[llvm] r274247 - Update llvm-pdbdump to use subcommands.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 30 10:42:49 PDT 2016


Author: zturner
Date: Thu Jun 30 12:42:48 2016
New Revision: 274247

URL: http://llvm.org/viewvc/llvm-project?rev=274247&view=rev
Log:
Update llvm-pdbdump to use subcommands.

Modified:
    llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-flags.test
    llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test
    llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test
    llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
    llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test
    llvm/trunk/test/tools/llvm-pdbdump/class-layout.test
    llvm/trunk/test/tools/llvm-pdbdump/enum-layout.test
    llvm/trunk/test/tools/llvm-pdbdump/load-address.test
    llvm/trunk/test/tools/llvm-pdbdump/regex-filter.test
    llvm/trunk/tools/llvm-pdbdump/ClassDefinitionDumper.cpp
    llvm/trunk/tools/llvm-pdbdump/EnumDumper.cpp
    llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
    llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h
    llvm/trunk/tools/llvm-pdbdump/LinePrinter.cpp
    llvm/trunk/tools/llvm-pdbdump/OutputStyle.h
    llvm/trunk/tools/llvm-pdbdump/TypeDumper.cpp
    llvm/trunk/tools/llvm-pdbdump/VariableDumper.cpp
    llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
    llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h

Modified: llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-flags.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-flags.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-flags.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-flags.test Thu Jun 30 12:42:48 2016
@@ -1,7 +1,7 @@
-; RUN: llvm-pdbdump %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=NO_ARGS
-; RUN: llvm-pdbdump -types %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=TYPES
-; RUN: llvm-pdbdump -compilands %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=COMPILANDS
-; RUN: llvm-pdbdump -types -compilands %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=MULTIPLE
+; RUN: llvm-pdbdump pretty %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=NO_ARGS
+; RUN: llvm-pdbdump pretty -types %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=TYPES
+; RUN: llvm-pdbdump pretty -compilands %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=COMPILANDS
+; RUN: llvm-pdbdump pretty -types -compilands %p/../Inputs/empty.pdb | FileCheck %s -check-prefix=MULTIPLE
 
 ; Check that neither symbols nor compilands are dumped when neither argument specified.
 ; NO_ARGS: empty.pdb

Modified: llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test Thu Jun 30 12:42:48 2016
@@ -1,4 +1,4 @@
-; RUN: llvm-pdbdump -lines %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=LINE_NUMS %s
+; RUN: llvm-pdbdump pretty -lines %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=LINE_NUMS %s
 
 ; LINE_NUMS: llvm\test\debuginfo\pdb\inputs\symbolformat-fpo.cpp
 ; LINE_NUMS: Line 5, Address: [0x000011a0 - 0x000011a5] (6 bytes)

Modified: llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test Thu Jun 30 12:42:48 2016
@@ -1,10 +1,10 @@
-; RUN: llvm-pdbdump -symbols %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=SYM_FORMAT %s
-; RUN: llvm-pdbdump -types %p/../Inputs/symbolformat.pdb > %t.types
+; RUN: llvm-pdbdump pretty -symbols %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=SYM_FORMAT %s
+; RUN: llvm-pdbdump pretty -types %p/../Inputs/symbolformat.pdb > %t.types
 ; RUN: FileCheck --check-prefix=TYPES_FORMAT %s < %t.types
 ; RUN: FileCheck --check-prefix=TYPES_1 %s < %t.types
 ; RUN: FileCheck --check-prefix=TYPES_2 %s < %t.types
-; RUN: llvm-pdbdump -types %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=TYPES_FORMAT %s
-; RUN: llvm-pdbdump -globals %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=GLOBALS %s
+; RUN: llvm-pdbdump pretty -types %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=TYPES_FORMAT %s
+; RUN: llvm-pdbdump pretty -globals %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=GLOBALS %s
 
 ; The format is func [0x<rva_start>+<prologue_length> - 0x<rva_end>-<epilogue_length>]
 ; SYM_FORMAT: ---SYMBOLS---

Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test Thu Jun 30 12:42:48 2016
@@ -1,12 +1,12 @@
-; RUN: llvm-pdbdump -raw-headers -raw-tpi-records -raw-tpi-record-bytes -raw-module-syms \
-; RUN:              -raw-sym-record-bytes -raw-publics -raw-module-files -raw-stream-name=/names \
-; RUN:              -raw-stream-summary -raw-stream-blocks -raw-ipi-records -raw-ipi-record-bytes \
-; RUN:              -raw-section-contribs -raw-section-map -raw-section-headers -raw-line-info \
-; RUN:              -raw-tpi-hash -raw-fpo %p/Inputs/empty.pdb | FileCheck -check-prefix=EMPTY %s
-; RUN: llvm-pdbdump -raw-all %p/Inputs/empty.pdb | FileCheck -check-prefix=ALL %s
-; RUN: llvm-pdbdump -raw-headers -raw-stream-name=/names -raw-modules -raw-module-files \
+; RUN: llvm-pdbdump raw -headers -tpi-records -tpi-record-bytes -module-syms \
+; RUN:              -sym-record-bytes -publics -module-files -stream-name=/names \
+; RUN:              -stream-summary -stream-blocks -ipi-records -ipi-record-bytes \
+; RUN:              -section-contribs -section-map -section-headers -line-info \
+; RUN:              -tpi-hash -fpo %p/Inputs/empty.pdb | FileCheck -check-prefix=EMPTY %s
+; RUN: llvm-pdbdump raw -all %p/Inputs/empty.pdb | FileCheck -check-prefix=ALL %s
+; RUN: llvm-pdbdump raw -headers -stream-name=/names -modules -module-files \
 ; RUN:              %p/Inputs/big-read.pdb | FileCheck -check-prefix=BIG %s
