From 5c4ce05d6aa0aaac4e7707b55983290093077c8b Mon Sep 17 00:00:00 2001 From: Kuba Brecka Date: Thu, 5 Mar 2015 09:47:13 +0000 Subject: [PATCH] Symbolizer refactoring: Link symbolizer tools into a fallback chain Reviewed at http://reviews.llvm.org/D8049 llvm-svn: 231361 --- .../sanitizer_symbolizer_internal.h | 7 ++++ .../sanitizer_symbolizer_posix_libcdep.cc | 41 ++++++++++++++-------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_internal.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_internal.h index a50ee12..5e6a6d5 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_internal.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_internal.h @@ -28,6 +28,13 @@ const char *ExtractUptr(const char *str, const char *delims, uptr *result); class SymbolizerTool { public: + // POSIXSymbolizer implements a "fallback chain" of symbolizer tools. In a + // request to symbolize an address, if one tool returns false, the next tool + // in the chain will be tried. + SymbolizerTool *next; + + SymbolizerTool() : next(nullptr) { } + // Can't declare pure virtual functions in sanitizer runtimes: // __cxa_pure_virtual might be unavailable. diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc index 2a7b16d..5088e22 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc @@ -350,8 +350,8 @@ class InternalSymbolizer : public SymbolizerTool { class POSIXSymbolizer : public Symbolizer { public: - explicit POSIXSymbolizer(SymbolizerTool *symbolizer_tool) - : Symbolizer(), symbolizer_tool_(symbolizer_tool) {} + explicit POSIXSymbolizer(IntrusiveList tools) + : Symbolizer(), tools_(tools) {} SymbolizedStack *SymbolizePC(uptr addr) override { BlockingMutexLock l(&mu_); @@ -362,9 +362,12 @@ class POSIXSymbolizer : public Symbolizer { return res; // Always fill data about module name and offset. res->info.FillModuleInfo(module_name, module_offset); - if (symbolizer_tool_) { + for (auto iter = Iterator(&tools_); iter.hasNext();) { + auto *tool = iter.next(); SymbolizerScope sym_scope(this); - symbolizer_tool_->SymbolizePC(addr, res); + if (tool->SymbolizePC(addr, res)) { + return res; + } } return res; } @@ -379,9 +382,12 @@ class POSIXSymbolizer : public Symbolizer { info->Clear(); info->module = internal_strdup(module_name); info->module_offset = module_offset; - if (symbolizer_tool_) { + for (auto iter = Iterator(&tools_); iter.hasNext();) { + auto *tool = iter.next(); SymbolizerScope sym_scope(this); - symbolizer_tool_->SymbolizeData(addr, info); + if (tool->SymbolizeData(addr, info)) { + return true; + } } return true; } @@ -393,22 +399,24 @@ class POSIXSymbolizer : public Symbolizer { } bool CanReturnFileLineInfo() override { - return symbolizer_tool_ != nullptr; + return !tools_.empty(); } void Flush() override { BlockingMutexLock l(&mu_); - if (symbolizer_tool_) { + for (auto iter = Iterator(&tools_); iter.hasNext();) { + auto *tool = iter.next(); SymbolizerScope sym_scope(this); - symbolizer_tool_->Flush(); + tool->Flush(); } } const char *Demangle(const char *name) override { BlockingMutexLock l(&mu_); - if (symbolizer_tool_) { + for (auto iter = Iterator(&tools_); iter.hasNext();) { + auto *tool = iter.next(); SymbolizerScope sym_scope(this); - if (const char *demangled = symbolizer_tool_->Demangle(name)) + if (const char *demangled = tool->Demangle(name)) return demangled; } return DemangleCXXABI(name); @@ -472,7 +480,8 @@ class POSIXSymbolizer : public Symbolizer { bool modules_fresh_; BlockingMutex mu_; - SymbolizerTool *const symbolizer_tool_; // Leaked. + typedef IntrusiveList::Iterator Iterator; + IntrusiveList tools_; }; static SymbolizerTool *ChooseSymbolizer(LowLevelAllocator *allocator) { @@ -507,8 +516,12 @@ static SymbolizerTool *ChooseSymbolizer(LowLevelAllocator *allocator) { } Symbolizer *Symbolizer::PlatformInit() { - return new(symbolizer_allocator_) - POSIXSymbolizer(ChooseSymbolizer(&symbolizer_allocator_)); + IntrusiveList list; + list.clear(); + if (SymbolizerTool *tool = ChooseSymbolizer(&symbolizer_allocator_)) { + list.push_back(tool); + } + return new(symbolizer_allocator_) POSIXSymbolizer(list); } } // namespace __sanitizer -- 2.7.4