diff --git a/CMakeLists.txt b/CMakeLists.txt index a82c64097481..abe415957e33 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,7 @@ tvm_option(USE_FALLBACK_STL_MAP "Use TVM's POD compatible Map" OFF) tvm_option(USE_ETHOSN "Build with Arm(R) Ethos(TM)-N" OFF) tvm_option(USE_CMSISNN "Build with Arm CMSIS-NN" OFF) tvm_option(INDEX_DEFAULT_I64 "Defaults the index datatype to int64" ON) -tvm_option(USE_LIBBACKTRACE "Build libbacktrace to supply linenumbers on stack traces" AUTO) +tvm_option(USE_LIBBACKTRACE "Use libbacktrace to supply linenumbers on stack traces" AUTO) tvm_option(BACKTRACE_ON_SEGFAULT "Install a signal handler to print a backtrace on segfault" OFF) tvm_option(BUILD_STATIC_RUNTIME "Build static version of libtvm_runtime" OFF) tvm_option(USE_PAPI "Use Performance Application Programming Interface (PAPI) to read performance counters" OFF) diff --git a/cmake/config.cmake b/cmake/config.cmake index 32b4f3f9392f..e20b358ad837 100644 --- a/cmake/config.cmake +++ b/cmake/config.cmake @@ -379,6 +379,21 @@ set(BUILD_STATIC_RUNTIME OFF) # - /path/to/ccache: use specific path to ccache set(USE_CCACHE AUTO) +# Whether to use libbacktrace to supply linenumbers on stack traces. +# Possible values: +# - ON: Find libbacktrace from system paths. Report an error if not found. +# - OFF: Don't use libbacktrace. +# - /path/to/libbacktrace: Looking for the libbacktrace header and static lib from a user-provided path. Report error if not found. +# - COMPILE: Build and link to libbacktrace from 3rdparty/libbacktrace. +# - AUTO: +# - Find libbacktrace from system paths. +# - If not found, fallback to COMPILE on Linux or MacOS, fallback to OFF on Windows or other platforms. +set(USE_LIBBACKTRACE AUTO) + +# Whether to install a signal handler to print a backtrace on segfault. +# Need to have USE_LIBBACKTRACE enabled. +set(BACKTRACE_ON_SEGFAULT OFF) + # Whether to enable PAPI support in profiling. PAPI provides access to hardware # counters while profiling. # Possible values: diff --git a/cmake/libs/Libbacktrace.cmake b/cmake/libs/Libbacktrace.cmake index cece74475a5f..61f8c921a15a 100644 --- a/cmake/libs/Libbacktrace.cmake +++ b/cmake/libs/Libbacktrace.cmake @@ -62,9 +62,5 @@ ExternalProject_Add_Step(project_libbacktrace checkout DEPENDS ${LIBBACKTRACE_SRCS} ) -add_library(libbacktrace STATIC IMPORTED) -add_dependencies(libbacktrace project_libbacktrace) -set_property(TARGET libbacktrace - PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/lib/libbacktrace.a) # create include directory so cmake doesn't complain file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include) diff --git a/cmake/modules/Logging.cmake b/cmake/modules/Logging.cmake index 6b20fba1fda6..eea9db67efb4 100644 --- a/cmake/modules/Logging.cmake +++ b/cmake/modules/Logging.cmake @@ -17,6 +17,8 @@ # This script configures the logging module and dependency on libbacktrace +include(FindPackageHandleStandardArgs) + if(USE_CUSTOM_LOGGING) # Set and propogate TVM_LOG_CUSTOMIZE flag is custom logging has been requested target_compile_definitions(tvm_objs PUBLIC TVM_LOG_CUSTOMIZE=1) @@ -26,35 +28,89 @@ if(USE_CUSTOM_LOGGING) target_compile_definitions(tvm_runtime PUBLIC TVM_LOG_CUSTOMIZE=1) endif() -if("${USE_LIBBACKTRACE}" STREQUAL "AUTO") - if(CMAKE_SYSTEM_NAME MATCHES "Linux") - set(USE_LIBBACKTRACE ON) - else() - set(USE_LIBBACKTRACE OFF) - endif() - message(STATUS "Autoset: USE_LIBBACKTRACE=" ${USE_LIBBACKTRACE} " in " ${CMAKE_SYSTEM_NAME}) -endif() +add_library(libbacktrace STATIC IMPORTED) + +set(LIBBACKTRACE_INCLUDE_DIR NOTFOUND) +set(LIBBACKTRACE_STATIC_LIBRARY NOTFOUND) +set(LIBBACKTRACE_FOUND NO) +macro(__find_libbacktrace) + find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h) + find_library(LIBBACKTRACE_STATIC_LIBRARY libbacktrace.a) + find_package_handle_standard_args(LIBBACKTRACE REQUIRED_VARS + LIBBACKTRACE_STATIC_LIBRARY LIBBACKTRACE_INCLUDE_DIR) +endmacro() -if(USE_LIBBACKTRACE) - message(STATUS "Building with libbacktrace...") +macro(__find_libbacktrace_from PATH) + find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h + PATHS ${PATH} + PATH_SUFFIXES include + NO_CMAKE_SYSTEM_PATH + NO_SYSTEM_ENVIRONMENT_PATH + ) + find_library(LIBBACKTRACE_STATIC_LIBRARY libbacktrace.a + PATHS ${PATH} + PATH_SUFFIXES lib + NO_CMAKE_SYSTEM_PATH + NO_SYSTEM_ENVIRONMENT_PATH + ) + find_package_handle_standard_args(LIBBACKTRACE REQUIRED_VARS + LIBBACKTRACE_STATIC_LIBRARY LIBBACKTRACE_INCLUDE_DIR) +endmacro() + +macro(__compile_libbacktrace) + message(STATUS "Building libbacktrace from 3rdparty/libbacktrace") include(cmake/libs/Libbacktrace.cmake) - target_link_libraries(tvm PRIVATE libbacktrace) - target_link_libraries(tvm_runtime PRIVATE libbacktrace) + add_dependencies(libbacktrace project_libbacktrace) + set(LIBBACKTRACE_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include) + set(LIBBACKTRACE_STATIC_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/lib/libbacktrace.a) add_dependencies(tvm_runtime_objs libbacktrace) - # pre 3.12 versions of cmake cannot propagate include directories from imported targets so we set them manually - target_include_directories(tvm PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include") - target_include_directories(tvm_objs PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include") - target_include_directories(tvm_runtime PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include") - target_include_directories(tvm_runtime_objs PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/libbacktrace/include") - target_compile_definitions(tvm_objs PRIVATE TVM_USE_LIBBACKTRACE=1) - target_compile_definitions(tvm_runtime_objs PRIVATE TVM_USE_LIBBACKTRACE=1) + set(LIBBACKTRACE_FOUND YES) +endmacro() + +if(USE_LIBBACKTRACE STREQUAL "AUTO") + __find_libbacktrace() + if(NOT LIBBACKTRACE_FOUND AND (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin")) + __compile_libbacktrace() + endif() +elseif(USE_LIBBACKTRACE STREQUAL "COMPILE") + __compile_libbacktrace() +elseif("${USE_LIBBACKTRACE}" MATCHES ${IS_TRUE_PATTERN}) + __find_libbacktrace() + if(NOT LIBBACKTRACE_FOUND) + message(SEND_ERROR "libbacktrace not found. (Set USE_LIBBACKTRACE to COMPILE if you want to build with the submodule at 3rdparty/libbacktrace.)") + endif() +elseif("${USE_LIBBACKTRACE}" MATCHES ${IS_FALSE_PATTERN}) else() - target_compile_definitions(tvm_objs PRIVATE TVM_USE_LIBBACKTRACE=0) - target_compile_definitions(tvm_runtime_objs PRIVATE TVM_USE_LIBBACKTRACE=0) + # Treat USE_LIBBACKTRACE as path to libbacktrace + message(STATUS "Using libbacktrace from ${USE_LIBBACKTRACE}") + __find_libbacktrace_from(${USE_LIBBACKTRACE}) + if(NOT LIBBACKTRACE_FOUND) + message(SEND_ERROR "libbacktrace not found from ${USE_LIBBACKTRACE}.") + endif() endif() -if(BACKTRACE_ON_SEGFAULT) - target_compile_definitions(tvm_objs PRIVATE TVM_BACKTRACE_ON_SEGFAULT) - target_compile_definitions(tvm_runtime_objs PRIVATE TVM_BACKTRACE_ON_SEGFAULT) -endif() +set_property(TARGET libbacktrace + PROPERTY IMPORTED_LOCATION ${LIBBACKTRACE_STATIC_LIBRARY}) + +function(configure_backtrace TARGET) + if(LIBBACKTRACE_FOUND) + get_target_property(target_type ${TARGET} TYPE) + if(target_type MATCHES "EXECUTABLE|(STATIC|SHARED|MODULE)_LIBRARY") + target_link_libraries(${TARGET} PRIVATE libbacktrace) + endif() + target_include_directories(${TARGET} PRIVATE ${LIBBACKTRACE_INCLUDE_DIR}) + target_compile_definitions(${TARGET} PRIVATE TVM_USE_LIBBACKTRACE=1) + else() + target_compile_definitions(${TARGET} PRIVATE TVM_USE_LIBBACKTRACE=0) + endif() + + if(BACKTRACE_ON_SEGFAULT) + target_compile_definitions(${TARGET} PRIVATE TVM_BACKTRACE_ON_SEGFAULT) + endif() +endfunction() + +configure_backtrace(tvm) +configure_backtrace(tvm_runtime) +configure_backtrace(tvm_objs) +configure_backtrace(tvm_runtime_objs) diff --git a/tests/scripts/task_config_build_cpu.sh b/tests/scripts/task_config_build_cpu.sh index e3d8aa9a1d1b..b59fa08e7e7f 100755 --- a/tests/scripts/task_config_build_cpu.sh +++ b/tests/scripts/task_config_build_cpu.sh @@ -54,7 +54,7 @@ echo set\(USE_ETHOSN_HW OFF\) >> config.cmake echo set\(USE_CMSISNN OFF\) >> config.cmake echo set\(USE_VITIS_AI ON\) >> config.cmake echo set\(USE_VERILATOR ON\) >> config.cmake -echo set\(USE_LIBBACKTRACE ON\) >> config.cmake +echo set\(USE_LIBBACKTRACE COMPILE\) >> config.cmake echo set\(BACKTRACE_ON_SEGFAULT ON\) >> config.cmake echo set\(USE_CCACHE OFF\) >> config.cmake echo set\(USE_ETHOSU OFF\) >> config.cmake diff --git a/tests/scripts/task_config_build_minimal.sh b/tests/scripts/task_config_build_minimal.sh index 9c8e101a7043..1a9f3c455c29 100755 --- a/tests/scripts/task_config_build_minimal.sh +++ b/tests/scripts/task_config_build_minimal.sh @@ -29,7 +29,7 @@ echo set\(USE_RELAY_DEBUG ON\) >> config.cmake echo set\(CMAKE_BUILD_TYPE=Debug\) >> config.cmake echo set\(CMAKE_CXX_FLAGS \"-Werror -Wp,-D_GLIBCXX_ASSERTIONS\"\) >> config.cmake echo set\(HIDE_PRIVATE_SYMBOLS ON\) >> config.cmake -echo set\(USE_LIBBACKTRACE ON\) >> config.cmake +echo set\(USE_LIBBACKTRACE COMPILE\) >> config.cmake echo set\(USE_CCACHE OFF\) >> config.cmake echo set\(SUMMARIZE ON\) >> config.cmake echo set\(USE_MICRO ON\) >> config.cmake