summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbdump
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-pdbdump')
-rw-r--r--llvm/tools/llvm-pdbdump/CMakeLists.txt1
-rw-r--r--llvm/tools/llvm-pdbdump/CompilandDumper.cpp14
-rw-r--r--llvm/tools/llvm-pdbdump/ExternalSymbolDumper.cpp40
-rw-r--r--llvm/tools/llvm-pdbdump/ExternalSymbolDumper.h32
-rw-r--r--llvm/tools/llvm-pdbdump/FunctionDumper.cpp8
-rw-r--r--llvm/tools/llvm-pdbdump/VariableDumper.cpp2
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp19
7 files changed, 104 insertions, 12 deletions
diff --git a/llvm/tools/llvm-pdbdump/CMakeLists.txt b/llvm/tools/llvm-pdbdump/CMakeLists.txt
index 4dd339cee57..1907f917079 100644
--- a/llvm/tools/llvm-pdbdump/CMakeLists.txt
+++ b/llvm/tools/llvm-pdbdump/CMakeLists.txt
@@ -9,6 +9,7 @@ add_llvm_tool(llvm-pdbdump
ClassDefinitionDumper.cpp
CompilandDumper.cpp
EnumDumper.cpp
+ ExternalSymbolDumper.cpp
FunctionDumper.cpp
LinePrinter.cpp
TypeDumper.cpp
diff --git a/llvm/tools/llvm-pdbdump/CompilandDumper.cpp b/llvm/tools/llvm-pdbdump/CompilandDumper.cpp
index 86bf32d77d8..68ceb620627 100644
--- a/llvm/tools/llvm-pdbdump/CompilandDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/CompilandDumper.cpp
@@ -69,7 +69,7 @@ void CompilandDumper::dump(const PDBSymbolData &Symbol) {
case PDB_LocType::Static:
Printer << "data: ";
WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(Symbol.getRelativeVirtualAddress(), 10) << "]";
+ << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "]";
break;
case PDB_LocType::Constant:
Printer << "constant: ";
@@ -102,7 +102,7 @@ void CompilandDumper::dump(const PDBSymbolLabel &Symbol) {
Printer.NewLine();
Printer << "label ";
WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(Symbol.getRelativeVirtualAddress(), 10) << "] ";
+ << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "] ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
}
@@ -113,16 +113,16 @@ void CompilandDumper::dump(const PDBSymbolThunk &Symbol) {
Printer.NewLine();
Printer << "thunk ";
PDB_ThunkOrdinal Ordinal = Symbol.getThunkOrdinal();
- uint32_t RVA = Symbol.getRelativeVirtualAddress();
+ uint64_t VA = Symbol.getVirtualAddress();
if (Ordinal == PDB_ThunkOrdinal::TrampIncremental) {
- uint32_t Target = Symbol.getTargetRelativeVirtualAddress();
- WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(RVA, 10);
+ uint64_t Target = Symbol.getTargetVirtualAddress();
+ WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(VA, 10);
Printer << " -> ";
WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Target, 10);
} else {
WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(RVA, 10) << " - "
- << format_hex(RVA + Symbol.getLength(), 10) << "]";
+ << "[" << format_hex(VA, 10) << " - "
+ << format_hex(VA + Symbol.getLength(), 10) << "]";
}
Printer << " (";
WithColor(Printer, PDB_ColorItem::Register).get() << Ordinal;
diff --git a/llvm/tools/llvm-pdbdump/ExternalSymbolDumper.cpp b/llvm/tools/llvm-pdbdump/ExternalSymbolDumper.cpp
new file mode 100644
index 00000000000..c4e9f474880
--- /dev/null
+++ b/llvm/tools/llvm-pdbdump/ExternalSymbolDumper.cpp
@@ -0,0 +1,40 @@
+//===- ExternalSymbolDumper.cpp -------------------------------- *- C++ *-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ExternalSymbolDumper.h"
+#include "LinePrinter.h"
+
+#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h"
+#include "llvm/Support/Format.h"
+
+using namespace llvm;
+
+ExternalSymbolDumper::ExternalSymbolDumper(LinePrinter &P)
+ : PDBSymDumper(true), Printer(P) {}
+
+void ExternalSymbolDumper::start(const PDBSymbolExe &Symbol) {
+ auto Vars = Symbol.findAllChildren<PDBSymbolPublicSymbol>();
+ while (auto Var = Vars->getNext())
+ Var->dump(*this);
+}
+
+void ExternalSymbolDumper::dump(const PDBSymbolPublicSymbol &Symbol) {
+ std::string LinkageName = Symbol.getName();
+ if (Printer.IsSymbolExcluded(LinkageName))
+ return;
+
+ Printer.NewLine();
+ uint64_t Addr = Symbol.getVirtualAddress();
+
+ Printer << "[";
+ WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Addr, 10);
+ Printer << "] ";
+ WithColor(Printer, PDB_ColorItem::Identifier).get() << LinkageName;
+}
diff --git a/llvm/tools/llvm-pdbdump/ExternalSymbolDumper.h b/llvm/tools/llvm-pdbdump/ExternalSymbolDumper.h
new file mode 100644
index 00000000000..d77b09cdebf
--- /dev/null
+++ b/llvm/tools/llvm-pdbdump/ExternalSymbolDumper.h
@@ -0,0 +1,32 @@
+//===- ExternalSymbolDumper.h --------------------------------- *- C++ --*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVMPDBDUMP_EXTERNALSYMBOLDUMPER_H
+#define LLVM_TOOLS_LLVMPDBDUMP_EXTERNALSYMBOLDUMPER_H
+
+#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
+
+namespace llvm {
+
+class LinePrinter;
+
+class ExternalSymbolDumper : public PDBSymDumper {
+public:
+ ExternalSymbolDumper(LinePrinter &P);
+
+ void start(const PDBSymbolExe &Symbol);
+
+ void dump(const PDBSymbolPublicSymbol &Symbol) override;
+
+private:
+ LinePrinter &Printer;
+};
+}
+
+#endif
diff --git a/llvm/tools/llvm-pdbdump/FunctionDumper.cpp b/llvm/tools/llvm-pdbdump/FunctionDumper.cpp
index 419f888ef2f..9584812e81a 100644
--- a/llvm/tools/llvm-pdbdump/FunctionDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/FunctionDumper.cpp
@@ -109,19 +109,19 @@ void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
}
void FunctionDumper::start(const PDBSymbolFunc &Symbol, PointerType Pointer) {
- uint32_t FuncStart = Symbol.getRelativeVirtualAddress();
- uint32_t FuncEnd = FuncStart + Symbol.getLength();
+ uint64_t FuncStart = Symbol.getVirtualAddress();
+ uint64_t FuncEnd = FuncStart + Symbol.getLength();
Printer << "func [";
WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(FuncStart, 10);
if (auto DebugStart = Symbol.findOneChild<PDBSymbolFuncDebugStart>()) {
- uint32_t Prologue = DebugStart->getRelativeVirtualAddress() - FuncStart;
+ uint64_t Prologue = DebugStart->getVirtualAddress() - FuncStart;
WithColor(Printer, PDB_ColorItem::Offset).get() << "+" << Prologue;
}
Printer << " - ";
WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(FuncEnd, 10);
if (auto DebugEnd = Symbol.findOneChild<PDBSymbolFuncDebugEnd>()) {
- uint32_t Epilogue = FuncEnd - DebugEnd->getRelativeVirtualAddress();
+ uint64_t Epilogue = FuncEnd - DebugEnd->getVirtualAddress();
WithColor(Printer, PDB_ColorItem::Offset).get() << "-" << Epilogue;
}
Printer << "] (";
diff --git a/llvm/tools/llvm-pdbdump/VariableDumper.cpp b/llvm/tools/llvm-pdbdump/VariableDumper.cpp
index 030610c8c58..e5665b5fcaf 100644
--- a/llvm/tools/llvm-pdbdump/VariableDumper.cpp
+++ b/llvm/tools/llvm-pdbdump/VariableDumper.cpp
@@ -44,7 +44,7 @@ void VariableDumper::start(const PDBSymbolData &Var) {
Printer.NewLine();
Printer << "data [";
WithColor(Printer, PDB_ColorItem::Address).get()
- << format_hex(Var.getRelativeVirtualAddress(), 10);
+ << format_hex(Var.getVirtualAddress(), 10);
Printer << "] ";
WithColor(Printer, PDB_ColorItem::Keyword).get() << "static ";
dumpSymbolTypeAndName(*VarType, Var.getName());
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
index 597683291ff..4a4c64b80cc 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -15,6 +15,7 @@
#include "llvm-pdbdump.h"
#include "CompilandDumper.h"
+#include "ExternalSymbolDumper.h"
#include "FunctionDumper.h"
#include "LinePrinter.h"
#include "TypeDumper.h"
@@ -58,6 +59,7 @@ cl::list<std::string> InputFilenames(cl::Positional,
cl::OptionCategory TypeCategory("Symbol Type Options");
cl::OptionCategory FilterCategory("Filtering Options");
+cl::OptionCategory OtherOptions("Other Options");
cl::opt<bool> Compilands("compilands", cl::desc("Display compilands"),
cl::cat(TypeCategory));
@@ -65,11 +67,18 @@ cl::opt<bool> Symbols("symbols", cl::desc("Display symbols for each compiland"),
cl::cat(TypeCategory));
cl::opt<bool> Globals("globals", cl::desc("Dump global symbols"),
cl::cat(TypeCategory));
+cl::opt<bool> Externals("externals", cl::desc("Dump external symbols"),
+ cl::cat(TypeCategory));
cl::opt<bool> Types("types", cl::desc("Display types"), cl::cat(TypeCategory));
cl::opt<bool>
All("all", cl::desc("Implies all other options in 'Symbol Types' category"),
cl::cat(TypeCategory));
+cl::opt<uint64_t> LoadAddress(
+ "load-address",
+ cl::desc("Assume the module is loaded at the specified address"),
+ cl::cat(OtherOptions));
+
cl::list<std::string>
ExcludeTypes("exclude-types",
cl::desc("Exclude types by regular expression"),
@@ -121,6 +130,8 @@ static void dumpInput(StringRef Path) {
<< "'. An unknown error occured.\n";
return;
}
+ if (opts::LoadAddress)
+ Session->setLoadAddress(opts::LoadAddress);
LinePrinter Printer(2, outs());
@@ -215,6 +226,13 @@ static void dumpInput(StringRef Path) {
}
Printer.Unindent();
}
+ if (opts::Externals) {
+ Printer.NewLine();
+ WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---EXTERNALS---";
+ Printer.Indent();
+ ExternalSymbolDumper Dumper(Printer);
+ Dumper.start(*GlobalScope);
+ }
outs().flush();
}
@@ -240,6 +258,7 @@ int main(int argc_, const char *argv_[]) {
opts::Symbols = true;
opts::Globals = true;
opts::Types = true;
+ opts::Externals = true;
}
if (opts::ExcludeCompilerGenerated) {
opts::ExcludeTypes.push_back("__vc_attributes");
OpenPOWER on IntegriCloud