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