|
12 | 12 |
|
13 | 13 | namespace ur_sanitizer_layer { |
14 | 14 |
|
15 | | -static auto *Symbolizer = new llvm::symbolize::LLVMSymbolizer{}; |
| 15 | +static llvm::symbolize::LLVMSymbolizer *Symbolizer = nullptr; |
16 | 16 |
|
17 | | -// Let's destruct the symbolizer at the very end of exit process, at least |
18 | | -// should be after the destructors of the SanitizerLayer since we may print |
| 17 | +llvm::symbolize::LLVMSymbolizer *GetSymbolizer() { |
| 18 | + static auto *Instance = []() { |
| 19 | + Symbolizer = new llvm::symbolize::LLVMSymbolizer{}; |
| 20 | + return Symbolizer; |
| 21 | + }(); |
| 22 | + return Instance; |
| 23 | +} |
| 24 | + |
| 25 | +// Let's destruct the symbolizer at the very end of exit process, at least |
| 26 | +// should be after the destructors of the SanitizerLayer since we may print |
19 | 27 | // some symbolized information in the SanitizerLayer destructor. |
20 | 28 | __attribute__((destructor(101))) void DestructSymbolizer() { |
21 | 29 | delete Symbolizer; |
@@ -51,15 +59,15 @@ void SymbolizeCode(const char *ModuleName, uint64_t ModuleOffset, |
51 | 59 | auto Printer = |
52 | 60 | std::make_unique<llvm::symbolize::LLVMPrinter>(OS, EH, Config); |
53 | 61 |
|
54 | | - auto ResOrErr = ur_sanitizer_layer::Symbolizer->symbolizeInlinedCode( |
| 62 | + auto ResOrErr = ur_sanitizer_layer::GetSymbolizer()->symbolizeInlinedCode( |
55 | 63 | ModuleName, |
56 | 64 | {ModuleOffset, llvm::object::SectionedAddress::UndefSection}); |
57 | 65 |
|
58 | 66 | if (!ResOrErr) { |
59 | 67 | return; |
60 | 68 | } |
61 | 69 | Printer->print(Request, *ResOrErr); |
62 | | - ur_sanitizer_layer::Symbolizer->pruneCache(); |
| 70 | + ur_sanitizer_layer::GetSymbolizer()->pruneCache(); |
63 | 71 | if (RetSize) { |
64 | 72 | *RetSize = Result.size() + 1; |
65 | 73 | } |
|
0 commit comments