]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/sanitizer_common/symbolizer/sanitizer_symbolize.cc
Upgrade Unbound to 1.8.0. More to follow.
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / sanitizer_common / symbolizer / sanitizer_symbolize.cc
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"