diff options
author | Kuba Brecka <kuba.brecka@gmail.com> | 2015-03-05 09:47:13 +0000 |
---|---|---|
committer | Kuba Brecka <kuba.brecka@gmail.com> | 2015-03-05 09:47:13 +0000 |
commit | b3465aec3e011a26d65303434179a6af9df628ba (patch) | |
tree | 03aa7d209e4c75108706ef14fd12d5c386ecec26 /lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc | |
parent | 61f46f3d272b000aa722cb686f4867a6484a08f5 (diff) |
Symbolizer refactoring: Link symbolizer tools into a fallback chain
Reviewed at http://reviews.llvm.org/D8049
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@231361 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc b/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc index 2a7b16d97..5088e22b9 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc +++ b/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<SymbolizerTool> 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<SymbolizerTool>::Iterator Iterator; + IntrusiveList<SymbolizerTool> 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<SymbolizerTool> list; + list.clear(); + if (SymbolizerTool *tool = ChooseSymbolizer(&symbolizer_allocator_)) { + list.push_back(tool); + } + return new(symbolizer_allocator_) POSIXSymbolizer(list); } } // namespace __sanitizer |