commit b1ab3ca54c58e9e5505929b58bd311aca4458cda Author: Jonathan Wakely Date: Wed Nov 30 11:48:35 2022 libstdc++: Pass error handler to libbacktrace functions Also remove a redundant data member, which also allows removing several namespace scope declarations. libstdc++-v3/ChangeLog: * include/debug/formatter.h [_GLIBCXX_DEBUG_BACKTRACE] (_Error_formatter::_Error_formatter): Pass error handler to __glibcxx_backtrace_create_state. (_Error_formatter::_M_backtrace_full): Remove data member. (_Error_formatter::_S_err): Define empty function. * src/c++11/debug.cc (_Error_formatter::_M_error): Call __glibcxx_backtrace_full directly. diff --git a/libstdc++-v3/include/debug/formatter.h b/libstdc++-v3/include/debug/formatter.h index f120163c6d4..2dd90bdf23b 100644 --- a/libstdc++-v3/include/debug/formatter.h +++ b/libstdc++-v3/include/debug/formatter.h @@ -32,34 +32,11 @@ #include #if _GLIBCXX_HAVE_STACKTRACE -struct __glibcxx_backtrace_state; - extern "C" -{ - __glibcxx_backtrace_state* - __glibcxx_backtrace_create_state(const char*, int, - void(*)(void*, const char*, int), - void*); - - typedef int (*__glibcxx_backtrace_full_callback) ( - void*, __UINTPTR_TYPE__, const char *, int, const char*); - - typedef void (*__glibcxx_backtrace_error_callback) ( - void*, const char*, int); - - typedef int (*__glibcxx_backtrace_full_func) ( - __glibcxx_backtrace_state*, int, - __glibcxx_backtrace_full_callback, - __glibcxx_backtrace_error_callback, - void*); - - int - __glibcxx_backtrace_full( - __glibcxx_backtrace_state*, int, - __glibcxx_backtrace_full_callback, - __glibcxx_backtrace_error_callback, - void*); -} +struct __glibcxx_backtrace_state* +__glibcxx_backtrace_create_state(const char*, int, + void(*)(void*, const char*, int), + void*); #endif #if __cpp_rtti @@ -609,8 +586,7 @@ namespace __gnu_debug , _M_function(__function) #if _GLIBCXX_HAVE_STACKTRACE # ifdef _GLIBCXX_DEBUG_BACKTRACE - , _M_backtrace_state(__glibcxx_backtrace_create_state(0, 0, 0, 0)) - , _M_backtrace_full(&__glibcxx_backtrace_full) + , _M_backtrace_state(__glibcxx_backtrace_create_state(0, 1, _S_err, 0)) # else , _M_backtrace_state() # endif @@ -632,7 +608,8 @@ namespace __gnu_debug const char* _M_function; #if _GLIBCXX_HAVE_STACKTRACE __glibcxx_backtrace_state* _M_backtrace_state; - __glibcxx_backtrace_full_func _M_backtrace_full; + + static void _S_err(void*, const char*, int) { } #endif public: diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index 9eda38023f7..2f273ec2c93 100644 --- a/libstdc++-v3/src/c++11/debug.cc +++ b/libstdc++-v3/src/c++11/debug.cc @@ -1084,6 +1084,20 @@ namespace { print_string(ctx, str, nbc, nullptr, 0); } #if _GLIBCXX_HAVE_STACKTRACE +extern "C" +{ + using __glibcxx_backtrace_full_callback + = int (*)(void*, __UINTPTR_TYPE__, const char *, int, const char*); + + using __glibcxx_backtrace_error_callback = void (*)(void*, const char*, int); + + int + __glibcxx_backtrace_full(__glibcxx_backtrace_state*, int, + __glibcxx_backtrace_full_callback, + __glibcxx_backtrace_error_callback, + void*); +} + void print_raw(PrintContext& ctx, const char* str, ptrdiff_t nbc) { @@ -1192,8 +1206,8 @@ namespace __gnu_debug if (_M_backtrace_state) { print_literal(ctx, "Backtrace:\n"); - _M_backtrace_full( - _M_backtrace_state, 1, print_backtrace, nullptr, &ctx); + __glibcxx_backtrace_full( + _M_backtrace_state, 1, print_backtrace, _S_err, &ctx); ctx._M_first_line = true; print_literal(ctx, "\n"); }