summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/CodeView.h7
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/EnumTables.h1
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/Line.h11
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h35
-rw-r--r--llvm/lib/DebugInfo/CodeView/EnumTables.cpp10
-rw-r--r--llvm/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp16
-rw-r--r--llvm/test/DebugInfo/PDB/pdbdump-headers.test22
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp18
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:
OpenPOWER on IntegriCloud