[compiler-rt] r185146 - Demangle names using pluggable internal symbolizer if possible

Alexey Samsonov samsonov at google.com
Fri Jun 28 05:30:25 PDT 2013


Author: samsonov
Date: Fri Jun 28 07:30:24 2013
New Revision: 185146

URL: http://llvm.org/viewvc/llvm-project?rev=185146&view=rev
Log:
Demangle names using pluggable internal symbolizer if possible

Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_itanium.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h?rev=185146&r1=185145&r2=185146&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer.h Fri Jun 28 07:30:24 2013
@@ -74,7 +74,9 @@ bool IsSymbolizerAvailable();
 void FlushSymbolizer();  // releases internal caches (if any)
 
 // Attempts to demangle the provided C++ mangled name.
-const char *Demangle(const char *Name);
+const char *Demangle(const char *name);
+// Attempts to demangle the name via __cxa_demangle from __cxxabiv1.
+const char *DemangleCXXABI(const char *name);
 
 // Starts external symbolizer program in a subprocess. Sanitizer communicates
 // with external symbolizer via pipes.

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_itanium.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_itanium.cc?rev=185146&r1=185145&r2=185146&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_itanium.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_itanium.cc Fri Jun 28 07:30:24 2013
@@ -27,18 +27,18 @@ namespace __cxxabiv1 {
     SANITIZER_WEAK_ATTRIBUTE;
 }
 
-const char *__sanitizer::Demangle(const char *MangledName) {
+const char *__sanitizer::DemangleCXXABI(const char *name) {
   // FIXME: __cxa_demangle aggressively insists on allocating memory.
   // There's not much we can do about that, short of providing our
   // own demangler (libc++abi's implementation could be adapted so that
   // it does not allocate). For now, we just call it anyway, and we leak
   // the returned value.
   if (__cxxabiv1::__cxa_demangle)
-    if (const char *Demangled =
-          __cxxabiv1::__cxa_demangle(MangledName, 0, 0, 0))
-      return Demangled;
+    if (const char *demangled_name =
+          __cxxabiv1::__cxa_demangle(name, 0, 0, 0))
+      return demangled_name;
 
-  return MangledName;
+  return name;
 }
 
 #endif  // SANITIZER_MAC || SANITIZER_LINUX

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc?rev=185146&r1=185145&r2=185146&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc Fri Jun 28 07:30:24 2013
@@ -190,6 +190,9 @@ bool __sanitizer_symbolize_data(const ch
                                 char *Buffer, int MaxLength);
 SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
 void __sanitizer_symbolize_flush();
+SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
+void __sanitizer_symbolize_demangle(const char *Name, char *Buffer,
+                                    int MaxLength);
 }  // extern "C"
 
 class InternalSymbolizer {
@@ -218,10 +221,21 @@ class InternalSymbolizer {
       __sanitizer_symbolize_flush();
   }
 
+  const char *Demangle(const char *name) {
+    if (__sanitizer_symbolize_demangle) {
+      char *res = static_cast<char*>(InternalAlloc(kMaxDemangledNameSize));
+      internal_memset(res, 0, kMaxDemangledNameSize);
+      __sanitizer_symbolize_demangle(name, res, kMaxDemangledNameSize);
+      return res;
+    }
+    return name;
+  }
+
  private:
   InternalSymbolizer() { }
 
   static const int kBufferSize = 16 * 1024;
+  static const int kMaxDemangledNameSize = 1024;
   char buffer_[kBufferSize];
 };
 #else  // SANITIZER_SUPPORTS_WEAK_HOOKS
@@ -232,8 +246,8 @@ class InternalSymbolizer {
   char *SendCommand(bool is_data, const char *module_name, uptr module_offset) {
     return 0;
   }
-  void Flush() {
-  }
+  void Flush() { }
+  const char *Demangle(const char *name) { return name; }
 };
 
 #endif  // SANITIZER_SUPPORTS_WEAK_HOOKS
@@ -345,6 +359,12 @@ class Symbolizer {
       external_symbolizer_->Flush();
   }
 
+  const char *Demangle(const char *name) {
+    if (IsSymbolizerAvailable() && internal_symbolizer_ != 0)
+      return internal_symbolizer_->Demangle(name);
+    return DemangleCXXABI(name);
+  }
+
  private:
   char *SendCommand(bool is_data, const char *module_name, uptr module_offset) {
     // First, try to use internal symbolizer.
@@ -451,4 +471,8 @@ void FlushSymbolizer() {
   symbolizer.Flush();
 }
 
+const char *Demangle(const char *name) {
+  return symbolizer.Demangle(name);
+}
+
 }  // namespace __sanitizer





More information about the llvm-commits mailing list