|
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