diff options
author | Zachary Turner <zturner@google.com> | 2018-09-21 22:36:28 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2018-09-21 22:36:28 +0000 |
commit | 6345e84dde9532483c109ab0df365f64b5d8852b (patch) | |
tree | 3a9c64941563062a050a42a0c09bf37f4239971d /llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | |
parent | 355ffb0032182e74f64349dc7e4b941147bac2a2 (diff) | |
download | bcm5719-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.cpp | 39 |
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(); |