diff options
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp | 143 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/DumpOutputStyle.h | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/InputFile.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp | 3 |
4 files changed, 106 insertions, 47 deletions
diff --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp index 9e59adc7196..c628b148f60 100644 --- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp @@ -65,6 +65,16 @@ DumpOutputStyle::DumpOutputStyle(InputFile &File) PDBFile &DumpOutputStyle::getPdb() { return File.pdb(); } object::COFFObjectFile &DumpOutputStyle::getObj() { return File.obj(); } +void DumpOutputStyle::printStreamNotValidForObj() { + AutoIndent Indent(P, 4); + P.formatLine("Dumping this stream is not valid for object files"); +} + +void DumpOutputStyle::printStreamNotPresent(StringRef StreamName) { + AutoIndent Indent(P, 4); + P.formatLine("{0} stream not present", StreamName); +} + Error DumpOutputStyle::dump() { if (opts::dump::DumpSummary) { if (auto EC = dumpFileSummary()) @@ -199,14 +209,14 @@ static void printHeader(LinePrinter &P, const Twine &S) { Error DumpOutputStyle::dumpFileSummary() { printHeader(P, "Summary"); - ExitOnError Err("Invalid PDB Format: "); - - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping File summary is not valid for object files"); + printStreamNotValidForObj(); return Error::success(); } + AutoIndent Indent(P); + ExitOnError Err("Invalid PDB Format: "); + P.formatLine("Block Size: {0}", getPdb().getBlockSize()); P.formatLine("Number of blocks: {0}", getPdb().getBlockCount()); P.formatLine("Number of streams: {0}", getPdb().getNumStreams()); @@ -326,12 +336,13 @@ static bool shouldDumpSymbolGroup(uint32_t Idx, const SymbolGroup &Group) { Error DumpOutputStyle::dumpStreamSummary() { printHeader(P, "Streams"); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping streams is not valid for object files"); + printStreamNotValidForObj(); return Error::success(); } + AutoIndent Indent(P); + if (StreamPurposes.empty()) discoverStreamPurposes(getPdb(), StreamPurposes); @@ -527,18 +538,18 @@ static void dumpSectionContrib(LinePrinter &P, const SectionContrib2 &SC, Error DumpOutputStyle::dumpModules() { printHeader(P, "Modules"); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping modules is not supported for object files"); + printStreamNotValidForObj(); return Error::success(); } if (!getPdb().hasPDBDbiStream()) { - P.formatLine("DBI Stream not present"); + printStreamNotPresent("DBI"); return Error::success(); } + AutoIndent Indent(P); ExitOnError Err("Unexpected error processing modules: "); auto &Stream = Err(getPdb().getPDBDbiStream()); @@ -570,7 +581,12 @@ Error DumpOutputStyle::dumpModuleFiles() { printHeader(P, "Files"); if (File.isObj()) { - P.formatLine("Dumping files is not valid for object files"); + printStreamNotValidForObj(); + return Error::success(); + } + + if (!getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); return Error::success(); } @@ -591,6 +607,11 @@ Error DumpOutputStyle::dumpModuleFiles() { Error DumpOutputStyle::dumpSymbolStats() { printHeader(P, "Module Stats"); + if (File.isPdb() && !getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); + return Error::success(); + } + ExitOnError Err("Unexpected error processing modules: "); StatCollection SymStats; @@ -625,9 +646,9 @@ Error DumpOutputStyle::dumpSymbolStats() { } }); - P.printLine(" Summary |"); - AutoIndent Indent(P, 4); if (SymStats.Totals.Count > 0) { + P.printLine(" Summary |"); + AutoIndent Indent(P, 4); printModuleDetailStats<SymbolKind>(P, "Symbols", SymStats); printModuleDetailStats<DebugSubsectionKind>(P, "Chunks", ChunkStats); } @@ -680,6 +701,11 @@ static uint32_t getLongestTypeLeafName(const StatCollection &Stats) { Error DumpOutputStyle::dumpUdtStats() { printHeader(P, "S_UDT Record Stats"); + if (File.isPdb() && !getPdb().hasPDBGlobalsStream()) { + printStreamNotPresent("Globals"); + return Error::success(); + } + StatCollection UdtStats; StatCollection UdtTargetStats; AutoIndent Indent(P, 4); @@ -726,11 +752,6 @@ Error DumpOutputStyle::dumpUdtStats() { P.NewLine(); if (File.isPdb()) { - if (!getPdb().hasPDBGlobalsStream()) { - P.printLine("- Error: globals stream not present"); - return Error::success(); - } - auto &SymbolRecords = cantFail(getPdb().getPDBSymbolStream()); auto ExpGlobals = getPdb().getPDBGlobalsStream(); if (!ExpGlobals) @@ -839,6 +860,11 @@ static void typesetLinesAndColumns(LinePrinter &P, uint32_t Start, Error DumpOutputStyle::dumpLines() { printHeader(P, "Lines"); + if (File.isPdb() && !getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); + return Error::success(); + } + uint32_t LastModi = UINT32_MAX; uint32_t LastNameIndex = UINT32_MAX; iterateModuleSubsections<DebugLinesSubsectionRef>( @@ -875,6 +901,11 @@ Error DumpOutputStyle::dumpLines() { Error DumpOutputStyle::dumpInlineeLines() { printHeader(P, "Inlinee Lines"); + if (File.isPdb() && !getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); + return Error::success(); + } + iterateModuleSubsections<DebugInlineeLinesSubsectionRef>( File, PrintScope{P, 2}, [this](uint32_t Modi, const SymbolGroup &Strings, @@ -893,6 +924,12 @@ Error DumpOutputStyle::dumpInlineeLines() { Error DumpOutputStyle::dumpXmi() { printHeader(P, "Cross Module Imports"); + + if (File.isPdb() && !getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); + return Error::success(); + } + iterateModuleSubsections<DebugCrossModuleImportsSubsectionRef>( File, PrintScope{P, 2}, [this](uint32_t Modi, const SymbolGroup &Strings, @@ -929,6 +966,11 @@ Error DumpOutputStyle::dumpXmi() { Error DumpOutputStyle::dumpXme() { printHeader(P, "Cross Module Exports"); + if (File.isPdb() && !getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); + return Error::success(); + } + iterateModuleSubsections<DebugCrossModuleExportsSubsectionRef>( File, PrintScope{P, 2}, [this](uint32_t Modi, const SymbolGroup &Strings, @@ -1037,12 +1079,13 @@ Error DumpOutputStyle::dumpStringTableFromObj() { Error DumpOutputStyle::dumpNamedStreams() { printHeader(P, "Named Streams"); - AutoIndent Indent(P, 2); if (File.isObj()) { - P.formatLine("Dumping Named Streams is only supported for PDB files."); + printStreamNotValidForObj(); return Error::success(); } + + AutoIndent Indent(P); ExitOnError Err("Invalid PDB File: "); auto &IS = Err(File.pdb().getPDBInfoStream()); @@ -1204,7 +1247,6 @@ Error DumpOutputStyle::dumpTpiStream(uint32_t StreamIdx) { printHeader(P, "Types (IPI Stream)"); } - AutoIndent Indent(P); assert(!File.isObj()); bool Present = false; @@ -1229,10 +1271,11 @@ Error DumpOutputStyle::dumpTpiStream(uint32_t StreamIdx) { } if (!Present) { - P.formatLine("Stream not present"); + printStreamNotPresent(StreamIdx == StreamTPI ? "TPI" : "IPI"); return Error::success(); } + AutoIndent Indent(P); ExitOnError Err("Unexpected error processing types: "); auto &Stream = Err((StreamIdx == StreamTPI) ? getPdb().getPDBTpiStream() @@ -1321,12 +1364,12 @@ Error DumpOutputStyle::dumpModuleSymsForObj() { Error DumpOutputStyle::dumpModuleSymsForPdb() { printHeader(P, "Symbols"); - AutoIndent Indent(P); - if (!getPdb().hasPDBDbiStream()) { - P.formatLine("DBI Stream not present"); + if (File.isPdb() && !getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); return Error::success(); } + AutoIndent Indent(P); ExitOnError Err("Unexpected error processing symbols: "); auto &Ids = File.ids(); @@ -1364,18 +1407,19 @@ Error DumpOutputStyle::dumpModuleSymsForPdb() { Error DumpOutputStyle::dumpGSIRecords() { printHeader(P, "GSI Records"); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping Globals is not supported for object files"); + printStreamNotValidForObj(); return Error::success(); } if (!getPdb().hasPDBSymbolStream()) { - P.formatLine("GSI Common Symbol Stream not present"); + printStreamNotPresent("GSI Common Symbol"); return Error::success(); } + AutoIndent Indent(P); + auto &Records = cantFail(getPdb().getPDBSymbolStream()); auto &Types = File.types(); auto &Ids = File.ids(); @@ -1397,17 +1441,18 @@ Error DumpOutputStyle::dumpGSIRecords() { Error DumpOutputStyle::dumpGlobals() { printHeader(P, "Global Symbols"); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping Globals is not supported for object files"); + printStreamNotValidForObj(); return Error::success(); } if (!getPdb().hasPDBGlobalsStream()) { - P.formatLine("Globals stream not present"); + printStreamNotPresent("Globals"); return Error::success(); } + + AutoIndent Indent(P); ExitOnError Err("Error dumping globals stream: "); auto &Globals = Err(getPdb().getPDBGlobalsStream()); @@ -1418,17 +1463,18 @@ Error DumpOutputStyle::dumpGlobals() { Error DumpOutputStyle::dumpPublics() { printHeader(P, "Public Symbols"); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping Globals is not supported for object files"); + printStreamNotValidForObj(); return Error::success(); } if (!getPdb().hasPDBPublicsStream()) { - P.formatLine("Publics stream not present"); + printStreamNotPresent("Publics"); return Error::success(); } + + AutoIndent Indent(P); ExitOnError Err("Error dumping publics stream: "); auto &Publics = Err(getPdb().getPDBPublicsStream()); @@ -1560,12 +1606,17 @@ Error DumpOutputStyle::dumpSectionHeaders() { void DumpOutputStyle::dumpSectionHeaders(StringRef Label, DbgHeaderType Type) { printHeader(P, Label); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping Section Headers is not supported for object files"); + printStreamNotValidForObj(); + return; + } + + if (!getPdb().hasPDBDbiStream()) { + printStreamNotPresent("DBI"); return; } + AutoIndent Indent(P); ExitOnError Err("Error dumping section headers: "); std::unique_ptr<MappedBlockStream> Stream; ArrayRef<object::coff_section> Headers; @@ -1606,20 +1657,19 @@ void DumpOutputStyle::dumpSectionHeaders(StringRef Label, DbgHeaderType Type) { Error DumpOutputStyle::dumpSectionContribs() { printHeader(P, "Section Contributions"); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine( - "Dumping section contributions is not supported for object files"); + printStreamNotValidForObj(); return Error::success(); } - ExitOnError Err("Error dumping section contributions: "); if (!getPdb().hasPDBDbiStream()) { - P.formatLine( - "Section contribs require a DBI Stream, which could not be loaded"); + printStreamNotPresent("DBI"); return Error::success(); } + AutoIndent Indent(P); + ExitOnError Err("Error dumping section contributions: "); + auto &Dbi = Err(getPdb().getPDBDbiStream()); class Visitor : public ISectionContribVisitor { @@ -1651,21 +1701,20 @@ Error DumpOutputStyle::dumpSectionContribs() { Error DumpOutputStyle::dumpSectionMap() { printHeader(P, "Section Map"); - AutoIndent Indent(P); if (File.isObj()) { - P.formatLine("Dumping section map is not supported for object files"); + printStreamNotValidForObj(); return Error::success(); } - ExitOnError Err("Error dumping section map: "); - if (!getPdb().hasPDBDbiStream()) { - P.formatLine("Dumping the section map requires a DBI Stream, which could " - "not be loaded"); + printStreamNotPresent("DBI"); return Error::success(); } + AutoIndent Indent(P); + ExitOnError Err("Error dumping section map: "); + auto &Dbi = Err(getPdb().getPDBDbiStream()); uint32_t I = 0; diff --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.h b/llvm/tools/llvm-pdbutil/DumpOutputStyle.h index e7e9252f2fa..5232a07fbf1 100644 --- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.h +++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.h @@ -70,6 +70,9 @@ private: PDBFile &getPdb(); object::COFFObjectFile &getObj(); + void printStreamNotValidForObj(); + void printStreamNotPresent(StringRef StreamName); + Error dumpFileSummary(); Error dumpStreamSummary(); Error dumpSymbolStats(); diff --git a/llvm/tools/llvm-pdbutil/InputFile.cpp b/llvm/tools/llvm-pdbutil/InputFile.cpp index 7b5af7e9692..b2019642b2b 100644 --- a/llvm/tools/llvm-pdbutil/InputFile.cpp +++ b/llvm/tools/llvm-pdbutil/InputFile.cpp @@ -41,6 +41,10 @@ getModuleDebugStream(PDBFile &File, StringRef &ModuleName, uint32_t Index) { auto &Dbi = Err(File.getPDBDbiStream()); const auto &Modules = Dbi.modules(); + if (Index >= Modules.getModuleCount()) + return make_error<RawError>(raw_error_code::index_out_of_bounds, + "Invalid module index"); + auto Modi = Modules.getModuleDescriptor(Index); ModuleName = Modi.getModuleName(); diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp index a7afbf1242c..521e27fc089 100644 --- a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp @@ -191,6 +191,9 @@ Error YAMLOutputStyle::dumpDbiStream() { if (!opts::pdb2yaml::DbiStream) return Error::success(); + if (!File.hasPDBDbiStream()) + return Error::success(); + auto DbiS = File.getPDBDbiStream(); if (!DbiS) return DbiS.takeError(); |