diff options
Diffstat (limited to 'llvm')
-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 |
9 files changed, 114 insertions, 48 deletions
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 |