[Sanitizer] extend internal libc with stat/fstat/lstat functions
[blocksruntime.git] / lib / sanitizer_common / sanitizer_symbolizer_itanium.cc
blob43862949292316edf2a9f03392f1a3a065c4723d
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 #if defined(__APPLE__) || defined(__linux__)
15 #include "sanitizer_symbolizer.h"
17 #include <stdlib.h>
19 // C++ demangling function, as required by Itanium C++ ABI. This is weak,
20 // because we do not require a C++ ABI library to be linked to a program
21 // using sanitizers; if it's not present, we'll just use the mangled name.
22 namespace __cxxabiv1 {
23 extern "C" char *__cxa_demangle(const char *mangled, char *buffer,
24 size_t *length, int *status)
25 SANITIZER_WEAK_ATTRIBUTE;
28 const char *__sanitizer::Demangle(const char *MangledName) {
29 // FIXME: __cxa_demangle aggressively insists on allocating memory.
30 // There's not much we can do about that, short of providing our
31 // own demangler (libc++abi's implementation could be adapted so that
32 // it does not allocate). For now, we just call it anyway, and we leak
33 // the returned value.
34 if (__cxxabiv1::__cxa_demangle)
35 if (const char *Demangled =
36 __cxxabiv1::__cxa_demangle(MangledName, 0, 0, 0))
37 return Demangled;
39 return MangledName;
42 #endif // __APPLE__ || __linux__