]> granicus.if.org Git - llvm/commitdiff
[DebugInfo] follow up for "add SectionedAddress to DebugInfo interfaces"
authorAlexey Lapshin <a.v.lapshin@mail.ru>
Sat, 23 Mar 2019 08:08:40 +0000 (08:08 +0000)
committerAlexey Lapshin <a.v.lapshin@mail.ru>
Sat, 23 Mar 2019 08:08:40 +0000 (08:08 +0000)
  [Symbolizer] Add getModuleSectionIndexForAddress() helper routine

  The https://reviews.llvm.org/D58194 patch changed symbolizer interface.
  Particularily it requires not only Address but SectionIndex also.
  Note object::SectionedAddress parameter:

  Expected<DILineInfo> symbolizeCode(const std::string &ModuleName,
                                   object::SectionedAddress ModuleOffset,
                                   StringRef DWPName = "");

  There are callers of symbolizer which do not know particular section index.
  That patch creates getModuleSectionIndexForAddress() routine which
  will detect section index for the specified address. Thus if caller
  set ModuleOffset.SectionIndex into object::SectionedAddress::UndefSection
  state then symbolizer would detect section index using
  getModuleSectionIndexForAddress routine.

  Differential Revision: https://reviews.llvm.org/D58848

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356829 91177308-0d34-0410-b5e6-96231b3b80d8

lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp
lib/DebugInfo/Symbolize/SymbolizableObjectFile.h
tools/llvm-symbolizer/llvm-symbolizer.cpp

index f0a97827c036f34b1bfab2b8fb49427334233906..fc09be251e1a840e68bef0892e1dd322ca7c312c 100644 (file)
@@ -227,6 +227,11 @@ SymbolizableObjectFile::symbolizeCode(object::SectionedAddress ModuleOffset,
                                       FunctionNameKind FNKind,
                                       bool UseSymbolTable) const {
   DILineInfo LineInfo;
+
+  if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection)
+    ModuleOffset.SectionIndex =
+        getModuleSectionIndexForAddress(ModuleOffset.Address);
+
   if (DebugInfoContext) {
     LineInfo = DebugInfoContext->getLineInfoForAddress(
         ModuleOffset, getDILineInfoSpecifier(FNKind));
@@ -248,6 +253,10 @@ DIInliningInfo SymbolizableObjectFile::symbolizeInlinedCode(
     bool UseSymbolTable) const {
   DIInliningInfo InlinedContext;
 
+  if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection)
+    ModuleOffset.SectionIndex =
+        getModuleSectionIndexForAddress(ModuleOffset.Address);
+
   if (DebugInfoContext)
     InlinedContext = DebugInfoContext->getInliningInfoForAddress(
         ModuleOffset, getDILineInfoSpecifier(FNKind));
@@ -276,3 +285,20 @@ DIGlobal SymbolizableObjectFile::symbolizeData(
                          Res.Start, Res.Size);
   return Res;
 }
+
+/// Search for the first occurence of specified Address in ObjectFile.
+uint64_t SymbolizableObjectFile::getModuleSectionIndexForAddress(
+    uint64_t Address) const {
+
+  for (SectionRef Sec : Module->sections()) {
+    if (!Sec.isText() || Sec.isVirtual())
+      continue;
+
+    if (Address >= Sec.getAddress() &&
+        Address <= Sec.getAddress() + Sec.getSize()) {
+      return Sec.getIndex();
+    }
+  }
+
+  return object::SectionedAddress::UndefSection;
+}
index a49ab0001316e4b3bb350d856996dbb56e6d0be7..d5ad8d0d3c4d6001e479e50fb95cafa2320e7594 100644 (file)
@@ -63,6 +63,9 @@ private:
                             uint64_t OpdAddress = 0);
   std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj);
 
+  /// Search for the first occurence of specified Address in ObjectFile.
+  uint64_t getModuleSectionIndexForAddress(uint64_t Address) const;
+
   object::ObjectFile *Module;
   std::unique_ptr<DIContext> DebugInfoContext;
 
index 9a39c3019cd35cc959a923c8e1126ab7fe8795ae..bac7fc5f8e77882457c658ee4300a3d82438aa7d 100644 (file)
@@ -194,48 +194,6 @@ static bool parseCommand(StringRef InputString, bool &IsData,
   return !StringRef(pos, offset_length).getAsInteger(0, ModuleOffset);
 }
 
-// This routine returns section index for an address.
-// Assumption: would work ambiguously for object files which have sections not
-// assigned to an address(since the same address could belong to various
-// sections).
-static uint64_t getModuleSectionIndexForAddress(const std::string &ModuleName,
-                                                uint64_t Address) {
-
-  // following ModuleName processing was copied from
-  // LLVMSymbolizer::getOrCreateModuleInfo().
-  // it needs to be refactored to avoid code duplication.
-  std::string BinaryName = ModuleName;
-  size_t ColonPos = ModuleName.find_last_of(':');
-  // Verify that substring after colon form a valid arch name.
-  if (ColonPos != std::string::npos) {
-    std::string ArchStr = ModuleName.substr(ColonPos + 1);
-    if (Triple(ArchStr).getArch() != Triple::UnknownArch) {
-      BinaryName = ModuleName.substr(0, ColonPos);
-    }
-  }
-
-  Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(BinaryName);
-
-  if (error(BinaryOrErr))
-    return object::SectionedAddress::UndefSection;
-
-  Binary &Binary = *BinaryOrErr->getBinary();
-
-  if (ObjectFile *O = dyn_cast<ObjectFile>(&Binary)) {
-    for (SectionRef Sec : O->sections()) {
-      if (!Sec.isText() || Sec.isVirtual())
-        continue;
-
-      if (Address >= Sec.getAddress() &&
-          Address <= Sec.getAddress() + Sec.getSize()) {
-        return Sec.getIndex();
-      }
-    }
-  }
-
-  return object::SectionedAddress::UndefSection;
-}
-
 static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer,
                            DIPrinter &Printer) {
   bool IsData = false;
@@ -253,18 +211,19 @@ static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer,
     outs() << Delimiter;
   }
   Offset -= ClAdjustVMA;
-  object::SectionedAddress ModuleOffset = {
-      Offset, getModuleSectionIndexForAddress(ModuleName, Offset)};
   if (IsData) {
-    auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset);
+    auto ResOrErr = Symbolizer.symbolizeData(
+        ModuleName, {Offset, object::SectionedAddress::UndefSection});
     Printer << (error(ResOrErr) ? DIGlobal() : ResOrErr.get());
   } else if (ClPrintInlining) {
-    auto ResOrErr =
-        Symbolizer.symbolizeInlinedCode(ModuleName, ModuleOffset, ClDwpName);
+    auto ResOrErr = Symbolizer.symbolizeInlinedCode(
+        ModuleName, {Offset, object::SectionedAddress::UndefSection},
+        ClDwpName);
     Printer << (error(ResOrErr) ? DIInliningInfo() : ResOrErr.get());
   } else {
-    auto ResOrErr =
-        Symbolizer.symbolizeCode(ModuleName, ModuleOffset, ClDwpName);
+    auto ResOrErr = Symbolizer.symbolizeCode(
+        ModuleName, {Offset, object::SectionedAddress::UndefSection},
+        ClDwpName);
     Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get());
   }
   outs() << "\n";