Home | History | Annotate | Line # | Download | only in symbolizer
      1 //===-- sanitizer_symbolize.cc ----------------------------------*- C++ -*-===//
      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 // Implementation of weak hooks from sanitizer_symbolizer_posix_libcdep.cc.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include <stdio.h>
     15 #include <string>
     16 
     17 #include "llvm/DebugInfo/Symbolize/DIPrinter.h"
     18 #include "llvm/DebugInfo/Symbolize/Symbolize.h"
     19 
     20 static llvm::symbolize::LLVMSymbolizer *getDefaultSymbolizer() {
     21   static llvm::symbolize::LLVMSymbolizer *DefaultSymbolizer =
     22       new llvm::symbolize::LLVMSymbolizer();
     23   return DefaultSymbolizer;
     24 }
     25 
     26 namespace __sanitizer {
     27 int internal_snprintf(char *buffer, unsigned long length, const char *format,
     28                       ...);
     29 }  // namespace __sanitizer
     30 
     31 extern "C" {
     32 
     33 typedef uint64_t u64;
     34 
     35 bool __sanitizer_symbolize_code(const char *ModuleName, uint64_t ModuleOffset,
     36                                 char *Buffer, int MaxLength) {
     37   std::string Result;
     38   {
     39     llvm::raw_string_ostream OS(Result);
     40     llvm::symbolize::DIPrinter Printer(OS);
     41     auto ResOrErr =
     42         getDefaultSymbolizer()->symbolizeInlinedCode(ModuleName, ModuleOffset);
     43     Printer << (ResOrErr ? ResOrErr.get() : llvm::DIInliningInfo());
     44   }
     45   return __sanitizer::internal_snprintf(Buffer, MaxLength, "%s",
     46                                         Result.c_str()) < MaxLength;
     47 }
     48 
     49 bool __sanitizer_symbolize_data(const char *ModuleName, uint64_t ModuleOffset,
     50                                 char *Buffer, int MaxLength) {
     51   std::string Result;
     52   {
     53     llvm::raw_string_ostream OS(Result);
     54     llvm::symbolize::DIPrinter Printer(OS);
     55     auto ResOrErr =
     56         getDefaultSymbolizer()->symbolizeData(ModuleName, ModuleOffset);
     57     Printer << (ResOrErr ? ResOrErr.get() : llvm::DIGlobal());
     58   }
     59   return __sanitizer::internal_snprintf(Buffer, MaxLength, "%s",
     60                                         Result.c_str()) < MaxLength;
     61 }
     62 
     63 void __sanitizer_symbolize_flush() { getDefaultSymbolizer()->flush(); }
     64 
     65 int __sanitizer_symbolize_demangle(const char *Name, char *Buffer,
     66                                    int MaxLength) {
     67   std::string Result =
     68       llvm::symbolize::LLVMSymbolizer::DemangleName(Name, nullptr);
     69   return __sanitizer::internal_snprintf(Buffer, MaxLength, "%s",
     70                                         Result.c_str()) < MaxLength
     71              ? static_cast<int>(Result.size() + 1)
     72              : 0;
     73 }
     74 
     75 }  // extern "C"
     76