From 0ede96ac635054b4d21438b79900337cd367c360 Mon Sep 17 00:00:00 2001 From: Steve Checkoway Date: Thu, 18 Sep 2003 10:17:32 +0000 Subject: [PATCH] Correct handling of demangling. --- stepmania/src/archutils/Darwin/arch_setup.h | 2 +- .../src/archutils/Unix/CrashHandlerChild.cpp | 65 ++++++++++--------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/stepmania/src/archutils/Darwin/arch_setup.h b/stepmania/src/archutils/Darwin/arch_setup.h index 989aa1f6b5..b9f1ddc6e9 100644 --- a/stepmania/src/archutils/Darwin/arch_setup.h +++ b/stepmania/src/archutils/Darwin/arch_setup.h @@ -1,5 +1,4 @@ #define DARWIN 1 -#define HAVE_DECL_SIGPWR 0 #define NEED_POWF #define NEED_SQRTF #define NEED_SINF @@ -9,3 +8,4 @@ #define BACKTRACE_LOOKUP_METHOD_ATOS #define BACKTRACE_METHOD_POWERPC_DARWIN #define HAVE_VERSION_INFO +#define HAVE_CXA_DEMANGLE diff --git a/stepmania/src/archutils/Unix/CrashHandlerChild.cpp b/stepmania/src/archutils/Unix/CrashHandlerChild.cpp index 29c76d9c40..09c874d4d5 100644 --- a/stepmania/src/archutils/Unix/CrashHandlerChild.cpp +++ b/stepmania/src/archutils/Unix/CrashHandlerChild.cpp @@ -54,6 +54,40 @@ void BacktraceNames::Demangle() Symbol = f; free(f); } +#elif defined(HAVE_CXA_DEMANGLE) +#include + +void BacktraceNames::Demangle() +{ + /* demangle the name using __cxa_demangle() if needed */ + if (Symbol.substr(0, 2) == "_Z") + { + int status = 0; + const char *name = abi::__cxa_demangle(Symbol, 0, 0, &status); + if (name) + Symbol = name; + else + { + switch (status) + { + case 0: + fprintf(stderr, "Something went wrong, it returned success, but failed.\n"); + break; + case -1: + fprintf(stderr, "Memory allocation failure.\n"); + break; + case -2: + fprintf(stderr, "Invalid mangled name: %s.\n", Symbol.c_str()); + break; + case -3: + fprintf(stderr, "Invalid arguments.\n"); + break; + default: + fprintf(stderr, "No idea what happened here."); + } + } + } +} #else void BacktraceNames::Demangle() { } #endif @@ -150,8 +184,6 @@ void BacktraceNames::FromString( CString s ) } } #elif defined(BACKTRACE_LOOKUP_METHOD_ATOS) -#include - void BacktraceNames::FromAddr( void *p ) { int fds[2]; @@ -245,35 +277,6 @@ void BacktraceNames::FromAddr( void *p ) if (Symbol[0] == '_') Symbol = Symbol.substr(1); - /* demangle the name using __cxa_demangle() if needed */ - if (Symbol.substr(0, 2) == "_Z") - { - const char *name; - int status = 0; - name = abi::__cxa_demangle(Symbol, 0, 0, &status); - if (name) - Symbol = name; - else - { - switch (status) - { - case 0: - fprintf(stderr, "Something went wrong, it returned success, but failed.\n"); - break; - case -1: - fprintf(stderr, "Memory allocation failure.\n"); - break; - case -2: - fprintf(stderr, "Invalid mangled name: %s.\n", Symbol.c_str()); - break; - case -3: - fprintf(stderr, "Invalid arguments.\n"); - break; - default: - fprintf(stderr, "No idea what happened here."); - } - } - } /* eg, the full line: * __Z1Ci (in a.out) (asmtest.cc:33) * _main (in a.out) (asmtest.cc:52)