diff options
author | Zachary Turner <zturner@google.com> | 2017-06-16 00:04:24 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2017-06-16 00:04:24 +0000 |
commit | 68e216b09a80bd520f9299b460ccebbf5f99c72c (patch) | |
tree | cd454470b371f6b788f26d4eb948d6ba22059add /tools/llvm-pdbutil | |
parent | f391f226bc9420b8545dca18e820ebfb6270c158 (diff) |
[llvm-pdbutil] Add support for dumping cross module imports/exports.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305532 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-pdbutil')
-rw-r--r-- | tools/llvm-pdbutil/FormatUtil.cpp | 2 | ||||
-rw-r--r-- | tools/llvm-pdbutil/RawOutputStyle.cpp | 68 | ||||
-rw-r--r-- | tools/llvm-pdbutil/RawOutputStyle.h | 2 | ||||
-rw-r--r-- | tools/llvm-pdbutil/llvm-pdbutil.cpp | 12 | ||||
-rw-r--r-- | tools/llvm-pdbutil/llvm-pdbutil.h | 2 |
5 files changed, 81 insertions, 5 deletions
diff --git a/tools/llvm-pdbutil/FormatUtil.cpp b/tools/llvm-pdbutil/FormatUtil.cpp index 007db9ee9f9..1bbe2724f0a 100644 --- a/tools/llvm-pdbutil/FormatUtil.cpp +++ b/tools/llvm-pdbutil/FormatUtil.cpp @@ -17,7 +17,7 @@ using namespace llvm; using namespace llvm::pdb; std::string llvm::pdb::typesetItemList(ArrayRef<std::string> Opts, - uint32_t GroupSize, uint32_t IndentLevel, + uint32_t IndentLevel, uint32_t GroupSize, StringRef Sep) { std::string Result; while (!Opts.empty()) { diff --git a/tools/llvm-pdbutil/RawOutputStyle.cpp b/tools/llvm-pdbutil/RawOutputStyle.cpp index 053c10996ad..b204a89ec31 100644 --- a/tools/llvm-pdbutil/RawOutputStyle.cpp +++ b/tools/llvm-pdbutil/RawOutputStyle.cpp @@ -119,6 +119,16 @@ Error RawOutputStyle::dump() { return EC; } + if (opts::raw::DumpXmi) { + if (auto EC = dumpXmi()) + return EC; + } + + if (opts::raw::DumpXme) { + if (auto EC = dumpXme()) + return EC; + } + if (opts::raw::DumpTypes || opts::raw::DumpTypeExtras) { if (auto EC = dumpTpiStream(StreamTPI)) return EC; @@ -566,7 +576,6 @@ static void typesetLinesAndColumns(PDBFile &File, LinePrinter &P, Error RawOutputStyle::dumpLines() { printHeader(P, "Lines"); - ExitOnError Err("Unexpected error processing modules"); uint32_t LastModi = UINT32_MAX; uint32_t LastNameIndex = UINT32_MAX; @@ -603,7 +612,6 @@ Error RawOutputStyle::dumpLines() { Error RawOutputStyle::dumpInlineeLines() { printHeader(P, "Inlinee Lines"); - ExitOnError Err("Unexpected error processing modules"); iterateModuleSubsections<DebugInlineeLinesSubsectionRef>( File, P, 2, @@ -621,6 +629,58 @@ Error RawOutputStyle::dumpInlineeLines() { return Error::success(); } +Error RawOutputStyle::dumpXmi() { + printHeader(P, "Cross Module Imports"); + iterateModuleSubsections<DebugCrossModuleImportsSubsectionRef>( + File, P, 2, + [this](uint32_t Modi, StringsAndChecksumsPrinter &Strings, + DebugCrossModuleImportsSubsectionRef &Imports) { + P.formatLine("{0,=32} | {1}", "Imported Module", "Type IDs"); + + for (const auto &Xmi : Imports) { + auto ExpectedModule = + Strings.getNameFromStringTable(Xmi.Header->ModuleNameOffset); + StringRef Module; + SmallString<32> ModuleStorage; + if (!ExpectedModule) { + Module = "(unknown module)"; + consumeError(ExpectedModule.takeError()); + } else + Module = *ExpectedModule; + if (Module.size() > 32) { + ModuleStorage = "..."; + ModuleStorage += Module.take_back(32 - 3); + Module = ModuleStorage; + } + std::vector<std::string> TIs; + for (const auto I : Xmi.Imports) + TIs.push_back(formatv("{0,+10:X+}", fmtle(I))); + std::string Result = + typesetItemList(TIs, P.getIndentLevel() + 35, 12, " "); + P.formatLine("{0,+32} | {1}", Module, Result); + } + }); + + return Error::success(); +} + +Error RawOutputStyle::dumpXme() { + printHeader(P, "Cross Module Exports"); + + iterateModuleSubsections<DebugCrossModuleExportsSubsectionRef>( + File, P, 2, + [this](uint32_t Modi, StringsAndChecksumsPrinter &Strings, + DebugCrossModuleExportsSubsectionRef &Exports) { + P.formatLine("{0,-10} | {1}", "Local ID", "Global ID"); + for (const auto &Export : Exports) { + P.formatLine("{0,+10:X+} | {1}", TypeIndex(Export.Local), + TypeIndex(Export.Global)); + } + }); + + return Error::success(); +} + Error RawOutputStyle::dumpStringTable() { printHeader(P, "String Table"); @@ -909,7 +969,7 @@ static std::string formatSectionCharacteristics(uint32_t IndentLevel, PUSH_FLAG(SC, IMAGE_SCN_MEM_EXECUTE, C, "IMAGE_SCN_MEM_EXECUTE"); PUSH_FLAG(SC, IMAGE_SCN_MEM_READ, C, "IMAGE_SCN_MEM_READ"); PUSH_FLAG(SC, IMAGE_SCN_MEM_WRITE, C, "IMAGE_SCN_MEM_WRITE"); - return typesetItemList(Opts, 3, IndentLevel, " | "); + return typesetItemList(Opts, IndentLevel, 3, " | "); } static std::string formatSegMapDescriptorFlag(uint32_t IndentLevel, @@ -925,7 +985,7 @@ static std::string formatSegMapDescriptorFlag(uint32_t IndentLevel, PUSH_FLAG(OMFSegDescFlags, IsSelector, Flags, "selector"); PUSH_FLAG(OMFSegDescFlags, IsAbsoluteAddress, Flags, "absolute addr"); PUSH_FLAG(OMFSegDescFlags, IsGroup, Flags, "group"); - return typesetItemList(Opts, 4, IndentLevel, " | "); + return typesetItemList(Opts, IndentLevel, 4, " | "); } Error RawOutputStyle::dumpSectionContribs() { diff --git a/tools/llvm-pdbutil/RawOutputStyle.h b/tools/llvm-pdbutil/RawOutputStyle.h index e9405fc2a92..803f588961b 100644 --- a/tools/llvm-pdbutil/RawOutputStyle.h +++ b/tools/llvm-pdbutil/RawOutputStyle.h @@ -44,6 +44,8 @@ private: Error dumpStringTable(); Error dumpLines(); Error dumpInlineeLines(); + Error dumpXmi(); + Error dumpXme(); Error dumpTpiStream(uint32_t StreamIdx); Error dumpModules(); Error dumpModuleFiles(); diff --git a/tools/llvm-pdbutil/llvm-pdbutil.cpp b/tools/llvm-pdbutil/llvm-pdbutil.cpp index cbda8e6dbf5..9088783876e 100644 --- a/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -344,6 +344,16 @@ cl::opt<bool> DumpInlineeLines( "il", cl::desc("dump inlinee line information (DEBUG_S_INLINEELINES subsection)"), cl::cat(FileOptions), cl::sub(RawSubcommand)); +cl::opt<bool> DumpXmi( + "xmi", + cl::desc( + "dump cross module imports (DEBUG_S_CROSSSCOPEIMPORTS subsection)"), + cl::cat(FileOptions), cl::sub(RawSubcommand)); +cl::opt<bool> DumpXme( + "xme", + cl::desc( + "dump cross module exports (DEBUG_S_CROSSSCOPEEXPORTS subsection)"), + cl::cat(FileOptions), cl::sub(RawSubcommand)); // MISCELLANEOUS OPTIONS cl::opt<bool> DumpStringTable("string-table", cl::desc("dump PDB String Table"), @@ -903,6 +913,8 @@ int main(int argc_, const char *argv_[]) { if (opts::raw::RawAll) { opts::raw::DumpLines = true; opts::raw::DumpInlineeLines = true; + opts::raw::DumpXme = true; + opts::raw::DumpXmi = true; opts::raw::DumpIds = true; opts::raw::DumpPublics = true; opts::raw::DumpSectionContribs = true; diff --git a/tools/llvm-pdbutil/llvm-pdbutil.h b/tools/llvm-pdbutil/llvm-pdbutil.h index 422b9293981..a41b032d2b1 100644 --- a/tools/llvm-pdbutil/llvm-pdbutil.h +++ b/tools/llvm-pdbutil/llvm-pdbutil.h @@ -105,6 +105,8 @@ extern llvm::cl::list<std::string> DumpStreamData; extern llvm::cl::opt<bool> DumpLines; extern llvm::cl::opt<bool> DumpInlineeLines; +extern llvm::cl::opt<bool> DumpXmi; +extern llvm::cl::opt<bool> DumpXme; extern llvm::cl::opt<bool> DumpStringTable; extern llvm::cl::opt<bool> DumpTypes; extern llvm::cl::opt<bool> DumpTypeData; |