llvm-pdbdump: Add flags controlling the type of values to dump.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229330 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Zachary Turner
2015-02-15 20:27:53 +00:00
parent 5a4e2d2d64
commit 7f6d93f718
66 changed files with 392 additions and 273 deletions

View File

@@ -38,15 +38,78 @@
using namespace llvm;
namespace opts {
enum class PDB_DumpType { ByType, ByObjFile, Both };
cl::list<std::string> InputFilenames(cl::Positional,
cl::desc("<input PDB files>"),
cl::OneOrMore);
cl::opt<bool> Compilands("compilands",
cl::desc("Display a list of compilands (e.g. object "
"files) and symbols for each one."));
cl::alias CompilandsShort("c", cl::desc("Alias for --compilands"),
cl::aliasopt(Compilands));
cl::opt<bool> DumpHidden(
"hidden",
cl::desc("Attempt to find hidden symbols. This can find additional\n"
"symbols that cannot be found otherwise. For example, vtables\n"
"can only be found with an exhaustive search such as this. Be\n"
"warned that the performance can be prohibitive on large PDB "
"files."));
cl::opt<bool> DumpAll(
"all",
cl::desc("Specifies all other options except -hidden and -group-by"));
cl::opt<bool> DumpObjFiles("compilands", cl::desc("Display object files"));
cl::opt<bool> DumpFuncs("functions", cl::desc("Display function information"));
cl::opt<bool> DumpData(
"data",
cl::desc("Display global, class, and constant variable information."));
cl::opt<bool> DumpLabels("labels", cl::desc("Display labels"));
cl::opt<bool> DumpPublic("public", cl::desc("Display public symbols"));
cl::opt<bool> DumpClasses("classes", cl::desc("Display class type information"));
cl::opt<bool> DumpEnums("enums", cl::desc("Display enum information"));
cl::opt<bool> DumpFuncsigs("funcsigs",
cl::desc("Display unique function signatures"));
cl::opt<bool> DumpTypedefs("typedefs", cl::desc("Display typedefs"));
cl::opt<bool> DumpThunks("thunks", cl::desc("Display thunks"));
cl::opt<bool> DumpVtables(
"vtables",
cl::desc("Display virtual function tables (only with --exhaustive)"));
static cl::opt<PDB_DumpType> DumpMode(
"group-by", cl::init(PDB_DumpType::ByType), cl::desc("Dump mode:"),
cl::values(
clEnumValN(PDB_DumpType::ByType, "type",
"(Default) Display symbols grouped by type"),
clEnumValN(PDB_DumpType::ByObjFile, "compiland",
"Display symbols grouped under their containing object "
"file."),
clEnumValN(
PDB_DumpType::Both, "both",
"Display symbols grouped by type, and then by object file.")));
}
#define SET_DUMP_FLAG_FROM_OPT(Var, Flag, Opt) \
if (opts::Opt) \
Var |= Flag;
PDB_DumpFlags CalculateDumpFlags() {
PDB_DumpFlags Flags = PDB_DF_None;
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Hidden, DumpHidden)
if (opts::DumpAll)
return Flags | PDB_DF_All;
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_ObjFiles, DumpObjFiles)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Functions, DumpFuncs)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Data, DumpData)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Labels, DumpLabels)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_PublicSyms, DumpPublic)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Classes, DumpClasses)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Enums, DumpEnums)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Funcsigs, DumpFuncsigs)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Typedefs, DumpTypedefs)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_Thunks, DumpThunks)
SET_DUMP_FLAG_FROM_OPT(Flags, PDB_DF_VTables, DumpVtables)
return Flags;
}
static void dumpInput(StringRef Path) {
@@ -57,15 +120,19 @@ static void dumpInput(StringRef Path) {
outs() << " is available for your platform.";
return;
}
PDB_DumpFlags Flags = CalculateDumpFlags();
if (opts::DumpMode != opts::PDB_DumpType::ByObjFile)
Flags |= PDB_DF_Children;
auto GlobalScope(Session->getGlobalScope());
GlobalScope->dump(outs(), 0, PDB_DumpLevel::Normal);
outs().flush();
GlobalScope->dump(outs(), 0, PDB_DumpLevel::Normal, Flags);
outs() << "\n";
if (opts::Compilands) {
if (opts::DumpMode != opts::PDB_DumpType::ByType) {
auto Compilands = GlobalScope->findAllChildren<PDBSymbolCompiland>();
while (auto Compiland = Compilands->getNext()) {
Compiland->dump(outs(), 0, PDB_DumpLevel::Detailed);
Compiland->dump(outs(), 0, PDB_DumpLevel::Detailed,
Flags | PDB_DF_Children);
outs() << "\n";
}
}