summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-09-21 22:36:28 +0000
committerZachary Turner <zturner@google.com>2018-09-21 22:36:28 +0000
commit6345e84dde9532483c109ab0df365f64b5d8852b (patch)
tree3a9c64941563062a050a42a0c09bf37f4239971d /llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
parent355ffb0032182e74f64349dc7e4b941147bac2a2 (diff)
downloadbcm5719-llvm-6345e84dde9532483c109ab0df365f64b5d8852b.tar.gz
bcm5719-llvm-6345e84dde9532483c109ab0df365f64b5d8852b.zip
[NativePDB] Add support for reading function signatures.
This adds support for parsing function signature records and returning them through the native DIA interface. llvm-svn: 342780
Diffstat (limited to 'llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp')
-rw-r--r--llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp39
1 files changed, 28 insertions, 11 deletions
diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
index 4ce1922a006..e90783c80aa 100644
--- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
+++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp
@@ -70,6 +70,8 @@
#include "llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
#include "llvm/Support/BinaryByteStream.h"
@@ -188,6 +190,9 @@ static cl::opt<bool> UDTs("udts", cl::desc("Dump udt types"),
static cl::opt<bool> Compilands("compilands",
cl::desc("Dump compiland information"),
cl::sub(DiaDumpSubcommand));
+static cl::opt<bool> Funcsigs("funcsigs",
+ cl::desc("Dump function signature information"),
+ cl::sub(DiaDumpSubcommand));
} // namespace diadump
namespace pretty {
@@ -236,6 +241,8 @@ cl::opt<bool> Enums("enums", cl::desc("Display enum types"),
cl::cat(TypeCategory), cl::sub(PrettySubcommand));
cl::opt<bool> Typedefs("typedefs", cl::desc("Display typedef types"),
cl::cat(TypeCategory), cl::sub(PrettySubcommand));
+cl::opt<bool> Funcsigs("funcsigs", cl::desc("Display function signatures"),
+ cl::cat(TypeCategory), cl::sub(PrettySubcommand));
cl::opt<SymbolSortMode> SymbolOrder(
"symbol-order", cl::desc("symbol sort order"),
cl::init(SymbolSortMode::None),
@@ -969,6 +976,21 @@ static void dumpInjectedSources(LinePrinter &Printer, IPDBSession &Session) {
}
}
+template <typename OuterT, typename ChildT>
+void diaDumpChildren(PDBSymbol &Outer, PdbSymbolIdField Ids,
+ PdbSymbolIdField Recurse) {
+ OuterT *ConcreteOuter = dyn_cast<OuterT>(&Outer);
+ if (!ConcreteOuter)
+ return;
+
+ auto Children = ConcreteOuter->template findAllChildren<ChildT>();
+ while (auto Child = Children->getNext()) {
+ outs() << " {";
+ Child->defaultDump(outs(), 4, Ids, Recurse);
+ outs() << "\n }\n";
+ }
+}
+
static void dumpDia(StringRef Path) {
std::unique_ptr<IPDBSession> Session;
@@ -988,6 +1010,8 @@ static void dumpDia(StringRef Path) {
SymTypes.push_back(PDB_SymType::PointerType);
if (opts::diadump::UDTs)
SymTypes.push_back(PDB_SymType::UDT);
+ if (opts::diadump::Funcsigs)
+ SymTypes.push_back(PDB_SymType::FunctionSig);
PdbSymbolIdField Ids = opts::diadump::NoSymIndexIds ? PdbSymbolIdField::None
: PdbSymbolIdField::All;
@@ -1002,19 +1026,11 @@ static void dumpDia(StringRef Path) {
while (auto Child = Children->getNext()) {
outs() << "{";
Child->defaultDump(outs(), 2, Ids, Recurse);
- if (auto Enum = dyn_cast<PDBSymbolTypeEnum>(Child.get())) {
- auto Enumerators = Enum->findAllChildren<PDBSymbolData>();
- while (auto Enumerator = Enumerators->getNext()) {
- outs() << " {";
- Enumerator->defaultDump(outs(), 4, Ids, Recurse);
- outs() << "\n }\n";
- }
- }
+
+ diaDumpChildren<PDBSymbolTypeEnum, PDBSymbolData>(*Child, Ids, Recurse);
outs() << "\n}\n";
}
}
- auto Child = Session->getSymbolById(3);
- Child->defaultDump(outs(), 2, PdbSymbolIdField::All, PdbSymbolIdField::None);
}
static void dumpPretty(StringRef Path) {
@@ -1162,7 +1178,8 @@ static void dumpPretty(StringRef Path) {
}
}
- if (opts::pretty::Classes || opts::pretty::Enums || opts::pretty::Typedefs) {
+ if (opts::pretty::Classes || opts::pretty::Enums || opts::pretty::Typedefs ||
+ opts::pretty::Funcsigs) {
Printer.NewLine();
WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---TYPES---";
Printer.Indent();
OpenPOWER on IntegriCloud