diff options
author | Kuba Brecka <kuba.brecka@gmail.com> | 2015-03-03 23:13:02 +0000 |
---|---|---|
committer | Kuba Brecka <kuba.brecka@gmail.com> | 2015-03-03 23:13:02 +0000 |
commit | 453e3925e3f67ba9fd7b4c36598cb979e92b819e (patch) | |
tree | 2d52d6f70e52079143712d4b17a5f0cabd1b2866 /lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc | |
parent | dd6a4a0f07dd83640c044ec1888a09257c37510c (diff) |
Symbolizer refactoring: Unify access to symbolizer tools from POSIXSymbolizer
Reviewed at http://reviews.llvm.org/D8029
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@231162 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 | 127 |
1 files changed, 48 insertions, 79 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc b/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc index 7c4c24e6e..2a7b16d97 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc @@ -173,6 +173,7 @@ class LLVMSymbolizer : public SymbolizerTool { if (const char *buf = SendCommand(/*is_data*/ true, info->module, info->module_offset)) { ParseSymbolizeDataOutput(buf, info); + info->start += (addr - info->module_offset); // Add the base address. return true; } return false; @@ -301,7 +302,10 @@ class InternalSymbolizer : public SymbolizerTool { bool SymbolizeData(uptr addr, DataInfo *info) override { bool result = __sanitizer_symbolize_data(info->module, info->module_offset, buffer_, kBufferSize); - if (result) ParseSymbolizeDataOutput(buffer_, info); + if (result) { + ParseSymbolizeDataOutput(buffer_, info); + info->start += (addr - info->module_offset); // Add the base address. + } return result; } @@ -346,13 +350,8 @@ class InternalSymbolizer : public SymbolizerTool { class POSIXSymbolizer : public Symbolizer { public: - POSIXSymbolizer(SymbolizerTool *external_symbolizer, - SymbolizerTool *internal_symbolizer, - LibbacktraceSymbolizer *libbacktrace_symbolizer) - : Symbolizer(), - external_symbolizer_(external_symbolizer), - internal_symbolizer_(internal_symbolizer), - libbacktrace_symbolizer_(libbacktrace_symbolizer) {} + explicit POSIXSymbolizer(SymbolizerTool *symbolizer_tool) + : Symbolizer(), symbolizer_tool_(symbolizer_tool) {} SymbolizedStack *SymbolizePC(uptr addr) override { BlockingMutexLock l(&mu_); @@ -363,15 +362,9 @@ class POSIXSymbolizer : public Symbolizer { return res; // Always fill data about module name and offset. res->info.FillModuleInfo(module_name, module_offset); - // First, try to use libbacktrace symbolizer (if it's available). - if (libbacktrace_symbolizer_ != 0) { - mu_.CheckLocked(); - if (libbacktrace_symbolizer_->SymbolizePC(addr, res)) - return res; - } - if (SymbolizerTool *tool = GetSymbolizerTool()) { + if (symbolizer_tool_) { SymbolizerScope sym_scope(this); - tool->SymbolizePC(addr, res); + symbolizer_tool_->SymbolizePC(addr, res); } return res; } @@ -386,17 +379,10 @@ class POSIXSymbolizer : public Symbolizer { info->Clear(); info->module = internal_strdup(module_name); info->module_offset = module_offset; - // First, try to use libbacktrace symbolizer (if it's available). - if (libbacktrace_symbolizer_ != 0) { - mu_.CheckLocked(); - if (libbacktrace_symbolizer_->SymbolizeData(addr, info)) - return true; - } - if (SymbolizerTool *tool = GetSymbolizerTool()) { + if (symbolizer_tool_) { SymbolizerScope sym_scope(this); - tool->SymbolizeData(addr, info); + symbolizer_tool_->SymbolizeData(addr, info); } - info->start += module->base_address(); return true; } @@ -407,30 +393,24 @@ class POSIXSymbolizer : public Symbolizer { } bool CanReturnFileLineInfo() override { - return internal_symbolizer_ != 0 || external_symbolizer_ != 0 || - libbacktrace_symbolizer_ != 0; + return symbolizer_tool_ != nullptr; } void Flush() override { BlockingMutexLock l(&mu_); - if (internal_symbolizer_ != 0) { + if (symbolizer_tool_) { SymbolizerScope sym_scope(this); - internal_symbolizer_->Flush(); + symbolizer_tool_->Flush(); } } const char *Demangle(const char *name) override { BlockingMutexLock l(&mu_); - // Run hooks even if we don't use internal symbolizer, as cxxabi - // demangle may call system functions. - SymbolizerScope sym_scope(this); - // Try to use libbacktrace demangler (if available). - if (libbacktrace_symbolizer_ != 0) { - if (const char *demangled = libbacktrace_symbolizer_->Demangle(name)) + if (symbolizer_tool_) { + SymbolizerScope sym_scope(this); + if (const char *demangled = symbolizer_tool_->Demangle(name)) return demangled; } - if (internal_symbolizer_ != 0) - return internal_symbolizer_->Demangle(name); return DemangleCXXABI(name); } @@ -443,13 +423,6 @@ class POSIXSymbolizer : public Symbolizer { } private: - SymbolizerTool *GetSymbolizerTool() { - mu_.CheckLocked(); - if (internal_symbolizer_) return internal_symbolizer_; - if (external_symbolizer_) return external_symbolizer_; - return nullptr; - } - LoadedModule *FindModuleForAddress(uptr address) { mu_.CheckLocked(); bool modules_were_reloaded = false; @@ -499,47 +472,43 @@ class POSIXSymbolizer : public Symbolizer { bool modules_fresh_; BlockingMutex mu_; - SymbolizerTool *const external_symbolizer_; // Leaked. - SymbolizerTool *const internal_symbolizer_; // Leaked. - LibbacktraceSymbolizer *libbacktrace_symbolizer_; // Leaked. + SymbolizerTool *const symbolizer_tool_; // Leaked. }; -Symbolizer *Symbolizer::PlatformInit() { +static SymbolizerTool *ChooseSymbolizer(LowLevelAllocator *allocator) { if (!common_flags()->symbolize) { - return new(symbolizer_allocator_) POSIXSymbolizer(0, 0, 0); - } - InternalSymbolizer* internal_symbolizer = - InternalSymbolizer::get(&symbolizer_allocator_); - SymbolizerTool *external_symbolizer = 0; - LibbacktraceSymbolizer *libbacktrace_symbolizer = 0; - - if (!internal_symbolizer) { - libbacktrace_symbolizer = - LibbacktraceSymbolizer::get(&symbolizer_allocator_); - if (!libbacktrace_symbolizer) { - const char *path_to_external = common_flags()->external_symbolizer_path; - if (path_to_external && path_to_external[0] == '\0') { - // External symbolizer is explicitly disabled. Do nothing. - } else { - // Find path to llvm-symbolizer if it's not provided. - if (!path_to_external) - path_to_external = FindPathToBinary("llvm-symbolizer"); - if (path_to_external) { - external_symbolizer = new(symbolizer_allocator_) - LLVMSymbolizer(path_to_external, &symbolizer_allocator_); - } else if (common_flags()->allow_addr2line) { - // If llvm-symbolizer is not found, try to use addr2line. - if (const char *addr2line_path = FindPathToBinary("addr2line")) { - external_symbolizer = new(symbolizer_allocator_) - Addr2LinePool(addr2line_path, &symbolizer_allocator_); - } - } - } + return nullptr; + } + if (SymbolizerTool *tool = InternalSymbolizer::get(allocator)) { + return tool; + } + if (SymbolizerTool *tool = LibbacktraceSymbolizer::get(allocator)) { + return tool; + } + const char *path_to_external = common_flags()->external_symbolizer_path; + if (path_to_external && path_to_external[0] == '\0') { + // External symbolizer is explicitly disabled. Do nothing. + return nullptr; + } + // Find path to llvm-symbolizer if it's not provided. + if (!path_to_external) { + path_to_external = FindPathToBinary("llvm-symbolizer"); + } + if (path_to_external) { + return new(*allocator) LLVMSymbolizer(path_to_external, allocator); + } + if (common_flags()->allow_addr2line) { + // If llvm-symbolizer is not found, try to use addr2line. + if (const char *addr2line_path = FindPathToBinary("addr2line")) { + return new(*allocator) Addr2LinePool(addr2line_path, allocator); } } + return nullptr; +} - return new(symbolizer_allocator_) POSIXSymbolizer( - external_symbolizer, internal_symbolizer, libbacktrace_symbolizer); +Symbolizer *Symbolizer::PlatformInit() { + return new(symbolizer_allocator_) + POSIXSymbolizer(ChooseSymbolizer(&symbolizer_allocator_)); } } // namespace __sanitizer |