diff --git a/booster/CMakeLists.txt b/booster/CMakeLists.txt index 07f8f27..21ccd0e 100644 --- a/booster/CMakeLists.txt +++ b/booster/CMakeLists.txt @@ -339,6 +339,10 @@ check_cxx_source_compiles( #include #include #include + #ifdef __GNUC__ + #include + #endif + extern \"C\" { extern void* _Unwind_GetIP (void *); extern int _Unwind_Backtrace(int (*)(void *,void *),void *); @@ -347,6 +351,26 @@ check_cxx_source_compiles( int main() { _Unwind_Backtrace(0,0); _Unwind_GetIP(0); }" BOOSTER_HAVE_UNWIND_BACKTRACE) +check_cxx_source_compiles( + "#include + #include + #include + #include + #include + #include + #include + #ifdef __GNUC__ + #include + #endif + + extern \"C\" { + extern int _Unwind_Backtrace(int (*)(void *,void *),void *); + } + + int main() { _Unwind_Backtrace(0,0); _Unwind_GetIP((_Unwind_Context *)0); }" + BOOSTER_HAVE_UNWIND_BACKTRACE_BUILTIN) + + Check_cxx_source_compiles( "#include diff --git a/booster/lib/backtrace/src/backtrace.cpp b/booster/lib/backtrace/src/backtrace.cpp index 779982c..2b9e527 100644 --- a/booster/lib/backtrace/src/backtrace.cpp +++ b/booster/lib/backtrace/src/backtrace.cpp @@ -45,10 +45,11 @@ #include #endif -#if defined(BOOSTER_HAVE_UNWIND_BACKTRACE) - +#if defined(BOOSTER_HAVE_UNWIND_BACKTRACE) || defined(BOOSTER_HAVE_UNWIND_BACKTRACE_BUILTIN) extern "C" { + #ifndef BOOSTER_HAVE_UNWIND_BACKTRACE_BUILTIN extern void * _Unwind_GetIP (void *); + #endif extern int _Unwind_Backtrace(int (*)(void *,void *),void *); } @@ -63,7 +64,7 @@ namespace booster { // so enable it on Apple, Sun and BSD using libgcc's _Unwind_Backtrace // if present // - #if defined(BOOSTER_HAVE_UNWIND_BACKTRACE) && ( defined(__FreeBSD__) || defined(__sun) || defined(__APPLE__) ) + #if (defined(BOOSTER_HAVE_UNWIND_BACKTRACE) || defined(BOOSTER_HAVE_UNWIND_BACKTRACE_BUILTIN)) && ( defined(__FreeBSD__) || defined(__sun) || defined(__APPLE__) ) namespace { struct trace_data { @@ -77,7 +78,11 @@ namespace booster { trace_data *d = static_cast(cookie); if(d->reminder > 0) { d->reminder --; + #ifdef BOOSTER_HAVE_UNWIND_BACKTRACE_BUILTIN + d->array[d->total++] = reinterpret_cast(_Unwind_GetIP(static_cast<_Unwind_Context*>(context))); + #else d->array[d->total++] = _Unwind_GetIP(context); + #endif } return 0; } diff --git a/booster/lib/booster_build_config.cmake.h b/booster/lib/booster_build_config.cmake.h index ae5e450..2d2a11c 100644 --- a/booster/lib/booster_build_config.cmake.h +++ b/booster/lib/booster_build_config.cmake.h @@ -65,6 +65,7 @@ #cmakedefine BOOSTER_HAVE_UNWIND_BACKTRACE +#cmakedefine BOOSTER_HAVE_UNWIND_BACKTRACE_BUILTIN /* Define to module suffix. */ #cmakedefine BOOSTER_LIBRARY_SUFFIX "${BOOSTER_LIBRARY_SUFFIX}"