[llvm] r310128 - [pdbutil] When dumping section contribs, show the section name.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 4 14:10:04 PDT 2017


Author: zturner
Date: Fri Aug  4 14:10:04 2017
New Revision: 310128

URL: http://llvm.org/viewvc/llvm-project?rev=310128&view=rev
Log:
[pdbutil] When dumping section contribs, show the section name.

Modified:
    llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp

Modified: llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp?rev=310128&r1=310127&r2=310128&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/DumpOutputStyle.cpp Fri Aug  4 14:10:04 2017
@@ -1068,45 +1068,53 @@ Error DumpOutputStyle::dumpSectionHeader
   return Error::success();
 }
 
-void DumpOutputStyle::dumpSectionHeaders(StringRef Label, DbgHeaderType Type) {
-  printHeader(P, Label);
-  ExitOnError Err("Error dumping publics stream: ");
-
-  AutoIndent Indent(P);
-  if (!File.hasPDBDbiStream()) {
-    P.formatLine(
-        "Section headers require a DBI Stream, which could not be loaded");
-    return;
-  }
+static Expected<std::pair<std::unique_ptr<MappedBlockStream>,
+                          ArrayRef<llvm::object::coff_section>>>
+loadSectionHeaders(PDBFile &File, DbgHeaderType Type) {
+  if (!File.hasPDBDbiStream())
+    return make_error<StringError>(
+        "Section headers require a DBI Stream, which could not be loaded",
+        inconvertibleErrorCode());
 
-  auto &Dbi = Err(File.getPDBDbiStream());
+  auto &Dbi = cantFail(File.getPDBDbiStream());
   uint32_t SI = Dbi.getDebugStreamIndex(Type);
 
-  if (SI == kInvalidStreamIndex) {
-    P.formatLine(
-        "PDB does not contain the requested image section header type");
-    return;
-  }
+  if (SI == kInvalidStreamIndex)
+    return make_error<StringError>(
+        "PDB does not contain the requested image section header type",
+        inconvertibleErrorCode());
 
   auto Stream = MappedBlockStream::createIndexedStream(
       File.getMsfLayout(), File.getMsfBuffer(), SI, File.getAllocator());
-  if (!Stream) {
-    P.formatLine("Could not load the required stream data");
-    return;
-  }
+  if (!Stream)
+    return make_error<StringError>("Could not load the required stream data",
+                                   inconvertibleErrorCode());
+
   ArrayRef<object::coff_section> Headers;
-  if (Stream->getLength() % sizeof(object::coff_section) != 0) {
-    P.formatLine(
-        "Section header array size is not a multiple of section header size");
-    return;
-  }
+  if (Stream->getLength() % sizeof(object::coff_section) != 0)
+    return make_error<StringError>(
+        "Section header array size is not a multiple of section header size",
+        inconvertibleErrorCode());
+
   uint32_t NumHeaders = Stream->getLength() / sizeof(object::coff_section);
   BinaryStreamReader Reader(*Stream);
   cantFail(Reader.readArray(Headers, NumHeaders));
-  if (Headers.empty()) {
-    P.formatLine("No section headers");
+  return std::make_pair(std::move(Stream), Headers);
+}
+
+void DumpOutputStyle::dumpSectionHeaders(StringRef Label, DbgHeaderType Type) {
+  printHeader(P, Label);
+  ExitOnError Err("Error dumping publics stream: ");
+
+  AutoIndent Indent(P);
+  std::unique_ptr<MappedBlockStream> Stream;
+  ArrayRef<object::coff_section> Headers;
+  auto ExpectedHeaders = loadSectionHeaders(File, Type);
+  if (!ExpectedHeaders) {
+    P.printLine(toString(ExpectedHeaders.takeError()));
     return;
   }
+  std::tie(Stream, Headers) = std::move(*ExpectedHeaders);
 
   uint32_t I = 1;
   for (const auto &Header : Headers) {
@@ -1135,6 +1143,20 @@ void DumpOutputStyle::dumpSectionHeaders
   return;
 }
 
+std::vector<std::string> getSectionNames(PDBFile &File) {
+  auto ExpectedHeaders = loadSectionHeaders(File, DbgHeaderType::SectionHdr);
+  if (!ExpectedHeaders)
+    return {};
+
+  std::unique_ptr<MappedBlockStream> Stream;
+  ArrayRef<object::coff_section> Headers;
+  std::tie(Stream, Headers) = std::move(*ExpectedHeaders);
+  std::vector<std::string> Names;
+  for (const auto &H : Headers)
+    Names.push_back(H.Name);
+  return Names;
+}
+
 Error DumpOutputStyle::dumpSectionContribs() {
   printHeader(P, "Section Contributions");
   ExitOnError Err("Error dumping publics stream: ");
@@ -1150,23 +1172,33 @@ Error DumpOutputStyle::dumpSectionContri
 
   class Visitor : public ISectionContribVisitor {
   public:
-    Visitor(LinePrinter &P) : P(P) {}
+    Visitor(LinePrinter &P, ArrayRef<std::string> Names) : P(P), Names(Names) {
+      auto Max = std::max_element(
+          Names.begin(), Names.end(),
+          [](StringRef S1, StringRef S2) { return S1.size() < S2.size(); });
+      MaxNameLen = (Max == Names.end() ? 0 : Max->size());
+    }
     void visit(const SectionContrib &SC) override {
-      P.formatLine(
-          "SC  | mod = {2}, {0}, size = {1}, data crc = {3}, reloc crc = {4}",
-          formatSegmentOffset(SC.ISect, SC.Off), fmtle(SC.Size), fmtle(SC.Imod),
-          fmtle(SC.DataCrc), fmtle(SC.RelocCrc));
+      assert(SC.ISect > 0);
+      StringRef SectionName = Names[SC.ISect - 1];
+      std::string NameInsert = formatv("[{0}]", SectionName).str();
+      P.formatLine("SC{5}  | mod = {2}, {0}, size = {1}, data crc = {3}, reloc "
+                   "crc = {4}",
+                   formatSegmentOffset(SC.ISect, SC.Off), fmtle(SC.Size),
+                   fmtle(SC.Imod), fmtle(SC.DataCrc), fmtle(SC.RelocCrc),
+                   fmt_align(NameInsert, AlignStyle::Left, MaxNameLen + 2));
+      AutoIndent Indent(P, MaxNameLen + 2);
       P.formatLine("      {0}",
                    formatSectionCharacteristics(P.getIndentLevel() + 6,
                                                 SC.Characteristics, 3, " | "));
     }
     void visit(const SectionContrib2 &SC) override {
-      P.formatLine("SC2 | mod = {2}, {0}, size = {1}, data crc = {3}, reloc "
-                   "crc = {4}, coff section = {5}",
-                   formatSegmentOffset(SC.Base.ISect, SC.Base.Off),
-                   fmtle(SC.Base.Size), fmtle(SC.Base.Imod),
-                   fmtle(SC.Base.DataCrc), fmtle(SC.Base.RelocCrc),
-                   fmtle(SC.ISectCoff));
+      P.formatLine(
+          "SC2[{6}] | mod = {2}, {0}, size = {1}, data crc = {3}, reloc "
+          "crc = {4}, coff section = {5}",
+          formatSegmentOffset(SC.Base.ISect, SC.Base.Off), fmtle(SC.Base.Size),
+          fmtle(SC.Base.Imod), fmtle(SC.Base.DataCrc), fmtle(SC.Base.RelocCrc),
+          fmtle(SC.ISectCoff));
       P.formatLine("      {0}", formatSectionCharacteristics(
                                     P.getIndentLevel() + 6,
                                     SC.Base.Characteristics, 3, " | "));
@@ -1174,9 +1206,12 @@ Error DumpOutputStyle::dumpSectionContri
 
   private:
     LinePrinter &P;
+    uint32_t MaxNameLen;
+    ArrayRef<std::string> Names;
   };
 
-  Visitor V(P);
+  std::vector<std::string> Names = getSectionNames(File);
+  Visitor V(P, makeArrayRef(Names));
   Dbi.visitSectionContributions(V);
   return Error::success();
 }




More information about the llvm-commits mailing list