From 84831cda6605dcb4748f66cb727f3739319e77ca Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 13 Nov 2015 17:00:36 +0000 Subject: [PATCH] [Symbolizer] Don't use PE symbol tables to override PDB symbols Summary: PE files are stripped by default, and only contain the names of exported symbols. The actual reason that we bother to do this override by default is actually due to a quirk of the way -gline-tables-only is implemented, so I phrased the check as "if we are symbolizing from dwarf, do the symtab override". This fixes lots of Windows ASan tests that I broke in r250582. Reviewers: samsonov Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14594 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253051 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Symbolize/SymbolizableObjectFile.cpp | 15 +++++++++++++-- lib/DebugInfo/Symbolize/SymbolizableObjectFile.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index d3a54ca8d47..e3146245984 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -14,6 +14,7 @@ #include "SymbolizableObjectFile.h" #include "llvm/Object/SymbolSize.h" #include "llvm/Support/DataExtractor.h" +#include "llvm/DebugInfo/DWARF/DWARFContext.h" namespace llvm { namespace symbolize { @@ -186,6 +187,16 @@ bool SymbolizableObjectFile::getNameFromSymbolTable(SymbolRef::Type Type, return true; } +bool SymbolizableObjectFile::shouldOverrideWithSymbolTable( + FunctionNameKind FNKind, bool UseSymbolTable) const { + // When DWARF is used with -gline-tables-only / -gmlt, the symbol table gives + // better answers for linkage names than the DIContext. Otherwise, we are + // probably using PEs and PDBs, and we shouldn't do the override. PE files + // generally only contain the names of exported symbols. + return FNKind == FunctionNameKind::LinkageName && UseSymbolTable && + isa(DebugInfoContext.get()); +} + DILineInfo SymbolizableObjectFile::symbolizeCode(uint64_t ModuleOffset, FunctionNameKind FNKind, bool UseSymbolTable) const { @@ -195,7 +206,7 @@ DILineInfo SymbolizableObjectFile::symbolizeCode(uint64_t ModuleOffset, ModuleOffset, getDILineInfoSpecifier(FNKind)); } // Override function name from symbol table if necessary. - if (FNKind == FunctionNameKind::LinkageName && UseSymbolTable) { + if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) { std::string FunctionName; uint64_t Start, Size; if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset, @@ -218,7 +229,7 @@ DIInliningInfo SymbolizableObjectFile::symbolizeInlinedCode( InlinedContext.addFrame(DILineInfo()); // Override the function name in lower frame with name from symbol table. - if (FNKind == FunctionNameKind::LinkageName && UseSymbolTable) { + if (shouldOverrideWithSymbolTable(FNKind, UseSymbolTable)) { std::string FunctionName; uint64_t Start, Size; if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset, diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h index a90e95c376f..8583b6a36e6 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -43,6 +43,9 @@ public: uint64_t getModulePreferredBase() const override; private: + bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind, + bool UseSymbolTable) const; + bool getNameFromSymbolTable(object::SymbolRef::Type Type, uint64_t Address, std::string &Name, uint64_t &Addr, uint64_t &Size) const; -- 2.34.1