diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-09-07 07:26:35 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-09-07 07:26:35 +0000 |
commit | 3bb7e52327bdfbfdf8b22073910cb7be0a0c06e8 (patch) | |
tree | 39f7a833d3c822ccc4201853e4aeb1092b7ee147 | |
parent | 03e23bba872d0745ac6b30ead66631277269ac3d (diff) |
[Sanitizer] add --demangle option to llvm-symbolizer (for now just assume that __cxa_demangle option is available)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@163376 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/llvm-symbolizer/llvm-symbolizer.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/utils/llvm-symbolizer/llvm-symbolizer.cpp b/utils/llvm-symbolizer/llvm-symbolizer.cpp index af634b1b2..aabd3e773 100644 --- a/utils/llvm-symbolizer/llvm-symbolizer.cpp +++ b/utils/llvm-symbolizer/llvm-symbolizer.cpp @@ -50,6 +50,10 @@ static cl::opt<bool> PrintInlining("inlining", cl::init(true), cl::desc("Print all inlined frames for a given address")); +static cl::opt<bool> +Demangle("demangle", cl::init(true), + cl::desc("Demangle function names")); + static StringRef ToolInvocationPath; static bool error(error_code ec) { @@ -237,6 +241,10 @@ static ModuleInfo *getOrCreateModuleInfo(const string &ModuleName) { return Info; } +// Assume that __cxa_demangle is provided by libcxxabi. +extern "C" char *__cxa_demangle(const char *mangled_name, char *output_buffer, + size_t *length, int *status); + static void printDILineInfo(DILineInfo LineInfo) { // By default, DILineInfo contains "<invalid>" for function/filename it // cannot fetch. We replace it to "??" to make our output closer to addr2line. @@ -246,6 +254,15 @@ static void printDILineInfo(DILineInfo LineInfo) { string FunctionName = LineInfo.getFunctionName(); if (FunctionName == kDILineInfoBadString) FunctionName = kSymbolizerBadString; + if (Demangle) { + int status = 0; + char *DemangledName = __cxa_demangle( + FunctionName.c_str(), 0, 0, &status); + if (status == 0) { + FunctionName = DemangledName; + free(DemangledName); + } + } outs() << FunctionName << "\n"; } string Filename = LineInfo.getFileName(); |