Skip to content

Commit

Permalink
Extend the USE_LIBBACKTRACE option (apache#13816)
Browse files Browse the repository at this point in the history
This PR extends the value accepted by USE_LIBBACKTRACE cmake variable. It adds ability to search pre-compile libbacktrace from system path or user-provided path. The behavior of this variable will be:
- 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. 
- \<PATH\>: 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.
  • Loading branch information
yelite authored Feb 2, 2023
1 parent ba936e9 commit 49849c8
Show file tree
Hide file tree
Showing 6 changed files with 99 additions and 32 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
15 changes: 15 additions & 0 deletions cmake/config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 0 additions & 4 deletions cmake/libs/Libbacktrace.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
106 changes: 81 additions & 25 deletions cmake/modules/Logging.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
2 changes: 1 addition & 1 deletion tests/scripts/task_config_build_cpu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion tests/scripts/task_config_build_minimal.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 49849c8

Please sign in to comment.