From 6e54c3e519892ca13f15bdcea0d431befbadac25 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Thu, 5 Feb 2015 12:05:34 -0800 Subject: [PATCH] Use the libcxxabi __cxa_demangle. Bug: 18930951 Change-Id: If2ea3633ac6dfd4ec975c0f16bdf3dd58e05c614 --- libc/Android.mk | 3 ++- libc/bionic/debug_stacktrace.cpp | 21 +++------------------ 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/libc/Android.mk b/libc/Android.mk index fc4940abd..afd586ee2 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -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 diff --git a/libc/bionic/debug_stacktrace.cpp b/libc/bionic/debug_stacktrace.cpp index c6ce71412..71e876b95 100644 --- a/libc/bionic/debug_stacktrace.cpp +++ b/libc/bionic/debug_stacktrace.cpp @@ -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(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 = ""; } 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",