diff options
-rw-r--r-- | lld/COFF/PDB.cpp | 3 | ||||
-rw-r--r-- | lld/test/COFF/Inputs/pdb-diff-cl.pdb | bin | 0 -> 102400 bytes | |||
-rw-r--r-- | lld/test/COFF/Inputs/pdb-diff.cpp | 10 | ||||
-rw-r--r-- | lld/test/COFF/Inputs/pdb-diff.obj | bin | 0 -> 8602 bytes | |||
-rw-r--r-- | lld/test/COFF/pdb-diff.test | 200 | ||||
-rw-r--r-- | lld/test/COFF/pdb-source-lines.test | 2 | ||||
-rw-r--r-- | lld/test/COFF/pdb.test | 2 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h | 2 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp | 9 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/Diff.cpp | 19 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/DiffPrinter.cpp | 95 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/DiffPrinter.h | 13 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 14 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/llvm-pdbutil.h | 5 |
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 Binary files differnew file mode 100644 index 00000000000..ba5d8380e7c --- /dev/null +++ b/lld/test/COFF/Inputs/pdb-diff-cl.pdb 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 Binary files differnew file mode 100644 index 00000000000..a8948bd0c51 --- /dev/null +++ b/lld/test/COFF/Inputs/pdb-diff.obj 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 |