Home | History | Annotate | Download | only in sanitizer_common
      1 //===-- sanitizer_symbolizer_itanium.cc -----------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file is shared between the sanitizer run-time libraries.
     11 // Itanium C++ ABI-specific implementation of symbolizer parts.
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "sanitizer_platform.h"
     15 #if SANITIZER_MAC || SANITIZER_LINUX
     16 
     17 #include "sanitizer_symbolizer.h"
     18 
     19 #include <stdlib.h>
     20 
     21 // C++ demangling function, as required by Itanium C++ ABI. This is weak,
     22 // because we do not require a C++ ABI library to be linked to a program
     23 // using sanitizers; if it's not present, we'll just use the mangled name.
     24 namespace __cxxabiv1 {
     25   extern "C" char *__cxa_demangle(const char *mangled, char *buffer,
     26                                   size_t *length, int *status)
     27     SANITIZER_WEAK_ATTRIBUTE;
     28 }
     29 
     30 const char *__sanitizer::DemangleCXXABI(const char *name) {
     31   // FIXME: __cxa_demangle aggressively insists on allocating memory.
     32   // There's not much we can do about that, short of providing our
     33   // own demangler (libc++abi's implementation could be adapted so that
     34   // it does not allocate). For now, we just call it anyway, and we leak
     35   // the returned value.
     36   if (__cxxabiv1::__cxa_demangle)
     37     if (const char *demangled_name =
     38           __cxxabiv1::__cxa_demangle(name, 0, 0, 0))
     39       return demangled_name;
     40 
     41   return name;
     42 }
     43 
     44 #endif  // SANITIZER_MAC || SANITIZER_LINUX
     45