[llvm] r306148 - [llvm-pdbutil] Dump raw bytes of pdb name map.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 23 13:18:39 PDT 2017


Author: zturner
Date: Fri Jun 23 15:18:38 2017
New Revision: 306148

URL: http://llvm.org/viewvc/llvm-project?rev=306148&view=rev
Log:
[llvm-pdbutil] Dump raw bytes of pdb name map.

This patch dumps the raw bytes of the pdb name map which contains
the mapping of stream name to stream index for the string table
and other reserved streams.

Modified:
    llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h
    llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp
    llvm/trunk/test/DebugInfo/PDB/pdbdump-raw-bytes.test
    llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.cpp
    llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.h
    llvm/trunk/tools/llvm-pdbutil/LinePrinter.cpp
    llvm/trunk/tools/llvm-pdbutil/LinePrinter.h
    llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp
    llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.h

Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h Fri Jun 23 15:18:38 2017
@@ -47,6 +47,8 @@ public:
 
   const NamedStreamMap &getNamedStreams() const;
 
+  BinarySubstreamRef getNamedStreamsBuffer() const;
+
   uint32_t getNamedStreamIndex(llvm::StringRef Name) const;
   iterator_range<StringMapConstIterator<uint32_t>> named_streams() const;
 
@@ -71,6 +73,8 @@ private:
   // universally unique.
   PDB_UniqueId Guid;
 
+  BinarySubstreamRef SubNamedStreams;
+
   std::vector<PdbRaw_FeatureSig> FeatureSignatures;
   PdbRaw_Features Features = PdbFeatureNone;
 

Modified: llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp (original)
+++ llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp Fri Jun 23 15:18:38 2017
@@ -57,6 +57,10 @@ Error InfoStream::reload() {
   uint32_t NewOffset = Reader.getOffset();
   NamedStreamMapByteSize = NewOffset - Offset;
 
+  Reader.setOffset(Offset);
+  if (auto EC = Reader.readSubstream(SubNamedStreams, NamedStreamMapByteSize))
+    return EC;
+
   bool Stop = false;
   while (!Stop && !Reader.empty()) {
     PdbRaw_FeatureSig Sig;
@@ -129,3 +133,7 @@ ArrayRef<PdbRaw_FeatureSig> InfoStream::
 const NamedStreamMap &InfoStream::getNamedStreams() const {
   return NamedStreams;
 }
+
+BinarySubstreamRef InfoStream::getNamedStreamsBuffer() const {
+  return SubNamedStreams;
+}

Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-raw-bytes.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-raw-bytes.test?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-raw-bytes.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-raw-bytes.test Fri Jun 23 15:18:38 2017
@@ -2,6 +2,8 @@
 ; RUN: not llvm-pdbutil bytes -byte-range=100-20 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=INVALID %s
 ; RUN: not llvm-pdbutil bytes -byte-range=100000-200000 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=INVALID-RANGE %s
 
+; RUN: llvm-pdbutil bytes -name-map %p/Inputs/empty.pdb | FileCheck --check-prefix=NAME-MAP %s
+
 
 VALID:                               MSF Bytes
 VALID-NEXT: ============================================================
@@ -13,3 +15,11 @@ VALID-NEXT:  )
 INVALID: llvm-pdbutil: Invalid byte range specified.  Max < Min
 
 INVALID-RANGE: llvm-pdbutil: Invalid byte range specified.  Requested byte larger than file size
+
+NAME-MAP:                            Named Stream Map
+NAME-MAP-NEXT: ============================================================
+NAME-MAP-NEXT:   Named Stream Map (
+NAME-MAP-NEXT:     1301C: 22000000 2F4C696E 6B496E66 6F002F6E 616D6573 002F7372 632F6865 61646572  |".../LinkInfo./names./src/header|
+NAME-MAP-NEXT:     1303C: 626C6F63 6B000300 00000600 00000100 00001A00 00000000 00001100 00000900  |block...........................|
+NAME-MAP-NEXT:     1305C: 00000A00 00000D00 00000000 00000500 0000                                 |..................|
+NAME-MAP-NEXT:   )

Modified: llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.cpp?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.cpp Fri Jun 23 15:18:38 2017
@@ -13,6 +13,7 @@
 #include "llvm-pdbutil.h"
 
 #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
+#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
 #include "llvm/DebugInfo/PDB/Native/RawError.h"
 #include "llvm/Support/BinaryStreamReader.h"
@@ -116,9 +117,25 @@ Error BytesOutputStyle::dump() {
     dumpStreamBytes();
     P.NewLine();
   }
+
+  if (opts::bytes::NameMap) {
+    dumpNameMap();
+    P.NewLine();
+  }
   return Error::success();
 }
 
