From ff7c978f81ab064c5a4f68ab921ff766d4747365 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Thu, 29 Oct 2015 23:49:19 +0000 Subject: [PATCH] [LLVMSymbolize] Move printing the description of a global into a separate function. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251669 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo/DIContext.h | 9 +++++ .../DebugInfo/Symbolize/SymbolizableModule.h | 3 +- include/llvm/DebugInfo/Symbolize/Symbolize.h | 2 ++ .../Symbolize/SymbolizableObjectFile.cpp | 10 +++--- .../Symbolize/SymbolizableObjectFile.h | 3 +- lib/DebugInfo/Symbolize/Symbolize.cpp | 34 ++++++++++++------- 6 files changed, 40 insertions(+), 21 deletions(-) diff --git a/include/llvm/DebugInfo/DIContext.h b/include/llvm/DebugInfo/DIContext.h index fa927d9d6bd..e98665f2b0d 100644 --- a/include/llvm/DebugInfo/DIContext.h +++ b/include/llvm/DebugInfo/DIContext.h @@ -65,6 +65,15 @@ class DIInliningInfo { } }; +/// DIGlobal - container for description of a global variable. +struct DIGlobal { + std::string Name; + uint64_t Start; + uint64_t Size; + + DIGlobal() : Name(""), Start(0), Size(0) {} +}; + /// A DINameKind is passed to name search methods to specify a /// preference regarding the type of name resolution the caller wants. enum class DINameKind { None, ShortName, LinkageName }; diff --git a/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h b/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h index 94a72faa944..ff9cc808875 100644 --- a/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h +++ b/include/llvm/DebugInfo/Symbolize/SymbolizableModule.h @@ -37,8 +37,7 @@ public: virtual DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset, FunctionNameKind FNKind, bool UseSymbolTable) const = 0; - virtual bool symbolizeData(uint64_t ModuleOffset, std::string &Name, - uint64_t &Start, uint64_t &Size) const = 0; + virtual DIGlobal symbolizeData(uint64_t ModuleOffset) const = 0; // Return true if this is a 32-bit x86 PE COFF module. virtual bool isWin32Module() const = 0; diff --git a/include/llvm/DebugInfo/Symbolize/Symbolize.h b/include/llvm/DebugInfo/Symbolize/Symbolize.h index e3de8c732e1..98e0b198da8 100644 --- a/include/llvm/DebugInfo/Symbolize/Symbolize.h +++ b/include/llvm/DebugInfo/Symbolize/Symbolize.h @@ -80,6 +80,8 @@ private: std::string printDILineInfo(DILineInfo LineInfo, const SymbolizableModule *ModInfo) const; + std::string printDIGlobal(DIGlobal Global, + const SymbolizableModule *ModInfo) const; // Owns all the parsed binaries and object files. SmallVector, 4> ParsedBinariesAndObjects; diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp index 65d4cce3dc1..fb2873e8159 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -239,11 +239,11 @@ DIInliningInfo SymbolizableObjectFile::symbolizeInlinedCode( return PatchedInlinedContext; } -bool SymbolizableObjectFile::symbolizeData(uint64_t ModuleOffset, - std::string &Name, uint64_t &Start, - uint64_t &Size) const { - return getNameFromSymbolTable(SymbolRef::ST_Data, ModuleOffset, Name, Start, - Size); +DIGlobal SymbolizableObjectFile::symbolizeData(uint64_t ModuleOffset) const { + DIGlobal Res; + getNameFromSymbolTable(SymbolRef::ST_Data, ModuleOffset, Res.Name, Res.Start, + Res.Size); + return Res; } } // namespace symbolize diff --git a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h index 7c138d3e468..a90e95c376f 100644 --- a/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ b/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -33,8 +33,7 @@ public: DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset, FunctionNameKind FNKind, bool UseSymbolTable) const override; - bool symbolizeData(uint64_t ModuleOffset, std::string &Name, uint64_t &Start, - uint64_t &Size) const override; + DIGlobal symbolizeData(uint64_t ModuleOffset) const override; // Return true if this is a 32-bit x86 PE COFF module. bool isWin32Module() const override; diff --git a/lib/DebugInfo/Symbolize/Symbolize.cpp b/lib/DebugInfo/Symbolize/Symbolize.cpp index 2da35f930d0..87f76eda6c7 100644 --- a/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -56,6 +56,10 @@ static bool error(std::error_code ec) { } +// By default, DILineInfo contains "" for function/filename it +// cannot fetch. We replace it to "??" to make our output closer to addr2line. +static const char kDILineInfoBadString[] = ""; + const char LLVMSymbolizer::kBadString[] = "??"; std::string LLVMSymbolizer::symbolizeCode(const std::string &ModuleName, @@ -88,9 +92,6 @@ std::string LLVMSymbolizer::symbolizeCode(const std::string &ModuleName, std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName, uint64_t ModuleOffset) { - std::string Name = kBadString; - uint64_t Start = 0; - uint64_t Size = 0; if (Opts.UseSymbolTable) { if (SymbolizableModule *Info = getOrCreateModuleInfo(ModuleName)) { // If the user is giving us relative addresses, add the preferred base of @@ -98,13 +99,11 @@ std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName, // expects. if (Opts.RelativeAddresses) ModuleOffset += Info->getModulePreferredBase(); - if (Info->symbolizeData(ModuleOffset, Name, Start, Size) && Opts.Demangle) - Name = DemangleName(Name, Info); + DIGlobal Global = Info->symbolizeData(ModuleOffset); + return printDIGlobal(Global, Info); } } - std::stringstream ss; - ss << Name << "\n" << Start << " " << Size << "\n"; - return ss.str(); + return printDIGlobal(DIGlobal(), nullptr); } void LLVMSymbolizer::flush() { @@ -359,9 +358,6 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { std::string LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo, const SymbolizableModule *ModInfo) const { - // By default, DILineInfo contains "" for function/filename it - // cannot fetch. We replace it to "??" to make our output closer to addr2line. - static const std::string kDILineInfoBadString = ""; std::stringstream Result; if (Opts.PrintFunctions != FunctionNameKind::None) { std::string FunctionName = LineInfo.FunctionName; @@ -378,6 +374,20 @@ LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo, return Result.str(); } +std::string +LLVMSymbolizer::printDIGlobal(DIGlobal Global, + const SymbolizableModule *ModInfo) const { + std::stringstream Result; + std::string Name = Global.Name; + if (Name == kDILineInfoBadString) + Name = kBadString; + else if (Opts.Demangle) + Name = DemangleName(Name, ModInfo); + Result << Name << "\n"; + Result << Global.Start << " " << Global.Size << "\n"; + return Result.str(); +} + // Undo these various manglings for Win32 extern "C" functions: // cdecl - _foo // stdcall - _foo@12 @@ -442,7 +452,7 @@ std::string LLVMSymbolizer::DemangleName(const std::string &Name, return (result == 0) ? Name : std::string(DemangledName); } #endif - if (ModInfo->isWin32Module()) + if (ModInfo && ModInfo->isWin32Module()) return std::string(demanglePE32ExternCFunc(Name)); return Name; } -- 2.34.1