summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/PDB.cpp3
-rw-r--r--lld/test/COFF/Inputs/pdb-diff-cl.pdbbin0 -> 102400 bytes
-rw-r--r--lld/test/COFF/Inputs/pdb-diff.cpp10
-rw-r--r--lld/test/COFF/Inputs/pdb-diff.objbin0 -> 8602 bytes
-rw-r--r--lld/test/COFF/pdb-diff.test200
-rw-r--r--lld/test/COFF/pdb-source-lines.test2
-rw-r--r--lld/test/COFF/pdb.test2
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h2
-rw-r--r--llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp3
-rw-r--r--llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp2
-rw-r--r--llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp9
-rw-r--r--llvm/tools/llvm-pdbutil/Diff.cpp19
-rw-r--r--llvm/tools/llvm-pdbutil/DiffPrinter.cpp95
-rw-r--r--llvm/tools/llvm-pdbutil/DiffPrinter.h13
-rw-r--r--llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp14
-rw-r--r--llvm/tools/llvm-pdbutil/llvm-pdbutil.h5
16 files changed, 328 insertions, 51 deletions
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index d2cccef6674..e0dc58b2a18 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -410,6 +410,7 @@ void coff::createPDB(StringRef Path, SymbolTable *Symtab,
// Add an Info stream.
auto &InfoBuilder = Builder.getInfoBuilder();
InfoBuilder.setAge(DI ? DI->PDB70.Age : 0);
+ InfoBuilder.setSignature(time(nullptr));
llvm::SmallString<128> NativePath(Path.begin(), Path.end());
llvm::sys::fs::make_absolute(NativePath);
@@ -425,7 +426,7 @@ void coff::createPDB(StringRef Path, SymbolTable *Symtab,
// Add an empty DBI stream.
pdb::DbiStreamBuilder &DbiBuilder = Builder.getDbiBuilder();
- DbiBuilder.setVersionHeader(pdb::PdbDbiV110);
+ DbiBuilder.setVersionHeader(pdb::PdbDbiV70);
// It's not entirely clear what this is, but the * Linker * module uses it.
uint32_t PdbFilePathNI = DbiBuilder.addECName(NativePath);
diff --git a/lld/test/COFF/Inputs/pdb-diff-cl.pdb b/lld/test/COFF/Inputs/pdb-diff-cl.pdb
new file mode 100644
index 00000000000..ba5d8380e7c
--- /dev/null
+++ b/lld/test/COFF/Inputs/pdb-diff-cl.pdb
Binary files differ
diff --git a/lld/test/COFF/Inputs/pdb-diff.cpp b/lld/test/COFF/Inputs/pdb-diff.cpp
new file mode 100644
index 00000000000..7c5d13795f4
--- /dev/null
+++ b/lld/test/COFF/Inputs/pdb-diff.cpp
@@ -0,0 +1,10 @@
+// Build with cl:
+// cl.exe /Z7 pdb-diff.cpp /link /debug /pdb:pdb-diff-cl.pdb
+// /nodefaultlib /entry:main
+// Build with lld (after running the above cl command):
+// lld-link.exe /debug /pdb:pdb-diff-lld.pdb /nodefaultlib
+// /entry:main pdb-diff.obj
+
+void *__purecall = 0;
+
+int main() { return 42; }
diff --git a/lld/test/COFF/Inputs/pdb-diff.obj b/lld/test/COFF/Inputs/pdb-diff.obj
new file mode 100644
index 00000000000..a8948bd0c51
--- /dev/null
+++ b/lld/test/COFF/Inputs/pdb-diff.obj
Binary files differ
diff --git a/lld/test/COFF/pdb-diff.test b/lld/test/COFF/pdb-diff.test
new file mode 100644
index 00000000000..a6352ab4ef5
--- /dev/null
+++ b/lld/test/COFF/pdb-diff.test
@@ -0,0 +1,200 @@
+This test verifies that we produce PDBs compatible with MSVC in various ways.
+We check in a cl-generated object file, PDB, and original source which serve
+as the "baseline" for us to measure against. Then we link the same object
+file with LLD and compare the two PDBs. Since the baseline object file and
+PDB are already checked in, we just run LLD on the object file.
+
+RUN: lld-link /debug /pdb:%T/pdb-diff-lld.pdb /nodefaultlib /entry:main %S/Inputs/pdb-diff.obj
+RUN: llvm-pdbutil diff -result -values=false %T/pdb-diff-lld.pdb %S/Inputs/pdb-diff-cl.pdb | FileCheck %s
+
+CHECK: ----------------------
+CHECK-NEXT: | MSF Super Block |
+CHECK-NEXT: |----------------+---|
+CHECK-NEXT: | File | |
+CHECK-NEXT: |----------------+---|
+CHECK-NEXT: | Block Size | I |
+CHECK-NEXT: |----------------+---|
+CHECK-NEXT: | Block Count |
+CHECK-NEXT: |----------------+---|
+CHECK-NEXT: | Unknown 1 | I |
+CHECK-NEXT: |----------------+---|
+CHECK-NEXT: | Directory Size |
+CHECK-NEXT: |----------------+---|
+CHECK-NEXT: ------------------------------------
+CHECK-NEXT: | Stream Directory |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | File | |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Stream Count | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Old MSF Directory | I |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | PDB Stream | I |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | TPI Stream | I |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | DBI Stream | I |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | IPI Stream | I |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Section Header Data | {{[EI]}} |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Named Stream "/names" | {{[EI]}} |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Named Stream "/LinkInfo" | {{[EI]}} |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Named Stream "/src/heade..." | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Module "{{.*}}pdb-diff.obj" | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Module "* Linker *" | {{[EI]}} |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | TPI Hash | {{[EI]}} |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | IPI Hash | {{[EI]}} |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Global Symbol Hash | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Public Symbol Hash | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Public Symbol Records | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Module "{{.*}}pdb-diff.obj" | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | New FPO Data | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: ------------------------------------
+CHECK-NEXT: | String Table |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | File | |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Number of Strings | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Hash Version | I |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Byte Size |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Signature | I |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | Empty Strings |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | {{.*}}pdb-diff.cpp | {{[EI]}} |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | $T0 $ebp = $...p $T0 8 + = | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: | d:\src\llvm-...er internal) | D |
+CHECK-NEXT: |------------------------------+---|
+CHECK-NEXT: ----------------------------
+CHECK-NEXT: | PDB Stream |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | File | |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Stream Size |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Age | I |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Guid | D |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Signature | D |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Version | I |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Features (set) | I |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Feature | I |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Named Stream Size | D |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | Named Streams (map) | D |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | /names | I |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | /LinkInfo | E |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: | /src/headerblock | D |
+CHECK-NEXT: |----------------------+---|
+CHECK-NEXT: ----------------------------------------------
+CHECK-NEXT: | DBI Stream |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | File | |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Dbi Version | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Age | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Machine | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Flags | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Build Major | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Build Minor | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Build Number | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | PDB DLL Version | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | PDB DLL RBLD | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (FPO) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (Exception) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (Fixup) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (OmapToSrc) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (OmapFromSrc) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (SectionHdr) | {{[EI]}} |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (TokenRidMap) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (Xdata) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (Pdata) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (NewFPO) | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | DBG (SectionHdrOrig) | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Globals Stream | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Publics Stream | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Symbol Records | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Has CTypes | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Is Incrementally Linked | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Is Stripped | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Module Count | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Source File Count | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: |Module "{{.*}}Inputs/pdb-diff.obj"|
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - Modi | D |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | Module "* Linker *" |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - Modi | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - Obj File Name | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - Debug Stream | {{[EI]}} |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - C11 Byte Size | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - C13 Byte Size | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - # of files | I |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - Pdb File Path Index | {{[EI]}} |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - Source File Name Index | {{[EI]}} |
+CHECK-NEXT: |----------------------------------------+---|
+CHECK-NEXT: | - Symbol Byte Size | D |
+CHECK-NEXT: |----------------------------------------+---|
diff --git a/lld/test/COFF/pdb-source-lines.test b/lld/test/COFF/pdb-source-lines.test
index a630ecb22d6..f9e0e5c7487 100644
--- a/lld/test/COFF/pdb-source-lines.test
+++ b/lld/test/COFF/pdb-source-lines.test
@@ -23,7 +23,7 @@ RUN: lld-link -debug -entry:main -nodefaultlib -out:%t.exe -pdb:%t.pdb %t.pdb_li
RUN: llvm-pdbutil pdb2yaml -modules -module-files -subsections=lines,fc %t.pdb | FileCheck %s
CHECK-LABEL: DbiStream:
-CHECK-NEXT: VerHeader: V110
+CHECK-NEXT: VerHeader: V70
CHECK-NEXT: Age: 1
CHECK-NEXT: BuildNumber: 0
CHECK-NEXT: PdbDllVersion: 0
diff --git a/lld/test/COFF/pdb.test b/lld/test/COFF/pdb.test
index b38c8446034..5ad6fcebf41 100644
--- a/lld/test/COFF/pdb.test
+++ b/lld/test/COFF/pdb.test
@@ -30,7 +30,7 @@
# CHECK-NEXT: Features: [ VC140 ]
# CHECK-NEXT: Version: VC70
# CHECK-NEXT: DbiStream:
-# CHECK-NEXT: VerHeader: V110
+# CHECK-NEXT: VerHeader: V70
# CHECK-NEXT: Age: 1
# CHECK-NEXT: BuildNumber: 0
# CHECK-NEXT: PdbDllVersion: 0
diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
index 7d11cf3d6bb..7d676e87ecd 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h
@@ -78,7 +78,7 @@ public:
private:
struct DebugStream {
ArrayRef<uint8_t> Data;
- uint16_t StreamNumber = 0;
+ uint16_t StreamNumber = kInvalidStreamIndex;
};
Error finalize();
diff --git a/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp b/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp
index 78cf2c551c2..0eeac7e4c08 100644
--- a/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp
@@ -252,6 +252,9 @@ Error DbiStream::initializeSectionHeadersData() {
return Error::success();
uint32_t StreamNum = getDebugStreamIndex(DbgHeaderType::SectionHdr);
+ if (StreamNum == kInvalidStreamIndex)
+ return Error::success();
+
if (StreamNum >= Pdb.getNumStreams())
return make_error<RawError>(raw_error_code::no_stream);
diff --git a/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp b/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
index 2993f788434..e49a77b4fce 100644
--- a/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
+++ b/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp
@@ -51,7 +51,7 @@ void DbiStreamBuilder::setSectionMap(ArrayRef<SecMapEntry> SecMap) {
Error DbiStreamBuilder::addDbgStream(pdb::DbgHeaderType Type,
ArrayRef<uint8_t> Data) {
- if (DbgStreams[(int)Type].StreamNumber)
+ if (DbgStreams[(int)Type].StreamNumber != kInvalidStreamIndex)
return make_error<RawError>(raw_error_code::duplicate_entry,
"The specified stream type already exists");
auto ExpectedIndex = Msf.addStream(Data.size());
diff --git a/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp b/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp
index 4f6ebb0cb34..0b6492efc70 100644
--- a/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp
+++ b/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp
@@ -385,8 +385,11 @@ bool PDBFile::hasPDBDbiStream() const { return StreamDBI < getNumStreams(); }
bool PDBFile::hasPDBGlobalsStream() {
auto DbiS = getPDBDbiStream();
- if (!DbiS)
+ if (!DbiS) {
+ consumeError(DbiS.takeError());
return false;
+ }
+
return DbiS->getGlobalSymbolStreamIndex() < getNumStreams();
}
@@ -396,8 +399,10 @@ bool PDBFile::hasPDBIpiStream() const { return StreamIPI < getNumStreams(); }
bool PDBFile::hasPDBPublicsStream() {
auto DbiS = getPDBDbiStream();
- if (!DbiS)
+ if (!DbiS) {
+ consumeError(DbiS.takeError());
return false;
+ }
return DbiS->getPublicSymbolStreamIndex() < getNumStreams();
}
diff --git a/llvm/tools/llvm-pdbutil/Diff.cpp b/llvm/tools/llvm-pdbutil/Diff.cpp
index eda0ce275af..fc374ad3a4c 100644
--- a/llvm/tools/llvm-pdbutil/Diff.cpp
+++ b/llvm/tools/llvm-pdbutil/Diff.cpp
@@ -108,7 +108,8 @@ static std::string shortFilePath(StringRef Path, uint32_t Width) {
}
Error DiffStyle::diffSuperBlock() {
- DiffPrinter D(2, "MSF Super Block", 16, 20, outs());
+ DiffPrinter D(2, "MSF Super Block", 16, 20, opts::diff::PrintResultColumn,
+ opts::diff::PrintValueColumns, outs());
D.printExplicit("File", DiffResult::UNSPECIFIED,
shortFilePath(File1.getFilePath(), 18),
shortFilePath(File2.getFilePath(), 18));
@@ -121,7 +122,8 @@ Error DiffStyle::diffSuperBlock() {
}
Error DiffStyle::diffStreamDirectory() {
- DiffPrinter D(2, "Stream Directory", 30, 20, outs());
+ DiffPrinter D(2, "Stream Directory", 30, 20, opts::diff::PrintResultColumn,
+ opts::diff::PrintValueColumns, outs());
D.printExplicit("File", DiffResult::UNSPECIFIED,
shortFilePath(File1.getFilePath(), 18),
shortFilePath(File2.getFilePath(), 18));
@@ -163,7 +165,8 @@ Error DiffStyle::diffStreamDirectory() {
}
Error DiffStyle::diffStringTable() {
- DiffPrinter D(2, "String Table", 30, 20, outs());
+ DiffPrinter D(2, "String Table", 30, 20, opts::diff::PrintResultColumn,
+ opts::diff::PrintValueColumns, outs());
D.printExplicit("File", DiffResult::UNSPECIFIED,
shortFilePath(File1.getFilePath(), 18),
shortFilePath(File2.getFilePath(), 18));
@@ -251,7 +254,8 @@ Error DiffStyle::diffStringTable() {
Error DiffStyle::diffFreePageMap() { return Error::success(); }
Error DiffStyle::diffInfoStream() {
- DiffPrinter D(2, "PDB Stream", 22, 40, outs());
+ DiffPrinter D(2, "PDB Stream", 22, 40, opts::diff::PrintResultColumn,
+ opts::diff::PrintValueColumns, outs());
D.printExplicit("File", DiffResult::UNSPECIFIED,
shortFilePath(File1.getFilePath(), 38),
shortFilePath(File2.getFilePath(), 38));
@@ -345,10 +349,11 @@ getModuleDescriptors(const DbiModuleList &ML) {
}
Error DiffStyle::diffDbiStream() {
- DiffPrinter D(2, "DBI Stream", 40, 30, outs());
+ DiffPrinter D(2, "DBI Stream", 40, 30, opts::diff::PrintResultColumn,
+ opts::diff::PrintValueColumns, outs());
D.printExplicit("File", DiffResult::UNSPECIFIED,
- shortFilePath(File1.getFilePath(), 38),
- shortFilePath(File2.getFilePath(), 38));
+ shortFilePath(File1.getFilePath(), 28),
+ shortFilePath(File2.getFilePath(), 28));
auto ExpectedDbi1 = File1.getPDBDbiStream();
auto ExpectedDbi2 = File2.getPDBDbiStream();
diff --git a/llvm/tools/llvm-pdbutil/DiffPrinter.cpp b/llvm/tools/llvm-pdbutil/DiffPrinter.cpp
index b608d54d0e2..8deb69309b0 100644
--- a/llvm/tools/llvm-pdbutil/DiffPrinter.cpp
+++ b/llvm/tools/llvm-pdbutil/DiffPrinter.cpp
@@ -22,35 +22,60 @@ static void setColor(llvm::raw_ostream &OS, DiffResult Result) {
DiffPrinter::DiffPrinter(uint32_t Indent, StringRef Header,
uint32_t PropertyWidth, uint32_t FieldWidth,
- raw_ostream &Stream)
- : Indent(Indent), PropertyWidth(PropertyWidth), FieldWidth(FieldWidth),
- OS(Stream) {
+ bool Result, bool Fields, raw_ostream &Stream)
+ : PrintResult(Result), PrintValues(Fields), Indent(Indent),
+ PropertyWidth(PropertyWidth), FieldWidth(FieldWidth), OS(Stream) {
printHeaderRow();
printFullRow(Header);
}
DiffPrinter::~DiffPrinter() {}
+uint32_t DiffPrinter::tableWidth() const {
+ // `|`
+ uint32_t W = 1;
+
+ // `<width>|`
+ W += PropertyWidth + 1;
+
+ if (PrintResult) {
+ // ` I |`
+ W += 4;
+ }
+
+ if (PrintValues) {
+ // `<width>|<width>|`
+ W += 2 * (FieldWidth + 1);
+ }
+ return W;
+}
+
void DiffPrinter::printFullRow(StringRef Text) {
newLine();
- printField(Text, DiffResult::UNSPECIFIED, AlignStyle::Center,
- PropertyWidth + 1 + FieldWidth + 1 + FieldWidth);
+ printValue(Text, DiffResult::UNSPECIFIED, AlignStyle::Center,
+ tableWidth() - 2, true);
printSeparatorRow();
}
void DiffPrinter::printSeparatorRow() {
newLine();
OS << formatv("{0}", fmt_repeat('-', PropertyWidth));
- OS << '+';
- OS << formatv("{0}", fmt_repeat('-', FieldWidth));
- OS << '+';
- OS << formatv("{0}", fmt_repeat('-', FieldWidth));
+ if (PrintResult) {
+ OS << '+';
+ OS << formatv("{0}", fmt_repeat('-', 3));
+ }
+ if (PrintValues) {
+ OS << '+';
+ OS << formatv("{0}", fmt_repeat('-', FieldWidth));
+ OS << '+';
+ OS << formatv("{0}", fmt_repeat('-', FieldWidth));
+ }
OS << '|';
}
void DiffPrinter::printHeaderRow() {
newLine('-');
- OS << formatv("{0}", fmt_repeat('-', PropertyWidth + 2 * FieldWidth + 3));
+ OS << formatv("{0}", fmt_repeat('-', tableWidth() - 1));
}
void DiffPrinter::newLine(char InitialChar) {
@@ -61,34 +86,40 @@ void DiffPrinter::newLine(char InitialChar) {
void DiffPrinter::printExplicit(StringRef Property, DiffResult C,
StringRef Left, StringRef Right) {
newLine();
- printField(Property, DiffResult::UNSPECIFIED, AlignStyle::Right,
- PropertyWidth);
- printField(Left, C, AlignStyle::Center, FieldWidth);
- printField(Right, C, AlignStyle::Center, FieldWidth);
+ printValue(Property, DiffResult::UNSPECIFIED, AlignStyle::Right,
+ PropertyWidth, true);
+ printResult(C);
+ printValue(Left, C, AlignStyle::Center, FieldWidth, false);
+ printValue(Right, C, AlignStyle::Center, FieldWidth, false);
printSeparatorRow();
}
-void DiffPrinter::printSame(StringRef Property, StringRef Value) {
- newLine();
- printField(Property, DiffResult::UNSPECIFIED, AlignStyle::Right,
- PropertyWidth);
- printField(Value, DiffResult::IDENTICAL, AlignStyle::Center,
- FieldWidth + 1 + FieldWidth);
- printSeparatorRow();
+void DiffPrinter::printResult(DiffResult Result) {
+ if (!PrintResult)
+ return;
+ switch (Result) {
+ case DiffResult::DIFFERENT:
+ printValue("D", Result, AlignStyle::Center, 3, true);
+ break;
+ case DiffResult::EQUIVALENT:
+ printValue("E", Result, AlignStyle::Center, 3, true);
+ break;
+ case DiffResult::IDENTICAL:
+ printValue("I", Result, AlignStyle::Center, 3, true);
+ break;
+ case DiffResult::UNSPECIFIED:
+ printValue(" ", Result, AlignStyle::Center, 3, true);
+ break;
+ default:
+ llvm_unreachable("unreachable!");
+ }
}
-void DiffPrinter::printDifferent(StringRef Property, StringRef Left,
- StringRef Right) {
- newLine();
- printField(Property, DiffResult::UNSPECIFIED, AlignStyle::Right,
- PropertyWidth);
- printField(Left, DiffResult::DIFFERENT, AlignStyle::Center, FieldWidth);
- printField(Right, DiffResult::DIFFERENT, AlignStyle::Center, FieldWidth);
- printSeparatorRow();
-}
+void DiffPrinter::printValue(StringRef Value, DiffResult C, AlignStyle Style,
+ uint32_t Width, bool Force) {
+ if (!Force && !PrintValues)
+ return;
-void DiffPrinter::printField(StringRef Value, DiffResult C, AlignStyle Style,
- uint32_t Width) {
if (Style == AlignStyle::Right)
--Width;
diff --git a/llvm/tools/llvm-pdbutil/DiffPrinter.h b/llvm/tools/llvm-pdbutil/DiffPrinter.h
index 8a4527c6274..1235befa1c2 100644
--- a/llvm/tools/llvm-pdbutil/DiffPrinter.h
+++ b/llvm/tools/llvm-pdbutil/DiffPrinter.h
@@ -51,7 +51,8 @@ struct EquivalentDiffProvider {
class DiffPrinter {
public:
DiffPrinter(uint32_t Indent, StringRef Header, uint32_t PropertyWidth,
- uint32_t FieldWidth, raw_ostream &Stream);
+ uint32_t FieldWidth, bool Result, bool Values,
+ raw_ostream &Stream);
~DiffPrinter();
template <typename T, typename U> struct Identical {};
@@ -138,15 +139,17 @@ public:
void printFullRow(StringRef Text);
private:
- void printSame(StringRef Property, StringRef Value);
- void printDifferent(StringRef Property, StringRef Left, StringRef Right);
+ uint32_t tableWidth() const;
void printHeaderRow();
void printSeparatorRow();
void newLine(char InitialChar = '|');
- void printField(StringRef Value, DiffResult C, AlignStyle Style,
- uint32_t Width);
+ void printValue(StringRef Value, DiffResult C, AlignStyle Style,
+ uint32_t Width, bool Force);
+ void printResult(DiffResult Result);
+ bool PrintResult;
+ bool PrintValues;
uint32_t Indent;
uint32_t PropertyWidth;
uint32_t FieldWidth;
diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
index f3bfa8f7b35..6432b9ce86c 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
@@ -284,6 +284,15 @@ cl::opt<bool> NoEnumDefs("no-enum-definitions",
}
namespace diff {
+cl::opt<bool> PrintValueColumns(
+ "values", cl::init(true),
+ cl::desc("Print one column for each PDB with the field value"),
+ cl::Optional, cl::sub(DiffSubcommand));
+cl::opt<bool>
+ PrintResultColumn("result", cl::init(false),
+ cl::desc("Print a column with the result status"),
+ cl::Optional, cl::sub(DiffSubcommand));
+
cl::list<std::string> InputFilenames(cl::Positional,
cl::desc("<first> <second>"),
cl::OneOrMore, cl::sub(DiffSubcommand));
@@ -1079,6 +1088,11 @@ int main(int argc_, const char *argv_[]) {
if (opts::pdb2yaml::DumpModules)
opts::pdb2yaml::DbiStream = true;
}
+ if (opts::DiffSubcommand) {
+ if (!opts::diff::PrintResultColumn && !opts::diff::PrintValueColumns) {
+ llvm::errs() << "WARNING: No diff columns specified\n";
+ }
+ }
llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h
index 9ee5866bbef..b8e1cf4ed15 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h
@@ -168,6 +168,11 @@ extern llvm::cl::opt<bool> DumpModuleFiles;
extern llvm::cl::list<ModuleSubsection> DumpModuleSubsections;
extern llvm::cl::opt<bool> DumpModuleSyms;
} // namespace pdb2yaml
+
+namespace diff {
+extern llvm::cl::opt<bool> PrintValueColumns;
+extern llvm::cl::opt<bool> PrintResultColumn;
+} // namespace diff
}
#endif
OpenPOWER on IntegriCloud