-; RUN: not llvm-pdbdump -raw-headers %p/Inputs/bad-block-size.pdb 2>&1 | FileCheck -check-prefix=BAD-BLOCK-SIZE %s
+; RUN: not llvm-pdbdump raw -headers %p/Inputs/bad-block-size.pdb 2>&1 | FileCheck -check-prefix=BAD-BLOCK-SIZE %s
 
 ; EMPTY:      FileHeaders {
 ; EMPTY-NEXT:   BlockSize: 4096

Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test Thu Jun 30 12:42:48 2016
@@ -1,5 +1,4 @@
-; RUN: llvm-pdbdump -raw-headers -raw-output-style=YAML %p/Inputs/empty.pdb \
-; RUN:               | FileCheck -check-prefix=YAML %s
+; RUN: llvm-pdbdump pdb2yaml -stream-metadata %p/Inputs/empty.pdb | FileCheck -check-prefix=YAML %s
 
 ; YAML:      ---
 ; YAML-NEXT: MSF:
@@ -16,4 +15,4 @@
 ; YAML-NEXT:     - 23
 ; YAML-NEXT:   NumStreams:      17
 ; YAML-NEXT:   FileSize:        102400
-; YAML-NEXT: ...
+; YAML: ...

Modified: llvm/trunk/test/tools/llvm-pdbdump/class-layout.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-pdbdump/class-layout.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-pdbdump/class-layout.test (original)
+++ llvm/trunk/test/tools/llvm-pdbdump/class-layout.test Thu Jun 30 12:42:48 2016
@@ -1,4 +1,4 @@
-; RUN: llvm-pdbdump -all %p/Inputs/ClassLayoutTest.pdb > %t
+; RUN: llvm-pdbdump pretty -all %p/Inputs/ClassLayoutTest.pdb > %t
 ; RUN: FileCheck -input-file=%t %s -check-prefix=GLOBALS_TEST
 ; RUN: FileCheck -input-file=%t %s -check-prefix=MEMBERS_TEST
 ; RUN: FileCheck -input-file=%t %s -check-prefix=BASE_CLASS_A

Modified: llvm/trunk/test/tools/llvm-pdbdump/enum-layout.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-pdbdump/enum-layout.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-pdbdump/enum-layout.test (original)
+++ llvm/trunk/test/tools/llvm-pdbdump/enum-layout.test Thu Jun 30 12:42:48 2016
@@ -1,4 +1,4 @@
-; RUN: llvm-pdbdump -types %p/Inputs/ClassLayoutTest.pdb > %t
+; RUN: llvm-pdbdump pretty -types %p/Inputs/ClassLayoutTest.pdb > %t
 ; RUN: FileCheck -input-file=%t %s -check-prefix=GLOBAL_ENUM
 ; RUN: FileCheck -input-file=%t %s -check-prefix=MEMBER_ENUM
 

Modified: llvm/trunk/test/tools/llvm-pdbdump/load-address.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-pdbdump/load-address.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-pdbdump/load-address.test (original)
+++ llvm/trunk/test/tools/llvm-pdbdump/load-address.test Thu Jun 30 12:42:48 2016
@@ -1,6 +1,6 @@
-; RUN: llvm-pdbdump -externals %p/Inputs/LoadAddressTest.pdb \
+; RUN: llvm-pdbdump pretty -externals %p/Inputs/LoadAddressTest.pdb \
 ; RUN:    | FileCheck --check-prefix=RVA %s
-; RUN: llvm-pdbdump -externals -load-address=0x40000000 \
+; RUN: llvm-pdbdump pretty -externals -load-address=0x40000000 \
 ; RUN: %p/Inputs/LoadAddressTest.pdb | FileCheck --check-prefix=VA %s
 
 ; RVA: ---EXTERNALS---

Modified: llvm/trunk/test/tools/llvm-pdbdump/regex-filter.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-pdbdump/regex-filter.test?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-pdbdump/regex-filter.test (original)
+++ llvm/trunk/test/tools/llvm-pdbdump/regex-filter.test Thu Jun 30 12:42:48 2016
@@ -1,18 +1,18 @@
-; RUN: llvm-pdbdump -symbols -globals -types %p/Inputs/FilterTest.pdb \
+; RUN: llvm-pdbdump pretty -symbols -globals -types %p/Inputs/FilterTest.pdb \
 ; RUN:    | FileCheck --check-prefix=NO_FILTER %s
-; RUN: llvm-pdbdump -types -exclude-types="GlobalTypedef|NestedTypedef" \
+; RUN: llvm-pdbdump pretty -types -exclude-types="GlobalTypedef|NestedTypedef" \
 ; RUN:    %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_TYPEDEFS %s
-; RUN: llvm-pdbdump -types -exclude-types="GlobalEnum|NestedEnum" \
+; RUN: llvm-pdbdump pretty -types -exclude-types="GlobalEnum|NestedEnum" \
 ; RUN:    %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_ENUMS %s
-; RUN: llvm-pdbdump -types -symbols -globals -exclude-symbols="MemberVar|GlobalVar" \
+; RUN: llvm-pdbdump pretty -types -symbols -globals -exclude-symbols="MemberVar|GlobalVar" \
 ; RUN:    %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_VARS %s
-; RUN: llvm-pdbdump -types -exclude-types="FilterTestClass" \
+; RUN: llvm-pdbdump pretty -types -exclude-types="FilterTestClass" \
 ; RUN:    %p/Inputs/FilterTest.pdb | FileCheck  --check-prefix=EXCLUDE_WHOLE_CLASS %s
-; RUN: llvm-pdbdump -symbols -globals -exclude-compilands="FilterTest.obj"  \
+; RUN: llvm-pdbdump pretty -symbols -globals -exclude-compilands="FilterTest.obj"  \
 ; RUN:    %p/Inputs/FilterTest.pdb | FileCheck  --check-prefix=EXCLUDE_COMPILAND %s
-; RUN: llvm-pdbdump -types -include-types="FilterTestClass" \
+; RUN: llvm-pdbdump pretty -types -include-types="FilterTestClass" \
 ; RUN:    %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=INCLUDE_ONLY_TYPES %s
-; RUN: llvm-pdbdump -types -symbols -globals -include-symbols="[[:<:]](IntGlobalVar|DoubleGlobalVar)[[:>:]]" \
+; RUN: llvm-pdbdump pretty -types -symbols -globals -include-symbols="[[:<:]](IntGlobalVar|DoubleGlobalVar)[[:>:]]" \
 ; RUN:    %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=INCLUDE_ONLY_VARS %s
 
 ; NO_FILTER: ---TYPES---

Modified: llvm/trunk/tools/llvm-pdbdump/ClassDefinitionDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/ClassDefinitionDumper.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/ClassDefinitionDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/ClassDefinitionDumper.cpp Thu Jun 30 12:42:48 2016
@@ -85,7 +85,7 @@ void ClassDefinitionDumper::start(const
     auto &AccessGroup = Groups.find((int)Access)->second;
 
     if (auto Func = dyn_cast<PDBSymbolFunc>(Child.get())) {
-      if (Func->isCompilerGenerated() && opts::ExcludeCompilerGenerated)
+      if (Func->isCompilerGenerated() && opts::pretty::ExcludeCompilerGenerated)
         continue;
       if (Func->getLength() == 0 && !Func->isPureVirtual() &&
           !Func->isIntroVirtualFunction())

Modified: llvm/trunk/tools/llvm-pdbdump/EnumDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/EnumDumper.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/EnumDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/EnumDumper.cpp Thu Jun 30 12:42:48 2016
@@ -25,7 +25,7 @@ EnumDumper::EnumDumper(LinePrinter &P) :
 void EnumDumper::start(const PDBSymbolTypeEnum &Symbol) {
   WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
   WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-  if (!opts::NoEnumDefs) {
+  if (!opts::pretty::NoEnumDefs) {
     auto BuiltinType = Symbol.getUnderlyingType();
     if (BuiltinType->getBuiltinType() != PDB_BuiltinType::Int ||
         BuiltinType->getLength() != 4) {

Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp Thu Jun 30 12:42:48 2016
@@ -41,8 +41,56 @@ static void printSectionOffset(llvm::raw
 LLVMOutputStyle::LLVMOutputStyle(PDBFile &File)
     : File(File), P(outs()), TD(&P, false) {}
 
+Error LLVMOutputStyle::dump() {
+  if (auto EC = dumpFileHeaders())
+    return EC;
+
+  if (auto EC = dumpStreamSummary())
+    return EC;
+
+  if (auto EC = dumpStreamBlocks())
+    return EC;
+
+  if (auto EC = dumpStreamData())
+    return EC;
+
+  if (auto EC = dumpInfoStream())
+    return EC;
+
+  if (auto EC = dumpNamedStream())
+    return EC;
+
+  if (auto EC = dumpTpiStream(StreamTPI))
+    return EC;
+
+  if (auto EC = dumpTpiStream(StreamIPI))
+    return EC;
+
+  if (auto EC = dumpDbiStream())
+    return EC;
+
+  if (auto EC = dumpSectionContribs())
+    return EC;
+
+  if (auto EC = dumpSectionMap())
+    return EC;
+
+  if (auto EC = dumpPublicsStream())
+    return EC;
+
+  if (auto EC = dumpSectionHeaders())
+    return EC;
+
+  if (auto EC = dumpFpoStream())
+    return EC;
+
+  flush();
+
+  return Error::success();
+}
+
 Error LLVMOutputStyle::dumpFileHeaders() {
-  if (!opts::DumpHeaders)
+  if (!opts::raw::DumpHeaders)
     return Error::success();
 
   DictScope D(P, "FileHeaders");
@@ -64,7 +112,7 @@ Error LLVMOutputStyle::dumpFileHeaders()
 }
 
 Error LLVMOutputStyle::dumpStreamSummary() {
-  if (!opts::DumpStreamSummary)
+  if (!opts::raw::DumpStreamSummary)
     return Error::success();
 
   // It's OK if we fail to load some of these streams, we still attempt to print
@@ -186,7 +234,7 @@ Error LLVMOutputStyle::dumpStreamSummary
 }
 
 Error LLVMOutputStyle::dumpStreamBlocks() {
-  if (!opts::DumpStreamBlocks)
+  if (!opts::raw::DumpStreamBlocks)
     return Error::success();
 
   ListScope L(P, "StreamBlocks");
@@ -202,7 +250,7 @@ Error LLVMOutputStyle::dumpStreamBlocks(
 
 Error LLVMOutputStyle::dumpStreamData() {
   uint32_t StreamCount = File.getNumStreams();
-  StringRef DumpStreamStr = opts::DumpStreamDataIdx;
+  StringRef DumpStreamStr = opts::raw::DumpStreamDataIdx;
   uint32_t DumpStreamNum;
   if (DumpStreamStr.getAsInteger(/*Radix=*/0U, DumpStreamNum))
     return Error::success();
@@ -228,7 +276,7 @@ Error LLVMOutputStyle::dumpStreamData()
 }
 
 Error LLVMOutputStyle::dumpInfoStream() {
-  if (!opts::DumpHeaders)
+  if (!opts::raw::DumpHeaders)
     return Error::success();
   auto IS = File.getPDBInfoStream();
   if (!IS)
@@ -243,20 +291,21 @@ Error LLVMOutputStyle::dumpInfoStream()
 }
 
 Error LLVMOutputStyle::dumpNamedStream() {
-  if (opts::DumpStreamDataName.empty())
+  if (opts::raw::DumpStreamDataName.empty())
     return Error::success();
 
   auto IS = File.getPDBInfoStream();
   if (!IS)
     return IS.takeError();
 
-  uint32_t NameStreamIndex = IS->getNamedStreamIndex(opts::DumpStreamDataName);
+  uint32_t NameStreamIndex =
+      IS->getNamedStreamIndex(opts::raw::DumpStreamDataName);
   if (NameStreamIndex == 0 || NameStreamIndex >= File.getNumStreams())
     return make_error<RawError>(raw_error_code::no_stream);
 
   if (NameStreamIndex != 0) {
     std::string Name("Stream '");
-    Name += opts::DumpStreamDataName;
+    Name += opts::raw::DumpStreamDataName;
     Name += "'";
     DictScope D(P, Name);
     P.printNumber("Index", NameStreamIndex);
@@ -290,7 +339,7 @@ static void printTypeIndexOffset(raw_ost
 }
 
 static void dumpTpiHash(ScopedPrinter &P, TpiStream &Tpi) {
-  if (!opts::DumpTpiHash)
+  if (!opts::raw::DumpTpiHash)
     return;
   DictScope DD(P, "Hash");
   P.printNumber("Number of Hash Buckets", Tpi.NumHashBuckets());
@@ -311,17 +360,17 @@ Error LLVMOutputStyle::dumpTpiStream(uin
   StringRef Label;
   StringRef VerLabel;
   if (StreamIdx == StreamTPI) {
-    DumpRecordBytes = opts::DumpTpiRecordBytes;
-    DumpRecords = opts::DumpTpiRecords;
+    DumpRecordBytes = opts::raw::DumpTpiRecordBytes;
+    DumpRecords = opts::raw::DumpTpiRecords;
     Label = "Type Info Stream (TPI)";
     VerLabel = "TPI Version";
   } else if (StreamIdx == StreamIPI) {
-    DumpRecordBytes = opts::DumpIpiRecordBytes;
-    DumpRecords = opts::DumpIpiRecords;
+    DumpRecordBytes = opts::raw::DumpIpiRecordBytes;
+    DumpRecords = opts::raw::DumpIpiRecords;
     Label = "Type Info Stream (IPI)";
     VerLabel = "IPI Version";
   }
-  if (!DumpRecordBytes && !DumpRecords && !opts::DumpModuleSyms)
+  if (!DumpRecordBytes && !DumpRecords && !opts::raw::DumpModuleSyms)
     return Error::success();
 
   auto Tpi = (StreamIdx == StreamTPI) ? File.getPDBTpiStream()
@@ -353,7 +402,7 @@ Error LLVMOutputStyle::dumpTpiStream(uin
     if (HadError)
       return make_error<RawError>(raw_error_code::corrupt_file,
                                   "TPI stream contained corrupt record");
-  } else if (opts::DumpModuleSyms) {
+  } else if (opts::raw::DumpModuleSyms) {
     // Even if the user doesn't want to dump type records, we still need to
     // iterate them in order to build the list of types so that we can print
     // them when dumping module symbols. So when they want to dump symbols
@@ -378,9 +427,9 @@ Error LLVMOutputStyle::dumpTpiStream(uin
 }
 
 Error LLVMOutputStyle::dumpDbiStream() {
-  bool DumpModules = opts::DumpModules || opts::DumpModuleSyms ||
-                     opts::DumpModuleFiles || opts::DumpLineInfo;
-  if (!opts::DumpHeaders && !DumpModules)
+  bool DumpModules = opts::raw::DumpModules || opts::raw::DumpModuleSyms ||
+                     opts::raw::DumpModuleFiles || opts::raw::DumpLineInfo;
+  if (!opts::raw::DumpHeaders && !DumpModules)
     return Error::success();
 
   auto DS = File.getPDBDbiStream();
@@ -424,7 +473,7 @@ Error LLVMOutputStyle::dumpDbiStream() {
       P.printNumber("Symbol Byte Size", Modi.Info.getSymbolDebugInfoByteSize());
       P.printNumber("Type Server Index", Modi.Info.getTypeServerIndex());
       P.printBoolean("Has EC Info", Modi.Info.hasECInfo());
-      if (opts::DumpModuleFiles) {
+      if (opts::raw::DumpModuleFiles) {
         std::string FileListName =
             to_string(Modi.SourceFiles.size()) + " Contributing Source Files";
         ListScope LL(P, FileListName);
@@ -434,8 +483,8 @@ Error LLVMOutputStyle::dumpDbiStream() {
       bool HasModuleDI =
           (Modi.Info.getModuleStreamIndex() < File.getNumStreams());
       bool ShouldDumpSymbols =
-          (opts::DumpModuleSyms || opts::DumpSymRecordBytes);
-      if (HasModuleDI && (ShouldDumpSymbols || opts::DumpLineInfo)) {
+          (opts::raw::DumpModuleSyms || opts::raw::DumpSymRecordBytes);
+      if (HasModuleDI && (ShouldDumpSymbols || opts::raw::DumpLineInfo)) {
         auto ModStreamData = MappedBlockStream::createIndexedStream(
             Modi.Info.getModuleStreamIndex(), File);
         if (!ModStreamData)
@@ -451,9 +500,9 @@ Error LLVMOutputStyle::dumpDbiStream() {
           for (const auto &S : ModS.symbols(&HadError)) {
             DictScope DD(P, "");
 
-            if (opts::DumpModuleSyms)
+            if (opts::raw::DumpModuleSyms)
               SD.dump(S);
-            if (opts::DumpSymRecordBytes)
+            if (opts::raw::DumpSymRecordBytes)
               P.printBinaryBlock("Bytes", S.Data);
           }
           if (HadError)
@@ -461,7 +510,7 @@ Error LLVMOutputStyle::dumpDbiStream() {
                 raw_error_code::corrupt_file,
                 "DBI stream contained corrupt symbol record");
         }
-        if (opts::DumpLineInfo) {
+        if (opts::raw::DumpLineInfo) {
           ListScope SS(P, "LineInfo");
           bool HadError = false;
           // Define a locally scoped visitor to print the different
@@ -561,7 +610,7 @@ Error LLVMOutputStyle::dumpDbiStream() {
 }
 
 Error LLVMOutputStyle::dumpSectionContribs() {
-  if (!opts::DumpSectionContribs)
+  if (!opts::raw::DumpSectionContribs)
     return Error::success();
 
   auto Dbi = File.getPDBDbiStream();
@@ -608,7 +657,7 @@ Error LLVMOutputStyle::dumpSectionContri
 }
 
 Error LLVMOutputStyle::dumpSectionMap() {
-  if (!opts::DumpSectionMap)
+  if (!opts::raw::DumpSectionMap)
     return Error::success();
 
   auto Dbi = File.getPDBDbiStream();
@@ -633,7 +682,7 @@ Error LLVMOutputStyle::dumpSectionMap()
 }
 
 Error LLVMOutputStyle::dumpPublicsStream() {
-  if (!opts::DumpPublics)
+  if (!opts::raw::DumpPublics)
     return Error::success();
 
   DictScope D(P, "Publics Stream");
@@ -661,7 +710,7 @@ Error LLVMOutputStyle::dumpPublicsStream
     DictScope DD(P, "");
 
     SD.dump(S);
-    if (opts::DumpSymRecordBytes)
+    if (opts::raw::DumpSymRecordBytes)
       P.printBinaryBlock("Bytes", S.Data);
   }
   if (HadError)
@@ -673,7 +722,7 @@ Error LLVMOutputStyle::dumpPublicsStream
 }
 
 Error LLVMOutputStyle::dumpSectionHeaders() {
-  if (!opts::DumpSectionHeaders)
+  if (!opts::raw::DumpSectionHeaders)
     return Error::success();
 
   auto Dbi = File.getPDBDbiStream();
@@ -702,7 +751,7 @@ Error LLVMOutputStyle::dumpSectionHeader
 }
 
 Error LLVMOutputStyle::dumpFpoStream() {
-  if (!opts::DumpFpo)
+  if (!opts::raw::DumpFpo)
     return Error::success();
 
   auto Dbi = File.getPDBDbiStream();
@@ -724,4 +773,5 @@ Error LLVMOutputStyle::dumpFpoStream() {
   }
   return Error::success();
 }
+
 void LLVMOutputStyle::flush() { P.flush(); }

Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h Thu Jun 30 12:42:48 2016
@@ -21,23 +21,25 @@ class LLVMOutputStyle : public OutputSty
 public:
   LLVMOutputStyle(PDBFile &File);
 
-  Error dumpFileHeaders() override;
-  Error dumpStreamSummary() override;
-  Error dumpStreamBlocks() override;
-  Error dumpStreamData() override;
-  Error dumpInfoStream() override;
-  Error dumpNamedStream() override;
-  Error dumpTpiStream(uint32_t StreamIdx) override;
-  Error dumpDbiStream() override;
-  Error dumpSectionContribs() override;
-  Error dumpSectionMap() override;
-  Error dumpPublicsStream() override;
-  Error dumpSectionHeaders() override;
-  Error dumpFpoStream() override;
-
-  void flush() override;
+  Error dump() override;
 
 private:
+  Error dumpFileHeaders();
+  Error dumpStreamSummary();
+  Error dumpStreamBlocks();
+  Error dumpStreamData();
+  Error dumpInfoStream();
+  Error dumpNamedStream();
+  Error dumpTpiStream(uint32_t StreamIdx);
+  Error dumpDbiStream();
+  Error dumpSectionContribs();
+  Error dumpSectionMap();
+  Error dumpPublicsStream();
+  Error dumpSectionHeaders();
+  Error dumpFpoStream();
+
+  void flush();
+
   PDBFile &File;
   ScopedPrinter P;
   codeview::CVTypeDumper TD;

Modified: llvm/trunk/tools/llvm-pdbdump/LinePrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LinePrinter.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/LinePrinter.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/LinePrinter.cpp Thu Jun 30 12:42:48 2016
@@ -44,19 +44,19 @@ using namespace llvm;
 
 LinePrinter::LinePrinter(int Indent, llvm::raw_ostream &Stream)
     : OS(Stream), IndentSpaces(Indent), CurrentIndent(0) {
-  SetFilters(ExcludeTypeFilters, opts::ExcludeTypes.begin(),
-             opts::ExcludeTypes.end());
-  SetFilters(ExcludeSymbolFilters, opts::ExcludeSymbols.begin(),
-             opts::ExcludeSymbols.end());
-  SetFilters(ExcludeCompilandFilters, opts::ExcludeCompilands.begin(),
-             opts::ExcludeCompilands.end());
+  SetFilters(ExcludeTypeFilters, opts::pretty::ExcludeTypes.begin(),
+             opts::pretty::ExcludeTypes.end());
+  SetFilters(ExcludeSymbolFilters, opts::pretty::ExcludeSymbols.begin(),
+             opts::pretty::ExcludeSymbols.end());
+  SetFilters(ExcludeCompilandFilters, opts::pretty::ExcludeCompilands.begin(),
+             opts::pretty::ExcludeCompilands.end());
 
-  SetFilters(IncludeTypeFilters, opts::IncludeTypes.begin(),
-             opts::IncludeTypes.end());
-  SetFilters(IncludeSymbolFilters, opts::IncludeSymbols.begin(),
-             opts::IncludeSymbols.end());
-  SetFilters(IncludeCompilandFilters, opts::IncludeCompilands.begin(),
-             opts::IncludeCompilands.end());
+  SetFilters(IncludeTypeFilters, opts::pretty::IncludeTypes.begin(),
+             opts::pretty::IncludeTypes.end());
+  SetFilters(IncludeSymbolFilters, opts::pretty::IncludeSymbols.begin(),
+             opts::pretty::IncludeSymbols.end());
+  SetFilters(IncludeCompilandFilters, opts::pretty::IncludeCompilands.begin(),
+             opts::pretty::IncludeCompilands.end());
 }
 
 void LinePrinter::Indent() { CurrentIndent += IndentSpaces; }

Modified: llvm/trunk/tools/llvm-pdbdump/OutputStyle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/OutputStyle.h?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/OutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/OutputStyle.h Thu Jun 30 12:42:48 2016
@@ -19,21 +19,8 @@ class PDBFile;
 class OutputStyle {
 public:
   virtual ~OutputStyle() {}
-  virtual Error dumpFileHeaders() = 0;
-  virtual Error dumpStreamSummary() = 0;
-  virtual Error dumpStreamBlocks() = 0;
-  virtual Error dumpStreamData() = 0;
-  virtual Error dumpInfoStream() = 0;
-  virtual Error dumpNamedStream() = 0;
-  virtual Error dumpTpiStream(uint32_t StreamIdx) = 0;
-  virtual Error dumpDbiStream() = 0;
-  virtual Error dumpSectionContribs() = 0;
-  virtual Error dumpSectionMap() = 0;
-  virtual Error dumpPublicsStream() = 0;
-  virtual Error dumpSectionHeaders() = 0;
-  virtual Error dumpFpoStream() = 0;
 
-  virtual void flush() = 0;
+  virtual Error dump() = 0;
 };
 }
 }

Modified: llvm/trunk/tools/llvm-pdbdump/TypeDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/TypeDumper.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/TypeDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/TypeDumper.cpp Thu Jun 30 12:42:48 2016
@@ -88,7 +88,7 @@ void TypeDumper::dump(const PDBSymbolTyp
 
   Printer.NewLine();
 
-  if (opts::NoClassDefs) {
+  if (opts::pretty::NoClassDefs) {
     WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
     WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
   } else {

Modified: llvm/trunk/tools/llvm-pdbdump/VariableDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/VariableDumper.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/VariableDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/VariableDumper.cpp Thu Jun 30 12:42:48 2016
@@ -33,7 +33,7 @@ VariableDumper::VariableDumper(LinePrint
     : PDBSymDumper(true), Printer(P) {}
 
 void VariableDumper::start(const PDBSymbolData &Var) {
-  if (Var.isCompilerGenerated() && opts::ExcludeCompilerGenerated)
+  if (Var.isCompilerGenerated() && opts::pretty::ExcludeCompilerGenerated)
     return;
   if (Printer.IsSymbolExcluded(Var.getName()))
     return;

Modified: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp Thu Jun 30 12:42:48 2016
@@ -12,6 +12,7 @@
 #include "PdbYaml.h"
 #include "llvm-pdbdump.h"
 
+#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
 #include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
 
 using namespace llvm;
@@ -19,10 +20,21 @@ using namespace llvm::pdb;
 
 YAMLOutputStyle::YAMLOutputStyle(PDBFile &File) : File(File), Out(outs()) {}
 
-Error YAMLOutputStyle::dumpFileHeaders() {
-  if (!opts::DumpHeaders)
-    return Error::success();
+Error YAMLOutputStyle::dump() {
+  if (auto EC = dumpFileHeaders())
+    return EC;
+
+  if (auto EC = dumpStreamMetadata())
+    return EC;
+
+  if (auto EC = dumpStreamDirectory())
+    return EC;
+
+  flush();
+  return Error::success();
+}
 
+Error YAMLOutputStyle::dumpFileHeaders() {
   yaml::MsfHeaders Headers;
   Obj.Headers.SuperBlock.NumBlocks = File.getBlockCount();
   Obj.Headers.SuperBlock.BlockMapAddr = File.getBlockMapIndex();
@@ -32,7 +44,7 @@ Error YAMLOutputStyle::dumpFileHeaders()
   Obj.Headers.DirectoryBlocks.assign(Blocks.begin(), Blocks.end());
   Obj.Headers.NumDirectoryBlocks = File.getNumDirectoryBlocks();
   Obj.Headers.SuperBlock.NumDirectoryBytes = File.getNumDirectoryBytes();
-  Obj.Headers.NumStreams = File.getNumStreams();
+  Obj.Headers.NumStreams = opts::pdb2yaml::StreamMetadata ? File.getNumStreams() : 0;
   Obj.Headers.SuperBlock.Unknown0 = File.getUnknown0();
   Obj.Headers.SuperBlock.Unknown1 = File.getUnknown1();
   Obj.Headers.FileSize = File.getFileSize();
@@ -40,16 +52,16 @@ Error YAMLOutputStyle::dumpFileHeaders()
   return Error::success();
 }
 
-Error YAMLOutputStyle::dumpStreamSummary() {
-  if (!opts::DumpStreamSummary)
+Error YAMLOutputStyle::dumpStreamMetadata() {
+  if (!opts::pdb2yaml::StreamMetadata)
     return Error::success();
 
   Obj.StreamSizes = File.getStreamSizes();
   return Error::success();
 }
 
-Error YAMLOutputStyle::dumpStreamBlocks() {
-  if (!opts::DumpStreamBlocks)
+Error YAMLOutputStyle::dumpStreamDirectory() {
+  if (!opts::pdb2yaml::StreamDirectory)
     return Error::success();
 
   auto StreamMap = File.getStreamMap();
@@ -62,71 +74,6 @@ Error YAMLOutputStyle::dumpStreamBlocks(
 
   return Error::success();
 }
-
-Error YAMLOutputStyle::dumpStreamData() {
-  uint32_t StreamCount = File.getNumStreams();
-  StringRef DumpStreamStr = opts::DumpStreamDataIdx;
-  uint32_t DumpStreamNum;
-  if (DumpStreamStr.getAsInteger(/*Radix=*/0U, DumpStreamNum) ||
-      DumpStreamNum >= StreamCount)
-    return Error::success();
-
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpInfoStream() {
-  if (!opts::DumpHeaders)
-    return Error::success();
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpNamedStream() {
-  if (opts::DumpStreamDataName.empty())
-    return Error::success();
-
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpTpiStream(uint32_t StreamIdx) {
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpDbiStream() { return Error::success(); }
-
-Error YAMLOutputStyle::dumpSectionContribs() {
-  if (!opts::DumpSectionContribs)
-    return Error::success();
-
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpSectionMap() {
-  if (!opts::DumpSectionMap)
-    return Error::success();
-
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpPublicsStream() {
-  if (!opts::DumpPublics)
-    return Error::success();
-
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpSectionHeaders() {
-  if (!opts::DumpSectionHeaders)
-    return Error::success();
-
-  return Error::success();
-}
-
-Error YAMLOutputStyle::dumpFpoStream() {
-  if (!opts::DumpFpo)
-    return Error::success();
-
-  return Error::success();
-}
 
 void YAMLOutputStyle::flush() {
   Out << Obj;

Modified: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h Thu Jun 30 12:42:48 2016
@@ -23,23 +23,16 @@ class YAMLOutputStyle : public OutputSty
 public:
   YAMLOutputStyle(PDBFile &File);
 
-  Error dumpFileHeaders() override;
-  Error dumpStreamSummary() override;
-  Error dumpStreamBlocks() override;
-  Error dumpStreamData() override;
-  Error dumpInfoStream() override;
-  Error dumpNamedStream() override;
-  Error dumpTpiStream(uint32_t StreamIdx) override;
-  Error dumpDbiStream() override;
-  Error dumpSectionContribs() override;
-  Error dumpSectionMap() override;
-  Error dumpPublicsStream() override;
-  Error dumpSectionHeaders() override;
-  Error dumpFpoStream() override;
-
-  void flush() override;
+  Error dump() override;
 
 private:
+
+  Error dumpFileHeaders();
+  Error dumpStreamMetadata();
+  Error dumpStreamDirectory();
+
+  void flush();
+
   PDBFile &File;
   llvm::yaml::Output Out;
 

Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Thu Jun 30 12:42:48 2016
@@ -79,259 +79,194 @@ private:
 
 namespace opts {
 
-enum class PDB_DumpType { ByType, ByObjFile, Both };
-
-cl::list<std::string> InputFilenames(cl::Positional,
-                                     cl::desc("<input PDB files>"),
-                                     cl::OneOrMore);
+cl::SubCommand RawSubcommand("raw", "Dump raw structure of the PDB file");
+cl::SubCommand
+    PrettySubcommand("pretty",
+                     "Dump semantic information about types and symbols");
+cl::SubCommand YamlToPdbSubcommand("yaml2pdb", "Generate a PDB file from a YAML description");
+cl::SubCommand
+    PdbToYamlSubcommand("pdb2yaml",
+                        "Generate a detailed YAML description of a PDB File");
 
 cl::OptionCategory TypeCategory("Symbol Type Options");
 cl::OptionCategory FilterCategory("Filtering Options");
 cl::OptionCategory OtherOptions("Other Options");
-cl::OptionCategory NativeOptions("Native Options");
+
+namespace pretty {
+cl::list<std::string> InputFilenames(cl::Positional,
+                                     cl::desc("<input PDB files>"),
+                                     cl::OneOrMore, cl::sub(PrettySubcommand));
 
 cl::opt<bool> Compilands("compilands", cl::desc("Display compilands"),
-                         cl::cat(TypeCategory));
+                         cl::cat(TypeCategory), cl::sub(PrettySubcommand));
 cl::opt<bool> Symbols("symbols", cl::desc("Display symbols for each compiland"),
-                      cl::cat(TypeCategory));
+                      cl::cat(TypeCategory), cl::sub(PrettySubcommand));
 cl::opt<bool> Globals("globals", cl::desc("Dump global symbols"),
-                      cl::cat(TypeCategory));
+                      cl::cat(TypeCategory), cl::sub(PrettySubcommand));
 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> Lines("lines", cl::desc("Line tables"), cl::cat(TypeCategory));
+                        cl::cat(TypeCategory), cl::sub(PrettySubcommand));
+cl::opt<bool> Types("types", cl::desc("Display types"), cl::cat(TypeCategory),
+                    cl::sub(PrettySubcommand));
+cl::opt<bool> Lines("lines", cl::desc("Line tables"), cl::cat(TypeCategory),
+                    cl::sub(PrettySubcommand));
 cl::opt<bool>
     All("all", cl::desc("Implies all other options in 'Symbol Types' category"),
-        cl::cat(TypeCategory));
+        cl::cat(TypeCategory), cl::sub(PrettySubcommand));
 
 cl::opt<uint64_t> LoadAddress(
     "load-address",
     cl::desc("Assume the module is loaded at the specified address"),
-    cl::cat(OtherOptions));
-
-cl::opt<OutputStyleTy>
-    RawOutputStyle("raw-output-style", cl::desc("Specify dump outpout style"),
-                   cl::values(clEnumVal(LLVM, "LLVM default style"),
-                              clEnumVal(YAML, "YAML style"), clEnumValEnd),
-                   cl::init(LLVM), cl::cat(NativeOptions));
-
-cl::opt<bool> DumpHeaders("raw-headers", cl::desc("dump PDB headers"),
-                          cl::cat(NativeOptions));
-cl::opt<bool> DumpStreamBlocks("raw-stream-blocks",
-                               cl::desc("dump PDB stream blocks"),
-                               cl::cat(NativeOptions));
-cl::opt<bool> DumpStreamSummary("raw-stream-summary",
-                                cl::desc("dump summary of the PDB streams"),
-                                cl::cat(NativeOptions));
-cl::opt<bool>
-    DumpTpiRecords("raw-tpi-records",
-                   cl::desc("dump CodeView type records from TPI stream"),
-                   cl::cat(NativeOptions));
-cl::opt<bool> DumpTpiRecordBytes(
-    "raw-tpi-record-bytes",
-    cl::desc("dump CodeView type record raw bytes from TPI stream"),
-    cl::cat(NativeOptions));
-cl::opt<bool> DumpTpiHash("raw-tpi-hash",
-                          cl::desc("dump CodeView TPI hash stream"),
-                          cl::cat(NativeOptions));
-cl::opt<bool>
-    DumpIpiRecords("raw-ipi-records",
-                   cl::desc("dump CodeView type records from IPI stream"),
-                   cl::cat(NativeOptions));
-cl::opt<bool> DumpIpiRecordBytes(
-    "raw-ipi-record-bytes",
-    cl::desc("dump CodeView type record raw bytes from IPI stream"),
-    cl::cat(NativeOptions));
-cl::opt<std::string> DumpStreamDataIdx("raw-stream",
-                                       cl::desc("dump stream data"),
-                                       cl::cat(NativeOptions));
-cl::opt<std::string> DumpStreamDataName("raw-stream-name",
-                                        cl::desc("dump stream data"),
-                                        cl::cat(NativeOptions));
-cl::opt<bool> DumpModules("raw-modules", cl::desc("dump compiland information"),
-                          cl::cat(NativeOptions));
-cl::opt<bool> DumpModuleFiles("raw-module-files",
-                              cl::desc("dump file information"),
-                              cl::cat(NativeOptions));
-cl::opt<bool> DumpModuleSyms("raw-module-syms", cl::desc("dump module symbols"),
-                             cl::cat(NativeOptions));
-cl::opt<bool> DumpPublics("raw-publics", cl::desc("dump Publics stream data"),
-                          cl::cat(NativeOptions));
-cl::opt<bool> DumpSectionContribs("raw-section-contribs",
-                                  cl::desc("dump section contributions"),
-                                  cl::cat(NativeOptions));
-cl::opt<bool> DumpLineInfo("raw-line-info",
-                           cl::desc("dump file and line information"),
-                           cl::cat(NativeOptions));
-cl::opt<bool> DumpSectionMap("raw-section-map", cl::desc("dump section map"),
-                             cl::cat(NativeOptions));
-cl::opt<bool>
-    DumpSymRecordBytes("raw-sym-record-bytes",
-                       cl::desc("dump CodeView symbol record raw bytes"),
-                       cl::cat(NativeOptions));
-cl::opt<bool> DumpSectionHeaders("raw-section-headers",
-                                 cl::desc("dump section headers"),
-                                 cl::cat(NativeOptions));
-cl::opt<bool> DumpFpo("raw-fpo", cl::desc("dump FPO records"),
-                      cl::cat(NativeOptions));
-
-cl::opt<bool>
-    RawAll("raw-all",
-           cl::desc("Implies most other options in 'Native Options' category"),
-           cl::cat(NativeOptions));
-
-cl::opt<bool>
-    YamlToPdb("yaml-to-pdb",
-              cl::desc("The input file is yaml, and the tool outputs a pdb"),
-              cl::cat(NativeOptions));
-cl::opt<std::string> YamlPdbOutputFile(
-    "pdb-output", cl::desc("When yaml-to-pdb is specified, the output file"),
-    cl::cat(NativeOptions));
-
-cl::list<std::string>
-    ExcludeTypes("exclude-types",
-                 cl::desc("Exclude types by regular expression"),
-                 cl::ZeroOrMore, cl::cat(FilterCategory));
-cl::list<std::string>
-    ExcludeSymbols("exclude-symbols",
-                   cl::desc("Exclude symbols by regular expression"),
-                   cl::ZeroOrMore, cl::cat(FilterCategory));
-cl::list<std::string>
-    ExcludeCompilands("exclude-compilands",
-                      cl::desc("Exclude compilands by regular expression"),
-                      cl::ZeroOrMore, cl::cat(FilterCategory));
+    cl::cat(OtherOptions), cl::sub(PrettySubcommand));
+cl::list<std::string> ExcludeTypes(
+    "exclude-types", cl::desc("Exclude types by regular expression"),
+    cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
+cl::list<std::string> ExcludeSymbols(
+    "exclude-symbols", cl::desc("Exclude symbols by regular expression"),
+    cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
+cl::list<std::string> ExcludeCompilands(
+    "exclude-compilands", cl::desc("Exclude compilands by regular expression"),
+    cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 
 cl::list<std::string> IncludeTypes(
     "include-types",
     cl::desc("Include only types which match a regular expression"),
-    cl::ZeroOrMore, cl::cat(FilterCategory));
+    cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 cl::list<std::string> IncludeSymbols(
     "include-symbols",
     cl::desc("Include only symbols which match a regular expression"),
-    cl::ZeroOrMore, cl::cat(FilterCategory));
+    cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 cl::list<std::string> IncludeCompilands(
     "include-compilands",
     cl::desc("Include only compilands those which match a regular expression"),
-    cl::ZeroOrMore, cl::cat(FilterCategory));
+    cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 
 cl::opt<bool> ExcludeCompilerGenerated(
     "no-compiler-generated",
     cl::desc("Don't show compiler generated types and symbols"),
-    cl::cat(FilterCategory));
+    cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 cl::opt<bool>
     ExcludeSystemLibraries("no-system-libs",
                            cl::desc("Don't show symbols from system libraries"),
-                           cl::cat(FilterCategory));
+                           cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 cl::opt<bool> NoClassDefs("no-class-definitions",
                           cl::desc("Don't display full class definitions"),
-                          cl::cat(FilterCategory));
+                          cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 cl::opt<bool> NoEnumDefs("no-enum-definitions",
                          cl::desc("Don't display full enum definitions"),
-                         cl::cat(FilterCategory));
+                         cl::cat(FilterCategory), cl::sub(PrettySubcommand));
 }
 
-static ExitOnError ExitOnErr;
-
-static Error dumpStructure(RawSession &RS) {
-  PDBFile &File = RS.getPDBFile();
-  std::unique_ptr<OutputStyle> O;
-  if (opts::RawOutputStyle == opts::OutputStyleTy::LLVM)
-    O = llvm::make_unique<LLVMOutputStyle>(File);
-  else if (opts::RawOutputStyle == opts::OutputStyleTy::YAML)
-    O = llvm::make_unique<YAMLOutputStyle>(File);
-  else
-    return make_error<RawError>(raw_error_code::feature_unsupported,
-                                "Requested output style unsupported");
-
-  if (auto EC = O->dumpFileHeaders())
-    return EC;
-
-  if (auto EC = O->dumpStreamSummary())
-    return EC;
-
-  if (auto EC = O->dumpStreamBlocks())
-    return EC;
-
-  if (auto EC = O->dumpStreamData())
-    return EC;
-
-  if (auto EC = O->dumpInfoStream())
-    return EC;
-
-  if (auto EC = O->dumpNamedStream())
-    return EC;
+namespace raw {
 
-  if (auto EC = O->dumpTpiStream(StreamTPI))
-    return EC;
-
-  if (auto EC = O->dumpTpiStream(StreamIPI))
-    return EC;
+cl::OptionCategory MsfOptions("MSF Container Options");
+cl::OptionCategory TypeOptions("Type Record Options");
+cl::OptionCategory FileOptions("Module & File Options");
+cl::OptionCategory SymbolOptions("Symbol Options");
+cl::OptionCategory MiscOptions("Miscellaneous Options");
+
+// MSF OPTIONS
+cl::opt<bool> DumpHeaders("headers", cl::desc("dump PDB headers"),
+                          cl::cat(MsfOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpStreamBlocks("stream-blocks",
+                               cl::desc("dump PDB stream blocks"),
+                               cl::cat(MsfOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpStreamSummary("stream-summary",
+                                cl::desc("dump summary of the PDB streams"),
+                                cl::cat(MsfOptions), cl::sub(RawSubcommand));
 
-  if (auto EC = O->dumpDbiStream())
-    return EC;
+// TYPE OPTIONS
+cl::opt<bool>
+    DumpTpiRecords("tpi-records",
+                   cl::desc("dump CodeView type records from TPI stream"),
+                   cl::cat(TypeOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpTpiRecordBytes(
+    "tpi-record-bytes",
+    cl::desc("dump CodeView type record raw bytes from TPI stream"),
+    cl::cat(TypeOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpTpiHash("tpi-hash", cl::desc("dump CodeView TPI hash stream"),
+                          cl::cat(TypeOptions), cl::sub(RawSubcommand));
+cl::opt<bool>
+    DumpIpiRecords("ipi-records",
+                   cl::desc("dump CodeView type records from IPI stream"),
+                   cl::cat(TypeOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpIpiRecordBytes(
+    "ipi-record-bytes",
+    cl::desc("dump CodeView type record raw bytes from IPI stream"),
+    cl::cat(TypeOptions), cl::sub(RawSubcommand));
 
-  if (auto EC = O->dumpSectionContribs())
-    return EC;
+// MODULE & FILE OPTIONS
+cl::opt<bool> DumpModules("modules", cl::desc("dump compiland information"),
+                          cl::cat(FileOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpModuleFiles("module-files", cl::desc("dump file information"),
+                              cl::cat(FileOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpLineInfo("line-info",
+  cl::desc("dump file and line information"),
+  cl::cat(FileOptions), cl::sub(RawSubcommand));
+
+// SYMBOL OPTIONS
+cl::opt<bool> DumpModuleSyms("module-syms", cl::desc("dump module symbols"),
+                             cl::cat(SymbolOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpPublics("publics", cl::desc("dump Publics stream data"),
+                          cl::cat(SymbolOptions), cl::sub(RawSubcommand));
+cl::opt<bool>
+    DumpSymRecordBytes("sym-record-bytes",
+                       cl::desc("dump CodeView symbol record raw bytes"),
+                       cl::cat(SymbolOptions), cl::sub(RawSubcommand));
 
-  if (auto EC = O->dumpSectionMap())
-    return EC;
+// MISCELLANEOUS OPTIONS
+cl::opt<bool> DumpSectionContribs("section-contribs",
+                                  cl::desc("dump section contributions"),
+                                  cl::cat(MiscOptions),
+                                  cl::sub(RawSubcommand));
+cl::opt<bool> DumpSectionMap("section-map", cl::desc("dump section map"),
+                             cl::cat(MiscOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpSectionHeaders("section-headers",
+                                 cl::desc("dump section headers"),
+                                 cl::cat(MiscOptions),
+                                 cl::sub(RawSubcommand));
+cl::opt<bool> DumpFpo("fpo", cl::desc("dump FPO records"),
+                      cl::cat(MiscOptions), cl::sub(RawSubcommand));
+
+cl::opt<std::string> DumpStreamDataIdx("stream", cl::desc("dump stream data"),
+  cl::cat(MiscOptions),
+  cl::sub(RawSubcommand));
+cl::opt<std::string> DumpStreamDataName("stream-name",
+  cl::desc("dump stream data"),
+  cl::cat(MiscOptions),
+  cl::sub(RawSubcommand));
 
-  if (auto EC = O->dumpPublicsStream())
-    return EC;
+cl::opt<bool>
+    RawAll("all",
+           cl::desc("Implies most other options."),
+           cl::cat(MiscOptions), cl::sub(RawSubcommand));
 
-  if (auto EC = O->dumpSectionHeaders())
-    return EC;
+cl::list<std::string> InputFilenames(cl::Positional,
+                                     cl::desc("<input PDB files>"),
+                                     cl::OneOrMore, cl::sub(RawSubcommand));
+}
 
-  if (auto EC = O->dumpFpoStream())
-    return EC;
-  O->flush();
-  return Error::success();
+namespace yaml2pdb {
+cl::opt<std::string>
+    YamlPdbOutputFile("pdb", cl::desc("the name of the PDB file to write"),
+                      cl::sub(YamlToPdbSubcommand));
+
+cl::list<std::string> InputFilename(cl::Positional,
+                                    cl::desc("<input YAML file>"), cl::Required,
+                                    cl::sub(YamlToPdbSubcommand));
 }
 
-bool isRawDumpEnabled() {
-  if (opts::DumpHeaders)
-    return true;
-  if (opts::DumpModules)
-    return true;
-  if (opts::DumpModuleFiles)
-    return true;
-  if (opts::DumpModuleSyms)
-    return true;
-  if (!opts::DumpStreamDataIdx.empty())
-    return true;
-  if (!opts::DumpStreamDataName.empty())
-    return true;
-  if (opts::DumpPublics)
-    return true;
-  if (opts::DumpStreamSummary)
-    return true;
-  if (opts::DumpStreamBlocks)
-    return true;
-  if (opts::DumpSymRecordBytes)
-    return true;
-  if (opts::DumpTpiRecordBytes)
-    return true;
-  if (opts::DumpTpiRecords)
-    return true;
-  if (opts::DumpTpiHash)
-    return true;
-  if (opts::DumpIpiRecords)
-    return true;
-  if (opts::DumpIpiRecordBytes)
-    return true;
-  if (opts::DumpSectionHeaders)
-    return true;
-  if (opts::DumpSectionContribs)
-    return true;
-  if (opts::DumpSectionMap)
-    return true;
-  if (opts::DumpLineInfo)
-    return true;
-  if (opts::DumpFpo)
-    return true;
-  return false;
+namespace pdb2yaml {
+  cl::opt<bool> StreamMetadata("stream-metadata", cl::desc("Dump the number of streams and each stream's size"), cl::sub(PdbToYamlSubcommand));
+  cl::opt<bool> StreamDirectory("stream-directory", cl::desc("Dump each stream's block map (implies -stream-metadata)"), cl::sub(PdbToYamlSubcommand));
+
+cl::list<std::string> InputFilename(cl::Positional,
+                                    cl::desc("<input PDB file>"), cl::Required,
+                                    cl::sub(PdbToYamlSubcommand));
+}
 }
 
+static ExitOnError ExitOnErr;
+
 static void yamlToPdb(StringRef Path) {
   ErrorOr<std::unique_ptr<MemoryBuffer>> ErrorOrBuffer =
       MemoryBuffer::getFileOrSTDIN(Path, /*FileSize=*/-1,
@@ -347,11 +282,11 @@ static void yamlToPdb(StringRef Path) {
   pdb::yaml::PdbObject YamlObj;
   In >> YamlObj;
 
-  auto OutFileOrError = FileOutputBuffer::create(opts::YamlPdbOutputFile,
-                                                 YamlObj.Headers.FileSize);
+  auto OutFileOrError = FileOutputBuffer::create(
+      opts::yaml2pdb::YamlPdbOutputFile, YamlObj.Headers.FileSize);
   if (OutFileOrError.getError())
     ExitOnErr(make_error<GenericError>(generic_error_code::invalid_path,
-                                       opts::YamlPdbOutputFile));
+                                       opts::yaml2pdb::YamlPdbOutputFile));
 
   auto FileByteStream =
       llvm::make_unique<FileBufferByteStream>(std::move(*OutFileOrError));
@@ -371,20 +306,28 @@ static void yamlToPdb(StringRef Path) {
   Pdb.commit();
 }
 
-static void dumpInput(StringRef Path) {
+static void dumpRaw(StringRef Path) {
   std::unique_ptr<IPDBSession> Session;
-  if (isRawDumpEnabled()) {
-    ExitOnErr(loadDataForPDB(PDB_ReaderType::Raw, Path, Session));
+  ExitOnErr(loadDataForPDB(PDB_ReaderType::Raw, Path, Session));
 
-    RawSession *RS = static_cast<RawSession *>(Session.get());
-    ExitOnErr(dumpStructure(*RS));
-    return;
-  }
+  RawSession *RS = static_cast<RawSession *>(Session.get());
+  PDBFile &File = RS->getPDBFile();
+  std::unique_ptr<OutputStyle> O;
+  if (opts::PdbToYamlSubcommand)
+    O = llvm::make_unique<YAMLOutputStyle>(File);
+  else
+    O = llvm::make_unique<LLVMOutputStyle>(File);
+
+  ExitOnErr(O->dump());
+}
+
+static void dumpPretty(StringRef Path) {
+  std::unique_ptr<IPDBSession> Session;
 
   ExitOnErr(loadDataForPDB(PDB_ReaderType::DIA, Path, Session));
 
-  if (opts::LoadAddress)
-    Session->setLoadAddress(opts::LoadAddress);
+  if (opts::pretty::LoadAddress)
+    Session->setLoadAddress(opts::pretty::LoadAddress);
 
   LinePrinter Printer(2, outs());
 
@@ -421,7 +364,7 @@ static void dumpInput(StringRef Path) {
     outs() << "HasPrivateSymbols ";
   Printer.Unindent();
 
-  if (opts::Compilands) {
+  if (opts::pretty::Compilands) {
     Printer.NewLine();
     WithColor(Printer, PDB_ColorItem::SectionHeader).get()
         << "---COMPILANDS---";
@@ -429,14 +372,14 @@ static void dumpInput(StringRef Path) {
     auto Compilands = GlobalScope->findAllChildren<PDBSymbolCompiland>();
     CompilandDumper Dumper(Printer);
     CompilandDumpFlags options = CompilandDumper::Flags::None;
-    if (opts::Lines)
+    if (opts::pretty::Lines)
       options = options | CompilandDumper::Flags::Lines;
     while (auto Compiland = Compilands->getNext())
       Dumper.start(*Compiland, options);
     Printer.Unindent();
   }
 
-  if (opts::Types) {
+  if (opts::pretty::Types) {
     Printer.NewLine();
     WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---TYPES---";
     Printer.Indent();
@@ -445,7 +388,7 @@ static void dumpInput(StringRef Path) {
     Printer.Unindent();
   }
 
-  if (opts::Symbols) {
+  if (opts::pretty::Symbols) {
     Printer.NewLine();
     WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---SYMBOLS---";
     Printer.Indent();
@@ -456,7 +399,7 @@ static void dumpInput(StringRef Path) {
     Printer.Unindent();
   }
 
-  if (opts::Globals) {
+  if (opts::pretty::Globals) {
     Printer.NewLine();
     WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---GLOBALS---";
     Printer.Indent();
@@ -482,14 +425,14 @@ static void dumpInput(StringRef Path) {
     }
     Printer.Unindent();
   }
-  if (opts::Externals) {
+  if (opts::pretty::Externals) {
     Printer.NewLine();
     WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---EXTERNALS---";
     Printer.Indent();
     ExternalSymbolDumper Dumper(Printer);
     Dumper.start(*GlobalScope);
   }
-  if (opts::Lines) {
+  if (opts::pretty::Lines) {
     Printer.NewLine();
   }
   outs().flush();
@@ -510,60 +453,68 @@ int main(int argc_, const char *argv_[])
   llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
 
   cl::ParseCommandLineOptions(argv.size(), argv.data(), "LLVM PDB Dumper\n");
-  if (opts::Lines)
-    opts::Compilands = true;
 
-  if (opts::All) {
-    opts::Compilands = true;
-    opts::Symbols = true;
-    opts::Globals = true;
-    opts::Types = true;
-    opts::Externals = true;
-    opts::Lines = true;
-  }
-
-  if (opts::RawAll) {
-    opts::DumpHeaders = true;
-    opts::DumpModules = true;
-    opts::DumpModuleFiles = true;
-    opts::DumpModuleSyms = true;
-    opts::DumpPublics = true;
-    opts::DumpSectionHeaders = true;
-    opts::DumpStreamSummary = true;
-    opts::DumpStreamBlocks = true;
-    opts::DumpTpiRecords = true;
-    opts::DumpTpiHash = true;
-    opts::DumpIpiRecords = true;
-    opts::DumpSectionMap = true;
-    opts::DumpSectionContribs = true;
-    opts::DumpLineInfo = true;
-    opts::DumpFpo = 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 it needs to
-  // be escaped again in the C++.  So matching a single \ in the input requires
-  // 4 \es in the C++.
-  if (opts::ExcludeCompilerGenerated) {
-    opts::ExcludeTypes.push_back("__vc_attributes");
-    opts::ExcludeCompilands.push_back("\\* Linker \\*");
-  }
-  if (opts::ExcludeSystemLibraries) {
-    opts::ExcludeCompilands.push_back(
-        "f:\\\\binaries\\\\Intermediate\\\\vctools\\\\crt_bld");
-    opts::ExcludeCompilands.push_back("f:\\\\dd\\\\vctools\\\\crt");
-    opts::ExcludeCompilands.push_back("d:\\\\th.obj.x86fre\\\\minkernel");
+  // These options are shared by two subcommands.
+  if ((opts::PdbToYamlSubcommand || opts::RawSubcommand) && opts::raw::RawAll) {
+    opts::raw::DumpHeaders = true;
+    opts::raw::DumpModules = true;
+    opts::raw::DumpModuleFiles = true;
+    opts::raw::DumpModuleSyms = true;
+    opts::raw::DumpPublics = true;
+    opts::raw::DumpSectionHeaders = true;
+    opts::raw::DumpStreamSummary = true;
+    opts::raw::DumpStreamBlocks = true;
+    opts::raw::DumpTpiRecords = true;
+    opts::raw::DumpTpiHash = true;
+    opts::raw::DumpIpiRecords = true;
+    opts::raw::DumpSectionMap = true;
+    opts::raw::DumpSectionContribs = true;
+    opts::raw::DumpLineInfo = true;
+    opts::raw::DumpFpo = true;
   }
 
   llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
 
-  if (opts::YamlToPdb) {
-    std::for_each(opts::InputFilenames.begin(), opts::InputFilenames.end(),
-                  yamlToPdb);
-  } else {
-    std::for_each(opts::InputFilenames.begin(), opts::InputFilenames.end(),
-                  dumpInput);
+  if (opts::PdbToYamlSubcommand) {
+    dumpRaw(opts::pdb2yaml::InputFilename.front());
+  } else if (opts::YamlToPdbSubcommand) {
+    yamlToPdb(opts::yaml2pdb::InputFilename.front());
+  } else if (opts::PrettySubcommand) {
+    if (opts::pretty::Lines)
+      opts::pretty::Compilands = true;
+
+    if (opts::pretty::All) {
+      opts::pretty::Compilands = true;
+      opts::pretty::Symbols = true;
+      opts::pretty::Globals = true;
+      opts::pretty::Types = true;
+      opts::pretty::Externals = true;
+      opts::pretty::Lines = 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 it needs to
+    // be escaped again in the C++.  So matching a single \ in the input
+    // requires
+    // 4 \es in the C++.
+    if (opts::pretty::ExcludeCompilerGenerated) {
+      opts::pretty::ExcludeTypes.push_back("__vc_attributes");
+      opts::pretty::ExcludeCompilands.push_back("\\* Linker \\*");
+    }
+    if (opts::pretty::ExcludeSystemLibraries) {
+      opts::pretty::ExcludeCompilands.push_back(
+          "f:\\\\binaries\\\\Intermediate\\\\vctools\\\\crt_bld");
+      opts::pretty::ExcludeCompilands.push_back("f:\\\\dd\\\\vctools\\\\crt");
+      opts::pretty::ExcludeCompilands.push_back(
+          "d:\\\\th.obj.x86fre\\\\minkernel");
+    }
+    std::for_each(opts::pretty::InputFilenames.begin(),
+                  opts::pretty::InputFilenames.end(), dumpPretty);
+  } else if (opts::RawSubcommand) {
+    std::for_each(opts::raw::InputFilenames.begin(),
+                  opts::raw::InputFilenames.end(), dumpRaw);
   }
 
   outs().flush();

Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h?rev=274247&r1=274246&r2=274247&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h Thu Jun 30 12:42:48 2016
@@ -15,15 +15,25 @@
 
 namespace opts {
 
-enum OutputStyleTy { LLVM, YAML };
-
+namespace pretty {
 extern llvm::cl::opt<bool> Compilands;
 extern llvm::cl::opt<bool> Symbols;
 extern llvm::cl::opt<bool> Globals;
 extern llvm::cl::opt<bool> Types;
 extern llvm::cl::opt<bool> All;
+extern llvm::cl::opt<bool> ExcludeCompilerGenerated;
+
+extern llvm::cl::opt<bool> NoClassDefs;
+extern llvm::cl::opt<bool> NoEnumDefs;
+extern llvm::cl::list<std::string> ExcludeTypes;
+extern llvm::cl::list<std::string> ExcludeSymbols;
+extern llvm::cl::list<std::string> ExcludeCompilands;
+extern llvm::cl::list<std::string> IncludeTypes;
+extern llvm::cl::list<std::string> IncludeSymbols;
+extern llvm::cl::list<std::string> IncludeCompilands;
+}
 
-extern llvm::cl::opt<OutputStyleTy> RawOutputStyle;
+namespace raw {
 extern llvm::cl::opt<bool> DumpHeaders;
 extern llvm::cl::opt<bool> DumpStreamBlocks;
 extern llvm::cl::opt<bool> DumpStreamSummary;
@@ -44,17 +54,13 @@ extern llvm::cl::opt<bool> DumpSectionMa
 extern llvm::cl::opt<bool> DumpSymRecordBytes;
 extern llvm::cl::opt<bool> DumpSectionHeaders;
 extern llvm::cl::opt<bool> DumpFpo;
+}
 
-extern llvm::cl::opt<bool> ExcludeCompilerGenerated;
-
-extern llvm::cl::opt<bool> NoClassDefs;
-extern llvm::cl::opt<bool> NoEnumDefs;
-extern llvm::cl::list<std::string> ExcludeTypes;
-extern llvm::cl::list<std::string> ExcludeSymbols;
-extern llvm::cl::list<std::string> ExcludeCompilands;
-extern llvm::cl::list<std::string> IncludeTypes;
-extern llvm::cl::list<std::string> IncludeSymbols;
-extern llvm::cl::list<std::string> IncludeCompilands;
+namespace pdb2yaml {
+extern llvm::cl::opt<bool> StreamMetadata;
+extern llvm::cl::opt<bool> StreamDirectory;
+extern llvm::cl::list<std::string> InputFilename;
+}
 }
 
 #endif




More information about the llvm-commits mailing list