+void BytesOutputStyle::dumpNameMap() {
+  printHeader(P, "Named Stream Map");
+
+  AutoIndent Indent(P);
+
+  auto &InfoS = Err(File.getPDBInfoStream());
+  BinarySubstreamRef NS = InfoS.getNamedStreamsBuffer();
+  auto Layout = File.getStreamLayout(StreamPDB);
+  P.formatMsfStreamData("Named Stream Map", File, Layout, NS);
+}
+
 void BytesOutputStyle::dumpBlockRanges(uint32_t Min, uint32_t Max) {
   printHeader(P, "MSF Blocks");
 

Modified: llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.h?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbutil/BytesOutputStyle.h Fri Jun 23 15:18:38 2017
@@ -28,12 +28,14 @@ public:
   Error dump() override;
 
 private:
+  void dumpNameMap();
   void dumpBlockRanges(uint32_t Min, uint32_t Max);
   void dumpByteRanges(uint32_t Min, uint32_t Max);
   void dumpStreamBytes();
 
   PDBFile &File;
   LinePrinter P;
+  ExitOnError Err;
   SmallVector<std::string, 8> StreamPurposes;
 };
 } // namespace pdb

Modified: llvm/trunk/tools/llvm-pdbutil/LinePrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/LinePrinter.cpp?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/LinePrinter.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/LinePrinter.cpp Fri Jun 23 15:18:38 2017
@@ -203,11 +203,12 @@ void LinePrinter::formatMsfStreamData(St
              StreamPurpose, Size, S->getLength());
   AutoIndent Indent(*this);
   BinaryStreamRef Slice(*S);
-  Slice = Slice.keep_front(Offset + Size);
-  BinaryStreamReader Reader(Slice);
-  consumeError(Reader.skip(Offset));
+  BinarySubstreamRef Substream;
+  Substream.Offset = Offset;
+  Substream.StreamData = Slice.drop_front(Offset).keep_front(Size);
+
   auto Layout = File.getStreamLayout(StreamIdx);
-  formatMsfStreamData(Label, File, Layout, Reader);
+  formatMsfStreamData(Label, File, Layout, Substream);
 }
 
 void LinePrinter::formatMsfStreamData(StringRef Label, PDBFile &File,
@@ -215,13 +216,6 @@ void LinePrinter::formatMsfStreamData(St
                                       BinarySubstreamRef Substream) {
   BinaryStreamReader Reader(Substream.StreamData);
 
-  consumeError(Reader.skip(Substream.Offset));
-  formatMsfStreamData(Label, File, Stream, Reader);
-}
-
-void LinePrinter::formatMsfStreamData(StringRef Label, PDBFile &File,
-                                      const msf::MSFStreamLayout &Stream,
-                                      BinaryStreamReader &Reader) {
   auto Runs = computeBlockRuns(File.getBlockSize(), Stream);
 
   NewLine();
@@ -231,7 +225,7 @@ void LinePrinter::formatMsfStreamData(St
 
     Run FoundRun;
     uint32_t RunOffset;
-    std::tie(FoundRun, RunOffset) = findRun(Reader.getOffset(), Runs);
+    std::tie(FoundRun, RunOffset) = findRun(Substream.Offset, Runs);
     assert(FoundRun.ByteLen >= RunOffset);
     uint32_t Len = FoundRun.ByteLen - RunOffset;
     Len = std::min(Len, Reader.bytesRemaining());
@@ -245,6 +239,7 @@ void LinePrinter::formatMsfStreamData(St
       OS << formatv("  {0}",
                     fmt_align("<discontinuity>", AlignStyle::Center, 114, '-'));
     }
+    Substream.Offset += Len;
   }
   NewLine();
   OS << ")";

Modified: llvm/trunk/tools/llvm-pdbutil/LinePrinter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/LinePrinter.h?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/LinePrinter.h (original)
+++ llvm/trunk/tools/llvm-pdbutil/LinePrinter.h Fri Jun 23 15:18:38 2017
@@ -60,9 +60,6 @@ public:
   void formatMsfStreamData(StringRef Label, PDBFile &File,
                            const msf::MSFStreamLayout &Stream,
                            BinarySubstreamRef Substream);
-  void formatMsfStreamData(StringRef Label, PDBFile &File,
-                           const msf::MSFStreamLayout &Stream,
-                           BinaryStreamReader &Reader);
 
   bool hasColor() const { return UseColor; }
   raw_ostream &getStream() { return OS; }

Modified: llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp Fri Jun 23 15:18:38 2017
@@ -286,6 +286,9 @@ cl::list<std::string>
                             "is SN[:Start][@Size]"),
                    cl::sub(BytesSubcommand));
 
+cl::opt<bool> NameMap("name-map", cl::desc("Dump bytes of PDB Name Map"),
+                      cl::sub(BytesSubcommand));
+
 cl::list<std::string> InputFilenames(cl::Positional,
                                      cl::desc("<input PDB files>"),
                                      cl::OneOrMore, cl::sub(BytesSubcommand));

Modified: llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.h?rev=306148&r1=306147&r2=306148&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.h (original)
+++ llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.h Fri Jun 23 15:18:38 2017
@@ -101,6 +101,7 @@ struct NumberRange {
 extern llvm::Optional<NumberRange> DumpBlockRange;
 extern llvm::Optional<NumberRange> DumpByteRange;
 extern llvm::cl::list<std::string> DumpStreamData;
+extern llvm::cl::opt<bool> NameMap;
 } // namespace bytes
 
 namespace dump {




More information about the llvm-commits mailing list