From c0847c179c93848f047ae56bc136854a09b106d5 Mon Sep 17 00:00:00 2001 From: Lite Ye Date: Thu, 19 Jan 2023 12:11:45 -0500 Subject: [PATCH 1/5] Extend the USE_LIBBACKTRACE option --- CMakeLists.txt | 2 +- cmake/libs/Libbacktrace.cmake | 4 -- cmake/modules/Logging.cmake | 115 ++++++++++++++++++++++++++-------- 3 files changed, 91 insertions(+), 30 deletions(-) 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/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..d815fd69b27c 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,98 @@ 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() + +# Available options for USE_LIBBACKTRACE: +# - OFF: Don't use libbacktrace +# - ON: Find libbacktrace from system paths. Fail the build generation if libbacktrace is not found. +# - COMPILE: Build and link to libbacktrace from 3rdparty/libbacktrace. +# - : Looking for the libbacktrace header and static lib from a user-provided path. Fail the build generation if libbacktrace is not found. +# - AUTO: +# - Find libbacktrace from system paths. +# - If not found, fallback to COMPILE on Linux or MacOS, fallback to OFF on Windows or other platforms. +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.") + 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) + From 3bbcd64cfe4d1ed60a6cb86462920e157363bcb6 Mon Sep 17 00:00:00 2001 From: Lite Ye Date: Fri, 20 Jan 2023 13:38:10 -0500 Subject: [PATCH 2/5] Fix lint --- cmake/modules/Logging.cmake | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/cmake/modules/Logging.cmake b/cmake/modules/Logging.cmake index d815fd69b27c..c8afe38628e5 100644 --- a/cmake/modules/Logging.cmake +++ b/cmake/modules/Logging.cmake @@ -42,14 +42,14 @@ macro(__find_libbacktrace) endmacro() macro(__find_libbacktrace_from PATH) - find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h - PATHS ${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} + PATHS ${PATH} PATH_SUFFIXES lib NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH @@ -71,9 +71,9 @@ endmacro() # Available options for USE_LIBBACKTRACE: # - OFF: Don't use libbacktrace # - ON: Find libbacktrace from system paths. Fail the build generation if libbacktrace is not found. -# - COMPILE: Build and link to libbacktrace from 3rdparty/libbacktrace. +# - COMPILE: Build and link to libbacktrace from 3rdparty/libbacktrace. # - : Looking for the libbacktrace header and static lib from a user-provided path. Fail the build generation if libbacktrace is not found. -# - AUTO: +# - AUTO: # - Find libbacktrace from system paths. # - If not found, fallback to COMPILE on Linux or MacOS, fallback to OFF on Windows or other platforms. if(USE_LIBBACKTRACE STREQUAL "AUTO") @@ -110,7 +110,7 @@ function(configure_backtrace TARGET) 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) + target_compile_definitions(${TARGET} PRIVATE TVM_USE_LIBBACKTRACE=0) endif() if(BACKTRACE_ON_SEGFAULT) @@ -122,4 +122,3 @@ configure_backtrace(tvm) configure_backtrace(tvm_runtime) configure_backtrace(tvm_objs) configure_backtrace(tvm_runtime_objs) - From 3104a5b514c6c60fa95c5293f691491ed455c14a Mon Sep 17 00:00:00 2001 From: Lite Ye Date: Sat, 21 Jan 2023 14:52:35 -0500 Subject: [PATCH 3/5] Update CI build config --- tests/scripts/task_config_build_cpu.sh | 2 +- tests/scripts/task_config_build_minimal.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 From 0d0f2acc39d77180a615a04dbd141699e370ab6d Mon Sep 17 00:00:00 2001 From: Lite Ye Date: Mon, 23 Jan 2023 10:55:07 -0500 Subject: [PATCH 4/5] Improve error message --- cmake/modules/Logging.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/Logging.cmake b/cmake/modules/Logging.cmake index c8afe38628e5..a7756684e0aa 100644 --- a/cmake/modules/Logging.cmake +++ b/cmake/modules/Logging.cmake @@ -86,7 +86,7 @@ elseif(USE_LIBBACKTRACE STREQUAL "COMPILE") elseif("${USE_LIBBACKTRACE}" MATCHES ${IS_TRUE_PATTERN}) __find_libbacktrace() if(NOT LIBBACKTRACE_FOUND) - message(SEND_ERROR "libbacktrace not 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() From 5e5dbb6de395a3649f44f71d34501ce57d87ceb3 Mon Sep 17 00:00:00 2001 From: Lite Ye Date: Tue, 31 Jan 2023 09:43:03 -0500 Subject: [PATCH 5/5] Update the comment in config.cmake --- cmake/config.cmake | 15 +++++++++++++++ cmake/modules/Logging.cmake | 8 -------- 2 files changed, 15 insertions(+), 8 deletions(-) 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/modules/Logging.cmake b/cmake/modules/Logging.cmake index a7756684e0aa..eea9db67efb4 100644 --- a/cmake/modules/Logging.cmake +++ b/cmake/modules/Logging.cmake @@ -68,14 +68,6 @@ macro(__compile_libbacktrace) set(LIBBACKTRACE_FOUND YES) endmacro() -# Available options for USE_LIBBACKTRACE: -# - OFF: Don't use libbacktrace -# - ON: Find libbacktrace from system paths. Fail the build generation if libbacktrace is not found. -# - COMPILE: Build and link to libbacktrace from 3rdparty/libbacktrace. -# - : Looking for the libbacktrace header and static lib from a user-provided path. Fail the build generation if libbacktrace is not found. -# - AUTO: -# - Find libbacktrace from system paths. -# - If not found, fallback to COMPILE on Linux or MacOS, fallback to OFF on Windows or other platforms. if(USE_LIBBACKTRACE STREQUAL "AUTO") __find_libbacktrace() if(NOT LIBBACKTRACE_FOUND AND (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin"))