Index: llvm/trunk/tools/llvm-pdbdump/PrettyTypeDumper.cpp =================================================================== --- llvm/trunk/tools/llvm-pdbdump/PrettyTypeDumper.cpp +++ llvm/trunk/tools/llvm-pdbdump/PrettyTypeDumper.cpp @@ -29,35 +29,43 @@ TypeDumper::TypeDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {} void TypeDumper::start(const PDBSymbolExe &Exe) { - auto Enums = Exe.findAllChildren(); - Printer.NewLine(); - WithColor(Printer, PDB_ColorItem::Identifier).get() << "Enums"; - Printer << ": (" << Enums->getChildCount() << " items)"; - Printer.Indent(); - while (auto Enum = Enums->getNext()) - Enum->dump(*this); - Printer.Unindent(); + if (opts::pretty::Enums) { + auto Enums = Exe.findAllChildren(); + Printer.NewLine(); + WithColor(Printer, PDB_ColorItem::Identifier).get() << "Enums"; + Printer << ": (" << Enums->getChildCount() << " items)"; + Printer.Indent(); + while (auto Enum = Enums->getNext()) + Enum->dump(*this); + Printer.Unindent(); + } - auto Typedefs = Exe.findAllChildren(); - Printer.NewLine(); - WithColor(Printer, PDB_ColorItem::Identifier).get() << "Typedefs"; - Printer << ": (" << Typedefs->getChildCount() << " items)"; - Printer.Indent(); - while (auto Typedef = Typedefs->getNext()) - Typedef->dump(*this); - Printer.Unindent(); + if (opts::pretty::Typedefs) { + auto Typedefs = Exe.findAllChildren(); + Printer.NewLine(); + WithColor(Printer, PDB_ColorItem::Identifier).get() << "Typedefs"; + Printer << ": (" << Typedefs->getChildCount() << " items)"; + Printer.Indent(); + while (auto Typedef = Typedefs->getNext()) + Typedef->dump(*this); + Printer.Unindent(); + } - auto Classes = Exe.findAllChildren(); - Printer.NewLine(); - WithColor(Printer, PDB_ColorItem::Identifier).get() << "Classes"; - Printer << ": (" << Classes->getChildCount() << " items)"; - Printer.Indent(); - while (auto Class = Classes->getNext()) - Class->dump(*this); - Printer.Unindent(); + if (opts::pretty::Classes) { + auto Classes = Exe.findAllChildren(); + Printer.NewLine(); + WithColor(Printer, PDB_ColorItem::Identifier).get() << "Classes"; + Printer << ": (" << Classes->getChildCount() << " items)"; + Printer.Indent(); + while (auto Class = Classes->getNext()) + Class->dump(*this); + Printer.Unindent(); + } } void TypeDumper::dump(const PDBSymbolTypeEnum &Symbol) { + assert(opts::pretty::Enums); + if (Symbol.getUnmodifiedTypeId() != 0) return; if (Printer.IsTypeExcluded(Symbol.getName())) @@ -72,6 +80,8 @@ } void TypeDumper::dump(const PDBSymbolTypeTypedef &Symbol) { + assert(opts::pretty::Typedefs); + if (Printer.IsTypeExcluded(Symbol.getName())) return; @@ -81,6 +91,8 @@ } void TypeDumper::dump(const PDBSymbolTypeUDT &Symbol) { + assert(opts::pretty::Classes); + if (Symbol.getUnmodifiedTypeId() != 0) return; if (Printer.IsTypeExcluded(Symbol.getName())) Index: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h =================================================================== --- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h +++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h @@ -20,7 +20,9 @@ extern llvm::cl::opt Compilands; extern llvm::cl::opt Symbols; extern llvm::cl::opt Globals; -extern llvm::cl::opt Types; +extern llvm::cl::opt Classes; +extern llvm::cl::opt Enums; +extern llvm::cl::opt Typedefs; extern llvm::cl::opt All; extern llvm::cl::opt ExcludeCompilerGenerated; Index: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp =================================================================== --- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -112,8 +112,17 @@ cl::cat(TypeCategory), cl::sub(PrettySubcommand)); cl::opt Externals("externals", cl::desc("Dump external symbols"), cl::cat(TypeCategory), cl::sub(PrettySubcommand)); -cl::opt Types("types", cl::desc("Display types"), cl::cat(TypeCategory), - cl::sub(PrettySubcommand)); +cl::opt + Types("types", + cl::desc("Display all types (implies -classes, -enums, -typedefs)"), + cl::cat(TypeCategory), cl::sub(PrettySubcommand)); +cl::opt Classes("classes", cl::desc("Display class types"), + cl::cat(TypeCategory), cl::sub(PrettySubcommand)); +cl::opt Enums("enums", cl::desc("Display enum types"), + cl::cat(TypeCategory), cl::sub(PrettySubcommand)); +cl::opt Typedefs("typedefs", cl::desc("Display typedef types"), + cl::cat(TypeCategory), cl::sub(PrettySubcommand)); + cl::opt Lines("lines", cl::desc("Line tables"), cl::cat(TypeCategory), cl::sub(PrettySubcommand)); cl::opt @@ -557,7 +566,7 @@ Printer.Unindent(); } - if (opts::pretty::Types) { + if (opts::pretty::Classes || opts::pretty::Enums || opts::pretty::Typedefs) { Printer.NewLine(); WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---TYPES---"; Printer.Indent(); @@ -699,6 +708,12 @@ opts::pretty::Lines = true; } + if (opts::pretty::Types) { + opts::pretty::Classes = true; + opts::pretty::Typedefs = true; + opts::pretty::Enums = true; + } + // When adding filters for excluded compilands and types, we need to // remember that these are regexes. So special characters such as * and \ // need to be escaped in the regex. In the case of a literal \, this means