summaryrefslogtreecommitdiff
path: root/tools/llvm-pdbutil
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2017-06-16 00:04:24 +0000
committerZachary Turner <zturner@google.com>2017-06-16 00:04:24 +0000
commit68e216b09a80bd520f9299b460ccebbf5f99c72c (patch)
treecd454470b371f6b788f26d4eb948d6ba22059add /tools/llvm-pdbutil
parentf391f226bc9420b8545dca18e820ebfb6270c158 (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.cpp2
-rw-r--r--tools/llvm-pdbutil/RawOutputStyle.cpp68
-rw-r--r--tools/llvm-pdbutil/RawOutputStyle.h2
-rw-r--r--tools/llvm-pdbutil/llvm-pdbutil.cpp12
-rw-r--r--tools/llvm-pdbutil/llvm-pdbutil.h2
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;