diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/InfoStream.h b/llvm/include/llvm/DebugInfo/PDB/Native/InfoStream.h index fc91fc7097bd..37bf5f3b573c 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/InfoStream.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/InfoStream.h @@ -47,6 +47,8 @@ public: const NamedStreamMap &getNamedStreams() const; + BinarySubstreamRef getNamedStreamsBuffer() const; + uint32_t getNamedStreamIndex(llvm::StringRef Name) const; iterator_range> named_streams() const; @@ -71,6 +73,8 @@ private: // universally unique. PDB_UniqueId Guid; + BinarySubstreamRef SubNamedStreams; + std::vector FeatureSignatures; PdbRaw_Features Features = PdbFeatureNone; diff --git a/llvm/lib/DebugInfo/PDB/Native/InfoStream.cpp b/llvm/lib/DebugInfo/PDB/Native/InfoStream.cpp index a3979d480bf4..21b66b3e7bcf 100644 --- a/llvm/lib/DebugInfo/PDB/Native/InfoStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/InfoStream.cpp @@ -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 InfoStream::getFeatureSignatures() const { const NamedStreamMap &InfoStream::getNamedStreams() const { return NamedStreams; } + +BinarySubstreamRef InfoStream::getNamedStreamsBuffer() const { + return SubNamedStreams; +} diff --git a/llvm/test/DebugInfo/PDB/pdbdump-raw-bytes.test b/llvm/test/DebugInfo/PDB/pdbdump-raw-bytes.test index 2c5c96c5a380..1087dfb65953 100644 --- a/llvm/test/DebugInfo/PDB/pdbdump-raw-bytes.test +++ b/llvm/test/DebugInfo/PDB/pdbdump-raw-bytes.test @@ -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: ) diff --git a/llvm/tools/llvm-pdbutil/BytesOutputStyle.cpp b/llvm/tools/llvm-pdbutil/BytesOutputStyle.cpp index 9761987f0765..5cf15685fe32 100644 --- a/llvm/tools/llvm-pdbutil/BytesOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/BytesOutputStyle.cpp @@ -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"); diff --git a/llvm/tools/llvm-pdbutil/BytesOutputStyle.h b/llvm/tools/llvm-pdbutil/BytesOutputStyle.h index a2cefbbfb4cd..4cf6937d99b1 100644 --- a/llvm/tools/llvm-pdbutil/BytesOutputStyle.h +++ b/llvm/tools/llvm-pdbutil/BytesOutputStyle.h @@ -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 StreamPurposes; }; } // namespace pdb diff --git a/llvm/tools/llvm-pdbutil/LinePrinter.cpp b/llvm/tools/llvm-pdbutil/LinePrinter.cpp index a5f48f058593..a9761b4337b8 100644 --- a/llvm/tools/llvm-pdbutil/LinePrinter.cpp +++ b/llvm/tools/llvm-pdbutil/LinePrinter.cpp @@ -203,11 +203,12 @@ void LinePrinter::formatMsfStreamData(StringRef Label, PDBFile &File, 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(StringRef Label, PDBFile &File, 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(StringRef Label, PDBFile &File, 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(StringRef Label, PDBFile &File, OS << formatv(" {0}", fmt_align("", AlignStyle::Center, 114, '-')); } + Substream.Offset += Len; } NewLine(); OS << ")"; diff --git a/llvm/tools/llvm-pdbutil/LinePrinter.h b/llvm/tools/llvm-pdbutil/LinePrinter.h index 7ce410d10c0d..68ce321a27ec 100644 --- a/llvm/tools/llvm-pdbutil/LinePrinter.h +++ b/llvm/tools/llvm-pdbutil/LinePrinter.h @@ -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; } diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index bdd8dfa164f4..6204594d8f6e 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -286,6 +286,9 @@ cl::list "is SN[:Start][@Size]"), cl::sub(BytesSubcommand)); +cl::opt NameMap("name-map", cl::desc("Dump bytes of PDB Name Map"), + cl::sub(BytesSubcommand)); + cl::list InputFilenames(cl::Positional, cl::desc(""), cl::OneOrMore, cl::sub(BytesSubcommand)); diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h index 78cea8fba9ce..dc1bbe9ef46c 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h @@ -101,6 +101,7 @@ struct NumberRange { extern llvm::Optional DumpBlockRange; extern llvm::Optional DumpByteRange; extern llvm::cl::list DumpStreamData; +extern llvm::cl::opt NameMap; } // namespace bytes namespace dump {