Merge "Use the libcxxabi __cxa_demangle."

This commit is contained in:
Elliott Hughes 2015-02-05 20:21:35 +00:00 committed by Gerrit Code Review
commit 9dfb00c1d4
2 changed files with 5 additions and 19 deletions

View File

@ -1221,7 +1221,8 @@ LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
# Only need this for arm since libc++ uses its own unwind code that
# doesn't mix with the other default unwind code.
LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm libc++abi
LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm
LOCAL_STATIC_LIBRARIES += libc++abi
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
# Don't install on release build

View File

@ -47,34 +47,20 @@
typedef struct _Unwind_Context __unwind_context;
extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
static mapinfo_t* g_map_info = NULL;
static void* g_demangler;
typedef char* (*DemanglerFn)(const char*, char*, size_t*, int*);
static DemanglerFn g_demangler_fn = NULL;
__LIBC_HIDDEN__ void backtrace_startup() {
ScopedDisableDebugCalls disable;
g_map_info = mapinfo_create(getpid());
g_demangler = dlopen("libgccdemangle.so", RTLD_NOW);
if (g_demangler != NULL) {
void* sym = dlsym(g_demangler, "__cxa_demangle");
g_demangler_fn = reinterpret_cast<DemanglerFn>(sym);
}
}
__LIBC_HIDDEN__ void backtrace_shutdown() {
ScopedDisableDebugCalls disable;
mapinfo_destroy(g_map_info);
dlclose(g_demangler);
}
static char* demangle(const char* symbol) {
if (g_demangler_fn == NULL) {
return NULL;
}
return (*g_demangler_fn)(symbol, NULL, NULL, NULL);
}
struct stack_crawl_state_t {
@ -158,8 +144,7 @@ __LIBC_HIDDEN__ void log_backtrace(uintptr_t* frames, size_t frame_count) {
soname = "<unknown>";
}
if (symbol != NULL) {
// TODO: we might need a flag to say whether it's safe to allocate (demangling allocates).
char* demangled_symbol = demangle(symbol);
char* demangled_symbol = __cxa_demangle(symbol, NULL, NULL, NULL);
const char* best_name = (demangled_symbol != NULL) ? demangled_symbol : symbol;
__libc_format_log(ANDROID_LOG_ERROR, "libc",