rework (lib)unwind integration

Allow to switch between the two backends.
This commit is contained in:
Sergiu Deitsch 2023-12-29 23:18:08 +01:00
parent 3c052d90f8
commit 43792b8a13
4 changed files with 44 additions and 17 deletions

View File

@ -40,7 +40,9 @@ option (WITH_GTEST "Use Google Test" ON)
option (WITH_PKGCONFIG "Enable pkg-config support" ON) option (WITH_PKGCONFIG "Enable pkg-config support" ON)
option (WITH_SYMBOLIZE "Enable symbolize module" ON) option (WITH_SYMBOLIZE "Enable symbolize module" ON)
option (WITH_THREADS "Enable multithreading support" ON) option (WITH_THREADS "Enable multithreading support" ON)
option (WITH_UNWIND "Enable libunwind support" ON)
set (WITH_UNWIND libunwind CACHE STRING "unwind driver")
set_property (CACHE WITH_UNWIND PROPERTY STRINGS none unwind libunwind)
cmake_dependent_option (WITH_GMOCK "Use Google Mock" ON WITH_GTEST OFF) cmake_dependent_option (WITH_GMOCK "Use Google Mock" ON WITH_GTEST OFF)
cmake_dependent_option (WITH_TLS "Enable Thread Local Storage (TLS) support" ON WITH_THREADS OFF) cmake_dependent_option (WITH_TLS "Enable Thread Local Storage (TLS) support" ON WITH_THREADS OFF)
@ -48,9 +50,9 @@ cmake_dependent_option (WITH_TLS "Enable Thread Local Storage (TLS) support" ON
set (WITH_FUZZING none CACHE STRING "Fuzzing engine") set (WITH_FUZZING none CACHE STRING "Fuzzing engine")
set_property (CACHE WITH_FUZZING PROPERTY STRINGS none libfuzzer ossfuzz) set_property (CACHE WITH_FUZZING PROPERTY STRINGS none libfuzzer ossfuzz)
if (NOT WITH_UNWIND) if (WITH_UNWIND STREQUAL none)
set (CMAKE_DISABLE_FIND_PACKAGE_Unwind ON) set (CMAKE_DISABLE_FIND_PACKAGE_Unwind ON)
endif (NOT WITH_UNWIND) endif (WITH_UNWIND STREQUAL none)
if (NOT WITH_GTEST) if (NOT WITH_GTEST)
set (CMAKE_DISABLE_FIND_PACKAGE_GTest ON) set (CMAKE_DISABLE_FIND_PACKAGE_GTest ON)
@ -91,13 +93,42 @@ find_package (Threads)
find_package (Unwind) find_package (Unwind)
if (Unwind_FOUND) if (Unwind_FOUND)
set (HAVE_LIB_UNWIND 1) cmake_push_check_state (RESET)
else (Unwind_FOUND) set (CMAKE_REQUIRED_LIBRARIES unwind::unwind)
# Check whether linking actually succeeds. ARM toolchains of LLVM unwind # Check whether linking actually succeeds. ARM toolchains of LLVM unwind
# implementation do not necessarily provide the _Unwind_Backtrace function # implementation do not necessarily provide the _Unwind_Backtrace function
# which causes the previous check to succeed but the linking to fail. # which causes the previous check to succeed but the linking to fail.
check_cxx_symbol_exists (_Unwind_Backtrace unwind.h HAVE__UNWIND_BACKTRACE) check_cxx_symbol_exists (_Unwind_Backtrace unwind.h HAVE__UNWIND_BACKTRACE)
check_cxx_symbol_exists (_Unwind_GetIP unwind.h HAVE__UNWIND_GETIP) check_cxx_symbol_exists (_Unwind_GetIP unwind.h HAVE__UNWIND_GETIP)
check_cxx_symbol_exists (unw_get_reg libunwind.h HAVE_UNW_GET_REG)
check_cxx_symbol_exists (unw_getcontext libunwind.h HAVE_UNW_GETCONTEXT)
check_cxx_symbol_exists (unw_init_local libunwind.h HAVE_UNW_INIT_LOCAL)
check_cxx_symbol_exists (unw_step libunwind.h HAVE_UNW_STEP)
if (HAVE__UNWIND_BACKTRACE AND HAVE__UNWIND_GETIP)
set (_HAVE_UNWIND 1)
endif (HAVE__UNWIND_BACKTRACE AND HAVE__UNWIND_GETIP)
if (HAVE_UNW_GET_REG AND HAVE_UNW_GETCONTEXT AND HAVE_UNW_INIT_LOCAL AND HAVE_UNW_STEP)
set (_HAVE_LIBUNWIND 1)
endif (HAVE_UNW_GET_REG AND HAVE_UNW_GETCONTEXT AND HAVE_UNW_INIT_LOCAL AND HAVE_UNW_STEP)
if (WITH_UNWIND STREQUAL unwind)
if (_HAVE_UNWIND)
set (HAVE_UNWIND 1)
endif (_HAVE_UNWIND)
elseif (WITH_UNWIND STREQUAL libunwind)
if (_HAVE_LIBUNWIND)
set (HAVE_LIBUNWIND 1)
endif (_HAVE_LIBUNWIND)
endif (WITH_UNWIND STREQUAL unwind)
unset (_HAVE_LIBUNWIND)
unset (_HAVE_UNWIND)
cmake_pop_check_state ()
endif (Unwind_FOUND) endif (Unwind_FOUND)
check_include_file_cxx (dlfcn.h HAVE_DLFCN_H) check_include_file_cxx (dlfcn.h HAVE_DLFCN_H)

View File

@ -73,8 +73,7 @@ def glog_library(namespace = "google", with_gflags = 1, **kwargs):
"-DHAVE_SYS_UTSNAME_H", "-DHAVE_SYS_UTSNAME_H",
# For src/utilities.cc. # For src/utilities.cc.
"-DHAVE_SYS_TIME_H", "-DHAVE_SYS_TIME_H",
"-DHAVE__UNWIND_BACKTRACE", "-DHAVE_UNWIND",
"-DHAVE__UNWIND_GETIP",
# Enable dumping stacktrace upon sigaction. # Enable dumping stacktrace upon sigaction.
"-DHAVE_SIGACTION", "-DHAVE_SIGACTION",
# For logging.cc. # For logging.cc.

View File

@ -37,9 +37,6 @@
/* define if you have dbghelp library */ /* define if you have dbghelp library */
#cmakedefine HAVE_DBGHELP #cmakedefine HAVE_DBGHELP
/* define if you have libunwind */
#cmakedefine HAVE_LIB_UNWIND
/* Define to 1 if you have the <memory.h> header file. */ /* Define to 1 if you have the <memory.h> header file. */
#cmakedefine HAVE_MEMORY_H #cmakedefine HAVE_MEMORY_H
@ -103,11 +100,11 @@
/* Define to 1 if you have the <unistd.h> header file. */ /* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H} #cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H}
/* Define if you linking to _Unwind_Backtrace is possible. */ /* define if you have unwind */
#cmakedefine HAVE__UNWIND_BACKTRACE #cmakedefine HAVE_UNWIND
/* Define if you linking to _Unwind_GetIP is possible. */ /* define if you have libunwind */
#cmakedefine HAVE__UNWIND_GETIP #cmakedefine HAVE_LIBUNWIND
/* define if your compiler has __attribute__ */ /* define if your compiler has __attribute__ */
#cmakedefine HAVE___ATTRIBUTE__ #cmakedefine HAVE___ATTRIBUTE__

View File

@ -1,4 +1,4 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2023, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
@ -85,9 +85,9 @@
// correctly when GetStackTrace() is called with max_depth == 0. // correctly when GetStackTrace() is called with max_depth == 0.
// Some code may do that. // Some code may do that.
#if defined(HAVE_LIB_UNWIND) #if defined(HAVE_LIBUNWIND)
# define STACKTRACE_H "stacktrace_libunwind-inl.h" # define STACKTRACE_H "stacktrace_libunwind-inl.h"
#elif defined(HAVE__UNWIND_BACKTRACE) && defined(HAVE__UNWIND_GETIP) #elif defined(HAVE_UNWIND)
# define STACKTRACE_H "stacktrace_unwind-inl.h" # define STACKTRACE_H "stacktrace_unwind-inl.h"
#elif !defined(NO_FRAME_POINTER) #elif !defined(NO_FRAME_POINTER)
# if defined(__i386__) && __GNUC__ >= 2 # if defined(__i386__) && __GNUC__ >= 2