@@ -25,6 +25,15 @@
# endif
#endif
+// C++ demangling function, as required by Itanium C++ ABI. This is weak,
+// because we do not require a C++ ABI library to be linked to a program
+// using sanitizers; if it's not present, we'll just use the mangled name.
+namespace __cxxabiv1 {
+ extern "C" SANITIZER_WEAK_ATTRIBUTE
+ char *__cxa_demangle(const char *mangled, char *buffer,
+ size_t *length, int *status);
+}
+
namespace __sanitizer {
#if SANITIZER_LIBBACKTRACE
@@ -39,6 +48,19 @@ struct SymbolizeCodeData {
uptr module_offset;
};
+char *MaybeDemangleAndDup(const char *symname) {
+ const char *demangled = symname;
+ if (symname[0] == '_' && symname[1] == 'Z' && __cxxabiv1::__cxa_demangle) {
+ demangled = __cxxabiv1::__cxa_demangle(symname, 0, 0, 0);
+ if (demangled == NULL)
+ demangled = symname;
+ }
+ char *ret = internal_strdup(demangled);
+ if (demangled != symname)
+ __builtin_free ((void *) demangled);
+ return ret;
+}
+
extern "C" {
static int SymbolizeCodePCInfoCallback(void *vdata, uintptr_t addr,
const char *filename, int lineno,
@@ -49,7 +71,7 @@ static int SymbolizeCodePCInfoCallback(v
info->Clear();
info->FillAddressAndModuleInfo(addr, cdata->module_name,
cdata->module_offset);
- info->function = internal_strdup(function);
+ info->function = MaybeDemangleAndDup(function);
if (filename)
info->file = internal_strdup(filename);
info->line = lineno;
@@ -67,7 +89,7 @@ static void SymbolizeCodeCallback(void *
info->Clear();
info->FillAddressAndModuleInfo(addr, cdata->module_name,
cdata->module_offset);
- info->function = internal_strdup(symname);
+ info->function = MaybeDemangleAndDup(symname);
cdata->n_frames = 1;
}
}
@@ -76,7 +98,7 @@ static void SymbolizeDataCallback(void *
uintptr_t symval, uintptr_t symsize) {
DataInfo *info = (DataInfo *)vdata;
if (symname && symval) {
- info->name = internal_strdup(symname);
+ info->name = MaybeDemangleAndDup(symname);
info->start = symval;
info->size = symsize;
}