diff options
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/CodeView.h | 7 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/EnumTables.h | 1 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/Line.h | 11 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h | 35 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/EnumTables.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp | 16 | ||||
-rw-r--r-- | llvm/test/DebugInfo/PDB/pdbdump-headers.test | 22 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 18 |
8 files changed, 82 insertions, 38 deletions
diff --git a/llvm/include/llvm/DebugInfo/CodeView/CodeView.h b/llvm/include/llvm/DebugInfo/CodeView/CodeView.h index a597d5426c0..0c5813f35ee 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/CodeView.h +++ b/llvm/include/llvm/DebugInfo/CodeView/CodeView.h @@ -537,6 +537,13 @@ enum class ThunkOrdinal { }; enum class TrampolineType { TrampIncremental, BranchIsland }; + +// These values correspond to the CV_SourceChksum_t enumeration. +enum class FileChecksumKind : uint8_t { None, MD5, SHA1, SHA256 }; + +enum LineFlags : uint32_t { + HaveColumns = 1, // CV_LINES_HAVE_COLUMNS +}; } } diff --git a/llvm/include/llvm/DebugInfo/CodeView/EnumTables.h b/llvm/include/llvm/DebugInfo/CodeView/EnumTables.h index d1b103dae3b..0999f211d64 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/EnumTables.h +++ b/llvm/include/llvm/DebugInfo/CodeView/EnumTables.h @@ -27,6 +27,7 @@ ArrayRef<EnumEntry<uint32_t>> getFrameCookieKindNames(); ArrayRef<EnumEntry<SourceLanguage>> getSourceLanguageNames(); ArrayRef<EnumEntry<uint32_t>> getCompileSym2FlagNames(); ArrayRef<EnumEntry<uint32_t>> getCompileSym3FlagNames(); +ArrayRef<EnumEntry<uint32_t>> getFileChecksumNames(); ArrayRef<EnumEntry<unsigned>> getCPUTypeNames(); ArrayRef<EnumEntry<uint32_t>> getFrameProcSymFlagNames(); ArrayRef<EnumEntry<uint16_t>> getExportSymFlagNames(); diff --git a/llvm/include/llvm/DebugInfo/CodeView/Line.h b/llvm/include/llvm/DebugInfo/CodeView/Line.h index bf2d55096b0..278400742b1 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/Line.h +++ b/llvm/include/llvm/DebugInfo/CodeView/Line.h @@ -141,13 +141,6 @@ struct InlineeSourceLine { // ulittle32_t Files[]; }; -enum class FileChecksumKind : uint8_t { - None, - MD5, - SHA1, - SHA256 -}; - struct FileChecksum { ulittle32_t FileNameOffset; // Offset of filename in string table substream. uint8_t ChecksumSize; @@ -155,10 +148,6 @@ struct FileChecksum { // Checksum bytes follow. }; -enum LineFlags : uint32_t { - HaveColumns = 1, // CV_LINES_HAVE_COLUMNS -}; - } // namespace codeview } // namespace llvm diff --git a/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h b/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h index 7542de3d04c..1c15512e98b 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h +++ b/llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h @@ -26,9 +26,9 @@ struct LineColumnEntry { FixedStreamArray<ColumnNumberEntry> Columns; }; -class FileLineInfoExtractor { +template <> class VarStreamArrayExtractor<LineColumnEntry> { public: - FileLineInfoExtractor(const LineSubstreamHeader *Header) : Header(Header) {} + VarStreamArrayExtractor(const LineSubstreamHeader *Header) : Header(Header) {} Error operator()(StreamRef Stream, uint32_t &Len, LineColumnEntry &Item) const { @@ -64,7 +64,31 @@ private: const LineSubstreamHeader *Header; }; -typedef VarStreamArray<LineColumnEntry, FileLineInfoExtractor> LineInfoArray; +struct FileChecksumEntry { + uint32_t FileNameOffset; + FileChecksumKind Kind; + ArrayRef<uint8_t> Checksum; +}; + +template <> class VarStreamArrayExtractor<FileChecksumEntry> { +public: + Error operator()(StreamRef Stream, uint32_t &Len, + FileChecksumEntry &Item) const { + const FileChecksum *Header; + StreamReader Reader(Stream); + if (auto EC = Reader.readObject(Header)) + return EC; + Item.FileNameOffset = Header->FileNameOffset; + Item.Kind = static_cast<FileChecksumKind>(Header->ChecksumKind); + if (auto EC = Reader.readBytes(Item.Checksum, Header->ChecksumSize)) + return EC; + Len = sizeof(FileChecksum) + Header->ChecksumSize; + return Error::success(); + } +}; + +typedef VarStreamArray<LineColumnEntry> LineInfoArray; +typedef VarStreamArray<FileChecksumEntry> FileChecksumArray; class IModuleSubstreamVisitor { public: @@ -73,9 +97,10 @@ public: virtual Error visitUnknown(ModuleSubstreamKind Kind, StreamRef Data) = 0; virtual Error visitSymbols(StreamRef Data); virtual Error visitLines(StreamRef Data, const LineSubstreamHeader *Header, - LineInfoArray Lines); + const LineInfoArray &Lines); virtual Error visitStringTable(StreamRef Data); - virtual Error visitFileChecksums(StreamRef Data); + virtual Error visitFileChecksums(StreamRef Data, + const FileChecksumArray &Checksums); virtual Error visitFrameData(StreamRef Data); virtual Error visitInlineeLines(StreamRef Data); virtual Error visitCrossScopeImports(StreamRef Data); diff --git a/llvm/lib/DebugInfo/CodeView/EnumTables.cpp b/llvm/lib/DebugInfo/CodeView/EnumTables.cpp index edb489767d4..d71fec61344 100644 --- a/llvm/lib/DebugInfo/CodeView/EnumTables.cpp +++ b/llvm/lib/DebugInfo/CodeView/EnumTables.cpp @@ -147,6 +147,13 @@ static const EnumEntry<uint32_t> CompileSym3FlagNames[] = { CV_ENUM_CLASS_ENT(CompileSym3Flags, Exp), }; +static const EnumEntry<uint32_t> FileChecksumNames[] = { + CV_ENUM_CLASS_ENT(FileChecksumKind, None), + CV_ENUM_CLASS_ENT(FileChecksumKind, MD5), + CV_ENUM_CLASS_ENT(FileChecksumKind, SHA1), + CV_ENUM_CLASS_ENT(FileChecksumKind, SHA256), +}; + static const EnumEntry<unsigned> CPUTypeNames[] = { CV_ENUM_CLASS_ENT(CPUType, Intel8080), CV_ENUM_CLASS_ENT(CPUType, Intel8086), @@ -339,6 +346,9 @@ ArrayRef<EnumEntry<uint32_t>> getCompileSym2FlagNames() { ArrayRef<EnumEntry<uint32_t>> getCompileSym3FlagNames() { return makeArrayRef(CompileSym3FlagNames); } +ArrayRef<EnumEntry<uint32_t>> getFileChecksumNames() { + return makeArrayRef(FileChecksumNames); +} ArrayRef<EnumEntry<unsigned>> getCPUTypeNames() { return makeArrayRef(CPUTypeNames); } diff --git a/llvm/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp b/llvm/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp index 7b5c3506aa7..6f237ee67fe 100644 --- a/llvm/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp +++ b/llvm/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp @@ -17,13 +17,14 @@ Error IModuleSubstreamVisitor::visitSymbols(StreamRef Data) { } Error IModuleSubstreamVisitor::visitLines(StreamRef Data, const LineSubstreamHeader *Header, - LineInfoArray Lines) { + const LineInfoArray &Lines) { return visitUnknown(ModuleSubstreamKind::Lines, Data); } Error IModuleSubstreamVisitor::visitStringTable(StreamRef Data) { return visitUnknown(ModuleSubstreamKind::StringTable, Data); } -Error IModuleSubstreamVisitor::visitFileChecksums(StreamRef Data) { +Error IModuleSubstreamVisitor::visitFileChecksums( + StreamRef Data, const FileChecksumArray &Checksums) { return visitUnknown(ModuleSubstreamKind::FileChecksums, Data); } Error IModuleSubstreamVisitor::visitFrameData(StreamRef Data) { @@ -64,7 +65,7 @@ Error llvm::codeview::visitModuleSubstream(const ModuleSubstream &R, const LineSubstreamHeader *Header; if (auto EC = Reader.readObject(Header)) return EC; - FileLineInfoExtractor E(Header); + VarStreamArrayExtractor<LineColumnEntry> E(Header); LineInfoArray LineInfos(E); if (auto EC = Reader.readArray(LineInfos, Reader.bytesRemaining())) return EC; @@ -72,8 +73,13 @@ Error llvm::codeview::visitModuleSubstream(const ModuleSubstream &R, } case ModuleSubstreamKind::StringTable: return V.visitStringTable(R.getRecordData()); - case ModuleSubstreamKind::FileChecksums: - return V.visitFileChecksums(R.getRecordData()); + case ModuleSubstreamKind::FileChecksums: { + StreamReader Reader(R.getRecordData()); + FileChecksumArray Checksums; + if (auto EC = Reader.readArray(Checksums, Reader.bytesRemaining())) + return EC; + return V.visitFileChecksums(R.getRecordData(), Checksums); + } case ModuleSubstreamKind::FrameData: return V.visitFrameData(R.getRecordData()); case ModuleSubstreamKind::InlineeLines: diff --git a/llvm/test/DebugInfo/PDB/pdbdump-headers.test b/llvm/test/DebugInfo/PDB/pdbdump-headers.test index c7613affc74..136e4005ef9 100644 --- a/llvm/test/DebugInfo/PDB/pdbdump-headers.test +++ b/llvm/test/DebugInfo/PDB/pdbdump-headers.test @@ -70,9 +70,9 @@ ; EMPTY-NEXT: Version: 1 ; EMPTY-NEXT: Name Count: 4 ; EMPTY-NEXT: Names [ -; EMPTY-NEXT: d:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal) -; EMPTY-NEXT: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp -; EMPTY-NEXT: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = +; EMPTY-NEXT: 1: d:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal) +; EMPTY-NEXT: 86: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp +; EMPTY-NEXT: 134: $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = ; EMPTY-NEXT: ] ; EMPTY-NEXT: } ; EMPTY-NEXT: Type Info Stream (TPI) { @@ -351,17 +351,15 @@ ; EMPTY-NEXT: EndDelta: 0 ; EMPTY-NEXT: IsStatement: Yes ; EMPTY-NEXT: } -; EMPTY-NEXT: Data ( -; EMPTY-NEXT: 0000: 10000000 01000000 0A000000 00000000 |................| -; EMPTY-NEXT: 0010: 03000000 24000000 00000000 05000080 |....$...........| -; EMPTY-NEXT: 0020: 03000000 06000080 08000000 07000080 |................| -; EMPTY-NEXT: ) ; EMPTY-NEXT: } ; EMPTY-NEXT: FileChecksums { -; EMPTY-NEXT: Data ( -; EMPTY-NEXT: 0000: 56000000 1001A0A5 BD0D3ECD 93FC29D1 |V.........>...).| -; EMPTY-NEXT: 0010: 9DE826FB F4BC0000 |..&.....| -; EMPTY-NEXT: ) +; EMPTY-NEXT: Checksum { +; EMPTY-NEXT: FileNameOffset: 86 +; EMPTY-NEXT: Kind: MD5 (0x1) +; EMPTY-NEXT: Checksum ( +; EMPTY-NEXT: 0000: A0A5BD0D 3ECD93FC 29D19DE8 26FBF4BC |....>...)...&...| +; EMPTY-NEXT: ) +; EMPTY-NEXT: } ; EMPTY-NEXT: } ; EMPTY-NEXT: ] ; EMPTY-NEXT: } diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index 30fe5995074..dcaf494ee5c 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -427,7 +427,7 @@ static Error dumpNamedStream(ScopedPrinter &P, PDBFile &File) { for (uint32_t ID : NameTable.name_ids()) { StringRef Str = NameTable.getStringForID(ID); if (!Str.empty()) - P.printString(Str); + P.printString(to_string(ID), Str); } } return Error::success(); @@ -528,13 +528,21 @@ static Error dumpDbiStream(ScopedPrinter &P, PDBFile &File, DictScope DD(P, "Unknown"); return printBinaryData(Data); } - Error visitFileChecksums(StreamRef Data) override { + Error + visitFileChecksums(StreamRef Data, + const FileChecksumArray &Checksums) override { DictScope DD(P, "FileChecksums"); - return printBinaryData(Data); + for (const auto &C : Checksums) { + DictScope DDD(P, "Checksum"); + P.printNumber("FileNameOffset", C.FileNameOffset); + P.printEnum("Kind", uint8_t(C.Kind), getFileChecksumNames()); + P.printBinaryBlock("Checksum", C.Checksum); + } + return Error::success(); } Error visitLines(StreamRef Data, const LineSubstreamHeader *Header, - LineInfoArray Lines) override { + const LineInfoArray &Lines) override { DictScope DD(P, "Lines"); for (const auto &L : Lines) { P.printNumber("FileOffset", L.Offset); @@ -557,7 +565,7 @@ static Error dumpDbiStream(ScopedPrinter &P, PDBFile &File, P.printNumber("End", C.EndColumn); } } - return printBinaryData(Data); + return Error::success(); } private: |