[LLVMSymbolize] Move printing the description of a global into a separate function...
authorAlexey Samsonov <vonosmas@gmail.com>
Thu, 29 Oct 2015 23:49:19 +0000 (23:49 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Thu, 29 Oct 2015 23:49:19 +0000 (23:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251669 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/DIContext.h
include/llvm/DebugInfo/Symbolize/SymbolizableModule.h
include/llvm/DebugInfo/Symbolize/Symbolize.h
lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
lib/DebugInfo/Symbolize/SymbolizableObjectFile.h
lib/DebugInfo/Symbolize/Symbolize.cpp

index fa927d9d6bd447dcaee063cc12ca67bc00dcb440..e98665f2b0d2783eaf31f4efba9c2a586d408e4b 100644 (file)
@@ -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("<invalid>"), 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 };
index 94a72faa944e86e818c0d0ec26463a20fa0acbcd..ff9cc808875d4e8fa966492d52b6932b556dbb5f 100644 (file)
@@ -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;
index e3de8c732e1cc1415d07560ad303f0239ba5741a..98e0b198da85a8fbe00c0d69e7841af54c820c34 100644 (file)
@@ -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<std::unique_ptr<Binary>, 4> ParsedBinariesAndObjects;
index 65d4cce3dc177d4b54a9c413e944e3189e32bbec..fb2873e8159d03bc6ff50a62f9b4510fe30c6432 100644 (file)
@@ -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
index 7c138d3e4683a12e27c66daf315e34ddb504e25f..a90e95c376f9cbd7c166392cfc9a70597a445422 100644 (file)
@@ -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;
index 2da35f930d025967f5eebd3d4b98a5fd30acb3eb..87f76eda6c7b99faabe394cee89014ba9614c188 100644 (file)
@@ -56,6 +56,10 @@ static bool error(std::error_code ec) {
 }
 
 
+// By default, DILineInfo contains "<invalid>" for function/filename it
+// cannot fetch. We replace it to "??" to make our output closer to addr2line.
+static const char kDILineInfoBadString[] = "<invalid>";
+
 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 "<invalid>" for function/filename it
-  // cannot fetch. We replace it to "??" to make our output closer to addr2line.
-  static const std::string kDILineInfoBadString = "<invalid>";
   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;
 }