]> granicus.if.org Git - llvm/commitdiff
[llvm-pdbutil] rewrite the "raw" output style.
authorZachary Turner <zturner@google.com>
Thu, 15 Jun 2017 19:34:41 +0000 (19:34 +0000)
committerZachary Turner <zturner@google.com>
Thu, 15 Jun 2017 19:34:41 +0000 (19:34 +0000)
After some internal discussions, we agreed that the raw output style had
outlived its usefulness. It was originally created before we had even
thought of dumping to YAML, and it was intended to give us some insight
into the internals of a PDB file. Now we have YAML mode which does
almost exactly this but is more powerful in that it can round-trip back
to a PDB, which the raw mode could not do. So the raw mode had become
purely a maintenance burden.

One option was to just delete it. However, its original goal was to be
as readable as possible while staying close to the "metal" - i.e.
presenting the output in a way that maps directly to the underlying file
format. We don't actually need that last requirement anymore since it's
covered by the yaml mode, so we could repurpose "raw" mode to actually
just be as readable as possible.

This patch implements about 80% of the functionality previously in raw
mode, but in a completely different style that is more akin to what
cvdump outputs. Records are very compressed, often times appearing on
just one line. One nice thing about this is that it makes full record
matching easier, because you can grep for indices, names, and leaf types
on a single line often.

See the tests for some examples of what the new output looks like.

Note that this patch actually regresses the functionality of raw mode in
a few areas, but only because the patch was already unreasonably large
and going 100% would have been even worse. Specifically, this patch is
missing:

The ability to dump module debug subsections (checksums, lines, etc)
The ability to dump section headers
Aside from that everything is here. While goign through the tests fixing
them all up, I found many duplicate tests. They've been deleted. In
subsequent patches I will go through and re-add the missing
functionality.

Differential Revision: https://reviews.llvm.org/D34191

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305495 91177308-0d34-0410-b5e6-96231b3b80d8

41 files changed:
include/llvm/DebugInfo/CodeView/CodeView.h
include/llvm/DebugInfo/CodeView/Formatters.h
include/llvm/DebugInfo/CodeView/SymbolRecord.h
include/llvm/DebugInfo/CodeView/TypeIndex.h
include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
include/llvm/DebugInfo/PDB/Native/PublicsStream.h
include/llvm/DebugInfo/PDB/Native/RawConstants.h
include/llvm/DebugInfo/PDB/Native/SymbolStream.h
include/llvm/Support/BinaryStreamArray.h
include/llvm/Support/FormatProviders.h
lib/DebugInfo/CodeView/SymbolDumper.cpp
lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
lib/DebugInfo/CodeView/TypeDatabase.cpp
lib/DebugInfo/CodeView/TypeIndex.cpp
lib/DebugInfo/PDB/Native/PublicsStream.cpp
lib/ObjectYAML/CodeViewYAMLSymbols.cpp
test/DebugInfo/PDB/pdb-yaml-types.test [deleted file]
test/DebugInfo/PDB/pdbdump-debug-subsections.test
test/DebugInfo/PDB/pdbdump-headers.test
test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test
test/DebugInfo/PDB/pdbdump-mergeids.test
test/DebugInfo/PDB/pdbdump-mergetypes.test
test/DebugInfo/PDB/pdbdump-raw-blocks.test
test/DebugInfo/PDB/pdbdump-raw-stream.test
test/DebugInfo/PDB/pdbdump-readwrite.test
test/tools/llvm-pdbdump/raw-stream-data.test [deleted file]
tools/llvm-pdbutil/CMakeLists.txt
tools/llvm-pdbutil/FormatUtil.cpp [new file with mode: 0644]
tools/llvm-pdbutil/FormatUtil.h [new file with mode: 0644]
tools/llvm-pdbutil/LLVMOutputStyle.cpp [deleted file]
tools/llvm-pdbutil/LinePrinter.cpp
tools/llvm-pdbutil/LinePrinter.h
tools/llvm-pdbutil/MinimalSymbolDumper.cpp [new file with mode: 0644]
tools/llvm-pdbutil/MinimalSymbolDumper.h [new file with mode: 0644]
tools/llvm-pdbutil/MinimalTypeDumper.cpp [new file with mode: 0644]
tools/llvm-pdbutil/MinimalTypeDumper.h [new file with mode: 0644]
tools/llvm-pdbutil/RawOutputStyle.cpp [new file with mode: 0644]
tools/llvm-pdbutil/RawOutputStyle.h [moved from tools/llvm-pdbutil/LLVMOutputStyle.h with 62% similarity]
tools/llvm-pdbutil/YAMLOutputStyle.cpp
tools/llvm-pdbutil/llvm-pdbutil.cpp
tools/llvm-pdbutil/llvm-pdbutil.h

index 251c9d1ae62c9c10b9522b6e4e38c67cd6a341e3..6820e26b754c0b9e60a80ee7fb30ab28442cb6d0 100644 (file)
@@ -418,6 +418,8 @@ CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(ProcSymFlags)
 
 /// Corresponds to COMPILESYM2::Flags bitfield.
 enum class CompileSym2Flags : uint32_t {
+  None = 0,
+  SourceLanguageMask = 0xFF,
   EC = 1 << 8,
   NoDbgInfo = 1 << 9,
   LTCG = 1 << 10,
@@ -432,6 +434,8 @@ CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(CompileSym2Flags)
 
 /// Corresponds to COMPILESYM3::Flags bitfield.
 enum class CompileSym3Flags : uint32_t {
+  None = 0,
+  SourceLanguageMask = 0xFF,
   EC = 1 << 8,
   NoDbgInfo = 1 << 9,
   LTCG = 1 << 10,
@@ -448,6 +452,7 @@ enum class CompileSym3Flags : uint32_t {
 CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(CompileSym3Flags)
 
 enum class ExportFlags : uint16_t {
+  None = 0,
   IsConstant = 1 << 0,
   IsData = 1 << 1,
   IsPrivate = 1 << 2,
index 37a91098a8b65e3e625b88e21e26adce1a02a11e..1fbb0dd6f9b00321a2ccee26e4f902ee2e42f044 100644 (file)
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
 #include "llvm/Support/FormatAdapters.h"
+#include "llvm/Support/FormatProviders.h"
+#include "llvm/Support/FormatVariadic.h"
 
 namespace llvm {
 namespace codeview {
@@ -35,6 +38,20 @@ inline detail::GuidAdapter fmt_guid(ArrayRef<uint8_t> Item) {
   return detail::GuidAdapter(Item);
 }
 }
+
+template <> struct format_provider<codeview::TypeIndex> {
+public:
+  static void format(const codeview::TypeIndex &V, llvm::raw_ostream &Stream,
+                     StringRef Style) {
+    if (V.isNoneType())
+      Stream << "<no type>";
+    else {
+      Stream << formatv("{0:X+4}", V.getIndex());
+      if (V.isSimple())
+        Stream << " (" << codeview::TypeIndex::simpleTypeName(V) << ")";
+    }
+  }
+};
 }
 
 #endif
index a3e4dff647bd7cca8a8f5cf23c48e73dee10cce5..5f85ed28cb3a1968facdcad0e11914f8e048388f 100644 (file)
@@ -363,7 +363,7 @@ public:
       : SymbolRecord(SymbolRecordKind::PublicSym32),
         RecordOffset(RecordOffset) {}
 
-  uint32_t Index;
+  TypeIndex Index;
   uint32_t Offset;
   uint16_t Segment;
   StringRef Name;
@@ -379,7 +379,7 @@ public:
       : SymbolRecord(SymbolRecordKind::RegisterSym),
         RecordOffset(RecordOffset) {}
 
-  uint32_t Index;
+  TypeIndex Index;
   RegisterId Register;
   StringRef Name;
 
@@ -679,7 +679,7 @@ public:
       : SymbolRecord(SymbolRecordKind::FileStaticSym),
         RecordOffset(RecordOffset) {}
 
-  uint32_t Index;
+  TypeIndex Index;
   uint32_t ModFilenameOffset;
   LocalSymFlags Flags;
   StringRef Name;
@@ -814,7 +814,7 @@ public:
 
   uint32_t CodeOffset;
   uint16_t Register;
-  uint8_t CookieKind;
+  FrameCookieKind CookieKind;
   uint8_t Flags;
 
   uint32_t RecordOffset;
@@ -871,7 +871,7 @@ public:
 
   uint32_t Offset;
   TypeIndex Type;
-  uint16_t Register;
+  RegisterId Register;
   StringRef Name;
 
   uint32_t RecordOffset;
index 31eed7d3e877ac6c62af6405e4e723484ee31cc0..10d51c2d6244f12d5971344461a9d4d286288e89 100644 (file)
@@ -248,6 +248,8 @@ public:
     return A.toArrayIndex() - B.toArrayIndex();
   }
 
+  static StringRef simpleTypeName(TypeIndex TI);
+
 private:
   support::ulittle32_t Index;
 };
index a8121978d882c6e243c86e6bd04812e56304c9fc..8e2e29ab3bacb34865ef067ce6d7ef9f350720d1 100644 (file)
@@ -40,6 +40,10 @@ public:
   iterator_range<codeview::CVSymbolArray::Iterator>
   symbols(bool *HadError) const;
 
+  const codeview::CVSymbolArray &getSymbolArray() const {
+    return SymbolsSubstream;
+  }
+
   llvm::iterator_range<DebugSubsectionIterator> subsections() const;
 
   bool hasDebugSubsections() const;
index 4a541edd6a7b464457594b04827742a0228b34f5..4570c80c76d7c33318565fd6fd41002c7022c4f5 100644 (file)
@@ -35,6 +35,7 @@ public:
   uint32_t getSymHash() const;
   uint32_t getAddrMap() const;
   uint32_t getNumBuckets() const { return NumBuckets; }
+  Expected<const codeview::CVSymbolArray &> getSymbolArray() const;
   iterator_range<codeview::CVSymbolArray::Iterator>
   getSymbols(bool *HadError) const;
   FixedStreamArray<support::ulittle32_t> getHashBuckets() const {
index e1bd86b2870be2d247848b2c5080fb14de89ecba..bb1d097b5123fcb6c37b83ccf67fd6fd913b9a83 100644 (file)
@@ -98,15 +98,19 @@ enum class DbgHeaderType : uint16_t {
 };
 
 enum class OMFSegDescFlags : uint16_t {
+  None = 0,
   Read = 1 << 0,              // Segment is readable.
   Write = 1 << 1,             // Segment is writable.
   Execute = 1 << 2,           // Segment is executable.
   AddressIs32Bit = 1 << 3,    // Descriptor describes a 32-bit linear address.
   IsSelector = 1 << 8,        // Frame represents a selector.
   IsAbsoluteAddress = 1 << 9, // Frame represents an absolute address.
-  IsGroup = 1 << 10           // If set, descriptor represents a group.
+  IsGroup = 1 << 10,          // If set, descriptor represents a group.
+  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ IsGroup)
 };
 
+LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
+
 } // end namespace pdb
 } // end namespace llvm
 
index 41d5e6ad64a0e43a59efbd48c86b5cb814eeface..17695f587849ee620131fb7b718fcd17b9149bb6 100644 (file)
@@ -27,6 +27,10 @@ public:
   ~SymbolStream();
   Error reload();
 
+  const codeview::CVSymbolArray &getSymbolArray() const {
+    return SymbolRecords;
+  }
+
   iterator_range<codeview::CVSymbolArray::Iterator>
   getSymbols(bool *HadError) const;
 
index 65ec15f6d9e07ea35473ee77039a63e208ef8615..3f5562ba751952494adad861571bb27bb11e165d 100644 (file)
@@ -290,6 +290,12 @@ public:
     return FixedStreamArrayIterator<T>(*this, size());
   }
 
+  const T &front() const { return *begin(); }
+  const T &back() const {
+    FixedStreamArrayIterator<T> I = end();
+    return *(--I);
+  }
+
   BinaryStreamRef getUnderlyingStream() const { return Stream; }
 
 private:
index 4e57034ff98e9336478548cfba0fb8ed2a46fe44..e90105c617cb876fe0630ee5f1a3c688cfc77560 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/ADT/Twine.h"
+#include "llvm/Support/Endian.h"
 #include "llvm/Support/FormatVariadicDetails.h"
 #include "llvm/Support/NativeFormatting.h"
 
@@ -150,6 +151,19 @@ public:
   }
 };
 
+template <typename T, llvm::support::endianness E, int alignment>
+struct format_provider<
+    support::detail::packed_endian_specific_integral<T, E, alignment>> {
+  using Type =
+      support::detail::packed_endian_specific_integral<T, E, alignment>;
+
+public:
+  static void format(const Type &V, llvm::raw_ostream &Stream,
+                     StringRef Style) {
+    format_provider<T>::format(static_cast<T>(V), Stream, Style);
+  }
+};
+
 /// Implementation of format_provider<T> for integral pointer types.
 ///
 /// The options string of a pointer type has the grammar:
index 66045933ce9b5ea66a62aa15752272d09948c020..36abafc079edbc7b0ca24f49f34bd18b1256f5df 100644 (file)
@@ -212,7 +212,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
 Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
                                            FileStaticSym &FileStatic) {
   DictScope S(W, "FileStatic");
-  W.printNumber("Index", FileStatic.Index);
+  printTypeIndex("Index", FileStatic.Index);
   W.printNumber("ModFilenameOffset", FileStatic.ModFilenameOffset);
   W.printFlags("Flags", uint16_t(FileStatic.Flags), getLocalFlagNames());
   W.printString("Name", FileStatic.Name);
@@ -516,7 +516,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
 Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
                                            RegisterSym &Register) {
   DictScope S(W, "RegisterSym");
-  W.printNumber("Type", Register.Index);
+  printTypeIndex("Type", Register.Index);
   W.printEnum("Seg", uint16_t(Register.Register), getRegisterNames());
   W.printString("Name", Register.Name);
   return Error::success();
@@ -524,7 +524,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
 
 Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) {
   DictScope S(W, "PublicSym");
-  W.printNumber("Type", Public.Index);
+  printTypeIndex("Type", Public.Index);
   W.printNumber("Seg", Public.Segment);
   W.printNumber("Off", Public.Offset);
   W.printString("Name", Public.Name);
@@ -631,7 +631,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
 
   W.printHex("Offset", RegRel.Offset);
   printTypeIndex("Type", RegRel.Type);
-  W.printHex("Register", RegRel.Register);
+  W.printEnum("Register", uint16_t(RegRel.Register), getRegisterNames());
   W.printString("VarName", RegRel.Name);
   return Error::success();
 }
index ea46841a70f6349aeae44e32f109211b2441712a..d731dc1b0a37230ed490d0fd0fff0c25afd37ecc 100644 (file)
@@ -307,7 +307,7 @@ Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
 
   error(IO.mapInteger(FrameCookie.CodeOffset));
   error(IO.mapInteger(FrameCookie.Register));
-  error(IO.mapInteger(FrameCookie.CookieKind));
+  error(IO.mapEnum(FrameCookie.CookieKind));
   error(IO.mapInteger(FrameCookie.Flags));
 
   return Error::success();
@@ -439,7 +439,7 @@ Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
 
   error(IO.mapInteger(RegRel.Offset));
   error(IO.mapInteger(RegRel.Type));
-  error(IO.mapInteger(RegRel.Register));
+  error(IO.mapEnum(RegRel.Register));
   error(IO.mapStringZ(RegRel.Name));
 
   return Error::success();
index af05d2dc294beed3dff68a2db2fac4ddc95e9481..08f848b36a9d5aeda4d73e31785c2f792b10407e 100644 (file)
 using namespace llvm;
 using namespace llvm::codeview;
 
-namespace {
-struct SimpleTypeEntry {
-  StringRef Name;
-  SimpleTypeKind Kind;
-};
-}
-
-/// The names here all end in "*". If the simple type is a pointer type, we
-/// return the whole name. Otherwise we lop off the last character in our
-/// StringRef.
-static const SimpleTypeEntry SimpleTypeNames[] = {
-    {"void*", SimpleTypeKind::Void},
-    {"<not translated>*", SimpleTypeKind::NotTranslated},
-    {"HRESULT*", SimpleTypeKind::HResult},
-    {"signed char*", SimpleTypeKind::SignedCharacter},
-    {"unsigned char*", SimpleTypeKind::UnsignedCharacter},
-    {"char*", SimpleTypeKind::NarrowCharacter},
-    {"wchar_t*", SimpleTypeKind::WideCharacter},
-    {"char16_t*", SimpleTypeKind::Character16},
-    {"char32_t*", SimpleTypeKind::Character32},
-    {"__int8*", SimpleTypeKind::SByte},
-    {"unsigned __int8*", SimpleTypeKind::Byte},
-    {"short*", SimpleTypeKind::Int16Short},
-    {"unsigned short*", SimpleTypeKind::UInt16Short},
-    {"__int16*", SimpleTypeKind::Int16},
-    {"unsigned __int16*", SimpleTypeKind::UInt16},
-    {"long*", SimpleTypeKind::Int32Long},
-    {"unsigned long*", SimpleTypeKind::UInt32Long},
-    {"int*", SimpleTypeKind::Int32},
-    {"unsigned*", SimpleTypeKind::UInt32},
-    {"__int64*", SimpleTypeKind::Int64Quad},
-    {"unsigned __int64*", SimpleTypeKind::UInt64Quad},
-    {"__int64*", SimpleTypeKind::Int64},
-    {"unsigned __int64*", SimpleTypeKind::UInt64},
-    {"__int128*", SimpleTypeKind::Int128},
-    {"unsigned __int128*", SimpleTypeKind::UInt128},
-    {"__half*", SimpleTypeKind::Float16},
-    {"float*", SimpleTypeKind::Float32},
-    {"float*", SimpleTypeKind::Float32PartialPrecision},
-    {"__float48*", SimpleTypeKind::Float48},
-    {"double*", SimpleTypeKind::Float64},
-    {"long double*", SimpleTypeKind::Float80},
-    {"__float128*", SimpleTypeKind::Float128},
-    {"_Complex float*", SimpleTypeKind::Complex32},
-    {"_Complex double*", SimpleTypeKind::Complex64},
-    {"_Complex long double*", SimpleTypeKind::Complex80},
-    {"_Complex __float128*", SimpleTypeKind::Complex128},
-    {"bool*", SimpleTypeKind::Boolean8},
-    {"__bool16*", SimpleTypeKind::Boolean16},
-    {"__bool32*", SimpleTypeKind::Boolean32},
-    {"__bool64*", SimpleTypeKind::Boolean64},
-};
-
 TypeDatabase::TypeDatabase(uint32_t Capacity) : TypeNameStorage(Allocator) {
   CVUDTNames.resize(Capacity);
   TypeRecords.resize(Capacity);
@@ -103,22 +50,8 @@ StringRef TypeDatabase::saveTypeName(StringRef TypeName) {
 }
 
 StringRef TypeDatabase::getTypeName(TypeIndex Index) const {
-  if (Index.isNoneType())
-    return "<no type>";
-
-  if (Index.isSimple()) {
-    // This is a simple type.
-    for (const auto &SimpleTypeName : SimpleTypeNames) {
-      if (SimpleTypeName.Kind == Index.getSimpleKind()) {
-        if (Index.getSimpleMode() == SimpleTypeMode::Direct)
-          return SimpleTypeName.Name.drop_back(1);
-        // Otherwise, this is a pointer type. We gloss over the distinction
-        // between near, far, 64, 32, etc, and just give a pointer type.
-        return SimpleTypeName.Name;
-      }
-    }
-    return "<unknown simple type>";
-  }
+  if (Index.isNoneType() || Index.isSimple())
+    return TypeIndex::simpleTypeName(Index);
 
   if (contains(Index))
     return CVUDTNames[Index.toArrayIndex()];
index 20ba6470cd5be02220d2bb597aa8a7be089a1074..24fe5fcb28d4f96efa743b837883cd653f407b48 100644 (file)
 using namespace llvm;
 using namespace llvm::codeview;
 
+namespace {
+struct SimpleTypeEntry {
+  StringRef Name;
+  SimpleTypeKind Kind;
+};
+
+/// The names here all end in "*". If the simple type is a pointer type, we
+/// return the whole name. Otherwise we lop off the last character in our
+/// StringRef.
+static const SimpleTypeEntry SimpleTypeNames[] = {
+    {"void*", SimpleTypeKind::Void},
+    {"<not translated>*", SimpleTypeKind::NotTranslated},
+    {"HRESULT*", SimpleTypeKind::HResult},
+    {"signed char*", SimpleTypeKind::SignedCharacter},
+    {"unsigned char*", SimpleTypeKind::UnsignedCharacter},
+    {"char*", SimpleTypeKind::NarrowCharacter},
+    {"wchar_t*", SimpleTypeKind::WideCharacter},
+    {"char16_t*", SimpleTypeKind::Character16},
+    {"char32_t*", SimpleTypeKind::Character32},
+    {"__int8*", SimpleTypeKind::SByte},
+    {"unsigned __int8*", SimpleTypeKind::Byte},
+    {"short*", SimpleTypeKind::Int16Short},
+    {"unsigned short*", SimpleTypeKind::UInt16Short},
+    {"__int16*", SimpleTypeKind::Int16},
+    {"unsigned __int16*", SimpleTypeKind::UInt16},
+    {"long*", SimpleTypeKind::Int32Long},
+    {"unsigned long*", SimpleTypeKind::UInt32Long},
+    {"int*", SimpleTypeKind::Int32},
+    {"unsigned*", SimpleTypeKind::UInt32},
+    {"__int64*", SimpleTypeKind::Int64Quad},
+    {"unsigned __int64*", SimpleTypeKind::UInt64Quad},
+    {"__int64*", SimpleTypeKind::Int64},
+    {"unsigned __int64*", SimpleTypeKind::UInt64},
+    {"__int128*", SimpleTypeKind::Int128},
+    {"unsigned __int128*", SimpleTypeKind::UInt128},
+    {"__half*", SimpleTypeKind::Float16},
+    {"float*", SimpleTypeKind::Float32},
+    {"float*", SimpleTypeKind::Float32PartialPrecision},
+    {"__float48*", SimpleTypeKind::Float48},
+    {"double*", SimpleTypeKind::Float64},
+    {"long double*", SimpleTypeKind::Float80},
+    {"__float128*", SimpleTypeKind::Float128},
+    {"_Complex float*", SimpleTypeKind::Complex32},
+    {"_Complex double*", SimpleTypeKind::Complex64},
+    {"_Complex long double*", SimpleTypeKind::Complex80},
+    {"_Complex __float128*", SimpleTypeKind::Complex128},
+    {"bool*", SimpleTypeKind::Boolean8},
+    {"__bool16*", SimpleTypeKind::Boolean16},
+    {"__bool32*", SimpleTypeKind::Boolean32},
+    {"__bool64*", SimpleTypeKind::Boolean64},
+};
+} // namespace
+
+StringRef TypeIndex::simpleTypeName(TypeIndex TI) {
+  assert(TI.isNoneType() || TI.isSimple());
+
+  if (TI.isNoneType())
+    return "<no type>";
+
+  // This is a simple type.
+  for (const auto &SimpleTypeName : SimpleTypeNames) {
+    if (SimpleTypeName.Kind == TI.getSimpleKind()) {
+      if (TI.getSimpleMode() == SimpleTypeMode::Direct)
+        return SimpleTypeName.Name.drop_back(1);
+      // Otherwise, this is a pointer type. We gloss over the distinction
+      // between near, far, 64, 32, etc, and just give a pointer type.
+      return SimpleTypeName.Name;
+    }
+  }
+  return "<unknown simple type>";
+}
+
 void llvm::codeview::printTypeIndex(ScopedPrinter &Printer, StringRef FieldName,
                                     TypeIndex TI, TypeCollection &Types) {
   StringRef TypeName;
-  if (!TI.isNoneType())
-    TypeName = Types.getTypeName(TI);
+  if (!TI.isNoneType()) {
+    if (TI.isSimple())
+      TypeName = TypeIndex::simpleTypeName(TI);
+    else
+      TypeName = Types.getTypeName(TI);
+  }
+
   if (!TypeName.empty())
     Printer.printHex(FieldName, TypeName, TI.getIndex());
   else
index 091ac67035dc69a4d5b7c13970f32c4b483c66bb..8f3474b9ce1906687916795fcfe695501d02e0ad 100644 (file)
@@ -130,4 +130,13 @@ PublicsStream::getSymbols(bool *HadError) const {
   return SS.getSymbols(HadError);
 }
 
+Expected<const codeview::CVSymbolArray &>
+PublicsStream::getSymbolArray() const {
+  auto SymbolS = Pdb.getPDBSymbolStream();
+  if (!SymbolS)
+    return SymbolS.takeError();
+
+  return SymbolS->getSymbolArray();
+}
+
 Error PublicsStream::commit() { return Error::success(); }
index 21e0229a7f8bb44ac643342501d0efa15dd0a15e..ba3a2abe2097821585d23bb8373e0d2ab7fa5889 100644 (file)
@@ -35,6 +35,7 @@ LLVM_YAML_DECLARE_SCALAR_TRAITS(APSInt, false)
 LLVM_YAML_DECLARE_SCALAR_TRAITS(TypeIndex, false)
 
 LLVM_YAML_DECLARE_ENUM_TRAITS(SymbolKind)
+LLVM_YAML_DECLARE_ENUM_TRAITS(FrameCookieKind)
 
 LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym2Flags)
 LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym3Flags)
@@ -149,6 +150,15 @@ void ScalarEnumerationTraits<ThunkOrdinal>::enumeration(IO &io,
   }
 }
 
+void ScalarEnumerationTraits<FrameCookieKind>::enumeration(
+    IO &io, FrameCookieKind &FC) {
+  auto ThunkNames = getFrameCookieKindNames();
+  for (const auto &E : ThunkNames) {
+    io.enumCase(FC, E.Name.str().c_str(),
+                static_cast<FrameCookieKind>(E.Value));
+  }
+}
+
 namespace llvm {
 namespace CodeViewYAML {
 namespace detail {
diff --git a/test/DebugInfo/PDB/pdb-yaml-types.test b/test/DebugInfo/PDB/pdb-yaml-types.test
deleted file mode 100644 (file)
index f65d9ed..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-RUN: llvm-pdbutil pdb2yaml -tpi-stream %p/Inputs/big-read.pdb > %t.yaml
-RUN: FileCheck -check-prefix=YAML %s < %t.yaml
-RUN: llvm-pdbutil yaml2pdb %t.yaml -pdb %t.pdb
-RUN: llvm-pdbutil raw -tpi-records %t.pdb | FileCheck %s --check-prefix=PDB
-
-Only verify the beginning of the type stream.
-
-YAML:      TpiStream:       
-YAML-NEXT:   Version:         VC80
-YAML-NEXT:   Records:         
-YAML-NEXT:     - Kind:            LF_ARGLIST
-YAML-NEXT:       ArgList:         
-YAML-NEXT:         ArgIndices:      [  ]
-YAML-NEXT:     - Kind:            LF_PROCEDURE
-YAML-NEXT:       Procedure:       
-YAML-NEXT:         ReturnType:      3
-YAML-NEXT:         CallConv:        NearC
-YAML-NEXT:         Options:         [ None ]
-YAML-NEXT:         ParameterCount:  0
-YAML-NEXT:         ArgumentList:    4096
-YAML-NEXT:     - Kind:            LF_PROCEDURE
-YAML-NEXT:       Procedure:       
-YAML-NEXT:         ReturnType:      116
-YAML-NEXT:         CallConv:        NearC
-YAML-NEXT:         Options:         [ None ]
-YAML-NEXT:         ParameterCount:  0
-YAML-NEXT:         ArgumentList:    4096
-
-This test is mostly checking to make sure we include the type index offset
-table, and eventually hash codes. The type index offsets should be similar to
-what are already present in big-read.pdb.
-
-PDB:      Type Info Stream (TPI) {
-PDB-NEXT:   TPI Version: 20040203
-PDB-NEXT:   Record count: 728
-PDB-NEXT:   Records [
-PDB-NEXT:     {
-PDB-NEXT:       ArgList (0x1000) {
-PDB-NEXT:         TypeLeafKind: LF_ARGLIST (0x1201)
-PDB-NEXT:         NumArgs: 0
-PDB-NEXT:         Arguments [
-PDB-NEXT:         ]
-PDB-NEXT:       }
-PDB-NEXT:     }
-PDB-NEXT:     {
-PDB-NEXT:       Procedure (0x1001) {
-PDB-NEXT:         TypeLeafKind: LF_PROCEDURE (0x1008)
-PDB-NEXT:         ReturnType: void (0x3)
-PDB-NEXT:         CallingConvention: NearC (0x0)
-PDB-NEXT:         FunctionOptions [ (0x0)
-PDB-NEXT:         ]
-PDB-NEXT:         NumParameters: 0
-PDB-NEXT:         ArgListType: () (0x1000)
-PDB-NEXT:       }
-PDB-NEXT:     }
-PDB-NEXT:     {
-PDB-NEXT:       Procedure (0x1002) {
-PDB-NEXT:         TypeLeafKind: LF_PROCEDURE (0x1008)
-PDB-NEXT:         ReturnType: int (0x74)
-PDB-NEXT:         CallingConvention: NearC (0x0)
-PDB-NEXT:         FunctionOptions [ (0x0)
-PDB-NEXT:         ]
-PDB-NEXT:         NumParameters: 0
-PDB-NEXT:         ArgListType: () (0x1000)
-PDB-NEXT:       }
-PDB-NEXT:     }
-...
-PDB:          TypeIndexOffsets [
-PDB-NEXT:       Index: 0x1000, Offset: 0
-PDB-NEXT:       Index: 0x106c, Offset: 8,116
-PDB-NEXT:       Index: 0x1118, Offset: 16,372
-PDB-NEXT:       Index: 0x11df, Offset: 24,564
-PDB-NEXT:       Index: 0x128e, Offset: 32,752
-PDB-NEXT:     ]
index 52f7bb52da2a9b5e9bb1d5ae654b797730948d13..4338f11587ce91b42580e96d931704f769d11862 100644 (file)
@@ -1,6 +1,5 @@
 ; RUN: llvm-pdbutil yaml2pdb -pdb=%t.pdb %p/Inputs/debug-subsections.yaml
 ; RUN: llvm-pdbutil pdb2yaml -all -no-file-headers %t.pdb | FileCheck --check-prefix=YAML %s
-; RUN: llvm-pdbutil raw -subsections=all %t.pdb | FileCheck --check-prefix=RAW %s
 
 YAML:      Modules:
 YAML-NEXT:   - Module:          Foo.obj
@@ -61,150 +60,7 @@ YAML-NEXT:                EndDelta:        0
 YAML-NEXT:            Columns:
 YAML-NEXT:      - !InlineeLines
 YAML-NEXT:        HasExtraFiles:   false
-YAML-NEXT:        Sites:           
+YAML-NEXT:        Sites:
 YAML-NEXT:          - FileName:        'f:\dd\externalapis\windows\10\sdk\inc\winerror.h'
 YAML-NEXT:            LineNum:         26950
 YAML-NEXT:            Inlinee:         22767
-
-
-RAW:      DBI Stream {
-RAW:        Modules [
-RAW-NEXT:     {
-RAW-NEXT:       Name: Foo.obj
-RAW:            Subsections [
-RAW-NEXT:         CrossModuleExports [
-RAW-NEXT:           Export {
-RAW-NEXT:             Local: 0x12F4
-RAW-NEXT:             Global: 0x2443
-RAW-NEXT:           }
-RAW-NEXT:           Export {
-RAW-NEXT:             Local: 0x80001083
-RAW-NEXT:             Global: 0x23A3
-RAW-NEXT:           }
-RAW-NEXT:         ]
-RAW-NEXT:       ]
-RAW-NEXT:     }
-RAW-NEXT:     {
-RAW-NEXT:       Name: Bar.obj
-RAW:            Subsections [
-RAW-NEXT:         CrossModuleExports [
-RAW-NEXT:           Export {
-RAW-NEXT:             Local: 0x10A9
-RAW-NEXT:             Global: 0x17D1
-RAW-NEXT:           }
-RAW-NEXT:           Export {
-RAW-NEXT:             Local: 0x10C9
-RAW-NEXT:             Global: 0x1245
-RAW-NEXT:           }
-RAW-NEXT:         ]
-RAW-NEXT:         CrossModuleImports [
-RAW-NEXT:           ModuleImport {
-RAW-NEXT:             Module: Foo.obj
-RAW-NEXT:             Imports: [0x12F4, 0x80001083]
-RAW-NEXT:           }
-RAW-NEXT:         ]
-RAW-NEXT:       ]
-RAW-NEXT:     }
-RAW-NEXT:     {
-RAW-NEXT:       Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-RAW:            Subsections [
-RAW-NEXT:         FileChecksums {
-RAW-NEXT:           Checksum {
-RAW-NEXT:             FileName: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
-RAW-NEXT:             Kind: MD5 (0x1)
-RAW-NEXT:             Checksum (
-RAW-NEXT:               0000: A0A5BD0D 3ECD93FC 29D19DE8 26FBF4BC  |....>...)...&...|
-RAW-NEXT:             )
-RAW-NEXT:           }
-RAW-NEXT:           Checksum {
-RAW-NEXT:             FileName: f:\dd\externalapis\windows\10\sdk\inc\winerror.h
-RAW-NEXT:             Kind: MD5 (0x1)
-RAW-NEXT:             Checksum (
-RAW-NEXT:               0000: 1154D69F 5B265019 6E1FC34F 4134E56B  |.T..[&P.n..OA4.k|
-RAW-NEXT:             )
-RAW-NEXT:           }
-RAW-NEXT:         }
-RAW-NEXT:         Lines {
-RAW-NEXT:           RelocSegment: 1
-RAW-NEXT:           RelocOffset: 100016
-RAW-NEXT:           CodeSize: 10
-RAW-NEXT:           HasColumns: No
-RAW-NEXT:           FileEntry {
-RAW-NEXT:             FileName: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
-RAW-NEXT:             Line {
-RAW-NEXT:               Offset: 0
-RAW-NEXT:               LineNumberStart: 5
-RAW-NEXT:               EndDelta: 0
-RAW-NEXT:               IsStatement: Yes
-RAW-NEXT:             }
-RAW-NEXT:             Line {
-RAW-NEXT:               Offset: 3
-RAW-NEXT:               LineNumberStart: 6
-RAW-NEXT:               EndDelta: 0
-RAW-NEXT:               IsStatement: Yes
-RAW-NEXT:             }
-RAW-NEXT:             Line {
-RAW-NEXT:               Offset: 8
-RAW-NEXT:               LineNumberStart: 7
-RAW-NEXT:               EndDelta: 0
-RAW-NEXT:               IsStatement: Yes
-RAW-NEXT:             }
-RAW-NEXT:           }
-RAW-NEXT:         }
-RAW-NEXT:         InlineeLines {
-RAW-NEXT:           HasExtraFiles: No
-RAW-NEXT:           Lines [
-RAW-NEXT:             Inlinee {
-RAW-NEXT:               FileName: f:\dd\externalapis\windows\10\sdk\inc\winerror.h
-RAW-NEXT:               Function {
-RAW-NEXT:                 Index: 0x58ef (unknown function)
-RAW-NEXT:               }
-RAW-NEXT:               SourceLine: 26950
-RAW-NEXT:             }
-RAW-NEXT:           ]
-RAW-NEXT:         }
-RAW-NEXT:       ]
-RAW-NEXT:     }
-RAW-NEXT:     {
-RAW-NEXT:       Name: ObjFileSubsections
-RAW-NEXT:       Debug Stream Index: 11
-RAW-NEXT:       Object File Name: ObjFileSubsections
-RAW-NEXT:       Num Files: 0
-RAW-NEXT:       Source File Name Idx: 0
-RAW-NEXT:       Pdb File Name Idx: 0
-RAW-NEXT:       Line Info Byte Size: 0
-RAW-NEXT:       C13 Line Info Byte Size: 116
-RAW-NEXT:       Symbol Byte Size: 4
-RAW-NEXT:       Type Server Index: 0
-RAW-NEXT:       Has EC Info: No
-RAW-NEXT:       Subsections [
-RAW-NEXT:         String Table [
-RAW-NEXT:           String1
-RAW-NEXT:           String2
-RAW-NEXT:           String3
-RAW-NEXT:         ]
-RAW-NEXT:         Symbols [
-RAW-NEXT:           {
-RAW-NEXT:             ObjectName {
-RAW-NEXT:               Signature: 0x0
-RAW-NEXT:               ObjectName: ObjFileSubsections
-RAW-NEXT:             }
-RAW-NEXT:           }
-RAW-NEXT:         ]
-RAW-NEXT:         FrameData [
-RAW-NEXT:           Frame {
-RAW-NEXT:             Rva: 6
-RAW-NEXT:             CodeSize: 1
-RAW-NEXT:             LocalSize: 2
-RAW-NEXT:             ParamsSize: 4
-RAW-NEXT:             MaxStackSize: 3
-RAW-NEXT:             FrameFunc: MyFunc
-RAW-NEXT:             PrologSize: 5
-RAW-NEXT:             SavedRegsSize: 7
-RAW-NEXT:             Flags: 0
-RAW-NEXT:           }
-RAW-NEXT:         ]
-RAW-NEXT:       ]
-RAW-NEXT:     }
-RAW-NEXT:   ]
-RAW-NEXT: }
index 82fe91dd20aa74b1271caf0f9672c0a1654c6b2d..7343dc48ef4edef5b5046a2e65e85d4126e91e0f 100644 (file)
-; RUN: llvm-pdbutil raw -headers -string-table -tpi-records -tpi-record-bytes -module-syms \
-; RUN:              -sym-record-bytes -globals -publics -module-files \
-; RUN:              -stream-summary -stream-blocks -ipi-records -ipi-record-bytes \
-; RUN:              -section-contribs -section-map -section-headers -subsections=all \
-; RUN:              -tpi-hash -fpo -page-stats %p/Inputs/empty.pdb | FileCheck -check-prefix=EMPTY %s
 ; RUN: llvm-pdbutil raw -all %p/Inputs/empty.pdb | FileCheck -check-prefix=ALL %s
-; RUN: llvm-pdbutil raw -headers -modules -module-files \
+; RUN: llvm-pdbutil raw -summary -modules -files \
 ; RUN:              %p/Inputs/big-read.pdb | FileCheck -check-prefix=BIG %s
-; RUN: not llvm-pdbutil raw -headers %p/Inputs/bad-block-size.pdb 2>&1 | FileCheck -check-prefix=BAD-BLOCK-SIZE %s
+; RUN: not llvm-pdbutil raw -summary %p/Inputs/bad-block-size.pdb 2>&1 | FileCheck -check-prefix=BAD-BLOCK-SIZE %s
+
+ALL:                                Summary
+ALL-NEXT: ============================================================
+ALL-NEXT:   Block Size: 4096
+ALL-NEXT:   Number of blocks: 25
+ALL-NEXT:   Number of streams: 17
+ALL-NEXT:   Signature: 1424295906
+ALL-NEXT:   Age: 1
+ALL-NEXT:   GUID: {0B355641-86A0-A249-896F-9988FAE52FF0}
+ALL-NEXT:   Features: 0x1
+ALL-NEXT:   Has Debug Info: true
+ALL-NEXT:   Has Types: true
+ALL-NEXT:   Has IDs: true
+ALL-NEXT:   Has Globals: true
+ALL-NEXT:   Has Publics: true
+ALL-NEXT:   Is incrementally linked: true
+ALL-NEXT:   Has conflicting types: false
+ALL-NEXT:   Is stripped: false
+ALL:                                  Streams
+ALL-NEXT: ============================================================
+ALL-NEXT: Stream  0: [Old MSF Directory] (40 bytes)
+ALL-NEXT:   Stream  1: [PDB Stream] (118 bytes)
+ALL-NEXT:   Stream  2: [TPI Stream] (5392 bytes)
+ALL-NEXT:   Stream  3: [DBI Stream] (739 bytes)
+ALL-NEXT:   Stream  4: [IPI Stream] (784 bytes)
+ALL-NEXT:   Stream  5: [Named Stream "/LinkInfo"] (0 bytes)
+ALL-NEXT:   Stream  6: [Global Symbol Hash] (556 bytes)
+ALL-NEXT:   Stream  7: [Public Symbol Hash] (604 bytes)
+ALL-NEXT:   Stream  8: [Public Symbol Records] (104 bytes)
+ALL-NEXT:   Stream  9: [Named Stream "/src/headerblock"] (0 bytes)
+ALL-NEXT:   Stream 10: [Section Header Data] (160 bytes)
+ALL-NEXT:   Stream 11: [New FPO Data] (32 bytes)
+ALL-NEXT:   Stream 12: [Module "d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj"] (308 bytes)
+ALL-NEXT:   Stream 13: [Named Stream "/names"] (239 bytes)
+ALL-NEXT:   Stream 14: [Module "* Linker *"] (520 bytes)
+ALL-NEXT:   Stream 15: [TPI Hash] (308 bytes)
+ALL-NEXT:   Stream 16: [IPI Hash] (68 bytes)
+ALL:                                String Table
+ALL-NEXT: ============================================================
+ALL-NEXT:    ID | String
+ALL-NEXT:     1 | 'd:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal)'
+ALL-NEXT:    86 | 'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp'
+ALL-NEXT:   134 | '$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = '
+ALL:                                       Modules
+ALL-NEXT: ============================================================
+ALL-NEXT:   Mod 0000 | Name: `d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj`:
+ALL-NEXT:              Obj: `d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj`:
+ALL-NEXT:              debug stream: 12, # files: 1, has ec info: false
+ALL-NEXT:              contributing source files:
+ALL-NEXT:              - d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
+ALL-NEXT:   Mod 0001 | Name: `* Linker *`:
+ALL-NEXT:              Obj: ``:
+ALL-NEXT:              debug stream: 14, # files: 0, has ec info: false
+ALL-NEXT:              contributing source files:
+ALL:                           Types (TPI Stream)
+ALL-NEXT: ============================================================
+ALL-NEXT:   Showing 75 records
+ALL-NEXT:   0x1000 | LF_ARGLIST [size = 8]
+ALL-NEXT:   0x1001 | LF_PROCEDURE [size = 16]
+ALL-NEXT:            return type = 0x0074 (int), # args = 0, param list = 0x1000
+ALL-NEXT:            calling conv = cdecl, options = None
+ALL-NEXT:   0x1002 | LF_FIELDLIST [size = 76]
+ALL-NEXT:            - LF_ENUMERATE [apartment = 1]
+ALL-NEXT:            - LF_ENUMERATE [single = 2]
+ALL-NEXT:            - LF_ENUMERATE [free = 3]
+ALL-NEXT:            - LF_ENUMERATE [neutral = 4]
+ALL-NEXT:            - LF_ENUMERATE [both = 5]
+ALL-NEXT:   0x1003 | LF_ENUM [size = 120]
+ALL-NEXT:            name: `__vc_attributes::threadingAttribute::threading_e`
+ALL-NEXT:            unique name: `.?AW4threading_e@threadingAttribute@__vc_attributes@@`
+ALL-NEXT:            field list: 0x1002, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x1004 | LF_STRUCTURE [size = 100]
+ALL-NEXT:            class name: `__vc_attributes::threadingAttribute`
+ALL-NEXT:            unique name: `.?AUthreadingAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+ALL-NEXT:            options: forward ref | has unique name
+ALL-NEXT:   0x1005 | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x1004, mode = pointer, opts = const, kind = ptr32
+ALL-NEXT:   0x1006 | LF_ARGLIST [size = 12]
+ALL-NEXT:            0x1003: `__vc_attributes::threadingAttribute::threading_e`
+ALL-NEXT:   0x1007 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 1, # args = 0x1006, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x1004, this type = 0x1005, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1008 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x1004, this type = 0x1005, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1009 | LF_METHODLIST [size = 20]
+ALL-NEXT:            - Method [type = 0x1007, vftable offset = -1, attrs = public]
+ALL-NEXT:            - Method [type = 0x1008, vftable offset = -1, attrs = public]
+ALL-NEXT:   0x100A | LF_FIELDLIST [size = 68]
+ALL-NEXT:            - LF_NESTTYPE [name = `threading_e`, parent = 0x1003]
+ALL-NEXT:            - LF_METHOD [name = `threadingAttribute`, # overloads = 2, overload list = 0x1009]
+ALL-NEXT:            - LF_MEMBER [name = `value`, Type = 0x1003, offset = 0, attrs = public]
+ALL-NEXT:   0x100B | LF_STRUCTURE [size = 100]
+ALL-NEXT:            class name: `__vc_attributes::threadingAttribute`
+ALL-NEXT:            unique name: `.?AUthreadingAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x100A
+ALL-NEXT:            options: has ctor / dtor | contains nested class | has unique name
+ALL-NEXT:   0x100C | LF_FIELDLIST [size = 48]
+ALL-NEXT:            - LF_ENUMERATE [native = 0]
+ALL-NEXT:            - LF_ENUMERATE [com = 1]
+ALL-NEXT:            - LF_ENUMERATE [managed = 2]
+ALL-NEXT:   0x100D | LF_ENUM [size = 120]
+ALL-NEXT:            name: `__vc_attributes::event_receiverAttribute::type_e`
+ALL-NEXT:            unique name: `.?AW4type_e@event_receiverAttribute@__vc_attributes@@`
+ALL-NEXT:            field list: 0x100C, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x100E | LF_STRUCTURE [size = 112]
+ALL-NEXT:            class name: `__vc_attributes::event_receiverAttribute`
+ALL-NEXT:            unique name: `.?AUevent_receiverAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+ALL-NEXT:            options: forward ref | has unique name
+ALL-NEXT:   0x100F | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x100E, mode = pointer, opts = const, kind = ptr32
+ALL-NEXT:   0x1010 | LF_ARGLIST [size = 16]
+ALL-NEXT:            0x100D: `__vc_attributes::event_receiverAttribute::type_e`
+ALL-NEXT:            0x0030 (bool): `bool`
+ALL-NEXT:   0x1011 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 2, # args = 0x1010, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x100E, this type = 0x100F, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1012 | LF_ARGLIST [size = 12]
+ALL-NEXT:            0x100D: `__vc_attributes::event_receiverAttribute::type_e`
+ALL-NEXT:   0x1013 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 1, # args = 0x1012, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x100E, this type = 0x100F, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1014 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x100E, this type = 0x100F, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1015 | LF_METHODLIST [size = 28]
+ALL-NEXT:            - Method [type = 0x1011, vftable offset = -1, attrs = public]
+ALL-NEXT:            - Method [type = 0x1013, vftable offset = -1, attrs = public]
+ALL-NEXT:            - Method [type = 0x1014, vftable offset = -1, attrs = public]
+ALL-NEXT:   0x1016 | LF_FIELDLIST [size = 96]
+ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x100D]
+ALL-NEXT:            - LF_METHOD [name = `event_receiverAttribute`, # overloads = 3, overload list = 0x1015]
+ALL-NEXT:            - LF_MEMBER [name = `type`, Type = 0x100D, offset = 0, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `layout_dependent`, Type = 0x0030 (bool), offset = 4, attrs = public]
+ALL-NEXT:   0x1017 | LF_STRUCTURE [size = 112]
+ALL-NEXT:            class name: `__vc_attributes::event_receiverAttribute`
+ALL-NEXT:            unique name: `.?AUevent_receiverAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1016
+ALL-NEXT:            options: has ctor / dtor | contains nested class | has unique name
+ALL-NEXT:   0x1018 | LF_FIELDLIST [size = 48]
+ALL-NEXT:            - LF_ENUMERATE [never = 0]
+ALL-NEXT:            - LF_ENUMERATE [allowed = 1]
+ALL-NEXT:            - LF_ENUMERATE [always = 2]
+ALL-NEXT:   0x1019 | LF_ENUM [size = 116]
+ALL-NEXT:            name: `__vc_attributes::aggregatableAttribute::type_e`
+ALL-NEXT:            unique name: `.?AW4type_e@aggregatableAttribute@__vc_attributes@@`
+ALL-NEXT:            field list: 0x1018, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x101A | LF_STRUCTURE [size = 108]
+ALL-NEXT:            class name: `__vc_attributes::aggregatableAttribute`
+ALL-NEXT:            unique name: `.?AUaggregatableAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+ALL-NEXT:            options: forward ref | has unique name
+ALL-NEXT:   0x101B | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x101A, mode = pointer, opts = const, kind = ptr32
+ALL-NEXT:   0x101C | LF_ARGLIST [size = 12]
+ALL-NEXT:            0x1019: `__vc_attributes::aggregatableAttribute::type_e`
+ALL-NEXT:   0x101D | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 1, # args = 0x101C, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x101E | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x101F | LF_METHODLIST [size = 20]
+ALL-NEXT:            - Method [type = 0x101D, vftable offset = -1, attrs = public]
+ALL-NEXT:            - Method [type = 0x101E, vftable offset = -1, attrs = public]
+ALL-NEXT:   0x1020 | LF_FIELDLIST [size = 68]
+ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x1019]
+ALL-NEXT:            - LF_METHOD [name = `aggregatableAttribute`, # overloads = 2, overload list = 0x101F]
+ALL-NEXT:            - LF_MEMBER [name = `type`, Type = 0x1019, offset = 0, attrs = public]
+ALL-NEXT:   0x1021 | LF_STRUCTURE [size = 108]
+ALL-NEXT:            class name: `__vc_attributes::aggregatableAttribute`
+ALL-NEXT:            unique name: `.?AUaggregatableAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1020
+ALL-NEXT:            options: has ctor / dtor | contains nested class | has unique name
+ALL-NEXT:   0x1022 | LF_ENUM [size = 116]
+ALL-NEXT:            name: `__vc_attributes::event_sourceAttribute::type_e`
+ALL-NEXT:            unique name: `.?AW4type_e@event_sourceAttribute@__vc_attributes@@`
+ALL-NEXT:            field list: 0x100C, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x1023 | LF_FIELDLIST [size = 28]
+ALL-NEXT:            - LF_ENUMERATE [speed = 0]
+ALL-NEXT:            - LF_ENUMERATE [size = 1]
+ALL-NEXT:   0x1024 | LF_ENUM [size = 124]
+ALL-NEXT:            name: `__vc_attributes::event_sourceAttribute::optimize_e`
+ALL-NEXT:            unique name: `.?AW4optimize_e@event_sourceAttribute@__vc_attributes@@`
+ALL-NEXT:            field list: 0x1023, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x1025 | LF_STRUCTURE [size = 108]
+ALL-NEXT:            class name: `__vc_attributes::event_sourceAttribute`
+ALL-NEXT:            unique name: `.?AUevent_sourceAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+ALL-NEXT:            options: forward ref | has unique name
+ALL-NEXT:   0x1026 | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x1025, mode = pointer, opts = const, kind = ptr32
+ALL-NEXT:   0x1027 | LF_ARGLIST [size = 12]
+ALL-NEXT:            0x1022: `__vc_attributes::event_sourceAttribute::type_e`
+ALL-NEXT:   0x1028 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 1, # args = 0x1027, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x1025, this type = 0x1026, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1029 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x1025, this type = 0x1026, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x102A | LF_METHODLIST [size = 20]
+ALL-NEXT:            - Method [type = 0x1028, vftable offset = -1, attrs = public]
+ALL-NEXT:            - Method [type = 0x1029, vftable offset = -1, attrs = public]
+ALL-NEXT:   0x102B | LF_FIELDLIST [size = 128]
+ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x1022]
+ALL-NEXT:            - LF_NESTTYPE [name = `optimize_e`, parent = 0x1024]
+ALL-NEXT:            - LF_METHOD [name = `event_sourceAttribute`, # overloads = 2, overload list = 0x102A]
+ALL-NEXT:            - LF_MEMBER [name = `type`, Type = 0x1022, offset = 0, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `optimize`, Type = 0x1024, offset = 4, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `decorate`, Type = 0x0030 (bool), offset = 8, attrs = public]
+ALL-NEXT:   0x102C | LF_STRUCTURE [size = 108]
+ALL-NEXT:            class name: `__vc_attributes::event_sourceAttribute`
+ALL-NEXT:            unique name: `.?AUevent_sourceAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x102B
+ALL-NEXT:            options: has ctor / dtor | contains nested class | has unique name
+ALL-NEXT:   0x102D | LF_FIELDLIST [size = 92]
+ALL-NEXT:            - LF_ENUMERATE [dll = 1]
+ALL-NEXT:            - LF_ENUMERATE [exe = 2]
+ALL-NEXT:            - LF_ENUMERATE [service = 3]
+ALL-NEXT:            - LF_ENUMERATE [unspecified = 4]
+ALL-NEXT:            - LF_ENUMERATE [EXE = 2]
+ALL-NEXT:            - LF_ENUMERATE [SERVICE = 3]
+ALL-NEXT:   0x102E | LF_ENUM [size = 104]
+ALL-NEXT:            name: `__vc_attributes::moduleAttribute::type_e`
+ALL-NEXT:            unique name: `.?AW4type_e@moduleAttribute@__vc_attributes@@`
+ALL-NEXT:            field list: 0x102D, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x102F | LF_STRUCTURE [size = 96]
+ALL-NEXT:            class name: `__vc_attributes::moduleAttribute`
+ALL-NEXT:            unique name: `.?AUmoduleAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+ALL-NEXT:            options: forward ref | has unique name
+ALL-NEXT:   0x1030 | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x102F, mode = pointer, opts = const, kind = ptr32
+ALL-NEXT:   0x1031 | LF_MODIFIER [size = 12]
+ALL-NEXT:            referent = 0x0070 (char), modifiers = const
+ALL-NEXT:   0x1032 | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x1031, mode = pointer, opts = None, kind = ptr32
+ALL-NEXT:   0x1033 | LF_ARGLIST [size = 68]
+ALL-NEXT:            0x102E: `__vc_attributes::moduleAttribute::type_e`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:            0x0074 (int): `int`
+ALL-NEXT:            0x0030 (bool): `bool`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:            0x0074 (int): `int`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:            0x0074 (int): `int`
+ALL-NEXT:            0x0030 (bool): `bool`
+ALL-NEXT:            0x0030 (bool): `bool`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:            0x1032: `const char*`
+ALL-NEXT:   0x1034 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 15, # args = 0x1033, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x102F, this type = 0x1030, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1035 | LF_ARGLIST [size = 12]
+ALL-NEXT:            0x102E: `__vc_attributes::moduleAttribute::type_e`
+ALL-NEXT:   0x1036 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 1, # args = 0x1035, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x102F, this type = 0x1030, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1037 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x102F, this type = 0x1030, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1038 | LF_METHODLIST [size = 28]
+ALL-NEXT:            - Method [type = 0x1034, vftable offset = -1, attrs = public]
+ALL-NEXT:            - Method [type = 0x1036, vftable offset = -1, attrs = public]
+ALL-NEXT:            - Method [type = 0x1037, vftable offset = -1, attrs = public]
+ALL-NEXT:   0x1039 | LF_FIELDLIST [size = 356]
+ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x102E]
+ALL-NEXT:            - LF_METHOD [name = `moduleAttribute`, # overloads = 3, overload list = 0x1038]
+ALL-NEXT:            - LF_MEMBER [name = `type`, Type = 0x102E, offset = 0, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `name`, Type = 0x1032, offset = 4, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `version`, Type = 0x1032, offset = 8, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `uuid`, Type = 0x1032, offset = 12, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `lcid`, Type = 0x0074 (int), offset = 16, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `control`, Type = 0x0030 (bool), offset = 20, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `helpstring`, Type = 0x1032, offset = 24, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `helpstringcontext`, Type = 0x0074 (int), offset = 28, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `helpstringdll`, Type = 0x1032, offset = 32, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `helpfile`, Type = 0x1032, offset = 36, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `helpcontext`, Type = 0x0074 (int), offset = 40, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `hidden`, Type = 0x0030 (bool), offset = 44, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `restricted`, Type = 0x0030 (bool), offset = 45, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `custom`, Type = 0x1032, offset = 48, attrs = public]
+ALL-NEXT:            - LF_MEMBER [name = `resource_name`, Type = 0x1032, offset = 52, attrs = public]
+ALL-NEXT:   0x103A | LF_STRUCTURE [size = 96]
+ALL-NEXT:            class name: `__vc_attributes::moduleAttribute`
+ALL-NEXT:            unique name: `.?AUmoduleAttribute@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1039
+ALL-NEXT:            options: has ctor / dtor | contains nested class | has unique name
+ALL-NEXT:   0x103B | LF_FIELDLIST [size = 756]
+ALL-NEXT:            - LF_ENUMERATE [eAnyUsage = 0]
+ALL-NEXT:            - LF_ENUMERATE [eCoClassUsage = 1]
+ALL-NEXT:            - LF_ENUMERATE [eCOMInterfaceUsage = 2]
+ALL-NEXT:            - LF_ENUMERATE [eInterfaceUsage = 6]
+ALL-NEXT:            - LF_ENUMERATE [eMemberUsage = 8]
+ALL-NEXT:            - LF_ENUMERATE [eMethodUsage = 16]
+ALL-NEXT:            - LF_ENUMERATE [eInterfaceMethodUsage = 32]
+ALL-NEXT:            - LF_ENUMERATE [eInterfaceMemberUsage = 64]
+ALL-NEXT:            - LF_ENUMERATE [eCoClassMemberUsage = 128]
+ALL-NEXT:            - LF_ENUMERATE [eCoClassMethodUsage = 256]
+ALL-NEXT:            - LF_ENUMERATE [eGlobalMethodUsage = 768]
+ALL-NEXT:            - LF_ENUMERATE [eGlobalDataUsage = 1024]
+ALL-NEXT:            - LF_ENUMERATE [eClassUsage = 2048]
+ALL-NEXT:            - LF_ENUMERATE [eInterfaceParameterUsage = 4096]
+ALL-NEXT:            - LF_ENUMERATE [eMethodParameterUsage = 12288]
+ALL-NEXT:            - LF_ENUMERATE [eIDLModuleUsage = 16384]
+ALL-NEXT:            - LF_ENUMERATE [eAnonymousUsage = 32768]
+ALL-NEXT:            - LF_ENUMERATE [eTypedefUsage = 65536]
+ALL-NEXT:            - LF_ENUMERATE [eUnionUsage = 131072]
+ALL-NEXT:            - LF_ENUMERATE [eEnumUsage = 262144]
+ALL-NEXT:            - LF_ENUMERATE [eDefineTagUsage = 524288]
+ALL-NEXT:            - LF_ENUMERATE [eStructUsage = 1048576]
+ALL-NEXT:            - LF_ENUMERATE [eLocalUsage = 2097152]
+ALL-NEXT:            - LF_ENUMERATE [ePropertyUsage = 4194304]
+ALL-NEXT:            - LF_ENUMERATE [eEventUsage = 8388608]
+ALL-NEXT:            - LF_ENUMERATE [eTemplateUsage = 16777216]
+ALL-NEXT:            - LF_ENUMERATE [eModuleUsage = 16777216]
+ALL-NEXT:            - LF_ENUMERATE [eIllegalUsage = 33554432]
+ALL-NEXT:            - LF_ENUMERATE [eAsynchronousUsage = 67108864]
+ALL-NEXT:            - LF_ENUMERATE [eAnyIDLUsage = 4161535]
+ALL-NEXT:   0x103C | LF_ENUM [size = 140]
+ALL-NEXT:            name: `__vc_attributes::helper_attributes::usageAttribute::usage_e`
+ALL-NEXT:            unique name: `.?AW4usage_e@usageAttribute@helper_attributes@__vc_attributes@@`
+ALL-NEXT:            field list: 0x103B, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x103D | LF_STRUCTURE [size = 128]
+ALL-NEXT:            class name: `__vc_attributes::helper_attributes::usageAttribute`
+ALL-NEXT:            unique name: `.?AUusageAttribute@helper_attributes@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+ALL-NEXT:            options: forward ref | has unique name
+ALL-NEXT:   0x103E | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x103D, mode = pointer, opts = const, kind = ptr32
+ALL-NEXT:   0x103F | LF_ARGLIST [size = 12]
+ALL-NEXT:            0x0075 (unsigned): `unsigned`
+ALL-NEXT:   0x1040 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 1, # args = 0x103F, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x103D, this type = 0x103E, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1041 | LF_FIELDLIST [size = 60]
+ALL-NEXT:            - LF_NESTTYPE [name = `usage_e`, parent = 0x103C]
+ALL-NEXT:            - LF_ONEMETHOD [name = `usageAttribute`]
+ALL-NEXT:              type = 0x1040, vftable offset = -1, attrs = public
+ALL-NEXT:            - LF_MEMBER [name = `value`, Type = 0x0075 (unsigned), offset = 0, attrs = public]
+ALL-NEXT:   0x1042 | LF_STRUCTURE [size = 128]
+ALL-NEXT:            class name: `__vc_attributes::helper_attributes::usageAttribute`
+ALL-NEXT:            unique name: `.?AUusageAttribute@helper_attributes@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1041
+ALL-NEXT:            options: has ctor / dtor | contains nested class | has unique name
+ALL-NEXT:   0x1043 | LF_FIELDLIST [size = 68]
+ALL-NEXT:            - LF_ENUMERATE [eBoolean = 0]
+ALL-NEXT:            - LF_ENUMERATE [eInteger = 1]
+ALL-NEXT:            - LF_ENUMERATE [eFloat = 2]
+ALL-NEXT:            - LF_ENUMERATE [eDouble = 3]
+ALL-NEXT:   0x1044 | LF_ENUM [size = 148]
+ALL-NEXT:            name: `__vc_attributes::helper_attributes::v1_alttypeAttribute::type_e`
+ALL-NEXT:            unique name: `.?AW4type_e@v1_alttypeAttribute@helper_attributes@__vc_attributes@@`
+ALL-NEXT:            field list: 0x1043, underlying type: 0x0074 (int)
+ALL-NEXT:            options: has unique name | is nested
+ALL-NEXT:   0x1045 | LF_STRUCTURE [size = 140]
+ALL-NEXT:            class name: `__vc_attributes::helper_attributes::v1_alttypeAttribute`
+ALL-NEXT:            unique name: `.?AUv1_alttypeAttribute@helper_attributes@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+ALL-NEXT:            options: forward ref | has unique name
+ALL-NEXT:   0x1046 | LF_POINTER [size = 12]
+ALL-NEXT:            referent = 0x1045, mode = pointer, opts = const, kind = ptr32
+ALL-NEXT:   0x1047 | LF_ARGLIST [size = 12]
+ALL-NEXT:            0x1044: `__vc_attributes::helper_attributes::v1_alttypeAttribute::type_e`
+ALL-NEXT:   0x1048 | LF_MFUNCTION [size = 28]
+ALL-NEXT:            return type = 1, # args = 0x1047, param list = 0x0003 (void)
+ALL-NEXT:            class type = 0x1045, this type = 0x1046, this adjust = 0
+ALL-NEXT:            calling conv = thiscall, options = constructor
+ALL-NEXT:   0x1049 | LF_FIELDLIST [size = 64]
+ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x1044]
+ALL-NEXT:            - LF_ONEMETHOD [name = `v1_alttypeAttribute`]
+ALL-NEXT:              type = 0x1048, vftable offset = -1, attrs = public
+ALL-NEXT:            - LF_MEMBER [name = `type`, Type = 0x1044, offset = 0, attrs = public]
+ALL-NEXT:   0x104A | LF_STRUCTURE [size = 140]
+ALL-NEXT:            class name: `__vc_attributes::helper_attributes::v1_alttypeAttribute`
+ALL-NEXT:            unique name: `.?AUv1_alttypeAttribute@helper_attributes@__vc_attributes@@`
+ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1049
+ALL-NEXT:            options: has ctor / dtor | contains nested class | has unique name
+ALL:                           Types (IPI Stream)
+ALL-NEXT: ============================================================
+ALL-NEXT:   Showing 15 records
+ALL-NEXT:   0x1000 | LF_UDT_MOD_SRC_LINE [size = 20]
+ALL-NEXT:            udt = 0x100B, mod = 1, file = 1, line = 481
+ALL-NEXT:   0x1001 | LF_UDT_MOD_SRC_LINE [size = 20]
+ALL-NEXT:            udt = 0x1017, mod = 1, file = 1, line = 194
+ALL-NEXT:   0x1002 | LF_UDT_MOD_SRC_LINE [size = 20]
+ALL-NEXT:            udt = 0x1021, mod = 1, file = 1, line = 603
+ALL-NEXT:   0x1003 | LF_UDT_MOD_SRC_LINE [size = 20]
+ALL-NEXT:            udt = 0x102C, mod = 1, file = 1, line = 1200
+ALL-NEXT:   0x1004 | LF_UDT_MOD_SRC_LINE [size = 20]
+ALL-NEXT:            udt = 0x103A, mod = 1, file = 1, line = 540
+ALL-NEXT:   0x1005 | LF_UDT_MOD_SRC_LINE [size = 20]
+ALL-NEXT:            udt = 0x1042, mod = 1, file = 1, line = 108
+ALL-NEXT:   0x1006 | LF_UDT_MOD_SRC_LINE [size = 20]
+ALL-NEXT:            udt = 0x104A, mod = 1, file = 1, line = 96
+ALL-NEXT:   0x1007 | LF_STRING_ID [size = 48] ID: <no type>, String: d:\src\llvm\test\DebugInfo\PDB\Inputs
+ALL-NEXT:   0x1008 | LF_STRING_ID [size = 76] ID: <no type>, String: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe
+ALL-NEXT:   0x1009 | LF_STRING_ID [size = 20] ID: <no type>, String: empty.cpp
+ALL-NEXT:   0x100A | LF_STRING_ID [size = 56] ID: <no type>, String: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb
+ALL-NEXT:   0x100B | LF_STRING_ID [size = 252] ID: <no type>, String: -Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows
+ALL-NEXT:   0x100C | LF_SUBSTR_LIST [size = 12]
+ALL-NEXT:            0x100B: `-Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows`
+ALL-NEXT:   0x100D | LF_STRING_ID [size = 96] ID: 0x100C, String:  Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X
+ALL-NEXT:   0x100E | LF_BUILDINFO [size = 28]
+ALL-NEXT:            0x1007: `d:\src\llvm\test\DebugInfo\PDB\Inputs`
+ALL-NEXT:            0x1008: `C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe`
+ALL-NEXT:            0x1009: `empty.cpp`
+ALL-NEXT:            0x100A: `d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb`
+ALL-NEXT:            0x100D: ` Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X`
+ALL:                             Public Symbols
+ALL-NEXT: ============================================================
+ALL-NEXT:   - S_PUB32 [size = 36] `?__purecall@@3PAXA`
+ALL-NEXT:       type = <no type>, addr = 0003:0000
+ALL-NEXT:   - S_PUB32 [size = 20] `_main`
+ALL-NEXT:       type = 0x0002 (<unknown simple type>), addr = 0001:0016
+ALL-NEXT:   - S_PROCREF [size = 20] `main`
+ALL-NEXT:       module = 1, sum name = 0, offset = 120
+ALL-NEXT:   - S_GDATA32 [size = 28] `__purecall`
+ALL-NEXT:       type = 0x0403 (void*), addr = 0003:0000
+ALL:                                Symbols
+ALL-NEXT: ============================================================
+ALL-NEXT:   Mod 0000 | `d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj`:
+ALL-NEXT:   - S_OBJNAME [size = 56] sig=0, `d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj`
+ALL-NEXT:   - S_COMPILE3 [size = 60]
+ALL-NEXT:       machine = intel pentium 3, Ver = Microsoft (R) Optimizing Compiler, language = c++
+ALL-NEXT:       frontend = 18.0.31101.0, backend = 18.0.31101.0
+ALL-NEXT:       flags = security checks
+ALL-NEXT:   - S_GPROC32 [size = 44] `main`
+ALL-NEXT:       parent = 0, addr = 0001:0016, code size = 10, end = 196
+ALL-NEXT:       debug start = 3, debug end = 8, flags = has fp
+ALL-NEXT:   - S_FRAMEPROC [size = 32]
+ALL-NEXT:       size = 0, padding size = 0, offset to padding = 0
+ALL-NEXT:       bytes of callee saved registers = 0, exception handler addr = 0000:0000
+ALL-NEXT:       flags = has async eh | opt speed
+ALL-NEXT:   - S_END [size = 4]
+ALL-NEXT:   - S_BUILDINFO [size = 8] BuildId = `4110`
+ALL-NEXT:   Mod 0001 | `* Linker *`:
+ALL-NEXT:   - S_OBJNAME [size = 20] sig=0, `* Linker *`
+ALL-NEXT:   - S_COMPILE3 [size = 48]
+ALL-NEXT:       machine = intel 80386, Ver = Microsoft (R) LINK, language = link
+ALL-NEXT:       frontend = 0.0.0.0, backend = 12.0.31101.0
+ALL-NEXT:       flags = none
+ALL-NEXT:   - S_ENVBLOCK [size = 172]
+ALL-NEXT:     - cwd
+ALL-NEXT:     - d:\src\llvm\test\DebugInfo\PDB\Inputs
+ALL-NEXT:     - exe
+ALL-NEXT:     - C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.exe
+ALL-NEXT:     - pdb
+ALL-NEXT:     - d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.pdb
+ALL-NEXT:   - S_TRAMPOLINE [size = 20]
+ALL-NEXT:       type = tramp incremental, size = 5, source = 0001:0005, target = 0001:0005
+ALL-NEXT:   - S_SECTION [size = 28] `.text`
+ALL-NEXT:       length = 4122, alignment = 12, rva = 4096, section # = 1, characteristics = 1610612768
+ALL-NEXT:   - S_COFFGROUP [size = 28] `.text$mn`
+ALL-NEXT:       length = 4122, addr = 0001:0000, characteristics = 1610612768
+ALL-NEXT:   - S_SECTION [size = 28] `.rdata`
+ALL-NEXT:       length = 690, alignment = 12, rva = 12288, section # = 2, characteristics = 1073741888
+ALL-NEXT:   - S_COFFGROUP [size = 28] `.rdata`
+ALL-NEXT:       length = 323, addr = 0002:0000, characteristics = 1073741888
+ALL-NEXT:   - S_COFFGROUP [size = 28] `.edata`
+ALL-NEXT:       length = 0, addr = 0002:0323, characteristics = 1073741888
+ALL-NEXT:   - S_COFFGROUP [size = 32] `.rdata$debug`
+ALL-NEXT:       length = 366, addr = 0002:0324, characteristics = 1073741888
+ALL-NEXT:   - S_SECTION [size = 28] `.data`
+ALL-NEXT:       length = 4, alignment = 12, rva = 16384, section # = 3, characteristics = 3221225536
+ALL-NEXT:   - S_COFFGROUP [size = 24] `.bss`
+ALL-NEXT:       length = 4, addr = 0003:0000, characteristics = 3221225600
+ALL-NEXT:   - S_SECTION [size = 28] `.reloc`
+ALL-NEXT:       length = 8, alignment = 12, rva = 20480, section # = 4, characteristics = 1107296320
+ALL:                         Section Contributions
+ALL-NEXT: ============================================================
+ALL-NEXT:   SC  | mod = 1, 0001:0000, size = 10, data crc = 0, reloc crc = 0
+ALL-NEXT:         IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
+ALL-NEXT:   SC  | mod = 0, 0001:0016, size = 10, data crc = 3617027124, reloc crc = 0
+ALL-NEXT:         IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_16BYTES | IMAGE_SCN_MEM_EXECUTE |
+ALL-NEXT:         IMAGE_SCN_MEM_READ
+ALL-NEXT:   SC  | mod = 1, 0002:0000, size = 56, data crc = 0, reloc crc = 0
+ALL-NEXT:         IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
+ALL-NEXT:   SC  | mod = 1, 0002:0324, size = 72, data crc = 0, reloc crc = 0
+ALL-NEXT:         IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ
+ALL-NEXT:   SC  | mod = 1, 0002:0396, size = 20, data crc = 0, reloc crc = 0
+ALL-NEXT:         IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ
+ALL-NEXT:   SC  | mod = 0, 0003:0000, size = 4, data crc = 0, reloc crc = 0
+ALL-NEXT:         IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ |
+ALL-NEXT:         IMAGE_SCN_MEM_WRITE
+ALL:                              Section Map
+ALL-NEXT: ============================================================
+ALL-NEXT:   Section 0000 | ovl = 0, group = 0, frame = 0, name = 1
+ALL-NEXT:                  class = 65535, offset = 0, size = 4122
+ALL-NEXT:                  flags = read | execute | 32 bit addr | selector
+ALL-NEXT:   Section 0001 | ovl = 1, group = 0, frame = 0, name = 2
+ALL-NEXT:                  class = 65535, offset = 0, size = 690
+ALL-NEXT:                  flags = read | 32 bit addr | selector
+ALL-NEXT:   Section 0002 | ovl = 2, group = 0, frame = 0, name = 3
+ALL-NEXT:                  class = 65535, offset = 0, size = 4
+ALL-NEXT:                  flags = read | write | 32 bit addr | selector
+ALL-NEXT:   Section 0003 | ovl = 3, group = 0, frame = 0, name = 4
+ALL-NEXT:                  class = 65535, offset = 0, size = 8
+ALL-NEXT:                  flags = read | 32 bit addr | selector
+ALL-NEXT:   Section 0004 | ovl = 4, group = 0, frame = 0, name = 0
+ALL-NEXT:                  class = 65535, offset = 0, size = 4294967295
+ALL-NEXT:                  flags = 32 bit addr | absolute addr
+
+
+
+BIG:                           Summary
+BIG-NEXT: ============================================================
+BIG-NEXT:   Block Size: 4096
+BIG-NEXT:   Number of blocks: 99
+BIG-NEXT:   Number of streams: 64
+BIG-NEXT:   Signature: 1461714535
+BIG-NEXT:   Age: 1
+BIG-NEXT:   GUID: {880ECC89-DF81-0B4F-839C-58CBD052E937}
+BIG-NEXT:   Features: 0x1
+BIG-NEXT:   Has Debug Info: true
+BIG-NEXT:   Has Types: true
+BIG-NEXT:   Has IDs: true
+BIG-NEXT:   Has Globals: true
+BIG-NEXT:   Has Publics: true
+BIG-NEXT:   Is incrementally linked: true
+BIG-NEXT:   Has conflicting types: false
+BIG-NEXT:   Is stripped: false
+BIG:                                Modules
+BIG-NEXT: ============================================================
+BIG-NEXT:   Mod 0000 | Name: `D:\src\llvm\test\tools\llvm-symbolizer\pdb\Inputs\test.obj`:
+BIG-NEXT:              Obj: `D:\src\llvm\test\tools\llvm-symbolizer\pdb\Inputs\test.obj`:
+BIG-NEXT:              debug stream: 12, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - d:\src\llvm\test\tools\llvm-symbolizer\pdb\inputs\test.cpp
+BIG-NEXT:   Mod 0001 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_cpu_disp_.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 14, # files: 14, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\misc\i386\cpu_disp.c
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:   Mod 0002 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_initsect_.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 15, # files: 19, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\rtc\initsect.cpp
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:   Mod 0003 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_sehprolg4_.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 16, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\eh\i386\sehprolg4.asm
+BIG-NEXT:   Mod 0004 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_chandler4gs_.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 17, # files: 14, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\eh\i386\chandler4gs.c
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:   Mod 0005 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_secchk_.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 18, # files: 14, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\eh\i386\secchk.c
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:   Mod 0006 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\gs_cookie.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 19, # files: 9, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:   Mod 0007 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\gs_report.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 20, # files: 14, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\gs\gs_report.c
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:   Mod 0008 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\gs_support.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 21, # files: 10, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\gs\gs_support.c
+BIG-NEXT:   Mod 0009 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\checkcfg.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 22, # files: 14, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\misc\checkcfg.c
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:   Mod 0010 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\guard_support.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 23, # files: 10, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\misc\guard_support.c
+BIG-NEXT:   Mod 0011 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\loadcfg.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 24, # files: 9, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:   Mod 0012 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\dyn_tls_dtor.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 25, # files: 11, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\utility\dyn_tls_dtor.c
+BIG-NEXT:   Mod 0013 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\dyn_tls_init.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 26, # files: 10, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\utility\dyn_tls_init.c
+BIG-NEXT:   Mod 0014 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\matherr_detection.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 27, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\utility\matherr_detection.c
+BIG-NEXT:   Mod 0015 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\ucrt_detection.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 28, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\utility\ucrt_detection.c
+BIG-NEXT:   Mod 0016 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\argv_mode.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 29, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\argv_mode.cpp
+BIG-NEXT:   Mod 0017 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\commit_mode.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 30, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\commit_mode.cpp
+BIG-NEXT:   Mod 0018 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\default_local_stdio_options.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 31, # files: 24, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\default_local_stdio_options.cpp
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdio.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstdio.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_stdio_config.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vadefs.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:   Mod 0019 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\denormal_control.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 32, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\denormal_control.cpp
+BIG-NEXT:   Mod 0020 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\env_mode.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 33, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\env_mode.cpp
+BIG-NEXT:   Mod 0021 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\file_mode.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 34, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\file_mode.cpp
+BIG-NEXT:   Mod 0022 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\invalid_parameter_handler.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 35, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\invalid_parameter_handler.cpp
+BIG-NEXT:   Mod 0023 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\matherr.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 36, # files: 2, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\matherr.cpp
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:   Mod 0024 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\new_mode.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 37, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\new_mode.cpp
+BIG-NEXT:   Mod 0025 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\thread_locale.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 38, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\thread_locale.cpp
+BIG-NEXT:   Mod 0026 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\tncleanup.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 39, # files: 21, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\eh\tncleanup.cpp
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_typeinfo.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_exception.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:   Mod 0027 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\exe_main.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 40, # files: 26, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdio.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstdio.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_stdio_config.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vadefs.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:   Mod 0028 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\initializers.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 41, # files: 20, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:   Mod 0029 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\utility.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 42, # files: 20, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\utility\utility.cpp
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:   Mod 0030 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\ucrt_stubs.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 43, # files: 1, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\utility\ucrt_stubs.cpp
+BIG-NEXT:   Mod 0031 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\utility_desktop.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 44, # files: 20, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\utility\utility_desktop.cpp
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:   Mod 0032 | Name: `f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\default_precision.obj`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib`:
+BIG-NEXT:              debug stream: 45, # files: 20, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\string.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\src\defaults\default_precision.cpp
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\malloc.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
+BIG-NEXT:              - f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\math.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\stdlib.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\ctype.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
+BIG-NEXT:              - f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
+BIG-NEXT:              - f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
+BIG-NEXT:   Mod 0033 | Name: `Import:KERNEL32.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\um\x86\kernel32.lib`:
+BIG-NEXT:              debug stream: 47, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0034 | Name: `KERNEL32.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\um\x86\kernel32.lib`:
+BIG-NEXT:              debug stream: 46, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0035 | Name: `Import:VCRUNTIME140.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\vcruntime.lib`:
+BIG-NEXT:              debug stream: 49, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0036 | Name: `VCRUNTIME140.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\MI0E91~1.0\VC\LIB\vcruntime.lib`:
+BIG-NEXT:              debug stream: 48, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0037 | Name: `Import:api-ms-win-crt-stdio-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 59, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0038 | Name: `api-ms-win-crt-stdio-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 58, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0039 | Name: `Import:api-ms-win-crt-runtime-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 57, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0040 | Name: `api-ms-win-crt-runtime-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 56, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0041 | Name: `Import:api-ms-win-crt-math-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 55, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0042 | Name: `api-ms-win-crt-math-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 54, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0043 | Name: `Import:api-ms-win-crt-locale-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 53, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0044 | Name: `api-ms-win-crt-locale-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 52, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0045 | Name: `Import:api-ms-win-crt-heap-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 51, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0046 | Name: `api-ms-win-crt-heap-l1-1-0.dll`:
+BIG-NEXT:              Obj: `C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib`:
+BIG-NEXT:              debug stream: 50, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+BIG-NEXT:   Mod 0047 | Name: `* Linker *`:
+BIG-NEXT:              Obj: ``:
+BIG-NEXT:              debug stream: 60, # files: 0, has ec info: false
+BIG-NEXT:              contributing source files:
+
+
+BAD-BLOCK-SIZE: Native PDB Error: The PDB file is corrupt. Does not contain superblock
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
-; EMPTY:      FileHeaders {
-; EMPTY-NEXT:   BlockSize: 4096
-; EMPTY-NEXT:   FreeBlockMap: 2
-; EMPTY-NEXT:   NumBlocks: 25
-; EMPTY-NEXT:   NumDirectoryBytes: 136
-; EMPTY-NEXT:   Unknown1: 0
-; EMPTY-NEXT:   BlockMapAddr: 24
-; EMPTY-NEXT:   NumDirectoryBlocks: 1
-; EMPTY-NEXT:   DirectoryBlocks: [23]
-; EMPTY-NEXT:   NumStreams: 17
-; EMPTY-NEXT: }
-; EMPTY-NEXT: Streams [
-; EMPTY-NEXT:   Stream 0: [Old MSF Directory] (40 bytes)
-; EMPTY-NEXT:   Stream 1: [PDB Stream] (118 bytes)
-; EMPTY-NEXT:   Stream 2: [TPI Stream] (5392 bytes)
-; EMPTY-NEXT:   Stream 3: [DBI Stream] (739 bytes)
-; EMPTY-NEXT:   Stream 4: [IPI Stream] (784 bytes)
-; EMPTY-NEXT:   Stream 5: [Named Stream "/LinkInfo"] (0 bytes)
-; EMPTY-NEXT:   Stream 6: [Global Symbol Hash] (556 bytes)
-; EMPTY-NEXT:   Stream 7: [Public Symbol Hash] (604 bytes)
-; EMPTY-NEXT:   Stream 8: [Public Symbol Records] (104 bytes)
-; EMPTY-NEXT:   Stream 9: [Named Stream "/src/headerblock"] (0 bytes)
-; EMPTY-NEXT:   Stream 10: [Section Header Data] (160 bytes)
-; EMPTY-NEXT:   Stream 11: [New FPO Data] (32 bytes)
-; EMPTY-NEXT:   Stream 12: [Module "d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj"] (308 bytes)
-; EMPTY-NEXT:   Stream 13: [Named Stream "/names"] (239 bytes)
-; EMPTY-NEXT:   Stream 14: [Module "* Linker *"] (520 bytes)
-; EMPTY-NEXT:   Stream 15: [TPI Hash] (308 bytes)
-; EMPTY-NEXT:   Stream 16: [IPI Hash] (68 bytes)
-; EMPTY-NEXT: ]
-; EMPTY-NEXT: Msf Free Pages: [3, 4, 5, 8, 9]
-; EMPTY-NEXT: Orphaned Pages: []
-; EMPTY-NEXT: Multiply Used Pages: []
-; EMPTY-NEXT: Use After Free Pages: []
-; EMPTY-NEXT: StreamBlocks [
-; EMPTY-NEXT:   Stream 0: [8]
-; EMPTY-NEXT:   Stream 1: [19]
-; EMPTY-NEXT:   Stream 2: [18, 17]
-; EMPTY-NEXT:   Stream 3: [14]
-; EMPTY-NEXT:   Stream 4: [20]
-; EMPTY-NEXT:   Stream 5: []
-; EMPTY-NEXT:   Stream 6: [11]
-; EMPTY-NEXT:   Stream 7: [13]
-; EMPTY-NEXT:   Stream 8: [12]
-; EMPTY-NEXT:   Stream 9: []
-; EMPTY-NEXT:   Stream 10: [10]
-; EMPTY-NEXT:   Stream 11: [15]
-; EMPTY-NEXT:   Stream 12: [6]
-; EMPTY-NEXT:   Stream 13: [16]
-; EMPTY-NEXT:   Stream 14: [7]
-; EMPTY-NEXT:   Stream 15: [21]
-; EMPTY-NEXT:   Stream 16: [22]
-; EMPTY-NEXT: ]
-; EMPTY-NEXT: String Table {
-; EMPTY-NEXT:   'd:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal)'
-; EMPTY-NEXT:   'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp'
-; EMPTY-NEXT:   '$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = '
-; EMPTY-NEXT: }
-; EMPTY-NEXT: PDB Stream {
-; EMPTY-NEXT:   Version: 20000404
-; EMPTY-NEXT:   Signature: 0x54E507E2
-; EMPTY-NEXT:   Age: 1
-; EMPTY-NEXT:   Guid: {0B355641-86A0-A249-896F-9988FAE52FF0}
-; EMPTY-NEXT:   Features: 0x1
-; EMPTY-NEXT:   Named Streams {
-; EMPTY-NEXT:     /names: 13
-; EMPTY-NEXT:     /LinkInfo: 5
-; EMPTY-NEXT:     /src/headerblock: 9
-; EMPTY-NEXT:   }
-; EMPTY-NEXT: }
-; EMPTY-NEXT: Type Info Stream (TPI) {
-; EMPTY-NEXT:   TPI Version: 20040203
-; EMPTY-NEXT:   Record count: 75
-; EMPTY-NEXT:   Records [
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       ArgList (0x1000) {
-; EMPTY-NEXT:         TypeLeafKind: LF_ARGLIST (0x1201)
-; EMPTY-NEXT:         NumArgs: 0
-; EMPTY-NEXT:         Arguments [
-; EMPTY-NEXT:         ]
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       Bytes (
-; EMPTY-NEXT:         0000: 00000000                             |....|
-; EMPTY-NEXT:       )
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       Procedure (0x1001) {
-; EMPTY-NEXT:         TypeLeafKind: LF_PROCEDURE (0x1008)
-; EMPTY-NEXT:         ReturnType: int (0x74)
-; EMPTY-NEXT:         CallingConvention: NearC (0x0)
-; EMPTY-NEXT:         FunctionOptions [ (0x0)
-; EMPTY-NEXT:         ]
-; EMPTY-NEXT:         NumParameters: 0
-; EMPTY-NEXT:         ArgListType: () (0x1000)
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       Bytes (
-; EMPTY-NEXT:         0000: 74000000 00000000 00100000           |t...........|
-; EMPTY-NEXT:       )
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       FieldList (0x1002) {
-; EMPTY-NEXT:         TypeLeafKind: LF_FIELDLIST (0x1203)
-; EMPTY-NEXT:         Enumerator {
-; EMPTY-NEXT:           TypeLeafKind: LF_ENUMERATE (0x1502)
-; EMPTY-NEXT:           AccessSpecifier: Public (0x3)
-; EMPTY-NEXT:           EnumValue: 1
-; EMPTY-NEXT:           Name: apartment
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Enumerator {
-; EMPTY-NEXT:           TypeLeafKind: LF_ENUMERATE (0x1502)
-; EMPTY-NEXT:           AccessSpecifier: Public (0x3)
-; EMPTY-NEXT:           EnumValue: 2
-; EMPTY-NEXT:           Name: single
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Enumerator {
-; EMPTY-NEXT:           TypeLeafKind: LF_ENUMERATE (0x1502)
-; EMPTY-NEXT:           AccessSpecifier: Public (0x3)
-; EMPTY-NEXT:           EnumValue: 3
-; EMPTY-NEXT:           Name: free
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Enumerator {
-; EMPTY-NEXT:           TypeLeafKind: LF_ENUMERATE (0x1502)
-; EMPTY-NEXT:           AccessSpecifier: Public (0x3)
-; EMPTY-NEXT:           EnumValue: 4
-; EMPTY-NEXT:           Name: neutral
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Enumerator {
-; EMPTY-NEXT:           TypeLeafKind: LF_ENUMERATE (0x1502)
-; EMPTY-NEXT:           AccessSpecifier: Public (0x3)
-; EMPTY-NEXT:           EnumValue: 5
-; EMPTY-NEXT:           Name: both
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       Bytes (
-; EMPTY-NEXT:         0000: 02150300 01006170 6172746D 656E7400  |......apartment.|
-; EMPTY-NEXT:         0010: 02150300 02007369 6E676C65 00F3F2F1  |......single....|
-; EMPTY-NEXT:         0020: 02150300 03006672 656500F1 02150300  |......free......|
-; EMPTY-NEXT:         0030: 04006E65 75747261 6C00F2F1 02150300  |..neutral.......|
-; EMPTY-NEXT:         0040: 0500626F 746800F1                    |..both..|
-; EMPTY-NEXT:       )
-; EMPTY-NEXT:     }
-; EMPTY:          Hash {
-; EMPTY-NEXT:       Number of Hash Buckets: 262143
-; EMPTY-NEXT:       Hash Key Size: 4
-; EMPTY-NEXT:       Values: [205956, 163561, 59811, 208239, 16377, 247078, 194342, 254156, 194536, 167492, 185421, 119540, 261871, 198119, 48056, 251486, 134580, 148190, 113636, 53336, 55779, 220695, 198114, 148734, 81128, 60158, 217249, 174209, 159978, 249504, 141941, 238785, 6214, 94935, 151449, 135589, 73373, 96512, 254299, 17744, 239514, 173189, 130544, 204437, 238560, 144673, 115151, 197306, 256035, 101096, 231280, 52156, 48854, 170035, 177041, 102745, 16947, 183703, 98548, 35693, 171328, 203640, 139292, 49018, 43821, 202555, 165040, 215835, 142625, 52534, 44186, 103930, 110942, 17991, 213215]
-; EMPTY-NEXT:       Adjusters [
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     TypeIndexOffsets [
-; EMPTY-NEXT:       Index: 0x1000, Offset: 0
-; EMPTY-NEXT:     ]
-; EMPTY:        Type Info Stream (IPI) {
-; EMPTY-NEXT:     IPI Version: 20040203
-; EMPTY-NEXT:     Record count: 15
-; EMPTY-NEXT:     Records [
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         UdtModSourceLine (0x1000) {
-; EMPTY-NEXT:           TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; EMPTY-NEXT:           UDT: __vc_attributes::threadingAttribute (0x100B)
-; EMPTY-NEXT:           SourceFile: <unknown simple type> (0x1)
-; EMPTY-NEXT:           LineNumber: 481
-; EMPTY-NEXT:           Module: 1
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 0B100000 01000000 E1010000 0100F2F1  |................|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         UdtModSourceLine (0x1001) {
-; EMPTY-NEXT:           TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; EMPTY-NEXT:           UDT: __vc_attributes::event_receiverAttribute (0x1017)
-; EMPTY-NEXT:           SourceFile: <unknown simple type> (0x1)
-; EMPTY-NEXT:           LineNumber: 194
-; EMPTY-NEXT:           Module: 1
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 17100000 01000000 C2000000 0100F2F1  |................|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         UdtModSourceLine (0x1002) {
-; EMPTY-NEXT:           TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; EMPTY-NEXT:           UDT: __vc_attributes::aggregatableAttribute (0x1021)
-; EMPTY-NEXT:           SourceFile: <unknown simple type> (0x1)
-; EMPTY-NEXT:           LineNumber: 603
-; EMPTY-NEXT:           Module: 1
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 21100000 01000000 5B020000 0100F2F1  |!.......[.......|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         UdtModSourceLine (0x1003) {
-; EMPTY-NEXT:           TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; EMPTY-NEXT:           UDT: __vc_attributes::event_sourceAttribute (0x102C)
-; EMPTY-NEXT:           SourceFile: <unknown simple type> (0x1)
-; EMPTY-NEXT:           LineNumber: 1200
-; EMPTY-NEXT:           Module: 1
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 2C100000 01000000 B0040000 0100F2F1  |,...............|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         UdtModSourceLine (0x1004) {
-; EMPTY-NEXT:           TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; EMPTY-NEXT:           UDT: __vc_attributes::moduleAttribute (0x103A)
-; EMPTY-NEXT:           SourceFile: <unknown simple type> (0x1)
-; EMPTY-NEXT:           LineNumber: 540
-; EMPTY-NEXT:           Module: 1
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 3A100000 01000000 1C020000 0100F2F1  |:...............|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         UdtModSourceLine (0x1005) {
-; EMPTY-NEXT:           TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; EMPTY-NEXT:           UDT: __vc_attributes::helper_attributes::usageAttribute (0x1042)
-; EMPTY-NEXT:           SourceFile: <unknown simple type> (0x1)
-; EMPTY-NEXT:           LineNumber: 108
-; EMPTY-NEXT:           Module: 1
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 42100000 01000000 6C000000 0100F2F1  |B.......l.......|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         UdtModSourceLine (0x1006) {
-; EMPTY-NEXT:           TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; EMPTY-NEXT:           UDT: __vc_attributes::helper_attributes::v1_alttypeAttribute (0x104A)
-; EMPTY-NEXT:           SourceFile: <unknown simple type> (0x1)
-; EMPTY-NEXT:           LineNumber: 96
-; EMPTY-NEXT:           Module: 1
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 4A100000 01000000 60000000 0100F2F1  |J.......`.......|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         StringId (0x1007) {
-; EMPTY-NEXT:           TypeLeafKind: LF_STRING_ID (0x1605)
-; EMPTY-NEXT:           Id: 0x0
-; EMPTY-NEXT:           StringData: d:\src\llvm\test\DebugInfo\PDB\Inputs
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 00000000 643A5C73 72635C6C 6C766D5C  |....d:\src\llvm\|
-; EMPTY-NEXT:           0010: 74657374 5C446562 7567496E 666F5C50  |test\DebugInfo\P|
-; EMPTY-NEXT:           0020: 44425C49 6E707574 7300F2F1           |DB\Inputs...|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         StringId (0x1008) {
-; EMPTY-NEXT:           TypeLeafKind: LF_STRING_ID (0x1605)
-; EMPTY-NEXT:           Id: 0x0
-; EMPTY-NEXT:           StringData: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 00000000 433A5C50 726F6772 616D2046  |....C:\Program F|
-; EMPTY-NEXT:           0010: 696C6573 20287838 36295C4D 6963726F  |iles (x86)\Micro|
-; EMPTY-NEXT:           0020: 736F6674 20566973 75616C20 53747564  |soft Visual Stud|
-; EMPTY-NEXT:           0030: 696F2031 322E305C 56435C42 494E5C63  |io 12.0\VC\BIN\c|
-; EMPTY-NEXT:           0040: 6C2E6578 6500F2F1                    |l.exe...|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         StringId (0x1009) {
-; EMPTY-NEXT:           TypeLeafKind: LF_STRING_ID (0x1605)
-; EMPTY-NEXT:           Id: 0x0
-; EMPTY-NEXT:           StringData: empty.cpp
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 00000000 656D7074 792E6370 7000F2F1  |....empty.cpp...|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         StringId (0x100A) {
-; EMPTY-NEXT:           TypeLeafKind: LF_STRING_ID (0x1605)
-; EMPTY-NEXT:           Id: 0x0
-; EMPTY-NEXT:           StringData: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 00000000 643A5C73 72635C6C 6C766D5C  |....d:\src\llvm\|
-; EMPTY-NEXT:           0010: 74657374 5C446562 7567496E 666F5C50  |test\DebugInfo\P|
-; EMPTY-NEXT:           0020: 44425C49 6E707574 735C7663 3132302E  |DB\Inputs\vc120.|
-; EMPTY-NEXT:           0030: 70646200                             |pdb.|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         StringId (0x100B) {
-; EMPTY-NEXT:           TypeLeafKind: LF_STRING_ID (0x1605)
-; EMPTY-NEXT:           Id: 0x0
-; EMPTY-NEXT:           StringData: -Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 00000000 2D5A6920 2D4D5420 2D492243  |....-Zi -MT -I"C|
-; EMPTY-NEXT:           0010: 3A5C5072 6F677261 6D204669 6C657320  |:\Program Files |
-; EMPTY-NEXT:           0020: 28783836 295C4D69 63726F73 6F667420  |(x86)\Microsoft |
-; EMPTY-NEXT:           0030: 56697375 616C2053 74756469 6F203132  |Visual Studio 12|
-; EMPTY-NEXT:           0040: 2E305C56 435C494E 434C5544 4522202D  |.0\VC\INCLUDE" -|
-; EMPTY-NEXT:           0050: 4922433A 5C50726F 6772616D 2046696C  |I"C:\Program Fil|
-; EMPTY-NEXT:           0060: 65732028 78383629 5C4D6963 726F736F  |es (x86)\Microso|
-; EMPTY-NEXT:           0070: 66742056 69737561 6C205374 7564696F  |ft Visual Studio|
-; EMPTY-NEXT:           0080: 2031322E 305C5643 5C41544C 4D46435C  | 12.0\VC\ATLMFC\|
-; EMPTY-NEXT:           0090: 494E434C 55444522 202D4922 433A5C50  |INCLUDE" -I"C:\P|
-; EMPTY-NEXT:           00A0: 726F6772 616D2046 696C6573 20287838  |rogram Files (x8|
-; EMPTY-NEXT:           00B0: 36295C57 696E646F 7773204B 6974735C  |6)\Windows Kits\|
-; EMPTY-NEXT:           00C0: 382E315C 696E636C 7564655C 73686172  |8.1\include\shar|
-; EMPTY-NEXT:           00D0: 65642220 2D492243 3A5C5072 6F677261  |ed" -I"C:\Progra|
-; EMPTY-NEXT:           00E0: 6D204669 6C657320 28783836 295C5769  |m Files (x86)\Wi|
-; EMPTY-NEXT:           00F0: 6E646F77 7300F2F1                    |ndows...|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         StringList (0x100C) {
-; EMPTY-NEXT:           TypeLeafKind: LF_SUBSTR_LIST (0x1604)
-; EMPTY-NEXT:           NumStrings: 1
-; EMPTY-NEXT:           Strings [
-; EMPTY-NEXT:             String: -Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows
-; EMPTY-NEXT:           ]
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 01000000 0B100000                    |........|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         StringId (0x100D) {
-; EMPTY-NEXT:           TypeLeafKind: LF_STRING_ID (0x1605)
-; EMPTY-NEXT:           Id: "-Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows" (0x100C)
-; EMPTY-NEXT:           StringData:  Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 0C100000 204B6974 735C382E 315C696E  |.... Kits\8.1\in|
-; EMPTY-NEXT:           0010: 636C7564 655C756D 22202D49 22433A5C  |clude\um" -I"C:\|
-; EMPTY-NEXT:           0020: 50726F67 72616D20 46696C65 73202878  |Program Files (x|
-; EMPTY-NEXT:           0030: 3836295C 57696E64 6F777320 4B697473  |86)\Windows Kits|
-; EMPTY-NEXT:           0040: 5C382E31 5C696E63 6C756465 5C77696E  |\8.1\include\win|
-; EMPTY-NEXT:           0050: 72742220 2D545020 2D5800F1           |rt" -TP -X..|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       {
-; EMPTY-NEXT:         BuildInfo (0x100E) {
-; EMPTY-NEXT:           TypeLeafKind: LF_BUILDINFO (0x1603)
-; EMPTY-NEXT:           NumArgs: 5
-; EMPTY-NEXT:           Arguments [
-; EMPTY-NEXT:             ArgType: d:\src\llvm\test\DebugInfo\PDB\Inputs (0x1007)
-; EMPTY-NEXT:             ArgType: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe (0x1008)
-; EMPTY-NEXT:             ArgType: empty.cpp (0x1009)
-; EMPTY-NEXT:             ArgType: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb (0x100A)
-; EMPTY-NEXT:             ArgType:  Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X (0x100D)
-; EMPTY-NEXT:           ]
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         Bytes (
-; EMPTY-NEXT:           0000: 05000710 00000810 00000910 00000A10  |................|
-; EMPTY-NEXT:           0010: 00000D10 0000F2F1                    |........|
-; EMPTY-NEXT:         )
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       TypeIndexOffsets [
-; EMPTY-NEXT:         Index: 0x1000, Offset: 0
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:   }
-; EMPTY:      DBI Stream {
-; EMPTY-NEXT:   Dbi Version: 19990903
-; EMPTY-NEXT:   Age: 1
-; EMPTY-NEXT:   Incremental Linking: Yes
-; EMPTY-NEXT:   Has CTypes: No
-; EMPTY-NEXT:   Is Stripped: No
-; EMPTY-NEXT:   Machine Type: x86
-; EMPTY-NEXT:   Symbol Record Stream Index: 8
-; EMPTY-NEXT:   Public Symbol Stream Index: 7
-; EMPTY-NEXT:   Global Symbol Stream Index: 6
-; EMPTY-NEXT:   Toolchain Version: 12.0
-; EMPTY-NEXT:   mspdb120.dll version: 12.0.31101
-; EMPTY-NEXT:   Modules [
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; EMPTY-NEXT:       Debug Stream Index: 12
-; EMPTY-NEXT:       Object File Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; EMPTY-NEXT:       Num Files: 1
-; EMPTY-NEXT:       Source File Name Idx: 0
-; EMPTY-NEXT:       Pdb File Name Idx: 0
-; EMPTY-NEXT:       Line Info Byte Size: 0
-; EMPTY-NEXT:       C13 Line Info Byte Size: 88
-; EMPTY-NEXT:       Symbol Byte Size: 208
-; EMPTY-NEXT:       Type Server Index: 0
-; EMPTY-NEXT:       Has EC Info: No
-; EMPTY-NEXT:       1 Contributing Source Files [
-; EMPTY-NEXT:         d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:       Symbols [
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           ObjectName {
-; EMPTY-NEXT:             Signature: 0x0
-; EMPTY-NEXT:             ObjectName: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 00000000 643A5C73 72635C6C 6C766D5C  |....d:\src\llvm\|
-; EMPTY-NEXT:             0010: 74657374 5C446562 7567496E 666F5C50  |test\DebugInfo\P|
-; EMPTY-NEXT:             0020: 44425C49 6E707574 735C656D 7074792E  |DB\Inputs\empty.|
-; EMPTY-NEXT:             0030: 6F626A00                             |obj.|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           CompilerFlags3 {
-; EMPTY-NEXT:             Language: Cpp (0x1)
-; EMPTY-NEXT:             Flags [ (0x2000)
-; EMPTY-NEXT:               SecurityChecks (0x2000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Machine: Pentium3 (0x7)
-; EMPTY-NEXT:             FrontendVersion: 18.0.31101.0
-; EMPTY-NEXT:             BackendVersion: 18.0.31101.0
-; EMPTY-NEXT:             VersionName: Microsoft (R) Optimizing Compiler
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 01200000 07001200 00007D79 00001200  |. ........}y....|
-; EMPTY-NEXT:             0010: 00007D79 00004D69 63726F73 6F667420  |..}y..Microsoft |
-; EMPTY-NEXT:             0020: 28522920 4F707469 6D697A69 6E672043  |(R) Optimizing C|
-; EMPTY-NEXT:             0030: 6F6D7069 6C657200                    |ompiler.|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           ProcStart {
-; EMPTY-NEXT:             Kind: S_GPROC32 (0x1110)
-; EMPTY-NEXT:             PtrParent: 0x0
-; EMPTY-NEXT:             PtrEnd: 0xC4
-; EMPTY-NEXT:             PtrNext: 0x0
-; EMPTY-NEXT:             CodeSize: 0xA
-; EMPTY-NEXT:             DbgStart: 0x3
-; EMPTY-NEXT:             DbgEnd: 0x8
-; EMPTY-NEXT:             FunctionType: int () (0x1001)
-; EMPTY-NEXT:             Segment: 0x1
-; EMPTY-NEXT:             Flags [ (0x1)
-; EMPTY-NEXT:               HasFP (0x1)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             DisplayName: main
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 00000000 C4000000 00000000 0A000000  |................|
-; EMPTY-NEXT:             0010: 03000000 08000000 01100000 10000000  |................|
-; EMPTY-NEXT:             0020: 0100016D 61696E00                    |...main.|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           FrameProc {
-; EMPTY-NEXT:             TotalFrameBytes: 0x0
-; EMPTY-NEXT:             PaddingFrameBytes: 0x0
-; EMPTY-NEXT:             OffsetToPadding: 0x0
-; EMPTY-NEXT:             BytesOfCalleeSavedRegisters: 0x0
-; EMPTY-NEXT:             OffsetOfExceptionHandler: 0x0
-; EMPTY-NEXT:             SectionIdOfExceptionHandler: 0x0
-; EMPTY-NEXT:             Flags [ (0x128200)
-; EMPTY-NEXT:               AsynchronousExceptionHandling (0x200)
-; EMPTY-NEXT:               OptimizedForSpeed (0x100000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 00000000 00000000 00000000 00000000  |................|
-; EMPTY-NEXT:             0010: 00000000 00000082 12000000           |............|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           BlockEnd {
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           BuildInfo {
-; EMPTY-NEXT:             BuildId: 4110
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 0E100000                             |....|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:       Subsections [
-; EMPTY-NEXT:         Lines {
-; EMPTY-NEXT:           RelocSegment: 1
-; EMPTY-NEXT:           RelocOffset: 16
-; EMPTY-NEXT:           CodeSize: 10
-; EMPTY-NEXT:           HasColumns: No
-; EMPTY-NEXT:           FileEntry {
-; EMPTY-NEXT:             FileName: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
-; EMPTY-NEXT:             Line {
-; EMPTY-NEXT:               Offset: 0
-; EMPTY-NEXT:               LineNumberStart: 5
-; EMPTY-NEXT:               EndDelta: 0
-; EMPTY-NEXT:               IsStatement: Yes
-; EMPTY-NEXT:             }
-; EMPTY-NEXT:             Line {
-; EMPTY-NEXT:               Offset: 3
-; EMPTY-NEXT:               LineNumberStart: 6
-; EMPTY-NEXT:               EndDelta: 0
-; EMPTY-NEXT:               IsStatement: Yes
-; EMPTY-NEXT:             }
-; EMPTY-NEXT:             Line {
-; EMPTY-NEXT:               Offset: 8
-; EMPTY-NEXT:               LineNumberStart: 7
-; EMPTY-NEXT:               EndDelta: 0
-; EMPTY-NEXT:               IsStatement: Yes
-; EMPTY-NEXT:             }
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         FileChecksums {
-; EMPTY-NEXT:           Checksum {
-; EMPTY-NEXT:             FileName: d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
-; EMPTY-NEXT:             Kind: MD5 (0x1)
-; EMPTY-NEXT:             Checksum (
-; EMPTY-NEXT:               0000: A0A5BD0D 3ECD93FC 29D19DE8 26FBF4BC  |....>...)...&...|
-; EMPTY-NEXT:             )
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       Name: * Linker *
-; EMPTY-NEXT:       Debug Stream Index: 14
-; EMPTY-NEXT:       Object File Name:
-; EMPTY-NEXT:       Num Files: 0
-; EMPTY-NEXT:       Source File Name Idx: 0
-; EMPTY-NEXT:       Pdb File Name Idx: 1
-; EMPTY-NEXT:       Line Info Byte Size: 0
-; EMPTY-NEXT:       C13 Line Info Byte Size: 0
-; EMPTY-NEXT:       Symbol Byte Size: 516
-; EMPTY-NEXT:       Type Server Index: 0
-; EMPTY-NEXT:       Has EC Info: No
-; EMPTY-NEXT:       0 Contributing Source Files [
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:       Symbols [
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           ObjectName {
-; EMPTY-NEXT:             Signature: 0x0
-; EMPTY-NEXT:             ObjectName: * Linker *
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 00000000 2A204C69 6E6B6572 202A0000  |....* Linker *..|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           CompilerFlags3 {
-; EMPTY-NEXT:             Language: Link (0x7)
-; EMPTY-NEXT:             Flags [ (0x0)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Machine: Intel80386 (0x3)
-; EMPTY-NEXT:             FrontendVersion: 0.0.0.0
-; EMPTY-NEXT:             BackendVersion: 12.0.31101.0
-; EMPTY-NEXT:             VersionName: Microsoft (R) LINK
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 07000000 03000000 00000000 00000C00  |................|
-; EMPTY-NEXT:             0010: 00007D79 00004D69 63726F73 6F667420  |..}y..Microsoft |
-; EMPTY-NEXT:             0020: 28522920 4C494E4B 00000000           |(R) LINK....|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           EnvBlock {
-; EMPTY-NEXT:             Entries [
-; EMPTY-NEXT:               cwd
-; EMPTY-NEXT:               d:\src\llvm\test\DebugInfo\PDB\Inputs
-; EMPTY-NEXT:               exe
-; EMPTY-NEXT:               C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.exe
-; EMPTY-NEXT:               pdb
-; EMPTY-NEXT:               d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.pdb
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 00637764 00643A5C 7372635C 6C6C766D  |.cwd.d:\src\llvm|
-; EMPTY-NEXT:             0010: 5C746573 745C4465 62756749 6E666F5C  |\test\DebugInfo\|
-; EMPTY-NEXT:             0020: 5044425C 496E7075 74730065 78650043  |PDB\Inputs.exe.C|
-; EMPTY-NEXT:             0030: 3A5C5072 6F677261 6D204669 6C657320  |:\Program Files |
-; EMPTY-NEXT:             0040: 28783836 295C4D69 63726F73 6F667420  |(x86)\Microsoft |
-; EMPTY-NEXT:             0050: 56697375 616C2053 74756469 6F203132  |Visual Studio 12|
-; EMPTY-NEXT:             0060: 2E305C56 435C4249 4E5C6C69 6E6B2E65  |.0\VC\BIN\link.e|
-; EMPTY-NEXT:             0070: 78650070 64620064 3A5C7372 635C6C6C  |xe.pdb.d:\src\ll|
-; EMPTY-NEXT:             0080: 766D5C74 6573745C 44656275 67496E66  |vm\test\DebugInf|
-; EMPTY-NEXT:             0090: 6F5C5044 425C496E 70757473 5C656D70  |o\PDB\Inputs\emp|
-; EMPTY-NEXT:             00A0: 74792E70 64620000                    |ty.pdb..|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           Trampoline {
-; EMPTY-NEXT:             Type: TrampIncremental (0x0)
-; EMPTY-NEXT:             Size: 5
-; EMPTY-NEXT:             ThunkOff: 5
-; EMPTY-NEXT:             TargetOff: 16
-; EMPTY-NEXT:             ThunkSection: 1
-; EMPTY-NEXT:             TargetSection: 1
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 00000500 05000000 10000000 01000100  |................|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           Section {
-; EMPTY-NEXT:             SectionNumber: 1
-; EMPTY-NEXT:             Alignment: 12
-; EMPTY-NEXT:             Rva: 4096
-; EMPTY-NEXT:             Length: 4122
-; EMPTY-NEXT:             Characteristics [ (0x60000020)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_CODE (0x20)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Name: .text
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 01000C00 00100000 1A100000 20000060  |............ ..`|
-; EMPTY-NEXT:             0010: 2E746578 74000000                    |.text...|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           COFF Group {
-; EMPTY-NEXT:             Size: 4122
-; EMPTY-NEXT:             Characteristics [ (0x60000020)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_CODE (0x20)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Offset: 0
-; EMPTY-NEXT:             Segment: 1
-; EMPTY-NEXT:             Name: .text$mn
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 1A100000 20000060 00000000 01002E74  |.... ..`.......t|
-; EMPTY-NEXT:             0010: 65787424 6D6E0000                    |ext$mn..|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           Section {
-; EMPTY-NEXT:             SectionNumber: 2
-; EMPTY-NEXT:             Alignment: 12
-; EMPTY-NEXT:             Rva: 12288
-; EMPTY-NEXT:             Length: 690
-; EMPTY-NEXT:             Characteristics [ (0x40000040)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Name: .rdata
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 02000C00 00300000 B2020000 40000040  |.....0......@..@|
-; EMPTY-NEXT:             0010: 2E726461 74610000                    |.rdata..|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           COFF Group {
-; EMPTY-NEXT:             Size: 323
-; EMPTY-NEXT:             Characteristics [ (0x40000040)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Offset: 0
-; EMPTY-NEXT:             Segment: 2
-; EMPTY-NEXT:             Name: .rdata
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 43010000 40000040 00000000 02002E72  |C...@..@.......r|
-; EMPTY-NEXT:             0010: 64617461 00000000                    |data....|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           COFF Group {
-; EMPTY-NEXT:             Size: 0
-; EMPTY-NEXT:             Characteristics [ (0x40000040)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Offset: 323
-; EMPTY-NEXT:             Segment: 2
-; EMPTY-NEXT:             Name: .edata
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 00000000 40000040 43010000 02002E65  |....@..@C......e|
-; EMPTY-NEXT:             0010: 64617461 00000000                    |data....|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           COFF Group {
-; EMPTY-NEXT:             Size: 366
-; EMPTY-NEXT:             Characteristics [ (0x40000040)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Offset: 324
-; EMPTY-NEXT:             Segment: 2
-; EMPTY-NEXT:             Name: .rdata$debug
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 6E010000 40000040 44010000 02002E72  |n...@..@D......r|
-; EMPTY-NEXT:             0010: 64617461 24646562 75670000           |data$debug..|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           Section {
-; EMPTY-NEXT:             SectionNumber: 3
-; EMPTY-NEXT:             Alignment: 12
-; EMPTY-NEXT:             Rva: 16384
-; EMPTY-NEXT:             Length: 4
-; EMPTY-NEXT:             Characteristics [ (0xC0000040)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_WRITE (0x80000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Name: .data
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 03000C00 00400000 04000000 400000C0  |.....@......@...|
-; EMPTY-NEXT:             0010: 2E646174 61000000                    |.data...|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           COFF Group {
-; EMPTY-NEXT:             Size: 4
-; EMPTY-NEXT:             Characteristics [ (0xC0000080)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_WRITE (0x80000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Offset: 0
-; EMPTY-NEXT:             Segment: 3
-; EMPTY-NEXT:             Name: .bss
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 04000000 800000C0 00000000 03002E62  |...............b|
-; EMPTY-NEXT:             0010: 73730000                             |ss..|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:         {
-; EMPTY-NEXT:           Section {
-; EMPTY-NEXT:             SectionNumber: 4
-; EMPTY-NEXT:             Alignment: 12
-; EMPTY-NEXT:             Rva: 20480
-; EMPTY-NEXT:             Length: 8
-; EMPTY-NEXT:             Characteristics [ (0x42000040)
-; EMPTY-NEXT:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_DISCARDABLE (0x2000000)
-; EMPTY-NEXT:               IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:             ]
-; EMPTY-NEXT:             Name: .reloc
-; EMPTY-NEXT:           }
-; EMPTY-NEXT:           Bytes (
-; EMPTY-NEXT:             0000: 04000C00 00500000 08000000 40000042  |.....P......@..B|
-; EMPTY-NEXT:             0010: 2E72656C 6F630000                    |.reloc..|
-; EMPTY-NEXT:           )
-; EMPTY-NEXT:         }
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:       Subsections [
-; EMPTY-NEXT:       ]
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:   ]
-; EMPTY-NEXT: }
-; EMPTY-NEXT: Section Contributions [
-; EMPTY-NEXT:   Contribution {
-; EMPTY-NEXT:     ISect: 1
-; EMPTY-NEXT:     Off: 0
-; EMPTY-NEXT:     Size: 10
-; EMPTY-NEXT:     Characteristics [ (0x60000020)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_CODE (0x20)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Module {
-; EMPTY-NEXT:       Index: 1
-; EMPTY-NEXT:       Name: * Linker *
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     Data CRC: 0
-; EMPTY-NEXT:     Reloc CRC: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Contribution {
-; EMPTY-NEXT:     ISect: 1
-; EMPTY-NEXT:     Off: 16
-; EMPTY-NEXT:     Size: 10
-; EMPTY-NEXT:     Characteristics [ (0x60500020)
-; EMPTY-NEXT:       IMAGE_SCN_ALIGN_16BYTES (0x500000)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_CODE (0x20)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Module {
-; EMPTY-NEXT:       Index: 0
-; EMPTY-NEXT:       Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     Data CRC: 3617027124
-; EMPTY-NEXT:     Reloc CRC: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Contribution {
-; EMPTY-NEXT:     ISect: 2
-; EMPTY-NEXT:     Off: 0
-; EMPTY-NEXT:     Size: 56
-; EMPTY-NEXT:     Characteristics [ (0x40000040)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Module {
-; EMPTY-NEXT:       Index: 1
-; EMPTY-NEXT:       Name: * Linker *
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     Data CRC: 0
-; EMPTY-NEXT:     Reloc CRC: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Contribution {
-; EMPTY-NEXT:     ISect: 2
-; EMPTY-NEXT:     Off: 324
-; EMPTY-NEXT:     Size: 72
-; EMPTY-NEXT:     Characteristics [ (0x40300040)
-; EMPTY-NEXT:       IMAGE_SCN_ALIGN_4BYTES (0x300000)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Module {
-; EMPTY-NEXT:       Index: 1
-; EMPTY-NEXT:       Name: * Linker *
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     Data CRC: 0
-; EMPTY-NEXT:     Reloc CRC: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Contribution {
-; EMPTY-NEXT:     ISect: 2
-; EMPTY-NEXT:     Off: 396
-; EMPTY-NEXT:     Size: 20
-; EMPTY-NEXT:     Characteristics [ (0x40300040)
-; EMPTY-NEXT:       IMAGE_SCN_ALIGN_4BYTES (0x300000)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Module {
-; EMPTY-NEXT:       Index: 1
-; EMPTY-NEXT:       Name: * Linker *
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     Data CRC: 0
-; EMPTY-NEXT:     Reloc CRC: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Contribution {
-; EMPTY-NEXT:     ISect: 3
-; EMPTY-NEXT:     Off: 0
-; EMPTY-NEXT:     Size: 4
-; EMPTY-NEXT:     Characteristics [ (0xC0300080)
-; EMPTY-NEXT:       IMAGE_SCN_ALIGN_4BYTES (0x300000)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_WRITE (0x80000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Module {
-; EMPTY-NEXT:       Index: 0
-; EMPTY-NEXT:       Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     Data CRC: 0
-; EMPTY-NEXT:     Reloc CRC: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT: ]
-; EMPTY-NEXT: Section Map [
-; EMPTY-NEXT:   Entry {
-; EMPTY-NEXT:     Flags [ (0x10D)
-; EMPTY-NEXT:       AddressIs32Bit (0x8)
-; EMPTY-NEXT:       Execute (0x4)
-; EMPTY-NEXT:       IsSelector (0x100)
-; EMPTY-NEXT:       Read (0x1)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Ovl: 0
-; EMPTY-NEXT:     Group: 0
-; EMPTY-NEXT:     Frame: 1
-; EMPTY-NEXT:     SecName: 65535
-; EMPTY-NEXT:     ClassName: 65535
-; EMPTY-NEXT:     Offset: 0
-; EMPTY-NEXT:     SecByteLength: 4122
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Entry {
-; EMPTY-NEXT:     Flags [ (0x109)
-; EMPTY-NEXT:       AddressIs32Bit (0x8)
-; EMPTY-NEXT:       IsSelector (0x100)
-; EMPTY-NEXT:       Read (0x1)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Ovl: 0
-; EMPTY-NEXT:     Group: 0
-; EMPTY-NEXT:     Frame: 2
-; EMPTY-NEXT:     SecName: 65535
-; EMPTY-NEXT:     ClassName: 65535
-; EMPTY-NEXT:     Offset: 0
-; EMPTY-NEXT:     SecByteLength: 690
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Entry {
-; EMPTY-NEXT:     Flags [ (0x10B)
-; EMPTY-NEXT:       AddressIs32Bit (0x8)
-; EMPTY-NEXT:       IsSelector (0x100)
-; EMPTY-NEXT:       Read (0x1)
-; EMPTY-NEXT:       Write (0x2)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Ovl: 0
-; EMPTY-NEXT:     Group: 0
-; EMPTY-NEXT:     Frame: 3
-; EMPTY-NEXT:     SecName: 65535
-; EMPTY-NEXT:     ClassName: 65535
-; EMPTY-NEXT:     Offset: 0
-; EMPTY-NEXT:     SecByteLength: 4
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Entry {
-; EMPTY-NEXT:     Flags [ (0x109)
-; EMPTY-NEXT:       AddressIs32Bit (0x8)
-; EMPTY-NEXT:       IsSelector (0x100)
-; EMPTY-NEXT:       Read (0x1)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Ovl: 0
-; EMPTY-NEXT:     Group: 0
-; EMPTY-NEXT:     Frame: 4
-; EMPTY-NEXT:     SecName: 65535
-; EMPTY-NEXT:     ClassName: 65535
-; EMPTY-NEXT:     Offset: 0
-; EMPTY-NEXT:     SecByteLength: 8
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   Entry {
-; EMPTY-NEXT:     Flags [ (0x208)
-; EMPTY-NEXT:       AddressIs32Bit (0x8)
-; EMPTY-NEXT:       IsAbsoluteAddress (0x200)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:     Ovl: 0
-; EMPTY-NEXT:     Group: 0
-; EMPTY-NEXT:     Frame: 0
-; EMPTY-NEXT:     SecName: 65535
-; EMPTY-NEXT:     ClassName: 65535
-; EMPTY-NEXT:     Offset: 0
-; EMPTY-NEXT:     SecByteLength: 4294967295
-; EMPTY-NEXT:   }
-; EMPTY-NEXT: ]
-; EMPTY-NEXT: Globals Stream {
-; EMPTY-NEXT:   Stream number: 6
-; EMPTY-NEXT:   Number of buckets: 2
-; EMPTY-NEXT:   Hash Buckets: [0, 12]
-; EMPTY-NEXT: }
-; EMPTY-NEXT: Publics Stream {
-; EMPTY-NEXT:   Stream number: 7
-; EMPTY-NEXT:   SymHash: 556
-; EMPTY-NEXT:   AddrMap: 8
-; EMPTY-NEXT:   Number of buckets: 2
-; EMPTY-NEXT:   Hash Buckets: [0, 12]
-; EMPTY-NEXT:   Address Map: [36, 0]
-; EMPTY-NEXT:   Thunk Map: [4112]
-; EMPTY-NEXT:   Section Offsets: [4096, 1]
-; EMPTY-NEXT:   Symbols [
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       PublicSym {
-; EMPTY-NEXT:         Type: 0
-; EMPTY-NEXT:         Seg: 3
-; EMPTY-NEXT:         Off: 0
-; EMPTY-NEXT:         Name: ?__purecall@@3PAXA
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       Bytes (
-; EMPTY-NEXT:         0000: 00000000 00000000 03003F5F 5F707572  |..........?__pur|
-; EMPTY-NEXT:         0010: 6563616C 6C404033 50415841 00000000  |ecall@@3PAXA....|
-; EMPTY-NEXT:       )
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       PublicSym {
-; EMPTY-NEXT:         Type: 2
-; EMPTY-NEXT:         Seg: 1
-; EMPTY-NEXT:         Off: 16
-; EMPTY-NEXT:         Name: _main
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       Bytes (
-; EMPTY-NEXT:         0000: 02000000 10000000 01005F6D 61696E00  |.........._main.|
-; EMPTY-NEXT:       )
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       ProcRef {
-; EMPTY-NEXT:         SumName: 0
-; EMPTY-NEXT:         SymOffset: 120
-; EMPTY-NEXT:         Mod: 1
-; EMPTY-NEXT:         Name: main
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       Bytes (
-; EMPTY-NEXT:         0000: 00000000 78000000 01006D61 696E0000  |....x.....main..|
-; EMPTY-NEXT:       )
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:     {
-; EMPTY-NEXT:       DataSym {
-; EMPTY-NEXT:         Kind: S_GDATA32 (0x110D)
-; EMPTY-NEXT:         Type: void* (0x403)
-; EMPTY-NEXT:         DisplayName: __purecall
-; EMPTY-NEXT:       }
-; EMPTY-NEXT:       Bytes (
-; EMPTY-NEXT:         0000: 03040000 00000000 03005F5F 70757265  |..........__pure|
-; EMPTY-NEXT:         0010: 63616C6C 00000000                    |call....|
-; EMPTY-NEXT:       )
-; EMPTY-NEXT:     }
-; EMPTY-NEXT:   ]
-; EMPTY-NEXT: }
-; EMPTY-NEXT: Section Headers [
-; EMPTY-NEXT:   {
-; EMPTY-NEXT:     Name: .text
-; EMPTY-NEXT:     Virtual Size: 4122
-; EMPTY-NEXT:     Virtual Address: 4096
-; EMPTY-NEXT:     Size of Raw Data: 4608
-; EMPTY-NEXT:     File Pointer to Raw Data: 1024
-; EMPTY-NEXT:     File Pointer to Relocations: 0
-; EMPTY-NEXT:     File Pointer to Linenumbers: 0
-; EMPTY-NEXT:     Number of Relocations: 0
-; EMPTY-NEXT:     Number of Linenumbers: 0
-; EMPTY-NEXT:     Characteristics [ (0x60000020)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_CODE (0x20)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   {
-; EMPTY-NEXT:     Name: .rdata
-; EMPTY-NEXT:     Virtual Size: 690
-; EMPTY-NEXT:     Virtual Address: 12288
-; EMPTY-NEXT:     Size of Raw Data: 1024
-; EMPTY-NEXT:     File Pointer to Raw Data: 5632
-; EMPTY-NEXT:     File Pointer to Relocations: 0
-; EMPTY-NEXT:     File Pointer to Linenumbers: 0
-; EMPTY-NEXT:     Number of Relocations: 0
-; EMPTY-NEXT:     Number of Linenumbers: 0
-; EMPTY-NEXT:     Characteristics [ (0x40000040)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   {
-; EMPTY-NEXT:     Name: .data
-; EMPTY-NEXT:     Virtual Size: 4
-; EMPTY-NEXT:     Virtual Address: 16384
-; EMPTY-NEXT:     Size of Raw Data: 0
-; EMPTY-NEXT:     File Pointer to Raw Data: 0
-; EMPTY-NEXT:     File Pointer to Relocations: 0
-; EMPTY-NEXT:     File Pointer to Linenumbers: 0
-; EMPTY-NEXT:     Number of Relocations: 0
-; EMPTY-NEXT:     Number of Linenumbers: 0
-; EMPTY-NEXT:     Characteristics [ (0xC0000040)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_WRITE (0x80000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   {
-; EMPTY-NEXT:     Name: .reloc
-; EMPTY-NEXT:     Virtual Size: 8
-; EMPTY-NEXT:     Virtual Address: 20480
-; EMPTY-NEXT:     Size of Raw Data: 512
-; EMPTY-NEXT:     File Pointer to Raw Data: 6656
-; EMPTY-NEXT:     File Pointer to Relocations: 0
-; EMPTY-NEXT:     File Pointer to Linenumbers: 0
-; EMPTY-NEXT:     Number of Relocations: 0
-; EMPTY-NEXT:     Number of Linenumbers: 0
-; EMPTY-NEXT:     Characteristics [ (0x42000040)
-; EMPTY-NEXT:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_DISCARDABLE (0x2000000)
-; EMPTY-NEXT:       IMAGE_SCN_MEM_READ (0x40000000)
-; EMPTY-NEXT:     ]
-; EMPTY-NEXT:   }
-; EMPTY-NEXT: ]
-; EMPTY:      New FPO [
-; EMPTY-NEXT:   {
-; EMPTY-NEXT:     Offset: 4112
-; EMPTY-NEXT:     Size: 10
-; EMPTY-NEXT:     Number of locals: 0
-; EMPTY-NEXT:     Number of params: 0
-; EMPTY-NEXT:     Size of Prolog: 0
-; EMPTY-NEXT:     Number of Saved Registers: 0
-; EMPTY-NEXT:     Has SEH: No
-; EMPTY-NEXT:     Use BP: No
-; EMPTY-NEXT:     Frame Pointer: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT:   {
-; EMPTY-NEXT:     Offset: 0
-; EMPTY-NEXT:     Size: 134
-; EMPTY-NEXT:     Number of locals: 3
-; EMPTY-NEXT:     Number of params: 4
-; EMPTY-NEXT:     Size of Prolog: 0
-; EMPTY-NEXT:     Number of Saved Registers: 0
-; EMPTY-NEXT:     Has SEH: No
-; EMPTY-NEXT:     Use BP: No
-; EMPTY-NEXT:     Frame Pointer: 0
-; EMPTY-NEXT:   }
-; EMPTY-NEXT: ]
 
-; ALL: FileHeaders {
-; ALL:   BlockSize: 4096
-; ALL:   FreeBlockMap: 2
-; ALL:   NumBlocks: 25
-; ALL:   NumDirectoryBytes: 136
-; ALL:   Unknown1: 0
-; ALL:   BlockMapAddr: 24
-; ALL:   NumDirectoryBlocks: 1
-; ALL:   DirectoryBlocks: [23]
-; ALL:   NumStreams: 17
-; ALL: }
-; ALL: Streams [
-; ALL:   Stream 0: [Old MSF Directory] (40 bytes)
-; ALL:   Stream 1: [PDB Stream] (118 bytes)
-; ALL:   Stream 2: [TPI Stream] (5392 bytes)
-; ALL:   Stream 3: [DBI Stream] (739 bytes)
-; ALL:   Stream 4: [IPI Stream] (784 bytes)
-; ALL:   Stream 5: [Named Stream "/LinkInfo"] (0 bytes)
-; ALL:   Stream 6: [Global Symbol Hash] (556 bytes)
-; ALL:   Stream 7: [Public Symbol Hash] (604 bytes)
-; ALL:   Stream 8: [Public Symbol Records] (104 bytes)
-; ALL:   Stream 9: [Named Stream "/src/headerblock"] (0 bytes)
-; ALL:   Stream 10: [Section Header Data] (160 bytes)
-; ALL:   Stream 11: [New FPO Data] (32 bytes)
-; ALL:   Stream 12: [Module "d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj"] (308 bytes)
-; ALL:   Stream 13: [Named Stream "/names"] (239 bytes)
-; ALL:   Stream 14: [Module "* Linker *"] (520 bytes)
-; ALL:   Stream 15: [TPI Hash] (308 bytes)
-; ALL:   Stream 16: [IPI Hash] (68 bytes)
-; ALL: ]
-; ALL: Msf Free Pages: [3, 4, 5, 8, 9]
-; ALL: Orphaned Pages: []
-; ALL: Multiply Used Pages: []
-; ALL: Use After Free Pages: []
-; ALL: StreamBlocks [
-; ALL:   Stream 0: [8]
-; ALL:   Stream 1: [19]
-; ALL:   Stream 2: [18, 17]
-; ALL:   Stream 3: [14]
-; ALL:   Stream 4: [20]
-; ALL:   Stream 5: []
-; ALL:   Stream 6: [11]
-; ALL:   Stream 7: [13]
-; ALL:   Stream 8: [12]
-; ALL:   Stream 9: []
-; ALL:   Stream 10: [10]
-; ALL:   Stream 11: [15]
-; ALL:   Stream 12: [6]
-; ALL:   Stream 13: [16]
-; ALL:   Stream 14: [7]
-; ALL:   Stream 15: [21]
-; ALL:   Stream 16: [22]
-; ALL: ]
-; ALL: PDB Stream {
-; ALL:   Version: 20000404
-; ALL:   Signature: 0x54E507E2
-; ALL:   Age: 1
-; ALL:   Guid: {0B355641-86A0-A249-896F-9988FAE52FF0}
-; ALL:   Features: 0x1
-; ALL: }
-; ALL: Type Info Stream (IPI) {
-; ALL:   IPI Version: 20040203
-; ALL:   Record count: 15
-; ALL:   Records [
-; ALL:     {
-; ALL:       UdtModSourceLine (0x1000) {
-; ALL:         TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; ALL:         UDT: __vc_attributes::threadingAttribute (0x100B)
-; ALL:         SourceFile: <unknown simple type> (0x1)
-; ALL:         LineNumber: 481
-; ALL:         Module: 1
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       UdtModSourceLine (0x1001) {
-; ALL:         TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; ALL:         UDT: __vc_attributes::event_receiverAttribute (0x1017)
-; ALL:         SourceFile: <unknown simple type> (0x1)
-; ALL:         LineNumber: 194
-; ALL:         Module: 1
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       UdtModSourceLine (0x1002) {
-; ALL:         TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; ALL:         UDT: __vc_attributes::aggregatableAttribute (0x1021)
-; ALL:         SourceFile: <unknown simple type> (0x1)
-; ALL:         LineNumber: 603
-; ALL:         Module: 1
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       UdtModSourceLine (0x1003) {
-; ALL:         TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; ALL:         UDT: __vc_attributes::event_sourceAttribute (0x102C)
-; ALL:         SourceFile: <unknown simple type> (0x1)
-; ALL:         LineNumber: 1200
-; ALL:         Module: 1
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       UdtModSourceLine (0x1004) {
-; ALL:         TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; ALL:         UDT: __vc_attributes::moduleAttribute (0x103A)
-; ALL:         SourceFile: <unknown simple type> (0x1)
-; ALL:         LineNumber: 540
-; ALL:         Module: 1
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       UdtModSourceLine (0x1005) {
-; ALL:         TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; ALL:         UDT: __vc_attributes::helper_attributes::usageAttribute (0x1042)
-; ALL:         SourceFile: <unknown simple type> (0x1)
-; ALL:         LineNumber: 108
-; ALL:         Module: 1
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       UdtModSourceLine (0x1006) {
-; ALL:         TypeLeafKind: LF_UDT_MOD_SRC_LINE (0x1607)
-; ALL:         UDT: __vc_attributes::helper_attributes::v1_alttypeAttribute (0x104A)
-; ALL:         SourceFile: <unknown simple type> (0x1)
-; ALL:         LineNumber: 96
-; ALL:         Module: 1
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       StringId (0x1007) {
-; ALL:         TypeLeafKind: LF_STRING_ID (0x1605)
-; ALL:         Id: 0x0
-; ALL:         StringData: d:\src\llvm\test\DebugInfo\PDB\Inputs
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       StringId (0x1008) {
-; ALL:         TypeLeafKind: LF_STRING_ID (0x1605)
-; ALL:         Id: 0x0
-; ALL:         StringData: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       StringId (0x1009) {
-; ALL:         TypeLeafKind: LF_STRING_ID (0x1605)
-; ALL:         Id: 0x0
-; ALL:         StringData: empty.cpp
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       StringId (0x100A) {
-; ALL:         TypeLeafKind: LF_STRING_ID (0x1605)
-; ALL:         Id: 0x0
-; ALL:         StringData: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       StringId (0x100B) {
-; ALL:         TypeLeafKind: LF_STRING_ID (0x1605)
-; ALL:         Id: 0x0
-; ALL:         StringData: -Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       StringList (0x100C) {
-; ALL:         TypeLeafKind: LF_SUBSTR_LIST (0x1604)
-; ALL:         NumStrings: 1
-; ALL:         Strings [
-; ALL:           String: -Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows (0x100B)
-; ALL:         ]
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       StringId (0x100D) {
-; ALL:         TypeLeafKind: LF_STRING_ID (0x1605)
-; ALL:         Id: "-Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows" (0x100C)
-; ALL:         StringData:  Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       BuildInfo (0x100E) {
-; ALL:         TypeLeafKind: LF_BUILDINFO (0x1603)
-; ALL:         NumArgs: 5
-; ALL:         Arguments [
-; ALL:           ArgType: d:\src\llvm\test\DebugInfo\PDB\Inputs (0x1007)
-; ALL:           ArgType: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe (0x1008)
-; ALL:           ArgType: empty.cpp (0x1009)
-; ALL:           ArgType: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb (0x100A)
-; ALL:           ArgType:  Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X (0x100D)
-; ALL:         ]
-; ALL:       }
-; ALL:     }
-; ALL:   ]
-; ALL: }
-; ALL: DBI Stream {
-; ALL:   Dbi Version: 19990903
-; ALL:   Age: 1
-; ALL:   Incremental Linking: Yes
-; ALL:   Has CTypes: No
-; ALL:   Is Stripped: No
-; ALL:   Machine Type: x86
-; ALL:   Symbol Record Stream Index: 8
-; ALL:   Public Symbol Stream Index: 7
-; ALL:   Global Symbol Stream Index: 6
-; ALL:   Toolchain Version: 12.0
-; ALL:   mspdb120.dll version: 12.0.31101
-; ALL:   Modules [
-; ALL:     {
-; ALL:       Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; ALL:       Debug Stream Index: 12
-; ALL:       Object File Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; ALL:       Num Files: 1
-; ALL:       Source File Name Idx: 0
-; ALL:       Pdb File Name Idx: 0
-; ALL:       Line Info Byte Size: 0
-; ALL:       C13 Line Info Byte Size: 88
-; ALL:       Symbol Byte Size: 208
-; ALL:       Type Server Index: 0
-; ALL:       Has EC Info: No
-; ALL:       1 Contributing Source Files [
-; ALL:         d:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp
-; ALL:       ]
-; ALL:       Symbols [
-; ALL:         {
-; ALL:           ObjectName {
-; ALL:             Signature: 0x0
-; ALL:             ObjectName: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           CompilerFlags3 {
-; ALL:             Language: Cpp (0x1)
-; ALL:             Flags [ (0x2000)
-; ALL:               SecurityChecks (0x2000)
-; ALL:             ]
-; ALL:             Machine: Pentium3 (0x7)
-; ALL:             FrontendVersion: 18.0.31101.0
-; ALL:             BackendVersion: 18.0.31101.0
-; ALL:             VersionName: Microsoft (R) Optimizing Compiler
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           ProcStart {
-; ALL:             PtrParent: 0x0
-; ALL:             PtrEnd: 0xC4
-; ALL:             PtrNext: 0x0
-; ALL:             CodeSize: 0xA
-; ALL:             DbgStart: 0x3
-; ALL:             DbgEnd: 0x8
-; ALL:             FunctionType: int () (0x1001)
-; ALL:             Segment: 0x1
-; ALL:             Flags [ (0x1)
-; ALL:               HasFP (0x1)
-; ALL:             ]
-; ALL:             DisplayName: main
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           FrameProc {
-; ALL:             TotalFrameBytes: 0x0
-; ALL:             PaddingFrameBytes: 0x0
-; ALL:             OffsetToPadding: 0x0
-; ALL:             BytesOfCalleeSavedRegisters: 0x0
-; ALL:             OffsetOfExceptionHandler: 0x0
-; ALL:             SectionIdOfExceptionHandler: 0x0
-; ALL:             Flags [ (0x128200)
-; ALL:               AsynchronousExceptionHandling (0x200)
-; ALL:               OptimizedForSpeed (0x100000)
-; ALL:             ]
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           BlockEnd {
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           BuildInfo {
-; ALL:             BuildId: 4110
-; ALL:           }
-; ALL:         }
-; ALL:       ]
-; ALL:     }
-; ALL:     {
-; ALL:       Name: * Linker *
-; ALL:       Debug Stream Index: 14
-; ALL:       Object File Name:
-; ALL:       Num Files: 0
-; ALL:       Source File Name Idx: 0
-; ALL:       Pdb File Name Idx: 1
-; ALL:       Line Info Byte Size: 0
-; ALL:       C13 Line Info Byte Size: 0
-; ALL:       Symbol Byte Size: 516
-; ALL:       Type Server Index: 0
-; ALL:       Has EC Info: No
-; ALL:       0 Contributing Source Files [
-; ALL:       ]
-; ALL:       Symbols [
-; ALL:         {
-; ALL:           ObjectName {
-; ALL:             Signature: 0x0
-; ALL:             ObjectName: * Linker *
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           CompilerFlags3 {
-; ALL:             Language: Link (0x7)
-; ALL:             Flags [ (0x0)
-; ALL:             ]
-; ALL:             Machine: Intel80386 (0x3)
-; ALL:             FrontendVersion: 0.0.0.0
-; ALL:             BackendVersion: 12.0.31101.0
-; ALL:             VersionName: Microsoft (R) LINK
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           EnvBlock {
-; ALL:             Entries [
-; ALL:               cwd
-; ALL:               d:\src\llvm\test\DebugInfo\PDB\Inputs
-; ALL:               exe
-; ALL:               C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.exe
-; ALL:               pdb
-; ALL:               d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.pdb
-; ALL:             ]
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           Trampoline {
-; ALL:             Type: TrampIncremental (0x0)
-; ALL:             Size: 5
-; ALL:             ThunkOff: 5
-; ALL:             TargetOff: 16
-; ALL:             ThunkSection: 1
-; ALL:             TargetSection: 1
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           Section {
-; ALL:             SectionNumber: 1
-; ALL:             Alignment: 12
-; ALL:             Rva: 4096
-; ALL:             Length: 4122
-; ALL:             Characteristics [ (0x60000020)
-; ALL:               IMAGE_SCN_CNT_CODE (0x20)
-; ALL:               IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:             ]
-; ALL:             Name: .text
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           COFF Group {
-; ALL:             Size: 4122
-; ALL:             Characteristics [ (0x60000020)
-; ALL:               IMAGE_SCN_CNT_CODE (0x20)
-; ALL:               IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:             ]
-; ALL:             Offset: 0
-; ALL:             Segment: 1
-; ALL:             Name: .text$mn
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           Section {
-; ALL:             SectionNumber: 2
-; ALL:             Alignment: 12
-; ALL:             Rva: 12288
-; ALL:             Length: 690
-; ALL:             Characteristics [ (0x40000040)
-; ALL:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:             ]
-; ALL:             Name: .rdata
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           COFF Group {
-; ALL:             Size: 323
-; ALL:             Characteristics [ (0x40000040)
-; ALL:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:             ]
-; ALL:             Offset: 0
-; ALL:             Segment: 2
-; ALL:             Name: .rdata
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           COFF Group {
-; ALL:             Size: 0
-; ALL:             Characteristics [ (0x40000040)
-; ALL:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:             ]
-; ALL:             Offset: 323
-; ALL:             Segment: 2
-; ALL:             Name: .edata
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           COFF Group {
-; ALL:             Size: 366
-; ALL:             Characteristics [ (0x40000040)
-; ALL:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:             ]
-; ALL:             Offset: 324
-; ALL:             Segment: 2
-; ALL:             Name: .rdata$debug
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           Section {
-; ALL:             SectionNumber: 3
-; ALL:             Alignment: 12
-; ALL:             Rva: 16384
-; ALL:             Length: 4
-; ALL:             Characteristics [ (0xC0000040)
-; ALL:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:               IMAGE_SCN_MEM_WRITE (0x80000000)
-; ALL:             ]
-; ALL:             Name: .data
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           COFF Group {
-; ALL:             Size: 4
-; ALL:             Characteristics [ (0xC0000080)
-; ALL:               IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:               IMAGE_SCN_MEM_WRITE (0x80000000)
-; ALL:             ]
-; ALL:             Offset: 0
-; ALL:             Segment: 3
-; ALL:             Name: .bss
-; ALL:           }
-; ALL:         }
-; ALL:         {
-; ALL:           Section {
-; ALL:             SectionNumber: 4
-; ALL:             Alignment: 12
-; ALL:             Rva: 20480
-; ALL:             Length: 8
-; ALL:             Characteristics [ (0x42000040)
-; ALL:               IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:               IMAGE_SCN_MEM_DISCARDABLE (0x2000000)
-; ALL:               IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:             ]
-; ALL:             Name: .reloc
-; ALL:           }
-; ALL:         }
-; ALL:       ]
-; ALL:     }
-; ALL:   ]
-; ALL: }
-; ALL: Section Contributions [
-; ALL:   Contribution {
-; ALL:     ISect: 1
-; ALL:     Off: 0
-; ALL:     Size: 10
-; ALL:     Characteristics [ (0x60000020)
-; ALL:       IMAGE_SCN_CNT_CODE (0x20)
-; ALL:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:     Module {
-; ALL:       Index: 1
-; ALL:       Name: * Linker *
-; ALL:     }
-; ALL:     Data CRC: 0
-; ALL:     Reloc CRC: 0
-; ALL:   }
-; ALL:   Contribution {
-; ALL:     ISect: 1
-; ALL:     Off: 16
-; ALL:     Size: 10
-; ALL:     Characteristics [ (0x60500020)
-; ALL:       IMAGE_SCN_ALIGN_16BYTES (0x500000)
-; ALL:       IMAGE_SCN_CNT_CODE (0x20)
-; ALL:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:     Module {
-; ALL:       Index: 0
-; ALL:       Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; ALL:     }
-; ALL:     Data CRC: 3617027124
-; ALL:     Reloc CRC: 0
-; ALL:   }
-; ALL:   Contribution {
-; ALL:     ISect: 2
-; ALL:     Off: 0
-; ALL:     Size: 56
-; ALL:     Characteristics [ (0x40000040)
-; ALL:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:     Module {
-; ALL:       Index: 1
-; ALL:       Name: * Linker *
-; ALL:     }
-; ALL:     Data CRC: 0
-; ALL:     Reloc CRC: 0
-; ALL:   }
-; ALL:   Contribution {
-; ALL:     ISect: 2
-; ALL:     Off: 324
-; ALL:     Size: 72
-; ALL:     Characteristics [ (0x40300040)
-; ALL:       IMAGE_SCN_ALIGN_4BYTES (0x300000)
-; ALL:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:     Module {
-; ALL:       Index: 1
-; ALL:       Name: * Linker *
-; ALL:     }
-; ALL:     Data CRC: 0
-; ALL:     Reloc CRC: 0
-; ALL:   }
-; ALL:   Contribution {
-; ALL:     ISect: 2
-; ALL:     Off: 396
-; ALL:     Size: 20
-; ALL:     Characteristics [ (0x40300040)
-; ALL:       IMAGE_SCN_ALIGN_4BYTES (0x300000)
-; ALL:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:     Module {
-; ALL:       Index: 1
-; ALL:       Name: * Linker *
-; ALL:     }
-; ALL:     Data CRC: 0
-; ALL:     Reloc CRC: 0
-; ALL:   }
-; ALL:   Contribution {
-; ALL:     ISect: 3
-; ALL:     Off: 0
-; ALL:     Size: 4
-; ALL:     Characteristics [ (0xC0300080)
-; ALL:       IMAGE_SCN_ALIGN_4BYTES (0x300000)
-; ALL:       IMAGE_SCN_CNT_UNINITIALIZED_DATA (0x80)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:       IMAGE_SCN_MEM_WRITE (0x80000000)
-; ALL:     ]
-; ALL:     Module {
-; ALL:       Index: 0
-; ALL:       Name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj
-; ALL:     }
-; ALL:     Data CRC: 0
-; ALL:     Reloc CRC: 0
-; ALL:   }
-; ALL: ]
-; ALL: Section Map [
-; ALL:   Entry {
-; ALL:     Flags [ (0x10D)
-; ALL:       AddressIs32Bit (0x8)
-; ALL:       Execute (0x4)
-; ALL:       IsSelector (0x100)
-; ALL:       Read (0x1)
-; ALL:     ]
-; ALL:     Ovl: 0
-; ALL:     Group: 0
-; ALL:     Frame: 1
-; ALL:     SecName: 65535
-; ALL:     ClassName: 65535
-; ALL:     Offset: 0
-; ALL:     SecByteLength: 4122
-; ALL:   }
-; ALL:   Entry {
-; ALL:     Flags [ (0x109)
-; ALL:       AddressIs32Bit (0x8)
-; ALL:       IsSelector (0x100)
-; ALL:       Read (0x1)
-; ALL:     ]
-; ALL:     Ovl: 0
-; ALL:     Group: 0
-; ALL:     Frame: 2
-; ALL:     SecName: 65535
-; ALL:     ClassName: 65535
-; ALL:     Offset: 0
-; ALL:     SecByteLength: 690
-; ALL:   }
-; ALL:   Entry {
-; ALL:     Flags [ (0x10B)
-; ALL:       AddressIs32Bit (0x8)
-; ALL:       IsSelector (0x100)
-; ALL:       Read (0x1)
-; ALL:       Write (0x2)
-; ALL:     ]
-; ALL:     Ovl: 0
-; ALL:     Group: 0
-; ALL:     Frame: 3
-; ALL:     SecName: 65535
-; ALL:     ClassName: 65535
-; ALL:     Offset: 0
-; ALL:     SecByteLength: 4
-; ALL:   }
-; ALL:   Entry {
-; ALL:     Flags [ (0x109)
-; ALL:       AddressIs32Bit (0x8)
-; ALL:       IsSelector (0x100)
-; ALL:       Read (0x1)
-; ALL:     ]
-; ALL:     Ovl: 0
-; ALL:     Group: 0
-; ALL:     Frame: 4
-; ALL:     SecName: 65535
-; ALL:     ClassName: 65535
-; ALL:     Offset: 0
-; ALL:     SecByteLength: 8
-; ALL:   }
-; ALL:   Entry {
-; ALL:     Flags [ (0x208)
-; ALL:       AddressIs32Bit (0x8)
-; ALL:       IsAbsoluteAddress (0x200)
-; ALL:     ]
-; ALL:     Ovl: 0
-; ALL:     Group: 0
-; ALL:     Frame: 0
-; ALL:     SecName: 65535
-; ALL:     ClassName: 65535
-; ALL:     Offset: 0
-; ALL:     SecByteLength: 4294967295
-; ALL:   }
-; ALL: ]
-; ALL: Globals Stream {
-; ALL:   Stream number: 6
-; ALL:   Number of buckets: 2
-; ALL:   Hash Buckets: [0, 12]
-; ALL: }
-; ALL: Publics Stream {
-; ALL:   Stream number: 7
-; ALL:   SymHash: 556
-; ALL:   AddrMap: 8
-; ALL:   Number of buckets: 2
-; ALL:   Hash Buckets: [0, 12]
-; ALL:   Address Map: [36, 0]
-; ALL:   Thunk Map: [4112]
-; ALL:   Section Offsets: [4096, 1]
-; ALL:   Symbols [
-; ALL:     {
-; ALL:       PublicSym {
-; ALL:         Type: 0
-; ALL:         Seg: 3
-; ALL:         Off: 0
-; ALL:         Name: ?__purecall@@3PAXA
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       PublicSym {
-; ALL:         Type: 2
-; ALL:         Seg: 1
-; ALL:         Off: 16
-; ALL:         Name: _main
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       ProcRef {
-; ALL:         SumName: 0
-; ALL:         SymOffset: 120
-; ALL:         Mod: 1
-; ALL:         Name: main
-; ALL:       }
-; ALL:     }
-; ALL:     {
-; ALL:       DataSym {
-; ALL:         Type: void* (0x403)
-; ALL:         DisplayName: __purecall
-; ALL:       }
-; ALL:     }
-; ALL:   ]
-; ALL: }
-; ALL: Section Headers [
-; ALL:   {
-; ALL:     Name: .text
-; ALL:     Virtual Size: 4122
-; ALL:     Virtual Address: 4096
-; ALL:     Size of Raw Data: 4608
-; ALL:     File Pointer to Raw Data: 1024
-; ALL:     File Pointer to Relocations: 0
-; ALL:     File Pointer to Linenumbers: 0
-; ALL:     Number of Relocations: 0
-; ALL:     Number of Linenumbers: 0
-; ALL:     Characteristics [ (0x60000020)
-; ALL:       IMAGE_SCN_CNT_CODE (0x20)
-; ALL:       IMAGE_SCN_MEM_EXECUTE (0x20000000)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:   }
-; ALL:   {
-; ALL:     Name: .rdata
-; ALL:     Virtual Size: 690
-; ALL:     Virtual Address: 12288
-; ALL:     Size of Raw Data: 1024
-; ALL:     File Pointer to Raw Data: 5632
-; ALL:     File Pointer to Relocations: 0
-; ALL:     File Pointer to Linenumbers: 0
-; ALL:     Number of Relocations: 0
-; ALL:     Number of Linenumbers: 0
-; ALL:     Characteristics [ (0x40000040)
-; ALL:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:   }
-; ALL:   {
-; ALL:     Name: .data
-; ALL:     Virtual Size: 4
-; ALL:     Virtual Address: 16384
-; ALL:     Size of Raw Data: 0
-; ALL:     File Pointer to Raw Data: 0
-; ALL:     File Pointer to Relocations: 0
-; ALL:     File Pointer to Linenumbers: 0
-; ALL:     Number of Relocations: 0
-; ALL:     Number of Linenumbers: 0
-; ALL:     Characteristics [ (0xC0000040)
-; ALL:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:       IMAGE_SCN_MEM_WRITE (0x80000000)
-; ALL:     ]
-; ALL:   }
-; ALL:   {
-; ALL:     Name: .reloc
-; ALL:     Virtual Size: 8
-; ALL:     Virtual Address: 20480
-; ALL:     Size of Raw Data: 512
-; ALL:     File Pointer to Raw Data: 6656
-; ALL:     File Pointer to Relocations: 0
-; ALL:     File Pointer to Linenumbers: 0
-; ALL:     Number of Relocations: 0
-; ALL:     Number of Linenumbers: 0
-; ALL:     Characteristics [ (0x42000040)
-; ALL:       IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-; ALL:       IMAGE_SCN_MEM_DISCARDABLE (0x2000000)
-; ALL:       IMAGE_SCN_MEM_READ (0x40000000)
-; ALL:     ]
-; ALL:   }
-; ALL: ]
 
-; BIG:      FileHeaders {
-; BIG-NEXT:   BlockSize: 4096
-; BIG-NEXT:   FreeBlockMap: 2
-; BIG-NEXT:   NumBlocks: 99
-; BIG-NEXT:   NumDirectoryBytes: 616
-; BIG-NEXT:   Unknown1: 0
-; BIG-NEXT:   BlockMapAddr: 97
-; BIG-NEXT:   NumDirectoryBlocks: 1
-; BIG-NEXT:   DirectoryBlocks: [96]
-; BIG-NEXT:   NumStreams: 64
-; BIG-NEXT: }
-; BIG-NEXT: PDB Stream {
-; BIG-NEXT:   Version: 20000404
-; BIG-NEXT:   Signature: 0x571FFE67
-; BIG-NEXT:   Age: 1
-; BIG-NEXT:   Guid: {880ECC89-DF81-0B4F-839C-58CBD052E937}
-; BIG-NEXT:   Features: 0x1
-; BIG-NEXT:   Named Streams {
-; BIG-NEXT:     /names: 13
-; BIG-NEXT:     /LinkInfo: 5
-; BIG-NEXT:     /src/headerblock: 61
-; BIG-NEXT:   }
-; BIG-NEXT: }
-; BIG-NEXT: DBI Stream {
-; BIG-NEXT:   Dbi Version: 19990903
-; BIG-NEXT:   Age: 1
-; BIG-NEXT:   Incremental Linking: Yes
-; BIG-NEXT:   Has CTypes: No
-; BIG-NEXT:   Is Stripped: No
-; BIG-NEXT:   Machine Type: x86
-; BIG-NEXT:   Symbol Record Stream Index: 9
-; BIG-NEXT:   Public Symbol Stream Index: 8
-; BIG-NEXT:   Global Symbol Stream Index: 7
-; BIG-NEXT:   Toolchain Version: 14.0
-; BIG-NEXT:   mspdb140.dll version: 14.0.23918
-; BIG-NEXT:   Modules [
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: D:\src\llvm\test\tools\llvm-symbolizer\pdb\Inputs\test.obj
-; BIG-NEXT:       Debug Stream Index: 12
-; BIG-NEXT:       Object File Name: D:\src\llvm\test\tools\llvm-symbolizer\pdb\Inputs\test.obj
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 400
-; BIG-NEXT:       Symbol Byte Size: 872
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         d:\src\llvm\test\tools\llvm-symbolizer\pdb\inputs\test.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_cpu_disp_.obj
-; BIG-NEXT:       Debug Stream Index: 14
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 14
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 344
-; BIG-NEXT:       Symbol Byte Size: 720
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       14 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\misc\i386\cpu_disp.c
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_initsect_.obj
-; BIG-NEXT:       Debug Stream Index: 15
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 19
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 464
-; BIG-NEXT:       Symbol Byte Size: 464
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       19 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\rtc\initsect.cpp
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_sehprolg4_.obj
-; BIG-NEXT:       Debug Stream Index: 16
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 1
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 32
-; BIG-NEXT:       Symbol Byte Size: 444
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\eh\i386\sehprolg4.asm
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_chandler4gs_.obj
-; BIG-NEXT:       Debug Stream Index: 17
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 14
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 344
-; BIG-NEXT:       Symbol Byte Size: 604
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       14 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\eh\i386\chandler4gs.c
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\_secchk_.obj
-; BIG-NEXT:       Debug Stream Index: 18
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 14
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 344
-; BIG-NEXT:       Symbol Byte Size: 344
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       14 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\eh\i386\secchk.c
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\gs_cookie.obj
-; BIG-NEXT:       Debug Stream Index: 19
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 9
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 224
-; BIG-NEXT:       Symbol Byte Size: 160
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       9 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\gs_report.obj
-; BIG-NEXT:       Debug Stream Index: 20
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 14
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 1392
-; BIG-NEXT:       Symbol Byte Size: 1144
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       14 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\gs\gs_report.c
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\gs_support.obj
-; BIG-NEXT:       Debug Stream Index: 21
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 10
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 432
-; BIG-NEXT:       Symbol Byte Size: 552
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       10 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\gs\gs_support.c
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\checkcfg.obj
-; BIG-NEXT:       Debug Stream Index: 22
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 14
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 392
-; BIG-NEXT:       Symbol Byte Size: 328
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       14 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\misc\checkcfg.c
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\guard_support.obj
-; BIG-NEXT:       Debug Stream Index: 23
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 10
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 352
-; BIG-NEXT:       Symbol Byte Size: 424
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       10 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\misc\guard_support.c
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\loadcfg.obj
-; BIG-NEXT:       Debug Stream Index: 24
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 9
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 224
-; BIG-NEXT:       Symbol Byte Size: 156
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       9 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\dyn_tls_dtor.obj
-; BIG-NEXT:       Debug Stream Index: 25
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 11
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 328
-; BIG-NEXT:       Symbol Byte Size: 272
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       11 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\utility\dyn_tls_dtor.c
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\dyn_tls_init.obj
-; BIG-NEXT:       Debug Stream Index: 26
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 10
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 304
-; BIG-NEXT:       Symbol Byte Size: 272
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       10 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\utility\dyn_tls_init.c
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\matherr_detection.obj
-; BIG-NEXT:       Debug Stream Index: 27
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 276
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\utility\matherr_detection.c
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\ucrt_detection.obj
-; BIG-NEXT:       Debug Stream Index: 28
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 268
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\utility\ucrt_detection.c
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\argv_mode.obj
-; BIG-NEXT:       Debug Stream Index: 29
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 260
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\argv_mode.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\commit_mode.obj
-; BIG-NEXT:       Debug Stream Index: 30
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 260
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\commit_mode.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\default_local_stdio_options.obj
-; BIG-NEXT:       Debug Stream Index: 31
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 24
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 760
-; BIG-NEXT:       Symbol Byte Size: 620
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       24 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\default_local_stdio_options.cpp
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdio.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstdio.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_stdio_config.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vadefs.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\denormal_control.obj
-; BIG-NEXT:       Debug Stream Index: 32
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 80
-; BIG-NEXT:       Symbol Byte Size: 272
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\denormal_control.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\env_mode.obj
-; BIG-NEXT:       Debug Stream Index: 33
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 268
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\env_mode.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\file_mode.obj
-; BIG-NEXT:       Debug Stream Index: 34
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 260
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\file_mode.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\invalid_parameter_handler.obj
-; BIG-NEXT:       Debug Stream Index: 35
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 80
-; BIG-NEXT:       Symbol Byte Size: 292
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\invalid_parameter_handler.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\matherr.obj
-; BIG-NEXT:       Debug Stream Index: 36
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 2
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 112
-; BIG-NEXT:       Symbol Byte Size: 312
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       2 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\matherr.cpp
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\new_mode.obj
-; BIG-NEXT:       Debug Stream Index: 37
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 260
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\new_mode.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\thread_locale.obj
-; BIG-NEXT:       Debug Stream Index: 38
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 88
-; BIG-NEXT:       Symbol Byte Size: 272
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\thread_locale.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\tncleanup.obj
-; BIG-NEXT:       Debug Stream Index: 39
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 21
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 624
-; BIG-NEXT:       Symbol Byte Size: 432
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       21 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\eh\tncleanup.cpp
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_typeinfo.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_exception.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\exe_main.obj
-; BIG-NEXT:       Debug Stream Index: 40
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 26
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 1668
-; BIG-NEXT:       Symbol Byte Size: 2364
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       26 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdio.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstdio.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_stdio_config.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vadefs.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\initializers.obj
-; BIG-NEXT:       Debug Stream Index: 41
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 20
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 488
-; BIG-NEXT:       Symbol Byte Size: 196
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       20 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\evntprov.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\utility.obj
-; BIG-NEXT:       Debug Stream Index: 42
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 20
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 2500
-; BIG-NEXT:       Symbol Byte Size: 6020
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       20 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\utility\utility.cpp
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\ucrt_stubs.obj
-; BIG-NEXT:       Debug Stream Index: 43
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 1
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 368
-; BIG-NEXT:       Symbol Byte Size: 988
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       1 Contributing Source Files [
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\utility\ucrt_stubs.cpp
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\utility_desktop.obj
-; BIG-NEXT:       Debug Stream Index: 44
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 20
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 1240
-; BIG-NEXT:       Symbol Byte Size: 1844
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       20 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\utility\utility_desktop.cpp
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: f:\dd\vctools\crt\vcstartup\build\md\msvcrt_kernel32\obj1r\i386\default_precision.obj
-; BIG-NEXT:       Debug Stream Index: 45
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\MSVCRT.lib
-; BIG-NEXT:       Num Files: 20
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 552
-; BIG-NEXT:       Symbol Byte Size: 356
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       20 Contributing Source Files [
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\string.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memory.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_memcpy_s.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\src\defaults\default_precision.cpp
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\internal_shared.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\vcruntime_new.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winuser.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\malloc.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\basetsd.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcruntime\inc\i386\xmmintrin.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winbase.h
-; BIG-NEXT:         f:\dd\vctools\crt\vcstartup\inc\vcstartup_internal.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\math.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\stdlib.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\stralign.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winnt.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\ctype.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\guiddef.h
-; BIG-NEXT:         f:\dd\externalapis\unifiedcrt\inc\corecrt_wstring.h
-; BIG-NEXT:         f:\dd\externalapis\windows\8.1\sdk\inc\winerror.h
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: Import:KERNEL32.dll
-; BIG-NEXT:       Debug Stream Index: 47
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\um\x86\kernel32.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 1616
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: KERNEL32.dll
-; BIG-NEXT:       Debug Stream Index: 46
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\um\x86\kernel32.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 208
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: Import:VCRUNTIME140.dll
-; BIG-NEXT:       Debug Stream Index: 49
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\vcruntime.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 664
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: VCRUNTIME140.dll
-; BIG-NEXT:       Debug Stream Index: 48
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\MI0E91~1.0\VC\LIB\vcruntime.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 148
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: Import:api-ms-win-crt-stdio-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 59
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 264
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: api-ms-win-crt-stdio-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 58
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 180
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: Import:api-ms-win-crt-runtime-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 57
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 3068
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: api-ms-win-crt-runtime-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 56
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 188
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: Import:api-ms-win-crt-math-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 55
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 140
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: api-ms-win-crt-math-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 54
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 180
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: Import:api-ms-win-crt-locale-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 53
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 148
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: api-ms-win-crt-locale-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 52
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 188
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: Import:api-ms-win-crt-heap-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 51
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 136
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: api-ms-win-crt-heap-l1-1-0.dll
-; BIG-NEXT:       Debug Stream Index: 50
-; BIG-NEXT:       Object File Name: C:\PROGRA~2\WI3CF2~1\10\Lib\10.0.10586.0\ucrt\x86\ucrt.lib
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 0
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 180
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:     {
-; BIG-NEXT:       Name: * Linker *
-; BIG-NEXT:       Debug Stream Index: 60
-; BIG-NEXT:       Object File Name:
-; BIG-NEXT:       Num Files: 0
-; BIG-NEXT:       Source File Name Idx: 0
-; BIG-NEXT:       Pdb File Name Idx: 55
-; BIG-NEXT:       Line Info Byte Size: 0
-; BIG-NEXT:       C13 Line Info Byte Size: 0
-; BIG-NEXT:       Symbol Byte Size: 3080
-; BIG-NEXT:       Type Server Index: 0
-; BIG-NEXT:       Has EC Info: No
-; BIG-NEXT:       0 Contributing Source Files [
-; BIG-NEXT:       ]
-; BIG-NEXT:     }
-; BIG-NEXT:   ]
-; BIG-NEXT: }
 
-; BAD-BLOCK-SIZE: Native PDB Error: The PDB file is corrupt. Does not contain superblock
index 2639490f542a4fe155147b8e609764a20ca37836..f25e9024453ba7517926514de6691a485ad24d8e 100644 (file)
@@ -1,65 +1,51 @@
 ; RUN: llvm-pdbutil yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge-ids-and-types-1.yaml
 ; RUN: llvm-pdbutil yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge-ids-and-types-2.yaml
 ; RUN: llvm-pdbutil merge -pdb=%t.3.pdb %t.1.pdb %t.2.pdb
-; RUN: llvm-pdbutil raw -tpi-records %t.3.pdb | FileCheck -check-prefix=TPI-TYPES %s
-; RUN: llvm-pdbutil raw -tpi-records %t.3.pdb | FileCheck -check-prefix=INTMAIN %s
-; RUN: llvm-pdbutil raw -tpi-records %t.3.pdb | FileCheck -check-prefix=VOIDMAIN %s
-; RUN: llvm-pdbutil raw -ipi-records %t.3.pdb | FileCheck -check-prefix=IPI-TYPES %s
-; RUN: llvm-pdbutil raw -ipi-records %t.3.pdb | FileCheck -check-prefix=IPI-NAMES %s
-; RUN: llvm-pdbutil raw -ipi-records %t.3.pdb | FileCheck -check-prefix=IPI-UDT %s
+; RUN: llvm-pdbutil raw -types %t.3.pdb | FileCheck -check-prefix=TPI-TYPES %s
+; RUN: llvm-pdbutil raw -ids %t.3.pdb | FileCheck -check-prefix=IPI-TYPES %s
 
-TPI-TYPES:     Type Info Stream (TPI)
-TPI-TYPES:     Record count: 9
-TPI-TYPES-DAG: TypeLeafKind: LF_POINTER
-TPI-TYPES-DAG: TypeLeafKind: LF_FIELDLIST
-TPI-TYPES-DAG: TypeLeafKind: LF_ARGLIST
-TPI-TYPES-DAG: TypeLeafKind: LF_STRUCTURE
-TPI-TYPES-DAG: TypeLeafKind: LF_MEMBER
-TPI-TYPES-DAG: TypeLeafKind: LF_POINTER
-TPI-TYPES-DAG: TypeLeafKind: LF_ARGLIST
-TPI-TYPES-DAG: TypeLeafKind: LF_MFUNCTION
-TPI-TYPES-DAG: TypeLeafKind: LF_PROCEDURE
-TPI-TYPES-DAG: TypeLeafKind: LF_PROCEDURE
-TPI-TYPES-DAG: TypeLeafKind: LF_ARGLIST
+TPI-TYPES:                          Types (TPI Stream)
+TPI-TYPES-NEXT: ============================================================
+TPI-TYPES-NEXT:   Showing 9 records
+TPI-TYPES-NEXT:   0x1000 | LF_POINTER [size = 12]
+TPI-TYPES-NEXT:            referent = 0x0470 (char*), mode = pointer, opts = None, kind = ptr32
+TPI-TYPES-NEXT:   0x1001 | LF_FIELDLIST [size = 24]
+TPI-TYPES-NEXT:            - LF_MEMBER [name = `FooMember`, Type = 0x0403 (void*), offset = 0, attrs = public]
+TPI-TYPES-NEXT:   0x1002 | LF_ARGLIST [size = 16]
+TPI-TYPES-NEXT:            0x0074 (int): `int`
+TPI-TYPES-NEXT:            0x1000: `char**`
+TPI-TYPES-NEXT:   0x1003 | LF_STRUCTURE [size = 36]
+TPI-TYPES-NEXT:            class name: `FooBar`
+TPI-TYPES-NEXT:            unique name: `FooBar`
+TPI-TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1001
+TPI-TYPES-NEXT:            options: has unique name
+TPI-TYPES-NEXT:   0x1004 | LF_POINTER [size = 12]
+TPI-TYPES-NEXT:            referent = 0x1003, mode = pointer, opts = None, kind = ptr32
+TPI-TYPES-NEXT:   0x1005 | LF_ARGLIST [size = 12]
+TPI-TYPES-NEXT:            0x0074 (int): `int`
+TPI-TYPES-NEXT:   0x1006 | LF_MFUNCTION [size = 28]
+TPI-TYPES-NEXT:            return type = 1, # args = 0x1005, param list = 0x0003 (void)
+TPI-TYPES-NEXT:            class type = 0x1003, this type = 0x1004, this adjust = 0
+TPI-TYPES-NEXT:            calling conv = thiscall, options = constructor
+TPI-TYPES-NEXT:   0x1007 | LF_PROCEDURE [size = 16]
+TPI-TYPES-NEXT:            return type = 0x0074 (int), # args = 2, param list = 0x1002
+TPI-TYPES-NEXT:            calling conv = cdecl, options = None
+TPI-TYPES-NEXT:   0x1008 | LF_PROCEDURE [size = 16]
+TPI-TYPES-NEXT:            return type = 0x0003 (void), # args = 2, param list = 0x1002
+TPI-TYPES-NEXT:            calling conv = cdecl, options = None
 
-; Both procedures should use the same arglist even though they have a different
-; return type.
-INTMAIN:      ArgList ([[ID:.*]])
-INTMAIN-NEXT:   TypeLeafKind: LF_ARGLIST
-INTMAIN-NEXT:   NumArgs: 2
-INTMAIN-NEXT:   Arguments [
-INTMAIN-NEXT:     ArgType: int
-INTMAIN-NEXT:     ArgType: char**
-INTMAIN:        TypeLeafKind: LF_PROCEDURE
-INTMAIN:          ReturnType: int
-INTMAIN:          NumParameters: 2
-INTMAIN-NEXT:     ArgListType: (int, char**) ([[ID]])
-
-VOIDMAIN:      ArgList ([[ID:.*]])
-VOIDMAIN-NEXT:   TypeLeafKind: LF_ARGLIST
-VOIDMAIN-NEXT:   NumArgs: 2
-VOIDMAIN-NEXT:   Arguments [
-VOIDMAIN-NEXT:     ArgType: int
-VOIDMAIN-NEXT:     ArgType: char**
-VOIDMAIN:        TypeLeafKind: LF_PROCEDURE
-VOIDMAIN:          ReturnType: void
-VOIDMAIN:          NumParameters: 2
-VOIDMAIN-NEXT:     ArgListType: (int, char**) ([[ID]])
-
-IPI-TYPES:     Type Info Stream (IPI)
-IPI-TYPES:     Record count: 6
-IPI-TYPES-DAG: TypeLeafKind: LF_FUNC_ID
-IPI-TYPES-DAG: TypeLeafKind: LF_MFUNC_ID
-IPI-TYPES-DAG: TypeLeafKind: LF_UDT_MOD_SRC_LINE
-IPI-TYPES-DAG: TypeLeafKind: LF_FUNC_ID
-IPI-TYPES-DAG: TypeLeafKind: LF_FUNC_ID
-IPI-TYPES-DAG: TypeLeafKind: LF_MFUNC_ID
-
-IPI-NAMES-DAG: Name: main
-IPI-NAMES-DAG: Name: FooMethod
-IPI-NAMES-DAG: Name: main2
-IPI-NAMES-DAG: Name: foo
-IPI-NAMES-DAG: Name: FooMethod2
-
-IPI-UDT:      TypeLeafKind: LF_UDT_MOD_SRC_LINE
-IPI-UDT-NEXT: UDT: FooBar
+IPI-TYPES:                          Types (IPI Stream)
+IPI-TYPES-NEXT: ============================================================
+IPI-TYPES-NEXT:   Showing 6 records
+IPI-TYPES-NEXT:   0x1000 | LF_FUNC_ID [size = 20]
+IPI-TYPES-NEXT:            name = main, type = 0x1007, parent scope = <no type>
+IPI-TYPES-NEXT:   0x1001 | LF_MFUNC_ID [size = 24]
+IPI-TYPES-NEXT:            name = FooMethod, type = 0x1006, class type = 0x1003
+IPI-TYPES-NEXT:   0x1002 | LF_UDT_MOD_SRC_LINE [size = 20]
+IPI-TYPES-NEXT:            udt = 0x1003, mod = 0, file = 0, line = 0
+IPI-TYPES-NEXT:   0x1003 | LF_FUNC_ID [size = 20]
+IPI-TYPES-NEXT:            name = main2, type = 0x1007, parent scope = <no type>
+IPI-TYPES-NEXT:   0x1004 | LF_FUNC_ID [size = 16]
+IPI-TYPES-NEXT:            name = foo, type = 0x1008, parent scope = <no type>
+IPI-TYPES-NEXT:   0x1005 | LF_MFUNC_ID [size = 24]
+IPI-TYPES-NEXT:            name = FooMethod2, type = 0x1006, class type = 0x1003
index 1c0a8704af2a2fa3597132caac54ada9c2211879..441ce4d8dbc89ab2b9c55bc3ad0bc068c35cb45c 100644 (file)
@@ -1,31 +1,24 @@
 ; RUN: llvm-pdbutil yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge-ids-1.yaml
 ; RUN: llvm-pdbutil yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge-ids-2.yaml
 ; RUN: llvm-pdbutil merge -pdb=%t.3.pdb %t.1.pdb %t.2.pdb
-; RUN: llvm-pdbutil raw -ipi-records %t.3.pdb | FileCheck -check-prefix=MERGED %s
-; RUN: llvm-pdbutil raw -ipi-records %t.3.pdb | FileCheck -check-prefix=SUBSTRS %s
-; RUN: llvm-pdbutil raw -tpi-records %t.3.pdb | FileCheck -check-prefix=TPI-EMPTY %s
+; RUN: llvm-pdbutil raw -ids %t.3.pdb | FileCheck -check-prefix=MERGED %s
+; RUN: llvm-pdbutil raw -types %t.3.pdb | FileCheck -check-prefix=TPI-EMPTY %s
 
 
-MERGED: Type Info Stream (IPI)
-MERGED: Record count: 8
-MERGED-DAG: StringData: One
-MERGED-DAG: StringData: Two
-MERGED-DAG: StringData: SubOne
-MERGED-DAG: StringData: SubTwo
-MERGED-DAG: StringData: Main
-MERGED-DAG: TypeLeafKind: LF_SUBSTR_LIST
-MERGED-DAG: StringData: OnlyInFirst
-MERGED-DAG: StringData: OnlyInSecond
+MERGED:                          Types (IPI Stream)
+MERGED-NEXT: ============================================================
+MERGED-NEXT:   Showing 8 records
+MERGED-NEXT:   0x1000 | LF_STRING_ID [size = 12] ID: <no type>, String: One
+MERGED-NEXT:   0x1001 | LF_STRING_ID [size = 12] ID: <no type>, String: Two
+MERGED-NEXT:   0x1002 | LF_STRING_ID [size = 20] ID: <no type>, String: OnlyInFirst
+MERGED-NEXT:   0x1003 | LF_STRING_ID [size = 16] ID: <no type>, String: SubOne
+MERGED-NEXT:   0x1004 | LF_STRING_ID [size = 16] ID: <no type>, String: SubTwo
+MERGED-NEXT:   0x1005 | LF_SUBSTR_LIST [size = 16]
+MERGED-NEXT:            0x1003: `SubOne`
+MERGED-NEXT:            0x1004: `SubTwo`
+MERGED-NEXT:   0x1006 | LF_STRING_ID [size = 16] ID: 0x1005, String: Main
+MERGED-NEXT:   0x1007 | LF_STRING_ID [size = 24] ID: <no type>, String: OnlyInSecond
 
-SUBSTRS:      StringList
-SUBSTRS:        TypeLeafKind: LF_SUBSTR_LIST
-SUBSTRS-NEXT:   NumStrings: 2
-SUBSTRS-NEXT:   Strings [
-SUBSTRS-NEXT:     SubOne
-SUBSTRS-NEXT:     SubTwo
-SUBSTRS:      StringId
-SUBSTRS-NEXT:   TypeLeafKind: LF_STRING_ID
-SUBSTRS-NEXT:   Id: "SubOne" "SubTwo"
-SUBSTRS-NEXT:   StringData: Main
-
-TPI-EMPTY: Record count: 0
+TPI-EMPTY:                     Types (TPI Stream)
+TPI-EMPTY-NEXT: ============================================================
+TPI-EMPTY-NEXT:   Showing 0 records
index 8d32b4d176f2e346f4f92a9723fcf159bd4a3945..9aae40543697995a944f1ca92f44817cbb11376b 100644 (file)
@@ -1,24 +1,36 @@
-; RUN: llvm-pdbutil yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge-types-1.yaml\r
-; RUN: llvm-pdbutil yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge-types-2.yaml\r
-; RUN: llvm-pdbutil merge -pdb=%t.3.pdb %t.1.pdb %t.2.pdb\r
-; RUN: llvm-pdbutil raw -tpi-records %t.3.pdb | FileCheck -check-prefix=MERGED %s\r
-; RUN: llvm-pdbutil raw -tpi-records %t.3.pdb | FileCheck -check-prefix=ARGLIST %s\r
-\r
-\r
-MERGED: Type Info Stream (TPI)\r
-MERGED: Record count: 9\r
-MERGED-DAG: PointeeType: unsigned\r
-MERGED-DAG: PointeeType: unsigned*\r
-MERGED-DAG: PointeeType: unsigned**\r
-MERGED-DAG: PointeeType: __int64\r
-MERGED-DAG: PointeeType: __int64*\r
-MERGED-DAG: Name: OnlyInMerge1\r
-MERGED-DAG: Name: OnlyInMerge2\r
-MERGED-DAG: TypeLeafKind: LF_ARGLIST\r
-\r
-ARGLIST: TypeLeafKind: LF_ARGLIST\r
-ARGLIST-NEXT: NumArgs: 3\r
-ARGLIST-NEXT: Arguments [\r
-ARGLIST-NEXT: ArgType: unsigned\r
-ARGLIST-NEXT: ArgType: unsigned*\r
-ARGLIST-NEXT: ArgType: unsigned**\r
++; RUN: llvm-pdbutil yaml2pdb -pdb=%t.1.pdb %p/Inputs/merge-types-1.yaml
+; RUN: llvm-pdbutil yaml2pdb -pdb=%t.2.pdb %p/Inputs/merge-types-2.yaml
+; RUN: llvm-pdbutil merge -pdb=%t.3.pdb %t.1.pdb %t.2.pdb
+; RUN: llvm-pdbutil raw -types %t.3.pdb | FileCheck -check-prefix=MERGED %s
+
+
+MERGED:                          Types (TPI Stream)
+MERGED-NEXT: ============================================================
+MERGED-NEXT:   Showing 9 records
+MERGED-NEXT:   0x1000 | LF_POINTER [size = 12]
+MERGED-NEXT:            referent = 0x0075 (unsigned), mode = pointer, opts = None, kind = ptr32
+MERGED-NEXT:   0x1001 | LF_POINTER [size = 12]
+MERGED-NEXT:            referent = 0x0076 (__int64), mode = pointer, opts = None, kind = ptr32
+MERGED-NEXT:   0x1002 | LF_STRUCTURE [size = 48]
+MERGED-NEXT:            class name: `OnlyInMerge1`
+MERGED-NEXT:            unique name: `OnlyInMerge1`
+MERGED-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+MERGED-NEXT:            options: forward ref | has unique name
+MERGED-NEXT:   0x1003 | LF_POINTER [size = 12]
+MERGED-NEXT:            referent = 0x1000, mode = pointer, opts = None, kind = ptr32
+MERGED-NEXT:   0x1004 | LF_POINTER [size = 12]
+MERGED-NEXT:            referent = 0x1003, mode = pointer, opts = None, kind = ptr32
+MERGED-NEXT:   0x1005 | LF_POINTER [size = 12]
+MERGED-NEXT:            referent = 0x1001, mode = pointer, opts = None, kind = ptr32
+MERGED-NEXT:   0x1006 | LF_ARGLIST [size = 20]
+MERGED-NEXT:            0x0075 (unsigned): `unsigned`
+MERGED-NEXT:            0x1000: `unsigned*`
+MERGED-NEXT:            0x1003: `unsigned**`
+MERGED-NEXT:   0x1007 | LF_PROCEDURE [size = 16]
+MERGED-NEXT:            return type = 0x0075 (unsigned), # args = 0, param list = 0x1006
+MERGED-NEXT:            calling conv = cdecl, options = None
+MERGED-NEXT:   0x1008 | LF_STRUCTURE [size = 48]
+MERGED-NEXT:            class name: `OnlyInMerge2`
+MERGED-NEXT:            unique name: `OnlyInMerge2`
+MERGED-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
+MERGED-NEXT:            options: forward ref | has unique name
index 14e1f86fc02964402d7fc2e2b61a08b0ee42a8f1..b695d5a1c4cd7d3bb29f93449a550718456400c9 100644 (file)
@@ -1,35 +1,29 @@
-; RUN: llvm-pdbutil raw -block-data=0 %p/Inputs/empty.pdb | FileCheck --check-prefix=BLOCK0 %s\r
-; RUN: llvm-pdbutil raw -block-data=0-1 %p/Inputs/empty.pdb | FileCheck --check-prefix=BLOCK01 %s\r
-; RUN: not llvm-pdbutil raw -block-data=0,1 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s\r
-; RUN: not llvm-pdbutil raw -block-data=0a1 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s\r
-; RUN: not llvm-pdbutil raw -block-data=0- %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s\r
-\r
-BLOCK0:      Block Data {\r
-BLOCK0-NEXT:   Block 0 (\r
-BLOCK0-NEXT:     0000: 4D696372 6F736F66 7420432F 432B2B20  |Microsoft C/C++ |\r
-BLOCK0-NEXT:     0010: 4D534620 372E3030 0D0A1A44 53000000  |MSF 7.00...DS...|\r
-BLOCK0-NEXT:     0020: 00100000 02000000 19000000 88000000  |................|\r
-BLOCK0-NEXT:     0030: 00000000 18000000 00000000 00000000  |................|\r
-BLOCK0:          0FE0: 00000000 00000000 00000000 00000000  |................|\r
-BLOCK0-NEXT:     0FF0: 00000000 00000000 00000000 00000000  |................|\r
-BLOCK0-NEXT:   )\r
-BLOCK0-NEXT: }\r
-\r
-BLOCK01:      Block Data {\r
-BLOCK01-NEXT:   Block 0 (\r
-BLOCK01-NEXT:     0000: 4D696372 6F736F66 7420432F 432B2B20  |Microsoft C/C++ |\r
-BLOCK01-NEXT:     0010: 4D534620 372E3030 0D0A1A44 53000000  |MSF 7.00...DS...|\r
-BLOCK01-NEXT:     0020: 00100000 02000000 19000000 88000000  |................|\r
-BLOCK01-NEXT:     0030: 00000000 18000000 00000000 00000000  |................|\r
-BLOCK01:          0FE0: 00000000 00000000 00000000 00000000  |................|\r
-BLOCK01-NEXT:     0FF0: 00000000 00000000 00000000 00000000  |................|\r
-BLOCK01-NEXT:   )\r
-BLOCK01-NEXT:   Block 1 (\r
-BLOCK01-NEXT:     0000: C0FCFFFF FFFFFFFF FFFFFFFF FFFFFFFF  |................|\r
-BLOCK01-NEXT:     0010: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF  |................|\r
-BLOCK01:          0FE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF  |................|\r
-BLOCK01-NEXT:     0FF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF  |................|\r
-BLOCK01-NEXT:   )\r
-BLOCK01-NEXT: }\r
-\r
-BADSYNTAX: Argument '{{.*}}' invalid format.\r
+; RUN: llvm-pdbutil raw -block-data=0 %p/Inputs/empty.pdb | FileCheck --check-prefix=BLOCK0 %s
+; RUN: llvm-pdbutil raw -block-data=0-1 %p/Inputs/empty.pdb | FileCheck --check-prefix=BLOCK01 %s
+; RUN: not llvm-pdbutil raw -block-data=0,1 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s
+; RUN: not llvm-pdbutil raw -block-data=0a1 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s
+; RUN: not llvm-pdbutil raw -block-data=0- %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BADSYNTAX %s
+
+BLOCK0:                         MSF Blocks
+BLOCK0-NEXT: ============================================================
+BLOCK0-NEXT:   Block 0 (
+BLOCK0-NEXT:     0000: 4D696372 6F736F66 7420432F 432B2B20 4D534620 372E3030 0D0A1A44 53000000  |Microsoft C/C++ MSF 7.00...DS...|
+BLOCK0-NEXT:     0020: 00100000 02000000 19000000 88000000 00000000 18000000 00000000 00000000  |................................|
+BLOCK0-NEXT:     0040: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  |................................|
+BLOCK0-NEXT:     0060: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  |................................|
+BLOCK0-NOT:   Block 1 (
+
+BLOCK01:                         MSF Blocks
+BLOCK01-NEXT: ============================================================
+BLOCK01-NEXT:   Block 0 (
+BLOCK01-NEXT:     0000: 4D696372 6F736F66 7420432F 432B2B20 4D534620 372E3030 0D0A1A44 53000000  |Microsoft C/C++ MSF 7.00...DS...|
+BLOCK01-NEXT:     0020: 00100000 02000000 19000000 88000000 00000000 18000000 00000000 00000000  |................................|
+BLOCK01-NEXT:     0040: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  |................................|
+BLOCK01-NEXT:     0060: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  |................................|
+BLOCK01:       Block 1 (
+BLOCK01-NEXT:    0000: C0FCFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF  |................................|
+BLOCK01-NEXT:    0020: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF  |................................|
+BLOCK01-NEXT:    0040: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF  |................................|
+BLOCK01-NOT:  Block 2 (
+
+BADSYNTAX: Argument '{{.*}}' invalid format.
index 846960a0964a3f6ae16cbf6a68cfbf29005fd83e..2f8e05ad0583bff802887c3dc6be1ebc33b23f1b 100644 (file)
@@ -1,23 +1,28 @@
-; RUN: llvm-pdbutil raw -stream-data=1 %p/Inputs/empty.pdb | FileCheck --check-prefix=STREAM1 %s\r
-; RUN: not llvm-pdbutil raw -stream-data=100 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=INVALIDSTREAM %s\r
-\r
-STREAM1:      Stream Data {\r
-STREAM1-NEXT:   Stream {\r
-STREAM1-NEXT:     Index: 1\r
-STREAM1-NEXT:     Type: PDB Stream\r
-STREAM1-NEXT:     Size: 118\r
-STREAM1-NEXT:     Blocks: [19]\r
-STREAM1-NEXT:     Data (\r
-STREAM1-NEXT:       0000: 942E3101 E207E554 01000000 0B355641  |..1....T.....5VA|\r
-STREAM1-NEXT:       0010: 86A0A249 896F9988 FAE52FF0 22000000  |...I.o..../."...|\r
-STREAM1-NEXT:       0020: 2F4C696E 6B496E66 6F002F6E 616D6573  |/LinkInfo./names|\r
-STREAM1-NEXT:       0030: 002F7372 632F6865 61646572 626C6F63  |./src/headerbloc|\r
-STREAM1-NEXT:       0040: 6B000300 00000600 00000100 00001A00  |k...............|\r
-STREAM1-NEXT:       0050: 00000000 00001100 00000900 00000A00  |................|\r
-STREAM1-NEXT:       0060: 00000D00 00000000 00000500 00000000  |................|\r
-STREAM1-NEXT:       0070: 00004191 3201                        |..A.2.|\r
-STREAM1-NEXT:     )\r
-STREAM1-NEXT:   }\r
-STREAM1-NEXT: }\r
-\r
-INVALIDSTREAM: Native PDB Error: The specified stream could not be loaded.\r
+; RUN: llvm-pdbutil raw -stream-data=1 %p/Inputs/empty.pdb | FileCheck --check-prefix=STREAM %s
+; RUN: llvm-pdbutil raw -stream-data=100 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=INVALIDSTREAM %s
+; RUN: llvm-pdbutil raw -stream-data=1,100 %p/Inputs/empty.pdb 2>&1 | FileCheck --check-prefix=BOTH %s
+
+STREAM:                             Stream Data
+STREAM-NEXT: ============================================================
+STREAM-NEXT:   Stream 1 (118 bytes): PDB Stream
+STREAM-NEXT:     Data (
+STREAM-NEXT:       0000: 942E3101 E207E554 01000000 0B355641 86A0A249 896F9988 FAE52FF0 22000000  |..1....T.....5VA...I.o..../."...|
+STREAM-NEXT:       0020: 2F4C696E 6B496E66 6F002F6E 616D6573 002F7372 632F6865 61646572 626C6F63  |/LinkInfo./names./src/headerbloc|
+STREAM-NEXT:       0040: 6B000300 00000600 00000100 00001A00 00000000 00001100 00000900 00000A00  |k...............................|
+STREAM-NEXT:       0060: 00000D00 00000000 00000500 00000000 00004191 3201                        |..................A.2.|
+STREAM-NEXT:     )
+
+INVALIDSTREAM:                             Stream Data
+INVALIDSTREAM-NEXT: ============================================================
+INVALIDSTREAM-NEXT:   Stream 100: Not present
+
+BOTH:                             Stream Data
+BOTH-NEXT: ============================================================
+BOTH-NEXT:   Stream 1 (118 bytes): PDB Stream
+BOTH-NEXT:     Data (
+BOTH-NEXT:       0000: 942E3101 E207E554 01000000 0B355641 86A0A249 896F9988 FAE52FF0 22000000  |..1....T.....5VA...I.o..../."...|
+BOTH-NEXT:       0020: 2F4C696E 6B496E66 6F002F6E 616D6573 002F7372 632F6865 61646572 626C6F63  |/LinkInfo./names./src/headerbloc|
+BOTH-NEXT:       0040: 6B000300 00000600 00000100 00001A00 00000000 00001100 00000900 00000A00  |k...............................|
+BOTH-NEXT:       0060: 00000D00 00000000 00000500 00000000 00004191 3201                        |..................A.2.|
+BOTH-NEXT:     )
+BOTH-NEXT:   Stream 100: Not present
index ee53f3b4cd2a44efcf2eb7032007dc03778d5de9..51ebd754545f839cb41739aefcf9008d23333ec9 100644 (file)
@@ -3,48 +3,33 @@ RUN:   -pdb-stream -string-table -tpi-stream -stream-directory \
 RUN:   -stream-metadata %p/Inputs/empty.pdb > %t.1
 RUN: llvm-pdbutil yaml2pdb -pdb=%t.2 %t.1
 
-RUN: llvm-pdbutil raw -headers -string-table -tpi-records %p/Inputs/empty.pdb | FileCheck %s
-RUN: llvm-pdbutil raw -headers -string-table -tpi-records %t.2 | FileCheck %s
+RUN: llvm-pdbutil raw -summary -string-table -types %p/Inputs/empty.pdb | FileCheck %s
+RUN: llvm-pdbutil raw -summary -string-table -types %t.2 | FileCheck %s
 
-CHECK:      FileHeaders {
-CHECK-NEXT:   BlockSize: 4096
-CHECK-NEXT:   FreeBlockMap:
-CHECK-NEXT:   NumBlocks:
-CHECK-NEXT:   NumDirectoryBytes:
-CHECK-NEXT:   Unknown1: 0
-CHECK-NEXT:   BlockMapAddr:
-CHECK-NEXT:   NumDirectoryBlocks: 1
-CHECK-NEXT:   DirectoryBlocks:
-CHECK-NEXT:   NumStreams:
-CHECK-NEXT: }
-CHECK:      String Table {
-CHECK-DAG:   'd:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal)'
-CHECK-DAG:   'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp'
-CHECK-DAG:   '$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = '
-CHECK-NEXT: }
-CHECK:      PDB Stream {
-CHECK-NEXT:   Version: 20000404
-CHECK-NEXT:   Signature: 0x54E507E2
-CHECK-NEXT:   Age: 1
-CHECK-NEXT:   Guid: {0B355641-86A0-A249-896F-9988FAE52FF0}
-CHECK-NEXT:   Features: 0x1
-CHECK-NEXT:   Named Streams {
-CHECK:          /names: 
-CHECK:        }
-CHECK-NEXT: }
-CHECK:      Type Info Stream (TPI) {
-CHECK-NEXT:   TPI Version: 20040203
-CHECK-NEXT:   Record count: 75
-CHECK:      DBI Stream {
-CHECK-NEXT:   Dbi Version: 19990903
-CHECK-NEXT:   Age: 1
-CHECK-NEXT:   Incremental Linking: Yes
-CHECK-NEXT:   Has CTypes: No
-CHECK-NEXT:   Is Stripped: No
-CHECK-NEXT:   Machine Type: x86
-CHECK-NEXT:   Symbol Record Stream Index:
-CHECK-NEXT:   Public Symbol Stream Index:
-CHECK-NEXT:   Global Symbol Stream Index:
-CHECK-NEXT:   Toolchain Version: 12.0
-CHECK-NEXT:   mspdb120.dll version: 12.0.31101
-CHECK-NEXT: }
+
+CHECK:                                Summary
+CHECK-NEXT: ============================================================
+CHECK-NEXT:  Block Size: 4096
+CHECK-NEXT:  Number of blocks:
+CHECK-NEXT:  Number of streams:
+CHECK-NEXT:  Signature: 1424295906
+CHECK-NEXT:  Age: 1
+CHECK-NEXT:  GUID: {0B355641-86A0-A249-896F-9988FAE52FF0}
+CHECK-NEXT:  Features: 0x1
+CHECK-NEXT:  Has Debug Info: true
+CHECK-NEXT:  Has Types: true
+CHECK-NEXT:  Has IDs: true
+CHECK-NEXT:  Has Globals:
+CHECK-NEXT:  Has Publics:
+CHECK-NEXT:  Is incrementally linked: true
+CHECK-NEXT:  Has conflicting types: false
+CHECK-NEXT:  Is stripped: false
+CHECK:                             String Table
+CHECK-NEXT: ============================================================
+CHECK-NEXT:   ID    | String
+CHECK-NEXT:  {{.*}} | 'd:\src\llvm\test\debuginfo\pdb\inputs\predefined c++ attributes (compiler internal)'
+CHECK-NEXT:  {{.*}} | 'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp'
+CHECK-NEXT:  {{.*}} | '$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = '
+CHECK:                          Types (TPI Stream)
+CHECK-NEXT: ============================================================
+CHECK-NEXT:  Showing 75 records
diff --git a/test/tools/llvm-pdbdump/raw-stream-data.test b/test/tools/llvm-pdbdump/raw-stream-data.test
deleted file mode 100644 (file)
index 1d7c23f..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-; RUN: llvm-pdbutil raw -stream-data=8 %p/Inputs/LoadAddressTest.pdb \\r
-; RUN:   | FileCheck %s -check-prefix=FULL_STREAM\r
-; RUN: llvm-pdbutil raw -stream-data=8:4 %p/Inputs/LoadAddressTest.pdb \\r
-; RUN:   | FileCheck %s -check-prefix=OFFSET_STREAM\r
-; RUN: llvm-pdbutil raw -stream-data=8:4@24 %p/Inputs/LoadAddressTest.pdb \\r
-; RUN:   | FileCheck %s -check-prefix=OFFSET_AND_LENGTH\r
-\r
-FULL_STREAM:      Stream Data {\r
-FULL_STREAM-NEXT:   Stream {\r
-FULL_STREAM-NEXT:     Index: 8\r
-FULL_STREAM-NEXT:     Type: Public Symbol Records\r
-FULL_STREAM-NEXT:     Size: 40\r
-FULL_STREAM-NEXT:     Blocks:\r
-FULL_STREAM-NEXT:     Data (\r
-FULL_STREAM-NEXT:       0000: 12000E11 02000000 10000000 01005F6D  |.............._m|\r
-FULL_STREAM-NEXT:       0010: 61696E00 12002511 00000000 88000000  |ain...%.........|\r
-FULL_STREAM-NEXT:       0020: 01006D61 696E0000                    |..main..|\r
-FULL_STREAM-NEXT:     )\r
-FULL_STREAM-NEXT:   }\r
-FULL_STREAM-NEXT: }\r
-\r
-OFFSET_STREAM:      Stream Data {\r
-OFFSET_STREAM-NEXT:   Stream {\r
-OFFSET_STREAM-NEXT:    Index: 8\r
-OFFSET_STREAM-NEXT:    Type: Public Symbol Records\r
-OFFSET_STREAM-NEXT:    Size: 40\r
-OFFSET_STREAM-NEXT:    Blocks: \r
-OFFSET_STREAM-NEXT:    Data (\r
-OFFSET_STREAM-NEXT:      0004: 02000000 10000000 01005F6D 61696E00  |.........._main.|\r
-OFFSET_STREAM-NEXT:      0014: 12002511 00000000 88000000 01006D61  |..%...........ma|\r
-OFFSET_STREAM-NEXT:      0024: 696E0000                             |in..|\r
-OFFSET_STREAM-NEXT:    )\r
-OFFSET_STREAM-NEXT:  }\r
-OFFSET_STREAM-NEXT:}\r
-\r
-OFFSET_AND_LENGTH:      Stream Data {\r
-OFFSET_AND_LENGTH-NEXT:   Stream {\r
-OFFSET_AND_LENGTH-NEXT:    Index: 8\r
-OFFSET_AND_LENGTH-NEXT:    Type: Public Symbol Records\r
-OFFSET_AND_LENGTH-NEXT:    Size: 40\r
-OFFSET_AND_LENGTH-NEXT:    Blocks: \r
-OFFSET_AND_LENGTH-NEXT:    Data (\r
-OFFSET_AND_LENGTH-NEXT:      0004: 02000000 10000000 01005F6D 61696E00  |.........._main.|\r
-OFFSET_AND_LENGTH-NEXT:      0014: 12002511 00000000                    |..%.....|\r
-OFFSET_AND_LENGTH-NEXT:    )\r
-OFFSET_AND_LENGTH-NEXT:  }\r
-OFFSET_AND_LENGTH-NEXT:}
\ No newline at end of file
index 9875dfb5a257dbffcb5abb2289fdad1cb9a51ed2..d09fa31d8b6a09f132d1345838f100a1539f5f7b 100644 (file)
@@ -12,8 +12,10 @@ add_llvm_tool(llvm-pdbutil
   CompactTypeDumpVisitor.cpp
   Diff.cpp
   llvm-pdbutil.cpp
+  FormatUtil.cpp
   LinePrinter.cpp
-  LLVMOutputStyle.cpp
+  MinimalSymbolDumper.cpp
+  MinimalTypeDumper.cpp
   PdbYaml.cpp
   PrettyBuiltinDumper.cpp
   PrettyClassDefinitionDumper.cpp
@@ -25,6 +27,7 @@ add_llvm_tool(llvm-pdbutil
   PrettyTypeDumper.cpp
   PrettyTypedefDumper.cpp
   PrettyVariableDumper.cpp
+  RawOutputStyle.cpp
   StreamUtil.cpp
   YAMLOutputStyle.cpp
   )
diff --git a/tools/llvm-pdbutil/FormatUtil.cpp b/tools/llvm-pdbutil/FormatUtil.cpp
new file mode 100644 (file)
index 0000000..007db9e
--- /dev/null
@@ -0,0 +1,49 @@
+//===- FormatUtil.cpp ----------------------------------------- *- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "FormatUtil.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/Support/FormatAdapters.h"
+#include "llvm/Support/FormatVariadic.h"
+
+using namespace llvm;
+using namespace llvm::pdb;
+
+std::string llvm::pdb::typesetItemList(ArrayRef<std::string> Opts,
+                                       uint32_t GroupSize, uint32_t IndentLevel,
+                                       StringRef Sep) {
+  std::string Result;
+  while (!Opts.empty()) {
+    ArrayRef<std::string> ThisGroup;
+    ThisGroup = Opts.take_front(GroupSize);
+    Opts = Opts.drop_front(ThisGroup.size());
+    Result += join(ThisGroup, Sep);
+    if (!Opts.empty()) {
+      Result += Sep;
+      Result += "\n";
+      Result += formatv("{0}", fmt_repeat(' ', IndentLevel));
+    }
+  }
+  return Result;
+}
+
+std::string llvm::pdb::typesetStringList(uint32_t IndentLevel,
+                                         ArrayRef<StringRef> Strings) {
+  std::string Result = "[";
+  for (const auto &S : Strings) {
+    Result += formatv("\n{0}{1}", fmt_repeat(' ', IndentLevel), S);
+  }
+  Result += "]";
+  return Result;
+}
+
+std::string llvm::pdb::formatSegmentOffset(uint16_t Segment, uint32_t Offset) {
+  return formatv("{0:4}:{1:4}", Segment, Offset);
+}
diff --git a/tools/llvm-pdbutil/FormatUtil.h b/tools/llvm-pdbutil/FormatUtil.h
new file mode 100644 (file)
index 0000000..5c9807e
--- /dev/null
@@ -0,0 +1,92 @@
+//===- FormatUtil.h ------------------------------------------- *- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVMPDBUTIL_FORMAT_UTIL_H
+#define LLVM_TOOLS_LLVMPDBUTIL_FORMAT_UTIL_H
+
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/FormatVariadic.h"
+
+#include <string>
+#include <type_traits>
+
+namespace llvm {
+namespace pdb {
+
+#define PUSH_MASKED_FLAG(Enum, Mask, TheOpt, Value, Text)                      \
+  if (Enum::TheOpt == (Value & Mask))                                          \
+    Opts.push_back(Text);
+
+#define PUSH_FLAG(Enum, TheOpt, Value, Text)                                   \
+  PUSH_MASKED_FLAG(Enum, Enum::TheOpt, TheOpt, Value, Text)
+
+#define RETURN_CASE(Enum, X, Ret)                                              \
+  case Enum::X:                                                                \
+    return Ret;
+
+template <typename T> static std::string formatUnknownEnum(T Value) {
+  return formatv("unknown ({0})",
+                 static_cast<std::underlying_type<T>::type>(Value))
+      .str();
+}
+
+std::string formatSegmentOffset(uint16_t Segment, uint32_t Offset);
+
+std::string typesetItemList(ArrayRef<std::string> Opts, uint32_t IndentLevel,
+                            uint32_t GroupSize, StringRef Sep);
+
+std::string typesetStringList(uint32_t IndentLevel,
+                              ArrayRef<StringRef> Strings);
+
+/// Returns the number of digits in the given integer.
+inline int NumDigits(uint64_t N) {
+  if (N < 10ULL)
+    return 1;
+  if (N < 100ULL)
+    return 2;
+  if (N < 1000ULL)
+    return 3;
+  if (N < 10000ULL)
+    return 4;
+  if (N < 100000ULL)
+    return 5;
+  if (N < 1000000ULL)
+    return 6;
+  if (N < 10000000ULL)
+    return 7;
+  if (N < 100000000ULL)
+    return 8;
+  if (N < 1000000000ULL)
+    return 9;
+  if (N < 10000000000ULL)
+    return 10;
+  if (N < 100000000000ULL)
+    return 11;
+  if (N < 1000000000000ULL)
+    return 12;
+  if (N < 10000000000000ULL)
+    return 13;
+  if (N < 100000000000000ULL)
+    return 14;
+  if (N < 1000000000000000ULL)
+    return 15;
+  if (N < 10000000000000000ULL)
+    return 16;
+  if (N < 100000000000000000ULL)
+    return 17;
+  if (N < 1000000000000000000ULL)
+    return 18;
+  if (N < 10000000000000000000ULL)
+    return 19;
+  return 20;
+}
+}
+} // namespace llvm
+#endif
diff --git a/tools/llvm-pdbutil/LLVMOutputStyle.cpp b/tools/llvm-pdbutil/LLVMOutputStyle.cpp
deleted file mode 100644 (file)
index c4af458..0000000
+++ /dev/null
@@ -1,1198 +0,0 @@
-//===- LLVMOutputStyle.cpp ------------------------------------ *- C++ --*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "LLVMOutputStyle.h"
-
-#include "CompactTypeDumpVisitor.h"
-#include "StreamUtil.h"
-#include "llvm-pdbutil.h"
-
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
-#include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h"
-#include "llvm/DebugInfo/CodeView/EnumTables.h"
-#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
-#include "llvm/DebugInfo/CodeView/Line.h"
-#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
-#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
-#include "llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h"
-#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
-#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
-#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
-#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
-#include "llvm/DebugInfo/PDB/Native/EnumTables.h"
-#include "llvm/DebugInfo/PDB/Native/GlobalsStream.h"
-#include "llvm/DebugInfo/PDB/Native/ISectionContribVisitor.h"
-#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
-#include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/PublicsStream.h"
-#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
-#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
-#include "llvm/DebugInfo/PDB/PDBExtras.h"
-#include "llvm/Object/COFF.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/FormatVariadic.h"
-
-#include <unordered_map>
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::msf;
-using namespace llvm::pdb;
-
-namespace {
-struct PageStats {
-  explicit PageStats(const BitVector &FreePages)
-      : Upm(FreePages), ActualUsedPages(FreePages.size()),
-        MultiUsePages(FreePages.size()), UseAfterFreePages(FreePages.size()) {
-    const_cast<BitVector &>(Upm).flip();
-    // To calculate orphaned pages, we start with the set of pages that the
-    // MSF thinks are used.  Each time we find one that actually *is* used,
-    // we unset it.  Whichever bits remain set at the end are orphaned.
-    OrphanedPages = Upm;
-  }
-
-  // The inverse of the MSF File's copy of the Fpm.  The basis for which we
-  // determine the allocation status of each page.
-  const BitVector Upm;
-
-  // Pages which are marked as used in the FPM and are used at least once.
-  BitVector ActualUsedPages;
-
-  // Pages which are marked as used in the FPM but are used more than once.
-  BitVector MultiUsePages;
-
-  // Pages which are marked as used in the FPM but are not used at all.
-  BitVector OrphanedPages;
-
-  // Pages which are marked free in the FPM but are used.
-  BitVector UseAfterFreePages;
-};
-
-class C13RawVisitor : public DebugSubsectionVisitor {
-public:
-  C13RawVisitor(ScopedPrinter &P, LazyRandomTypeCollection &TPI,
-                LazyRandomTypeCollection *IPI)
-      : P(P), TPI(TPI), IPI(IPI) {}
-
-  Error visitUnknown(DebugUnknownSubsectionRef &Unknown) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::Unknown))
-      return Error::success();
-    DictScope DD(P, "Unknown");
-    P.printHex("Kind", static_cast<uint32_t>(Unknown.kind()));
-    ArrayRef<uint8_t> Data;
-    BinaryStreamReader Reader(Unknown.getData());
-    consumeError(Reader.readBytes(Data, Reader.bytesRemaining()));
-    P.printBinaryBlock("Data", Data);
-    return Error::success();
-  }
-
-  Error visitLines(DebugLinesSubsectionRef &Lines,
-                   const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::Lines))
-      return Error::success();
-
-    DictScope DD(P, "Lines");
-
-    P.printNumber("RelocSegment", Lines.header()->RelocSegment);
-    P.printNumber("RelocOffset", Lines.header()->RelocOffset);
-    P.printNumber("CodeSize", Lines.header()->CodeSize);
-    P.printBoolean("HasColumns", Lines.hasColumnInfo());
-
-    for (const auto &L : Lines) {
-      DictScope DDDD(P, "FileEntry");
-
-      if (auto EC = printFileName("FileName", L.NameIndex, State))
-        return EC;
-
-      for (const auto &N : L.LineNumbers) {
-        DictScope DDD(P, "Line");
-        LineInfo LI(N.Flags);
-        P.printNumber("Offset", N.Offset);
-        if (LI.isAlwaysStepInto())
-          P.printString("StepInto", StringRef("Always"));
-        else if (LI.isNeverStepInto())
-          P.printString("StepInto", StringRef("Never"));
-        else
-          P.printNumber("LineNumberStart", LI.getStartLine());
-        P.printNumber("EndDelta", LI.getLineDelta());
-        P.printBoolean("IsStatement", LI.isStatement());
-      }
-      for (const auto &C : L.Columns) {
-        DictScope DDD(P, "Column");
-        P.printNumber("Start", C.StartColumn);
-        P.printNumber("End", C.EndColumn);
-      }
-    }
-
-    return Error::success();
-  }
-
-  Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums,
-                           const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::FileChecksums))
-      return Error::success();
-
-    DictScope DD(P, "FileChecksums");
-    for (const auto &CS : Checksums) {
-      DictScope DDD(P, "Checksum");
-      if (auto Result = getNameFromStringTable(CS.FileNameOffset, State))
-        P.printString("FileName", *Result);
-      else
-        return Result.takeError();
-      P.printEnum("Kind", uint8_t(CS.Kind), getFileChecksumNames());
-      P.printBinaryBlock("Checksum", CS.Checksum);
-    }
-    return Error::success();
-  }
-
-  Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees,
-                          const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::InlineeLines))
-      return Error::success();
-
-    DictScope D(P, "InlineeLines");
-    P.printBoolean("HasExtraFiles", Inlinees.hasExtraFiles());
-    ListScope LS(P, "Lines");
-    for (const auto &L : Inlinees) {
-      DictScope DDD(P, "Inlinee");
-      if (auto EC = printFileName("FileName", L.Header->FileID, State))
-        return EC;
-
-      if (auto EC = dumpTypeRecord("Function", L.Header->Inlinee))
-        return EC;
-      P.printNumber("SourceLine", L.Header->SourceLineNum);
-      if (Inlinees.hasExtraFiles()) {
-        ListScope DDDD(P, "ExtraFiles");
-        for (const auto &EF : L.ExtraFiles) {
-          if (auto EC = printFileName("File", EF, State))
-            return EC;
-        }
-      }
-    }
-    return Error::success();
-  }
-
-  Error visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &CSE,
-                                const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::CrossScopeExports))
-      return Error::success();
-
-    ListScope D(P, "CrossModuleExports");
-    for (const auto &M : CSE) {
-      DictScope D(P, "Export");
-      P.printHex("Local", M.Local);
-      P.printHex("Global", M.Global);
-    }
-    return Error::success();
-  }
-
-  Error visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &CSI,
-                                const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::CrossScopeImports))
-      return Error::success();
-
-    ListScope L(P, "CrossModuleImports");
-    for (const auto &M : CSI) {
-      DictScope D(P, "ModuleImport");
-      auto Name = getNameFromStringTable(M.Header->ModuleNameOffset, State);
-      if (!Name)
-        return Name.takeError();
-      P.printString("Module", *Name);
-      P.printHexList("Imports", M.Imports);
-    }
-    return Error::success();
-  }
-
-  Error visitFrameData(DebugFrameDataSubsectionRef &FD,
-                       const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::FrameData))
-      return Error::success();
-
-    ListScope L(P, "FrameData");
-    for (const auto &Frame : FD) {
-      DictScope D(P, "Frame");
-      auto Name = getNameFromStringTable(Frame.FrameFunc, State);
-      if (!Name)
-        return joinErrors(make_error<RawError>(raw_error_code::invalid_format,
-                                               "Invalid Frame.FrameFunc index"),
-                          Name.takeError());
-      P.printNumber("Rva", Frame.RvaStart);
-      P.printNumber("CodeSize", Frame.CodeSize);
-      P.printNumber("LocalSize", Frame.LocalSize);
-      P.printNumber("ParamsSize", Frame.ParamsSize);
-      P.printNumber("MaxStackSize", Frame.MaxStackSize);
-      P.printString("FrameFunc", *Name);
-      P.printNumber("PrologSize", Frame.PrologSize);
-      P.printNumber("SavedRegsSize", Frame.SavedRegsSize);
-      P.printNumber("Flags", Frame.Flags);
-    }
-    return Error::success();
-  }
-
-  Error visitSymbols(DebugSymbolsSubsectionRef &Symbols,
-                     const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::Symbols))
-      return Error::success();
-    ListScope L(P, "Symbols");
-
-    // This section should not actually appear in a PDB file, it really only
-    // appears in object files.  But we support it here for testing.  So we
-    // specify the Object File container type.
-    codeview::CVSymbolDumper SD(P, TPI, CodeViewContainer::ObjectFile, nullptr,
-                                false);
-    for (auto S : Symbols) {
-      DictScope LL(P, "");
-      if (auto EC = SD.dump(S)) {
-        return make_error<RawError>(
-            raw_error_code::corrupt_file,
-            "DEBUG_S_SYMBOLS subsection contained corrupt symbol record");
-      }
-    }
-    return Error::success();
-  }
-
-  Error visitStringTable(DebugStringTableSubsectionRef &Strings,
-                         const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::StringTable))
-      return Error::success();
-
-    ListScope D(P, "String Table");
-    BinaryStreamReader Reader(Strings.getBuffer());
-    StringRef S;
-    consumeError(Reader.readCString(S));
-    while (Reader.bytesRemaining() > 0) {
-      consumeError(Reader.readCString(S));
-      if (S.empty() && Reader.bytesRemaining() < 4)
-        break;
-      P.printString(S);
-    }
-    return Error::success();
-  }
-
-  Error visitCOFFSymbolRVAs(DebugSymbolRVASubsectionRef &RVAs,
-                            const StringsAndChecksumsRef &State) override {
-    if (!opts::checkModuleSubsection(opts::ModuleSubsection::CoffSymbolRVAs))
-      return Error::success();
-
-    ListScope D(P, "COFF Symbol RVAs");
-    P.printHexList("RVAs", RVAs);
-    return Error::success();
-  }
-
-private:
-  Error dumpTypeRecord(StringRef Label, TypeIndex Index) {
-    bool Success = false;
-    DictScope D(P, Label);
-    if (IPI) {
-      CompactTypeDumpVisitor CTDV(*IPI, Index, &P);
-      if (IPI->contains(Index)) {
-        CVType Type = IPI->getType(Index);
-        if (auto EC = codeview::visitTypeRecord(Type, CTDV))
-          return EC;
-      }
-    }
-
-    if (!Success) {
-      P.printString(
-          llvm::formatv("Index: {0:x} (unknown function)", Index.getIndex())
-              .str());
-    }
-    return Error::success();
-  }
-  Error printFileName(StringRef Label, uint32_t Offset,
-                      const StringsAndChecksumsRef &State) {
-    if (auto Result = getNameFromChecksumsBuffer(Offset, State)) {
-      P.printString(Label, *Result);
-      return Error::success();
-    } else
-      return Result.takeError();
-  }
-
-  Expected<StringRef>
-  getNameFromStringTable(uint32_t Offset, const StringsAndChecksumsRef &State) {
-    return State.strings().getString(Offset);
-  }
-
-  Expected<StringRef>
-  getNameFromChecksumsBuffer(uint32_t Offset,
-                             const StringsAndChecksumsRef &State) {
-    auto Array = State.checksums().getArray();
-    auto ChecksumIter = Array.at(Offset);
-    if (ChecksumIter == Array.end())
-      return make_error<RawError>(raw_error_code::invalid_format);
-    const auto &Entry = *ChecksumIter;
-    return getNameFromStringTable(Entry.FileNameOffset, State);
-  }
-
-  ScopedPrinter &P;
-  LazyRandomTypeCollection &TPI;
-  LazyRandomTypeCollection *IPI;
-};
-}
-
-static void recordKnownUsedPage(PageStats &Stats, uint32_t UsedIndex) {
-  if (Stats.Upm.test(UsedIndex)) {
-    if (Stats.ActualUsedPages.test(UsedIndex))
-      Stats.MultiUsePages.set(UsedIndex);
-    Stats.ActualUsedPages.set(UsedIndex);
-    Stats.OrphanedPages.reset(UsedIndex);
-  } else {
-    // The MSF doesn't think this page is used, but it is.
-    Stats.UseAfterFreePages.set(UsedIndex);
-  }
-}
-
-static void printSectionOffset(llvm::raw_ostream &OS,
-                               const SectionOffset &Off) {
-  OS << Off.Off << ", " << Off.Isect;
-}
-
-LLVMOutputStyle::LLVMOutputStyle(PDBFile &File) : File(File), P(outs()) {}
-
-Error LLVMOutputStyle::dump() {
-  if (auto EC = dumpFileHeaders())
-    return EC;
-
-  if (auto EC = dumpStreamSummary())
-    return EC;
-
-  if (auto EC = dumpFreePageMap())
-    return EC;
-
-  if (auto EC = dumpStreamBlocks())
-    return EC;
-
-  if (auto EC = dumpBlockRanges())
-    return EC;
-
-  if (auto EC = dumpStreamBytes())
-    return EC;
-
-  if (auto EC = dumpStringTable())
-    return EC;
-
-  if (auto EC = dumpInfoStream())
-    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 = dumpGlobalsStream())
-    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::raw::DumpHeaders)
-    return Error::success();
-
-  DictScope D(P, "FileHeaders");
-  P.printNumber("BlockSize", File.getBlockSize());
-  P.printNumber("FreeBlockMap", File.getFreeBlockMapBlock());
-  P.printNumber("NumBlocks", File.getBlockCount());
-  P.printNumber("NumDirectoryBytes", File.getNumDirectoryBytes());
-  P.printNumber("Unknown1", File.getUnknown1());
-  P.printNumber("BlockMapAddr", File.getBlockMapIndex());
-  P.printNumber("NumDirectoryBlocks", File.getNumDirectoryBlocks());
-
-  // The directory is not contiguous.  Instead, the block map contains a
-  // contiguous list of block numbers whose contents, when concatenated in
-  // order, make up the directory.
-  P.printList("DirectoryBlocks", File.getDirectoryBlockArray());
-  P.printNumber("NumStreams", File.getNumStreams());
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStreamSummary() {
-  if (!opts::raw::DumpStreamSummary)
-    return Error::success();
-
-  if (StreamPurposes.empty())
-    discoverStreamPurposes(File, StreamPurposes);
-
-  uint32_t StreamCount = File.getNumStreams();
-
-  ListScope L(P, "Streams");
-  for (uint16_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {
-    std::string Label("Stream ");
-    Label += to_string(StreamIdx);
-
-    std::string Value = "[" + StreamPurposes[StreamIdx] + "] (";
-    Value += to_string(File.getStreamByteSize(StreamIdx));
-    Value += " bytes)";
-
-    P.printString(Label, Value);
-  }
-
-  P.flush();
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpFreePageMap() {
-  if (!opts::raw::DumpPageStats)
-    return Error::success();
-
-  // Start with used pages instead of free pages because
-  // the number of free pages is far larger than used pages.
-  BitVector FPM = File.getMsfLayout().FreePageMap;
-
-  PageStats PS(FPM);
-
-  recordKnownUsedPage(PS, 0); // MSF Super Block
-
-  uint32_t BlocksPerSection = msf::getFpmIntervalLength(File.getMsfLayout());
-  uint32_t NumSections = msf::getNumFpmIntervals(File.getMsfLayout());
-  for (uint32_t I = 0; I < NumSections; ++I) {
-    uint32_t Fpm0 = 1 + BlocksPerSection * I;
-    // 2 Fpm blocks spaced at `getBlockSize()` block intervals
-    recordKnownUsedPage(PS, Fpm0);
-    recordKnownUsedPage(PS, Fpm0 + 1);
-  }
-
-  recordKnownUsedPage(PS, File.getBlockMapIndex()); // Stream Table
-
-  for (auto DB : File.getDirectoryBlockArray())
-    recordKnownUsedPage(PS, DB);
-
-  // Record pages used by streams. Note that pages for stream 0
-  // are considered being unused because that's what MSVC tools do.
-  // Stream 0 doesn't contain actual data, so it makes some sense,
-  // though it's a bit confusing to us.
-  for (auto &SE : File.getStreamMap().drop_front(1))
-    for (auto &S : SE)
-      recordKnownUsedPage(PS, S);
-
-  dumpBitVector("Msf Free Pages", FPM);
-  dumpBitVector("Orphaned Pages", PS.OrphanedPages);
-  dumpBitVector("Multiply Used Pages", PS.MultiUsePages);
-  dumpBitVector("Use After Free Pages", PS.UseAfterFreePages);
-  return Error::success();
-}
-
-void LLVMOutputStyle::dumpBitVector(StringRef Name, const BitVector &V) {
-  std::vector<uint32_t> Vec;
-  for (uint32_t I = 0, E = V.size(); I != E; ++I)
-    if (V[I])
-      Vec.push_back(I);
-  P.printList(Name, Vec);
-}
-
-Error LLVMOutputStyle::dumpGlobalsStream() {
-  if (!opts::raw::DumpGlobals)
-    return Error::success();
-  if (!File.hasPDBGlobalsStream()) {
-    P.printString("Globals Stream not present");
-    return Error::success();
-  }
-
-  auto Globals = File.getPDBGlobalsStream();
-  if (!Globals)
-    return Globals.takeError();
-  DictScope D(P, "Globals Stream");
-
-  auto Dbi = File.getPDBDbiStream();
-  if (!Dbi)
-    return Dbi.takeError();
-
-  P.printNumber("Stream number", Dbi->getGlobalSymbolStreamIndex());
-  P.printNumber("Number of buckets", Globals->getNumBuckets());
-  P.printList("Hash Buckets", Globals->getHashBuckets());
-
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStreamBlocks() {
-  if (!opts::raw::DumpStreamBlocks)
-    return Error::success();
-
-  ListScope L(P, "StreamBlocks");
-  uint32_t StreamCount = File.getNumStreams();
-  for (uint32_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {
-    std::string Name("Stream ");
-    Name += to_string(StreamIdx);
-    auto StreamBlocks = File.getStreamBlockList(StreamIdx);
-    P.printList(Name, StreamBlocks);
-  }
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpBlockRanges() {
-  if (!opts::raw::DumpBlockRange.hasValue())
-    return Error::success();
-  auto &R = *opts::raw::DumpBlockRange;
-  uint32_t Max = R.Max.getValueOr(R.Min);
-
-  if (Max < R.Min)
-    return make_error<StringError>(
-        "Invalid block range specified.  Max < Min",
-        std::make_error_code(std::errc::bad_address));
-  if (Max >= File.getBlockCount())
-    return make_error<StringError>(
-        "Invalid block range specified.  Requested block out of bounds",
-        std::make_error_code(std::errc::bad_address));
-
-  DictScope D(P, "Block Data");
-  for (uint32_t I = R.Min; I <= Max; ++I) {
-    auto ExpectedData = File.getBlockData(I, File.getBlockSize());
-    if (!ExpectedData)
-      return ExpectedData.takeError();
-    std::string Label;
-    llvm::raw_string_ostream S(Label);
-    S << "Block " << I;
-    S.flush();
-    P.printBinaryBlock(Label, *ExpectedData);
-  }
-
-  return Error::success();
-}
-
-static Error parseStreamSpec(StringRef Str, uint32_t &SI, uint32_t &Offset,
-                             uint32_t &Size) {
-  if (Str.consumeInteger(0, SI))
-    return make_error<RawError>(raw_error_code::invalid_format,
-                                "Invalid Stream Specification");
-  if (Str.consume_front(":")) {
-    if (Str.consumeInteger(0, Offset))
-      return make_error<RawError>(raw_error_code::invalid_format,
-                                  "Invalid Stream Specification");
-  }
-  if (Str.consume_front("@")) {
-    if (Str.consumeInteger(0, Size))
-      return make_error<RawError>(raw_error_code::invalid_format,
-                                  "Invalid Stream Specification");
-  }
-  if (!Str.empty())
-    return make_error<RawError>(raw_error_code::invalid_format,
-                                "Invalid Stream Specification");
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStreamBytes() {
-  if (opts::raw::DumpStreamData.empty())
-    return Error::success();
-
-  if (StreamPurposes.empty())
-    discoverStreamPurposes(File, StreamPurposes);
-
-  DictScope D(P, "Stream Data");
-  for (auto &Str : opts::raw::DumpStreamData) {
-    uint32_t SI = 0;
-    uint32_t Begin = 0;
-    uint32_t Size = 0;
-    uint32_t End = 0;
-
-    if (auto EC = parseStreamSpec(Str, SI, Begin, Size))
-      return EC;
-
-    if (SI >= File.getNumStreams())
-      return make_error<RawError>(raw_error_code::no_stream);
-
-    auto S = MappedBlockStream::createIndexedStream(
-        File.getMsfLayout(), File.getMsfBuffer(), SI, File.getAllocator());
-    if (!S)
-      continue;
-    DictScope DD(P, "Stream");
-    if (Size == 0)
-      End = S->getLength();
-    else {
-      End = Begin + Size;
-      if (End >= S->getLength())
-        return make_error<RawError>(raw_error_code::index_out_of_bounds,
-                                    "Stream is not long enough!");
-    }
-
-    P.printNumber("Index", SI);
-    P.printString("Type", StreamPurposes[SI]);
-    P.printNumber("Size", S->getLength());
-    auto Blocks = File.getMsfLayout().StreamMap[SI];
-    P.printList("Blocks", Blocks);
-
-    BinaryStreamReader R(*S);
-    ArrayRef<uint8_t> StreamData;
-    if (auto EC = R.readBytes(StreamData, S->getLength()))
-      return EC;
-    Size = End - Begin;
-    StreamData = StreamData.slice(Begin, Size);
-    P.printBinaryBlock("Data", StreamData, Begin);
-  }
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStringTable() {
-  if (!opts::raw::DumpStringTable)
-    return Error::success();
-
-  auto IS = File.getStringTable();
-  if (!IS)
-    return IS.takeError();
-
-  DictScope D(P, "String Table");
-  for (uint32_t I : IS->name_ids()) {
-    auto ES = IS->getStringForID(I);
-    if (!ES)
-      return ES.takeError();
-
-    if (ES->empty())
-      continue;
-    llvm::SmallString<32> Str;
-    Str.append("'");
-    Str.append(*ES);
-    Str.append("'");
-    P.printString(Str);
-  }
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpInfoStream() {
-  if (!opts::raw::DumpHeaders)
-    return Error::success();
-  if (!File.hasPDBInfoStream()) {
-    P.printString("PDB Stream not present");
-    return Error::success();
-  }
-  auto IS = File.getPDBInfoStream();
-  if (!IS)
-    return IS.takeError();
-
-  DictScope D(P, "PDB Stream");
-  P.printNumber("Version", IS->getVersion());
-  P.printHex("Signature", IS->getSignature());
-  P.printNumber("Age", IS->getAge());
-  P.printObject("Guid", IS->getGuid());
-  P.printHex("Features", IS->getFeatures());
-  {
-    DictScope DD(P, "Named Streams");
-    for (const auto &S : IS->getNamedStreams().entries())
-      P.printObject(S.getKey(), S.getValue());
-  }
-  return Error::success();
-}
-
-namespace {
-class RecordBytesVisitor : public TypeVisitorCallbacks {
-public:
-  explicit RecordBytesVisitor(ScopedPrinter &P) : P(P) {}
-
-  Error visitTypeEnd(CVType &Record) override {
-    P.printBinaryBlock("Bytes", Record.content());
-    return Error::success();
-  }
-
-private:
-  ScopedPrinter &P;
-};
-}
-
-Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) {
-  assert(StreamIdx == StreamTPI || StreamIdx == StreamIPI);
-
-  bool DumpRecordBytes = false;
-  bool DumpRecords = false;
-  bool DumpTpiHash = false;
-  StringRef Label;
-  StringRef VerLabel;
-  if (StreamIdx == StreamTPI) {
-    if (!File.hasPDBTpiStream()) {
-      P.printString("Type Info Stream (TPI) not present");
-      return Error::success();
-    }
-    DumpRecordBytes = opts::raw::DumpTpiRecordBytes;
-    DumpRecords = opts::raw::DumpTpiRecords;
-    DumpTpiHash = opts::raw::DumpTpiHash;
-    Label = "Type Info Stream (TPI)";
-    VerLabel = "TPI Version";
-  } else if (StreamIdx == StreamIPI) {
-    auto InfoS = File.getPDBInfoStream();
-    if (!InfoS)
-      return InfoS.takeError();
-
-    if (!File.hasPDBIpiStream() || !InfoS->containsIdStream())
-      return Error::success();
-    DumpRecordBytes = opts::raw::DumpIpiRecordBytes;
-    DumpRecords = opts::raw::DumpIpiRecords;
-    Label = "Type Info Stream (IPI)";
-    VerLabel = "IPI Version";
-  }
-
-  auto Tpi = (StreamIdx == StreamTPI) ? File.getPDBTpiStream()
-                                      : File.getPDBIpiStream();
-  if (!Tpi)
-    return Tpi.takeError();
-
-  auto ExpectedTypes = initializeTypeDatabase(StreamIdx);
-  if (!ExpectedTypes)
-    return ExpectedTypes.takeError();
-  auto &Types = *ExpectedTypes;
-
-  if (!DumpRecordBytes && !DumpRecords && !DumpTpiHash)
-    return Error::success();
-
-  std::unique_ptr<DictScope> StreamScope;
-  std::unique_ptr<ListScope> RecordScope;
-
-  StreamScope = llvm::make_unique<DictScope>(P, Label);
-  P.printNumber(VerLabel, Tpi->getTpiVersion());
-  P.printNumber("Record count", Tpi->getNumTypeRecords());
-
-  std::vector<std::unique_ptr<TypeVisitorCallbacks>> Visitors;
-
-  // If we're in dump mode, add a dumper with the appropriate detail level.
-  if (DumpRecords) {
-    std::unique_ptr<TypeVisitorCallbacks> Dumper;
-    if (opts::raw::CompactRecords)
-      Dumper = make_unique<CompactTypeDumpVisitor>(Types, &P);
-    else {
-      assert(TpiTypes);
-
-      auto X = make_unique<TypeDumpVisitor>(*TpiTypes, &P, false);
-      if (StreamIdx == StreamIPI)
-        X->setIpiTypes(*IpiTypes);
-      Dumper = std::move(X);
-    }
-    Visitors.push_back(std::move(Dumper));
-  }
-  if (DumpRecordBytes)
-    Visitors.push_back(make_unique<RecordBytesVisitor>(P));
-
-  // We always need to deserialize and add it to the type database.  This is
-  // true if even if we're not dumping anything, because we could need the
-  // type database for the purposes of dumping symbols.
-  TypeVisitorCallbackPipeline Pipeline;
-  for (const auto &V : Visitors)
-    Pipeline.addCallbackToPipeline(*V);
-
-  if (DumpRecords || DumpRecordBytes)
-    RecordScope = llvm::make_unique<ListScope>(P, "Records");
-
-  Optional<TypeIndex> I = Types.getFirst();
-  while (I) {
-    std::unique_ptr<DictScope> OneRecordScope;
-
-    if ((DumpRecords || DumpRecordBytes) && !opts::raw::CompactRecords)
-      OneRecordScope = llvm::make_unique<DictScope>(P, "");
-
-    auto T = Types.getType(*I);
-    if (auto EC = codeview::visitTypeRecord(T, *I, Pipeline))
-      return EC;
-    I = Types.getNext(*I);
-  }
-
-  if (DumpTpiHash) {
-    DictScope DD(P, "Hash");
-    P.printNumber("Number of Hash Buckets", Tpi->getNumHashBuckets());
-    P.printNumber("Hash Key Size", Tpi->getHashKeySize());
-    P.printList("Values", Tpi->getHashValues());
-
-    ListScope LHA(P, "Adjusters");
-    auto ExpectedST = File.getStringTable();
-    if (!ExpectedST)
-      return ExpectedST.takeError();
-    const auto &ST = *ExpectedST;
-    for (const auto &E : Tpi->getHashAdjusters()) {
-      DictScope DHA(P);
-      auto Name = ST.getStringForID(E.first);
-      if (!Name)
-        return Name.takeError();
-
-      P.printString("Type", *Name);
-      P.printHex("TI", E.second);
-    }
-  }
-
-  ListScope L(P, "TypeIndexOffsets");
-  for (const auto &IO : Tpi->getTypeIndexOffsets()) {
-    P.printString(formatv("Index: {0:x}, Offset: {1:N}", IO.Type.getIndex(),
-                          (uint32_t)IO.Offset)
-                      .str());
-  }
-
-  P.flush();
-  return Error::success();
-}
-
-Expected<codeview::LazyRandomTypeCollection &>
-LLVMOutputStyle::initializeTypeDatabase(uint32_t SN) {
-  auto &TypeCollection = (SN == StreamTPI) ? TpiTypes : IpiTypes;
-  auto Tpi =
-      (SN == StreamTPI) ? File.getPDBTpiStream() : File.getPDBIpiStream();
-  if (!Tpi)
-    return Tpi.takeError();
-
-  if (!TypeCollection) {
-    // Initialize the type collection, even if we're not going to dump it.  This
-    // way if some other part of the dumper decides it wants to use some or all
-    // of the records for whatever purposes, it can still access them lazily.
-    auto &Types = Tpi->typeArray();
-    uint32_t Count = Tpi->getNumTypeRecords();
-    auto Offsets = Tpi->getTypeIndexOffsets();
-    TypeCollection =
-        llvm::make_unique<LazyRandomTypeCollection>(Types, Count, Offsets);
-  }
-
-  return *TypeCollection;
-}
-
-Error LLVMOutputStyle::dumpDbiStream() {
-  bool DumpModules = opts::shared::DumpModules ||
-                     opts::shared::DumpModuleSyms ||
-                     opts::shared::DumpModuleFiles ||
-                     !opts::shared::DumpModuleSubsections.empty();
-  if (!opts::raw::DumpHeaders && !DumpModules)
-    return Error::success();
-  if (!File.hasPDBDbiStream()) {
-    P.printString("DBI Stream not present");
-    return Error::success();
-  }
-
-  ExitOnError Err("Error while processing DBI Stream");
-
-  auto DS = File.getPDBDbiStream();
-  if (!DS)
-    return DS.takeError();
-
-  DictScope D(P, "DBI Stream");
-  P.printNumber("Dbi Version", DS->getDbiVersion());
-  P.printNumber("Age", DS->getAge());
-  P.printBoolean("Incremental Linking", DS->isIncrementallyLinked());
-  P.printBoolean("Has CTypes", DS->hasCTypes());
-  P.printBoolean("Is Stripped", DS->isStripped());
-  P.printObject("Machine Type", DS->getMachineType());
-  P.printNumber("Symbol Record Stream Index", DS->getSymRecordStreamIndex());
-  P.printNumber("Public Symbol Stream Index", DS->getPublicSymbolStreamIndex());
-  P.printNumber("Global Symbol Stream Index", DS->getGlobalSymbolStreamIndex());
-
-  uint16_t Major = DS->getBuildMajorVersion();
-  uint16_t Minor = DS->getBuildMinorVersion();
-  P.printVersion("Toolchain Version", Major, Minor);
-
-  std::string DllName;
-  raw_string_ostream DllStream(DllName);
-  DllStream << "mspdb" << Major << Minor << ".dll version";
-  DllStream.flush();
-  P.printVersion(DllName, Major, Minor, DS->getPdbDllVersion());
-
-  if (DumpModules) {
-    ListScope L(P, "Modules");
-    const DbiModuleList &Modules = DS->modules();
-    for (uint32_t I = 0; I < Modules.getModuleCount(); ++I) {
-      const DbiModuleDescriptor &Modi = Modules.getModuleDescriptor(I);
-      DictScope DD(P);
-      P.printString("Name", Modi.getModuleName().str());
-      P.printNumber("Debug Stream Index", Modi.getModuleStreamIndex());
-      P.printString("Object File Name", Modi.getObjFileName().str());
-      P.printNumber("Num Files", Modi.getNumberOfFiles());
-      P.printNumber("Source File Name Idx", Modi.getSourceFileNameIndex());
-      P.printNumber("Pdb File Name Idx", Modi.getPdbFilePathNameIndex());
-      P.printNumber("Line Info Byte Size", Modi.getC11LineInfoByteSize());
-      P.printNumber("C13 Line Info Byte Size", Modi.getC13LineInfoByteSize());
-      P.printNumber("Symbol Byte Size", Modi.getSymbolDebugInfoByteSize());
-      P.printNumber("Type Server Index", Modi.getTypeServerIndex());
-      P.printBoolean("Has EC Info", Modi.hasECInfo());
-      if (opts::shared::DumpModuleFiles) {
-        std::string FileListName = to_string(Modules.getSourceFileCount(I)) +
-                                   " Contributing Source Files";
-        ListScope LL(P, FileListName);
-        for (auto File : Modules.source_files(I))
-          P.printString(File);
-      }
-      bool HasModuleDI = (Modi.getModuleStreamIndex() < File.getNumStreams());
-      bool ShouldDumpSymbols =
-          (opts::shared::DumpModuleSyms || opts::raw::DumpSymRecordBytes);
-      if (HasModuleDI &&
-          (ShouldDumpSymbols || !opts::shared::DumpModuleSubsections.empty())) {
-        auto ModStreamData = MappedBlockStream::createIndexedStream(
-            File.getMsfLayout(), File.getMsfBuffer(),
-            Modi.getModuleStreamIndex(), File.getAllocator());
-
-        ModuleDebugStreamRef ModS(Modi, std::move(ModStreamData));
-        if (auto EC = ModS.reload())
-          return EC;
-
-        auto ExpectedTpi = initializeTypeDatabase(StreamTPI);
-        if (!ExpectedTpi)
-          return ExpectedTpi.takeError();
-        auto &Tpi = *ExpectedTpi;
-        if (ShouldDumpSymbols) {
-
-          ListScope SS(P, "Symbols");
-          codeview::CVSymbolDumper SD(P, Tpi, CodeViewContainer::Pdb, nullptr,
-                                      false);
-          bool HadError = false;
-          for (auto S : ModS.symbols(&HadError)) {
-            DictScope LL(P, "");
-            if (opts::shared::DumpModuleSyms) {
-              if (auto EC = SD.dump(S)) {
-                llvm::consumeError(std::move(EC));
-                HadError = true;
-                break;
-              }
-            }
-            if (opts::raw::DumpSymRecordBytes)
-              P.printBinaryBlock("Bytes", S.content());
-          }
-          if (HadError)
-            return make_error<RawError>(
-                raw_error_code::corrupt_file,
-                "DBI stream contained corrupt symbol record");
-        }
-        if (!opts::shared::DumpModuleSubsections.empty()) {
-          ListScope SS(P, "Subsections");
-          auto &InfoS = Err(File.getPDBInfoStream());
-          LazyRandomTypeCollection *Ipi = nullptr;
-          if (InfoS.containsIdStream())
-            Ipi = &Err(initializeTypeDatabase(StreamIPI));
-          auto ExpectedStrings = File.getStringTable();
-          if (!ExpectedStrings)
-            return joinErrors(
-                make_error<RawError>(raw_error_code::no_stream,
-                                     "Could not get string table!"),
-                ExpectedStrings.takeError());
-
-          C13RawVisitor V(P, Tpi, Ipi);
-          if (auto EC = codeview::visitDebugSubsections(
-                  ModS.subsections(), V, ExpectedStrings->getStringTable()))
-            return EC;
-        }
-      }
-    }
-  }
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpSectionContribs() {
-  if (!opts::raw::DumpSectionContribs)
-    return Error::success();
-  if (!File.hasPDBDbiStream()) {
-    P.printString("DBI Stream not present");
-    return Error::success();
-  }
-
-  auto Dbi = File.getPDBDbiStream();
-  if (!Dbi)
-    return Dbi.takeError();
-
-  ListScope L(P, "Section Contributions");
-  class Visitor : public ISectionContribVisitor {
-  public:
-    Visitor(ScopedPrinter &P, DbiStream &DS) : P(P), DS(DS) {}
-    void visit(const SectionContrib &SC) override {
-      DictScope D(P, "Contribution");
-      P.printNumber("ISect", SC.ISect);
-      P.printNumber("Off", SC.Off);
-      P.printNumber("Size", SC.Size);
-      P.printFlags("Characteristics", SC.Characteristics,
-                   codeview::getImageSectionCharacteristicNames(),
-                   COFF::SectionCharacteristics(0x00F00000));
-      {
-        DictScope DD(P, "Module");
-        P.printNumber("Index", SC.Imod);
-        const DbiModuleList &Modules = DS.modules();
-        if (Modules.getModuleCount() > SC.Imod) {
-          P.printString("Name",
-                        Modules.getModuleDescriptor(SC.Imod).getModuleName());
-        }
-      }
-      P.printNumber("Data CRC", SC.DataCrc);
-      P.printNumber("Reloc CRC", SC.RelocCrc);
-      P.flush();
-    }
-    void visit(const SectionContrib2 &SC) override {
-      visit(SC.Base);
-      P.printNumber("ISect Coff", SC.ISectCoff);
-      P.flush();
-    }
-
-  private:
-    ScopedPrinter &P;
-    DbiStream &DS;
-  };
-  Visitor V(P, *Dbi);
-  Dbi->visitSectionContributions(V);
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpSectionMap() {
-  if (!opts::raw::DumpSectionMap)
-    return Error::success();
-  if (!File.hasPDBDbiStream()) {
-    P.printString("DBI Stream not present");
-    return Error::success();
-  }
-
-  auto Dbi = File.getPDBDbiStream();
-  if (!Dbi)
-    return Dbi.takeError();
-
-  ListScope L(P, "Section Map");
-  for (auto &M : Dbi->getSectionMap()) {
-    DictScope D(P, "Entry");
-    P.printFlags("Flags", M.Flags, getOMFSegMapDescFlagNames());
-    P.printNumber("Ovl", M.Ovl);
-    P.printNumber("Group", M.Group);
-    P.printNumber("Frame", M.Frame);
-    P.printNumber("SecName", M.SecName);
-    P.printNumber("ClassName", M.ClassName);
-    P.printNumber("Offset", M.Offset);
-    P.printNumber("SecByteLength", M.SecByteLength);
-    P.flush();
-  }
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpPublicsStream() {
-  if (!opts::raw::DumpPublics)
-    return Error::success();
-  if (!File.hasPDBPublicsStream()) {
-    P.printString("Publics Stream not present");
-    return Error::success();
-  }
-
-  auto Publics = File.getPDBPublicsStream();
-  if (!Publics)
-    return Publics.takeError();
-  DictScope D(P, "Publics Stream");
-
-  auto Dbi = File.getPDBDbiStream();
-  if (!Dbi)
-    return Dbi.takeError();
-
-  P.printNumber("Stream number", Dbi->getPublicSymbolStreamIndex());
-  P.printNumber("SymHash", Publics->getSymHash());
-  P.printNumber("AddrMap", Publics->getAddrMap());
-  P.printNumber("Number of buckets", Publics->getNumBuckets());
-  P.printList("Hash Buckets", Publics->getHashBuckets());
-  P.printList("Address Map", Publics->getAddressMap());
-  P.printList("Thunk Map", Publics->getThunkMap());
-  P.printList("Section Offsets", Publics->getSectionOffsets(),
-              printSectionOffset);
-  ListScope L(P, "Symbols");
-  auto ExpectedTypes = initializeTypeDatabase(StreamTPI);
-  if (!ExpectedTypes)
-    return ExpectedTypes.takeError();
-  auto &Tpi = *ExpectedTypes;
-
-  codeview::CVSymbolDumper SD(P, Tpi, CodeViewContainer::Pdb, nullptr, false);
-  bool HadError = false;
-  for (auto S : Publics->getSymbols(&HadError)) {
-    DictScope DD(P, "");
-
-    if (auto EC = SD.dump(S)) {
-      HadError = true;
-      break;
-    }
-    if (opts::raw::DumpSymRecordBytes)
-      P.printBinaryBlock("Bytes", S.content());
-  }
-  if (HadError)
-    return make_error<RawError>(
-        raw_error_code::corrupt_file,
-        "Public symbol stream contained corrupt record");
-
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpSectionHeaders() {
-  if (!opts::raw::DumpSectionHeaders)
-    return Error::success();
-  if (!File.hasPDBDbiStream()) {
-    P.printString("DBI Stream not present");
-    return Error::success();
-  }
-
-  auto Dbi = File.getPDBDbiStream();
-  if (!Dbi)
-    return Dbi.takeError();
-
-  ListScope D(P, "Section Headers");
-  for (const object::coff_section &Section : Dbi->getSectionHeaders()) {
-    DictScope DD(P, "");
-
-    // If a name is 8 characters long, there is no NUL character at end.
-    StringRef Name(Section.Name, strnlen(Section.Name, sizeof(Section.Name)));
-    P.printString("Name", Name);
-    P.printNumber("Virtual Size", Section.VirtualSize);
-    P.printNumber("Virtual Address", Section.VirtualAddress);
-    P.printNumber("Size of Raw Data", Section.SizeOfRawData);
-    P.printNumber("File Pointer to Raw Data", Section.PointerToRawData);
-    P.printNumber("File Pointer to Relocations", Section.PointerToRelocations);
-    P.printNumber("File Pointer to Linenumbers", Section.PointerToLinenumbers);
-    P.printNumber("Number of Relocations", Section.NumberOfRelocations);
-    P.printNumber("Number of Linenumbers", Section.NumberOfLinenumbers);
-    P.printFlags("Characteristics", Section.Characteristics,
-                 getImageSectionCharacteristicNames());
-  }
-  return Error::success();
-}
-
-Error LLVMOutputStyle::dumpFpoStream() {
-  if (!opts::raw::DumpFpo)
-    return Error::success();
-  if (!File.hasPDBDbiStream()) {
-    P.printString("DBI Stream not present");
-    return Error::success();
-  }
-
-  auto Dbi = File.getPDBDbiStream();
-  if (!Dbi)
-    return Dbi.takeError();
-
-  ListScope D(P, "New FPO");
-  for (const object::FpoData &Fpo : Dbi->getFpoRecords()) {
-    DictScope DD(P, "");
-    P.printNumber("Offset", Fpo.Offset);
-    P.printNumber("Size", Fpo.Size);
-    P.printNumber("Number of locals", Fpo.NumLocals);
-    P.printNumber("Number of params", Fpo.NumParams);
-    P.printNumber("Size of Prolog", Fpo.getPrologSize());
-    P.printNumber("Number of Saved Registers", Fpo.getNumSavedRegs());
-    P.printBoolean("Has SEH", Fpo.hasSEH());
-    P.printBoolean("Use BP", Fpo.useBP());
-    P.printNumber("Frame Pointer", Fpo.getFP());
-  }
-  return Error::success();
-}
-
-void LLVMOutputStyle::flush() { P.flush(); }
index ef56b5fe8e6a161c40968d56e05692bcf9f031af..718d3394e211d19df3451b3ec4d557e06e68d7e4 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/DebugInfo/PDB/UDTLayout.h"
+#include "llvm/Support/Format.h"
 #include "llvm/Support/Regex.h"
 
 #include <algorithm>
@@ -60,10 +61,16 @@ LinePrinter::LinePrinter(int Indent, bool UseColor, llvm::raw_ostream &Stream)
              opts::pretty::IncludeCompilands.end());
 }
 
-void LinePrinter::Indent() { CurrentIndent += IndentSpaces; }
+void LinePrinter::Indent(uint32_t Amount) {
+  if (Amount == 0)
+    Amount = IndentSpaces;
+  CurrentIndent += Amount;
+}
 
-void LinePrinter::Unindent() {
-  CurrentIndent = std::max(0, CurrentIndent - IndentSpaces);
+void LinePrinter::Unindent(uint32_t Amount) {
+  if (Amount == 0)
+    Amount = IndentSpaces;
+  CurrentIndent = std::max<int>(0, CurrentIndent - Amount);
 }
 
 void LinePrinter::NewLine() {
@@ -71,6 +78,13 @@ void LinePrinter::NewLine() {
   OS.indent(CurrentIndent);
 }
 
+void LinePrinter::print(const Twine &T) { OS << T; }
+
+void LinePrinter::printLine(const Twine &T) {
+  NewLine();
+  OS << T;
+}
+
 bool LinePrinter::IsClassExcluded(const ClassLayout &Class) {
   if (IsTypeExcluded(Class.getName(), Class.getSize()))
     return true;
@@ -79,6 +93,19 @@ bool LinePrinter::IsClassExcluded(const ClassLayout &Class) {
   return false;
 }
 
+void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
+                               uint32_t StartOffset) {
+  NewLine();
+  OS << Label << " (";
+  if (!Data.empty()) {
+    OS << "\n";
+    OS << format_bytes_with_ascii(Data, StartOffset, 32, 4,
+                                  CurrentIndent + IndentSpaces, true);
+    NewLine();
+  }
+  OS << ")";
+}
+
 bool LinePrinter::IsTypeExcluded(llvm::StringRef TypeName, uint32_t Size) {
   if (IsItemExcluded(TypeName, IncludeTypeFilters, ExcludeTypeFilters))
     return true;
index 1a922feb1e6221d9164f4e2111a3cf02765c3e70..f4fd22bcb6f450523b69da8bf1db8625f285dd31 100644 (file)
 #ifndef LLVM_TOOLS_LLVMPDBDUMP_LINEPRINTER_H
 #define LLVM_TOOLS_LLVMPDBDUMP_LINEPRINTER_H
 
+#include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/Twine.h"
-#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/Regex.h"
+#include "llvm/Support/raw_ostream.h"
 
 #include <list>
 
@@ -28,10 +30,22 @@ class LinePrinter {
 public:
   LinePrinter(int Indent, bool UseColor, raw_ostream &Stream);
 
-  void Indent();
-  void Unindent();
+  void Indent(uint32_t Amount = 0);
+  void Unindent(uint32_t Amount = 0);
   void NewLine();
 
+  void printLine(const Twine &T);
+  void print(const Twine &T);
+  template <typename... Ts> void formatLine(const char *Fmt, Ts &&... Items) {
+    printLine(formatv(Fmt, std::forward<Ts>(Items)...));
+  }
+  template <typename... Ts> void format(const char *Fmt, Ts &&... Items) {
+    print(formatv(Fmt, std::forward<Ts>(Items)...));
+  }
+
+  void formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
+                    uint32_t StartOffset);
+
   bool hasColor() const { return UseColor; }
   raw_ostream &getStream() { return OS; }
   int getIndentLevel() const { return CurrentIndent; }
@@ -63,6 +77,17 @@ private:
   std::list<Regex> IncludeSymbolFilters;
 };
 
+struct AutoIndent {
+  explicit AutoIndent(LinePrinter &L, uint32_t Amount = 0)
+      : L(L), Amount(Amount) {
+    L.Indent(Amount);
+  }
+  ~AutoIndent() { L.Unindent(Amount); }
+
+  LinePrinter &L;
+  uint32_t Amount = 0;
+};
+
 template <class T>
 inline raw_ostream &operator<<(LinePrinter &Printer, const T &Item) {
   Printer.getStream() << Item;
diff --git a/tools/llvm-pdbutil/MinimalSymbolDumper.cpp b/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
new file mode 100644 (file)
index 0000000..013f89b
--- /dev/null
@@ -0,0 +1,753 @@
+//===- MinimalSymbolDumper.cpp -------------------------------- *- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MinimalSymbolDumper.h"
+
+#include "FormatUtil.h"
+#include "LinePrinter.h"
+
+#include "llvm/DebugInfo/CodeView/CVRecord.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/Formatters.h"
+#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/Support/FormatVariadic.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+using namespace llvm::pdb;
+
+static StringRef getSymbolKindName(SymbolKind K) {
+  switch (K) {
+#define SYMBOL_RECORD(EnumName, value, name)                                   \
+  case EnumName:                                                               \
+    return #EnumName;
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
+  default:
+    llvm_unreachable("Unknown symbol kind!");
+  }
+  return "";
+}
+
+static std::string formatLocalSymFlags(uint32_t IndentLevel,
+                                       LocalSymFlags Flags) {
+  std::vector<std::string> Opts;
+  if (Flags == LocalSymFlags::None)
+    return "none";
+
+  PUSH_FLAG(LocalSymFlags, IsParameter, Flags, "param");
+  PUSH_FLAG(LocalSymFlags, IsAddressTaken, Flags, "address is taken");
+  PUSH_FLAG(LocalSymFlags, IsCompilerGenerated, Flags, "compiler generated");
+  PUSH_FLAG(LocalSymFlags, IsAggregate, Flags, "aggregate");
+  PUSH_FLAG(LocalSymFlags, IsAggregated, Flags, "aggregated");
+  PUSH_FLAG(LocalSymFlags, IsAliased, Flags, "aliased");
+  PUSH_FLAG(LocalSymFlags, IsAlias, Flags, "alias");
+  PUSH_FLAG(LocalSymFlags, IsReturnValue, Flags, "return val");
+  PUSH_FLAG(LocalSymFlags, IsOptimizedOut, Flags, "optimized away");
+  PUSH_FLAG(LocalSymFlags, IsEnregisteredGlobal, Flags, "enreg global");
+  PUSH_FLAG(LocalSymFlags, IsEnregisteredStatic, Flags, "enreg static");
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+static std::string formatExportFlags(uint32_t IndentLevel, ExportFlags Flags) {
+  std::vector<std::string> Opts;
+  if (Flags == ExportFlags::None)
+    return "none";
+
+  PUSH_FLAG(ExportFlags, IsConstant, Flags, "constant");
+  PUSH_FLAG(ExportFlags, IsData, Flags, "data");
+  PUSH_FLAG(ExportFlags, IsPrivate, Flags, "private");
+  PUSH_FLAG(ExportFlags, HasNoName, Flags, "no name");
+  PUSH_FLAG(ExportFlags, HasExplicitOrdinal, Flags, "explicit ord");
+  PUSH_FLAG(ExportFlags, IsForwarder, Flags, "forwarder");
+
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+static std::string formatCompileSym2Flags(uint32_t IndentLevel,
+                                          CompileSym2Flags Flags) {
+  std::vector<std::string> Opts;
+  Flags &= ~CompileSym2Flags::SourceLanguageMask;
+  if (Flags == CompileSym2Flags::None)
+    return "none";
+
+  PUSH_FLAG(CompileSym2Flags, EC, Flags, "edit and continue");
+  PUSH_FLAG(CompileSym2Flags, NoDbgInfo, Flags, "no dbg info");
+  PUSH_FLAG(CompileSym2Flags, LTCG, Flags, "ltcg");
+  PUSH_FLAG(CompileSym2Flags, NoDataAlign, Flags, "no data align");
+  PUSH_FLAG(CompileSym2Flags, ManagedPresent, Flags, "has managed code");
+  PUSH_FLAG(CompileSym2Flags, SecurityChecks, Flags, "security checks");
+  PUSH_FLAG(CompileSym2Flags, HotPatch, Flags, "hot patchable");
+  PUSH_FLAG(CompileSym2Flags, CVTCIL, Flags, "cvtcil");
+  PUSH_FLAG(CompileSym2Flags, MSILModule, Flags, "msil module");
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+static std::string formatCompileSym3Flags(uint32_t IndentLevel,
+                                          CompileSym3Flags Flags) {
+  std::vector<std::string> Opts;
+  Flags &= ~CompileSym3Flags::SourceLanguageMask;
+
+  if (Flags == CompileSym3Flags::None)
+    return "none";
+
+  PUSH_FLAG(CompileSym3Flags, EC, Flags, "edit and continue");
+  PUSH_FLAG(CompileSym3Flags, NoDbgInfo, Flags, "no dbg info");
+  PUSH_FLAG(CompileSym3Flags, LTCG, Flags, "ltcg");
+  PUSH_FLAG(CompileSym3Flags, NoDataAlign, Flags, "no data align");
+  PUSH_FLAG(CompileSym3Flags, ManagedPresent, Flags, "has managed code");
+  PUSH_FLAG(CompileSym3Flags, SecurityChecks, Flags, "security checks");
+  PUSH_FLAG(CompileSym3Flags, HotPatch, Flags, "hot patchable");
+  PUSH_FLAG(CompileSym3Flags, CVTCIL, Flags, "cvtcil");
+  PUSH_FLAG(CompileSym3Flags, MSILModule, Flags, "msil module");
+  PUSH_FLAG(CompileSym3Flags, Sdl, Flags, "sdl");
+  PUSH_FLAG(CompileSym3Flags, PGO, Flags, "pgo");
+  PUSH_FLAG(CompileSym3Flags, Exp, Flags, "exp");
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+static std::string formatFrameProcedureOptions(uint32_t IndentLevel,
+                                               FrameProcedureOptions FPO) {
+  std::vector<std::string> Opts;
+  if (FPO == FrameProcedureOptions::None)
+    return "none";
+
+  PUSH_FLAG(FrameProcedureOptions, HasAlloca, FPO, "has alloca");
+  PUSH_FLAG(FrameProcedureOptions, HasSetJmp, FPO, "has setjmp");
+  PUSH_FLAG(FrameProcedureOptions, HasLongJmp, FPO, "has longjmp");
+  PUSH_FLAG(FrameProcedureOptions, HasInlineAssembly, FPO, "has inline asm");
+  PUSH_FLAG(FrameProcedureOptions, HasExceptionHandling, FPO, "has eh");
+  PUSH_FLAG(FrameProcedureOptions, MarkedInline, FPO, "marked inline");
+  PUSH_FLAG(FrameProcedureOptions, HasStructuredExceptionHandling, FPO,
+            "has seh");
+  PUSH_FLAG(FrameProcedureOptions, Naked, FPO, "naked");
+  PUSH_FLAG(FrameProcedureOptions, SecurityChecks, FPO, "secure checks");
+  PUSH_FLAG(FrameProcedureOptions, AsynchronousExceptionHandling, FPO,
+            "has async eh");
+  PUSH_FLAG(FrameProcedureOptions, NoStackOrderingForSecurityChecks, FPO,
+            "no stack order");
+  PUSH_FLAG(FrameProcedureOptions, Inlined, FPO, "inlined");
+  PUSH_FLAG(FrameProcedureOptions, StrictSecurityChecks, FPO,
+            "strict secure checks");
+  PUSH_FLAG(FrameProcedureOptions, SafeBuffers, FPO, "safe buffers");
+  PUSH_FLAG(FrameProcedureOptions, ProfileGuidedOptimization, FPO, "pgo");
+  PUSH_FLAG(FrameProcedureOptions, ValidProfileCounts, FPO,
+            "has profile counts");
+  PUSH_FLAG(FrameProcedureOptions, OptimizedForSpeed, FPO, "opt speed");
+  PUSH_FLAG(FrameProcedureOptions, GuardCfg, FPO, "guard cfg");
+  PUSH_FLAG(FrameProcedureOptions, GuardCfw, FPO, "guard cfw");
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+static std::string formatProcSymFlags(uint32_t IndentLevel,
+                                      ProcSymFlags Flags) {
+  std::vector<std::string> Opts;
+  if (Flags == ProcSymFlags::None)
+    return "none";
+
+  PUSH_FLAG(ProcSymFlags, HasFP, Flags, "has fp");
+  PUSH_FLAG(ProcSymFlags, HasIRET, Flags, "has iret");
+  PUSH_FLAG(ProcSymFlags, HasFRET, Flags, "has fret");
+  PUSH_FLAG(ProcSymFlags, IsNoReturn, Flags, "noreturn");
+  PUSH_FLAG(ProcSymFlags, IsUnreachable, Flags, "unreachable");
+  PUSH_FLAG(ProcSymFlags, HasCustomCallingConv, Flags, "custom calling conv");
+  PUSH_FLAG(ProcSymFlags, IsNoInline, Flags, "noinline");
+  PUSH_FLAG(ProcSymFlags, HasOptimizedDebugInfo, Flags, "opt debuginfo");
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+static std::string formatThunkOrdinal(ThunkOrdinal Ordinal) {
+  switch (Ordinal) {
+    RETURN_CASE(ThunkOrdinal, Standard, "thunk");
+    RETURN_CASE(ThunkOrdinal, ThisAdjustor, "this adjustor");
+    RETURN_CASE(ThunkOrdinal, Vcall, "vcall");
+    RETURN_CASE(ThunkOrdinal, Pcode, "pcode");
+    RETURN_CASE(ThunkOrdinal, UnknownLoad, "unknown load");
+    RETURN_CASE(ThunkOrdinal, TrampIncremental, "tramp incremental");
+    RETURN_CASE(ThunkOrdinal, BranchIsland, "branch island");
+  default:
+    return formatUnknownEnum(Ordinal);
+  }
+}
+
+static std::string formatTrampolineType(TrampolineType Tramp) {
+  switch (Tramp) {
+    RETURN_CASE(TrampolineType, TrampIncremental, "tramp incremental");
+    RETURN_CASE(TrampolineType, BranchIsland, "branch island");
+  default:
+    return formatUnknownEnum(Tramp);
+  }
+}
+
+static std::string formatSourceLanguage(SourceLanguage Lang) {
+  switch (Lang) {
+    RETURN_CASE(SourceLanguage, C, "c");
+    RETURN_CASE(SourceLanguage, Cpp, "c++");
+    RETURN_CASE(SourceLanguage, Fortran, "fortran");
+    RETURN_CASE(SourceLanguage, Masm, "masm");
+    RETURN_CASE(SourceLanguage, Pascal, "pascal");
+    RETURN_CASE(SourceLanguage, Basic, "basic");
+    RETURN_CASE(SourceLanguage, Cobol, "cobol");
+    RETURN_CASE(SourceLanguage, Link, "link");
+    RETURN_CASE(SourceLanguage, Cvtres, "cvtres");
+    RETURN_CASE(SourceLanguage, Cvtpgd, "cvtpgd");
+    RETURN_CASE(SourceLanguage, CSharp, "c#");
+    RETURN_CASE(SourceLanguage, ILAsm, "il asm");
+    RETURN_CASE(SourceLanguage, Java, "java");
+    RETURN_CASE(SourceLanguage, JScript, "javascript");
+    RETURN_CASE(SourceLanguage, MSIL, "msil");
+    RETURN_CASE(SourceLanguage, HLSL, "hlsl");
+  default:
+    return formatUnknownEnum(Lang);
+  }
+}
+
+static std::string formatMachineType(CPUType Cpu) {
+  switch (Cpu) {
+    RETURN_CASE(CPUType, Intel8080, "intel 8080");
+    RETURN_CASE(CPUType, Intel8086, "intel 8086");
+    RETURN_CASE(CPUType, Intel80286, "intel 80286");
+    RETURN_CASE(CPUType, Intel80386, "intel 80386");
+    RETURN_CASE(CPUType, Intel80486, "intel 80486");
+    RETURN_CASE(CPUType, Pentium, "intel pentium");
+    RETURN_CASE(CPUType, PentiumPro, "intel pentium pro");
+    RETURN_CASE(CPUType, Pentium3, "intel pentium 3");
+    RETURN_CASE(CPUType, MIPS, "mips");
+    RETURN_CASE(CPUType, MIPS16, "mips-16");
+    RETURN_CASE(CPUType, MIPS32, "mips-32");
+    RETURN_CASE(CPUType, MIPS64, "mips-64");
+    RETURN_CASE(CPUType, MIPSI, "mips i");
+    RETURN_CASE(CPUType, MIPSII, "mips ii");
+    RETURN_CASE(CPUType, MIPSIII, "mips iii");
+    RETURN_CASE(CPUType, MIPSIV, "mips iv");
+    RETURN_CASE(CPUType, MIPSV, "mips v");
+    RETURN_CASE(CPUType, M68000, "motorola 68000");
+    RETURN_CASE(CPUType, M68010, "motorola 68010");
+    RETURN_CASE(CPUType, M68020, "motorola 68020");
+    RETURN_CASE(CPUType, M68030, "motorola 68030");
+    RETURN_CASE(CPUType, M68040, "motorola 68040");
+    RETURN_CASE(CPUType, Alpha, "alpha");
+    RETURN_CASE(CPUType, Alpha21164, "alpha 21164");
+    RETURN_CASE(CPUType, Alpha21164A, "alpha 21164a");
+    RETURN_CASE(CPUType, Alpha21264, "alpha 21264");
+    RETURN_CASE(CPUType, Alpha21364, "alpha 21364");
+    RETURN_CASE(CPUType, PPC601, "powerpc 601");
+    RETURN_CASE(CPUType, PPC603, "powerpc 603");
+    RETURN_CASE(CPUType, PPC604, "powerpc 604");
+    RETURN_CASE(CPUType, PPC620, "powerpc 620");
+    RETURN_CASE(CPUType, PPCFP, "powerpc fp");
+    RETURN_CASE(CPUType, PPCBE, "powerpc be");
+    RETURN_CASE(CPUType, SH3, "sh3");
+    RETURN_CASE(CPUType, SH3E, "sh3e");
+    RETURN_CASE(CPUType, SH3DSP, "sh3 dsp");
+    RETURN_CASE(CPUType, SH4, "sh4");
+    RETURN_CASE(CPUType, SHMedia, "shmedia");
+    RETURN_CASE(CPUType, ARM3, "arm 3");
+    RETURN_CASE(CPUType, ARM4, "arm 4");
+    RETURN_CASE(CPUType, ARM4T, "arm 4t");
+    RETURN_CASE(CPUType, ARM5, "arm 5");
+    RETURN_CASE(CPUType, ARM5T, "arm 5t");
+    RETURN_CASE(CPUType, ARM6, "arm 6");
+    RETURN_CASE(CPUType, ARM_XMAC, "arm xmac");
+    RETURN_CASE(CPUType, ARM_WMMX, "arm wmmx");
+    RETURN_CASE(CPUType, ARM7, "arm 7");
+    RETURN_CASE(CPUType, Omni, "omni");
+    RETURN_CASE(CPUType, Ia64, "intel itanium ia64");
+    RETURN_CASE(CPUType, Ia64_2, "intel itanium ia64 2");
+    RETURN_CASE(CPUType, CEE, "cee");
+    RETURN_CASE(CPUType, AM33, "am33");
+    RETURN_CASE(CPUType, M32R, "m32r");
+    RETURN_CASE(CPUType, TriCore, "tri-core");
+    RETURN_CASE(CPUType, X64, "intel x86-x64");
+    RETURN_CASE(CPUType, EBC, "ebc");
+    RETURN_CASE(CPUType, Thumb, "thumb");
+    RETURN_CASE(CPUType, ARMNT, "arm nt");
+    RETURN_CASE(CPUType, D3D11_Shader, "d3d11 shader");
+  default:
+    return formatUnknownEnum(Cpu);
+  }
+}
+
+static std::string formatCookieKind(FrameCookieKind Kind) {
+  switch (Kind) {
+    RETURN_CASE(FrameCookieKind, Copy, "copy");
+    RETURN_CASE(FrameCookieKind, XorStackPointer, "xor stack ptr");
+    RETURN_CASE(FrameCookieKind, XorFramePointer, "xor frame ptr");
+    RETURN_CASE(FrameCookieKind, XorR13, "xor rot13");
+  default:
+    return formatUnknownEnum(Kind);
+  }
+}
+
+static std::string formatRegisterId(RegisterId Id) {
+  switch (Id) {
+    RETURN_CASE(RegisterId, VFrame, "vframe");
+    RETURN_CASE(RegisterId, AL, "al");
+    RETURN_CASE(RegisterId, CL, "cl");
+    RETURN_CASE(RegisterId, DL, "dl");
+    RETURN_CASE(RegisterId, BL, "bl");
+    RETURN_CASE(RegisterId, AH, "ah");
+    RETURN_CASE(RegisterId, CH, "ch");
+    RETURN_CASE(RegisterId, DH, "dh");
+    RETURN_CASE(RegisterId, BH, "bh");
+    RETURN_CASE(RegisterId, AX, "ax");
+    RETURN_CASE(RegisterId, CX, "cx");
+    RETURN_CASE(RegisterId, DX, "dx");
+    RETURN_CASE(RegisterId, BX, "bx");
+    RETURN_CASE(RegisterId, SP, "sp");
+    RETURN_CASE(RegisterId, BP, "bp");
+    RETURN_CASE(RegisterId, SI, "si");
+    RETURN_CASE(RegisterId, DI, "di");
+    RETURN_CASE(RegisterId, EAX, "eax");
+    RETURN_CASE(RegisterId, ECX, "ecx");
+    RETURN_CASE(RegisterId, EDX, "edx");
+    RETURN_CASE(RegisterId, EBX, "ebx");
+    RETURN_CASE(RegisterId, ESP, "esp");
+    RETURN_CASE(RegisterId, EBP, "ebp");
+    RETURN_CASE(RegisterId, ESI, "esi");
+    RETURN_CASE(RegisterId, EDI, "edi");
+    RETURN_CASE(RegisterId, ES, "es");
+    RETURN_CASE(RegisterId, CS, "cs");
+    RETURN_CASE(RegisterId, SS, "ss");
+    RETURN_CASE(RegisterId, DS, "ds");
+    RETURN_CASE(RegisterId, FS, "fs");
+    RETURN_CASE(RegisterId, GS, "gs");
+    RETURN_CASE(RegisterId, IP, "ip");
+    RETURN_CASE(RegisterId, RAX, "rax");
+    RETURN_CASE(RegisterId, RBX, "rbx");
+    RETURN_CASE(RegisterId, RCX, "rcx");
+    RETURN_CASE(RegisterId, RDX, "rdx");
+    RETURN_CASE(RegisterId, RSI, "rsi");
+    RETURN_CASE(RegisterId, RDI, "rdi");
+    RETURN_CASE(RegisterId, RBP, "rbp");
+    RETURN_CASE(RegisterId, RSP, "rsp");
+    RETURN_CASE(RegisterId, R8, "r8");
+    RETURN_CASE(RegisterId, R9, "r9");
+    RETURN_CASE(RegisterId, R10, "r10");
+    RETURN_CASE(RegisterId, R11, "r11");
+    RETURN_CASE(RegisterId, R12, "r12");
+    RETURN_CASE(RegisterId, R13, "r13");
+    RETURN_CASE(RegisterId, R14, "r14");
+    RETURN_CASE(RegisterId, R15, "r15");
+  default:
+    return formatUnknownEnum(Id);
+  }
+}
+
+static std::string formatRange(LocalVariableAddrRange Range) {
+  return formatv("[{0},+{1})",
+                 formatSegmentOffset(Range.ISectStart, Range.OffsetStart),
+                 Range.Range)
+      .str();
+}
+
+static std::string formatGaps(uint32_t IndentLevel,
+                              ArrayRef<LocalVariableAddrGap> Gaps) {
+  std::vector<std::string> GapStrs;
+  for (const auto &G : Gaps) {
+    GapStrs.push_back(formatv("({0},{1})", G.GapStartOffset, G.Range).str());
+  }
+  return typesetItemList(GapStrs, 7, IndentLevel, ", ");
+}
+
+Error MinimalSymbolDumper::visitSymbolBegin(codeview::CVSymbol &Record) {
+  // formatLine puts the newline at the beginning, so we use formatLine here
+  // to start a new line, and then individual visit methods use format to
+  // append to the existing line.
+  P.formatLine("- {0} [size = {1}]", getSymbolKindName(Record.Type),
+               Record.length());
+  P.Indent();
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitSymbolEnd(CVSymbol &Record) {
+  P.Unindent();
+  return Error::success();
+}
+
+std::string MinimalSymbolDumper::typeIndex(TypeIndex TI) const {
+  if (TI.isSimple())
+    return formatv("{0}", TI).str();
+  StringRef Name = Types.getTypeName(TI);
+  if (Name.size() > 32) {
+    Name = Name.take_front(32);
+    return formatv("{0} ({1}...)", TI, Name);
+  } else
+    return formatv("{0} ({1})", TI, Name);
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
+  P.format(" `{0}`", Block.Name);
+  AutoIndent Indent(P);
+  P.formatLine("parent = {0}, addr = {1}", Block.Parent,
+               formatSegmentOffset(Block.Segment, Block.CodeOffset));
+  P.formatLine("code size = {0}, end = {1}", Block.CodeSize, Block.End);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
+  P.format(" `{0}`", Thunk.Name);
+  AutoIndent Indent(P);
+  P.formatLine("parent = {0}, addr = {1}", Thunk.Parent,
+               formatSegmentOffset(Thunk.Segment, Thunk.Offset));
+  P.formatLine("kind = {0}, size = {1}, end = {2}, next = {3}",
+               formatThunkOrdinal(Thunk.Thunk), Thunk.Length, Thunk.End,
+               Thunk.Next);
+
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            TrampolineSym &Tramp) {
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, size = {1}, source = {2}, target = {3}",
+               formatTrampolineType(Tramp.Type), Tramp.Size,
+               formatSegmentOffset(Tramp.ThunkSection, Tramp.ThunkOffset),
+               formatSegmentOffset(Tramp.TargetSection, Tramp.ThunkOffset));
+
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            SectionSym &Section) {
+  P.format(" `{0}`", Section.Name);
+  AutoIndent Indent(P);
+  P.formatLine("length = {0}, alignment = {1}, rva = {2}, section # = {3}, "
+               "characteristics = {4}",
+               Section.Length, Section.Alignment, Section.Rva,
+               Section.SectionNumber, Section.Characteristics);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CoffGroupSym &CG) {
+  P.format(" `{0}`", CG.Name);
+  AutoIndent Indent(P);
+  P.formatLine("length = {0}, addr = {1}, characteristics = {2}", CG.Size,
+               formatSegmentOffset(CG.Segment, CG.Offset), CG.Characteristics);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            BPRelativeSym &BPRel) {
+  P.format(" `{0}`", BPRel.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, offset = {1}", typeIndex(BPRel.Type), BPRel.Offset);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            BuildInfoSym &BuildInfo) {
+  P.format(" BuildId = `{0}`", BuildInfo.BuildId);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            CallSiteInfoSym &CSI) {
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, addr = {1}", typeIndex(CSI.Type),
+               formatSegmentOffset(CSI.Segment, CSI.CodeOffset));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            EnvBlockSym &EnvBlock) {
+  for (const auto &Entry : EnvBlock.Fields) {
+    P.formatLine("- {0}", Entry);
+  }
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FileStaticSym &FS) {
+  P.format(" `{0}`", FS.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, file name offset = {1}, flags = {2}",
+               typeIndex(FS.Index), FS.ModFilenameOffset,
+               formatLocalSymFlags(P.getIndentLevel() + 9, FS.Flags));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
+  P.format(" `{0}`", Export.Name);
+  AutoIndent Indent(P);
+  P.formatLine("ordinal = {0}, flags = {1}", Export.Ordinal,
+               formatExportFlags(P.getIndentLevel() + 9, Export.Flags));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            Compile2Sym &Compile2) {
+  AutoIndent Indent(P);
+  SourceLanguage Lang = static_cast<SourceLanguage>(
+      Compile2.Flags & CompileSym2Flags::SourceLanguageMask);
+  P.formatLine("machine = {0}, ver = {1}, language = {2}",
+               formatMachineType(Compile2.Machine), Compile2.Version,
+               formatSourceLanguage(Lang));
+  P.formatLine("frontend = {0}.{1}.{2}, backend = {3}.{4}.{5}",
+               Compile2.VersionFrontendMajor, Compile2.VersionFrontendMinor,
+               Compile2.VersionFrontendBuild, Compile2.VersionBackendMajor,
+               Compile2.VersionBackendMinor, Compile2.VersionBackendBuild);
+  P.formatLine("flags = {0}",
+               formatCompileSym2Flags(P.getIndentLevel() + 9, Compile2.Flags));
+  P.formatLine(
+      "extra strings = {0}",
+      typesetStringList(P.getIndentLevel() + 9 + 2, Compile2.ExtraStrings));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            Compile3Sym &Compile3) {
+  AutoIndent Indent(P);
+  SourceLanguage Lang = static_cast<SourceLanguage>(
+      Compile3.Flags & CompileSym3Flags::SourceLanguageMask);
+  P.formatLine("machine = {0}, Ver = {1}, language = {2}",
+               formatMachineType(Compile3.Machine), Compile3.Version,
+               formatSourceLanguage(Lang));
+  P.formatLine("frontend = {0}.{1}.{2}.{3}, backend = {4}.{5}.{6}.{7}",
+               Compile3.VersionFrontendMajor, Compile3.VersionFrontendMinor,
+               Compile3.VersionFrontendBuild, Compile3.VersionFrontendQFE,
+               Compile3.VersionBackendMajor, Compile3.VersionBackendMinor,
+               Compile3.VersionBackendBuild, Compile3.VersionBackendQFE);
+  P.formatLine("flags = {0}",
+               formatCompileSym3Flags(P.getIndentLevel() + 9, Compile3.Flags));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            ConstantSym &Constant) {
+  P.format(" `{0}`", Constant.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, value = {1}", typeIndex(Constant.Type),
+               Constant.Value.toString(10));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
+  P.format(" `{0}`", Data.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, addr = {1}", typeIndex(Data.Type),
+               formatSegmentOffset(Data.Segment, Data.DataOffset));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(
+    CVSymbol &CVR, DefRangeFramePointerRelFullScopeSym &Def) {
+  P.format(" offset = {0}", Def.Offset);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            DefRangeFramePointerRelSym &Def) {
+  AutoIndent Indent(P);
+  P.formatLine("offset = {0}, range = {1}", Def.Offset, formatRange(Def.Range));
+  P.formatLine("gaps = {2}", Def.Offset,
+               formatGaps(P.getIndentLevel() + 9, Def.Gaps));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            DefRangeRegisterRelSym &Def) {
+  AutoIndent Indent(P);
+  P.formatLine("register = {0}, base ptr = {1}, offset in parent = {2}, has "
+               "spilled udt = {3}",
+               uint16_t(Def.Hdr.Register), int32_t(Def.Hdr.BasePointerOffset),
+               Def.offsetInParent(), Def.hasSpilledUDTMember());
+  P.formatLine("range = {0}, gaps = {1}", formatRange(Def.Range),
+               formatGaps(P.getIndentLevel() + 9, Def.Gaps));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(
+    CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
+  AutoIndent Indent(P);
+  P.formatLine("register = {0}, may have no name = {1}, range start = "
+               "{2}, length = {3}",
+               uint16_t(DefRangeRegister.Hdr.Register),
+               uint16_t(DefRangeRegister.Hdr.MayHaveNoName),
+               formatSegmentOffset(DefRangeRegister.Range.ISectStart,
+                                   DefRangeRegister.Range.OffsetStart),
+               DefRangeRegister.Range.Range);
+  P.formatLine("gaps = [{0}]",
+               formatGaps(P.getIndentLevel() + 9, DefRangeRegister.Gaps));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            DefRangeSubfieldRegisterSym &Def) {
+  AutoIndent Indent(P);
+  bool NoName = !!(Def.Hdr.MayHaveNoName == 0);
+  P.formatLine("register = {0}, may have no name = {1}, offset in parent = {2}",
+               uint16_t(Def.Hdr.Register), NoName,
+               uint32_t(Def.Hdr.OffsetInParent));
+  P.formatLine("range = {0}, gaps = {1}", formatRange(Def.Range),
+               formatGaps(P.getIndentLevel() + 9, Def.Gaps));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            DefRangeSubfieldSym &Def) {
+  AutoIndent Indent(P);
+  P.formatLine("program = {0}, offset in parent = {1}, range = {2}",
+               Def.Program, Def.OffsetInParent, formatRange(Def.Range));
+  P.formatLine("gaps = {0}", formatGaps(P.getIndentLevel() + 9, Def.Gaps));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeSym &Def) {
+  AutoIndent Indent(P);
+  P.formatLine("program = {0}, range = {1}", Def.Program,
+               formatRange(Def.Range));
+  P.formatLine("gaps = {0}", formatGaps(P.getIndentLevel() + 9, Def.Gaps));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameCookieSym &FC) {
+  AutoIndent Indent(P);
+  P.formatLine("code offset = {0}, Register = {1}, kind = {2}, flags = {3}",
+               FC.CodeOffset, FC.Register, formatCookieKind(FC.CookieKind),
+               FC.Flags);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameProcSym &FP) {
+  AutoIndent Indent(P);
+  P.formatLine("size = {0}, padding size = {1}, offset to padding = {2}",
+               FP.TotalFrameBytes, FP.PaddingFrameBytes, FP.OffsetToPadding);
+  P.formatLine("bytes of callee saved registers = {0}, exception handler addr "
+               "= {1}",
+               FP.BytesOfCalleeSavedRegisters,
+               formatSegmentOffset(FP.SectionIdOfExceptionHandler,
+                                   FP.OffsetOfExceptionHandler));
+  P.formatLine("flags = {0}",
+               formatFrameProcedureOptions(P.getIndentLevel() + 9, FP.Flags));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            HeapAllocationSiteSym &HAS) {
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, addr = {1} call size = {2}", typeIndex(HAS.Type),
+               formatSegmentOffset(HAS.Segment, HAS.CodeOffset),
+               HAS.CallInstructionSize);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, InlineSiteSym &IS) {
+  AutoIndent Indent(P);
+  auto Bytes = makeArrayRef(IS.AnnotationData);
+  StringRef Annotations(reinterpret_cast<const char *>(Bytes.begin()),
+                        Bytes.size());
+
+  P.formatLine("inlinee = {0}, parent = {1}, end = {2}", typeIndex(IS.Inlinee),
+               IS.Parent, IS.End);
+  P.formatLine("annotations = {0}", toHex(Annotations));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            RegisterSym &Register) {
+  P.format(" `{0}`", Register.Name);
+  AutoIndent Indent(P);
+  P.formatLine("register = {0}, type = {1}",
+               formatRegisterId(Register.Register), typeIndex(Register.Index));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            PublicSym32 &Public) {
+  P.format(" `{0}`", Public.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, addr = {1}", typeIndex(Public.Index),
+               formatSegmentOffset(Public.Segment, Public.Offset));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcRefSym &PR) {
+  P.format(" `{0}`", PR.Name);
+  AutoIndent Indent(P);
+  P.formatLine("module = {0}, sum name = {1}, offset = {2}", PR.Module,
+               PR.SumName, PR.SymOffset);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
+  P.format(" `{0}` (addr = {1})", Label.Name,
+           formatSegmentOffset(Label.Segment, Label.CodeOffset));
+  AutoIndent Indent(P);
+  P.formatLine("flags = {0}",
+               formatProcSymFlags(P.getIndentLevel() + 9, Label.Flags));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
+  P.format(" `{0}`", Local.Name);
+  AutoIndent Indent(P);
+
+  std::string FlagStr =
+      formatLocalSymFlags(P.getIndentLevel() + 9, Local.Flags);
+  P.formatLine("type={0}, flags = {1}", typeIndex(Local.Type), FlagStr);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            ObjNameSym &ObjName) {
+  P.format(" sig={0}, `{1}`", ObjName.Signature, ObjName.Name);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
+  P.format(" `{0}`", Proc.Name);
+  AutoIndent Indent(P);
+  P.formatLine("parent = {0}, addr = {1}, code size = {2}, end = {3}",
+               Proc.Parent, formatSegmentOffset(Proc.Segment, Proc.CodeOffset),
+               Proc.CodeSize, Proc.End);
+  P.formatLine("debug start = {0}, debug end = {1}, flags = {2}", Proc.DbgStart,
+               Proc.DbgEnd,
+               formatProcSymFlags(P.getIndentLevel() + 9, Proc.Flags));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            ScopeEndSym &ScopeEnd) {
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
+  AutoIndent Indent(P);
+  for (const auto &I : Caller.Indices) {
+    P.formatLine("callee: {0}", typeIndex(I));
+  }
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            RegRelativeSym &RegRel) {
+  P.format(" `{0}`", RegRel.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, register = {1}, offset = {2}",
+               typeIndex(RegRel.Type), formatRegisterId(RegRel.Register),
+               RegRel.Offset);
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
+                                            ThreadLocalDataSym &Data) {
+  P.format(" `{0}`", Data.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, addr = {1}", typeIndex(Data.Type),
+               formatSegmentOffset(Data.Segment, Data.DataOffset));
+  return Error::success();
+}
+
+Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
+  P.format(" `{0}`", UDT.Name);
+  AutoIndent Indent(P);
+  P.formatLine("original type = {0}", UDT.Type);
+  return Error::success();
+}
diff --git a/tools/llvm-pdbutil/MinimalSymbolDumper.h b/tools/llvm-pdbutil/MinimalSymbolDumper.h
new file mode 100644 (file)
index 0000000..d185111
--- /dev/null
@@ -0,0 +1,49 @@
+//===- MinimalSymbolDumper.h ---------------------------------- *- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVMPDBUTIL_MINIMAL_SYMBOL_DUMPER_H
+#define LLVM_TOOLS_LLVMPDBUTIL_MINIMAL_SYMBOL_DUMPER_H
+
+#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
+
+namespace llvm {
+namespace codeview {
+class LazyRandomTypeCollection;
+}
+
+namespace pdb {
+class LinePrinter;
+
+class MinimalSymbolDumper : public codeview::SymbolVisitorCallbacks {
+public:
+  MinimalSymbolDumper(LinePrinter &P, bool RecordBytes,
+                      codeview::LazyRandomTypeCollection &Types)
+      : P(P), RecordBytes(RecordBytes), Types(Types) {}
+
+  virtual Error visitSymbolBegin(codeview::CVSymbol &Record);
+  virtual Error visitSymbolEnd(codeview::CVSymbol &Record);
+
+#define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
+  virtual Error visitKnownRecord(codeview::CVSymbol &CVR,                      \
+                                 codeview::Name &Record) override;
+#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
+
+private:
+  std::string typeIndex(codeview::TypeIndex TI) const;
+
+  uint32_t Width;
+  LinePrinter &P;
+  bool RecordBytes = false;
+  codeview::LazyRandomTypeCollection &Types;
+};
+} // namespace pdb
+} // namespace llvm
+
+#endif
\ No newline at end of file
diff --git a/tools/llvm-pdbutil/MinimalTypeDumper.cpp b/tools/llvm-pdbutil/MinimalTypeDumper.cpp
new file mode 100644 (file)
index 0000000..185dd40
--- /dev/null
@@ -0,0 +1,535 @@
+//===- MinimalTypeDumper.cpp ---------------------------------- *- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MinimalTypeDumper.h"
+
+#include "FormatUtil.h"
+#include "LinePrinter.h"
+
+#include "llvm/DebugInfo/CodeView/CVRecord.h"
+#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/Formatters.h"
+#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/MathExtras.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+using namespace llvm::pdb;
+
+static StringRef getLeafTypeName(TypeLeafKind K) {
+  switch (K) {
+#define TYPE_RECORD(EnumName, value, name)                                     \
+  case EnumName:                                                               \
+    return #EnumName;
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+  default:
+    llvm_unreachable("Unknown type leaf kind!");
+  }
+  return "";
+}
+
+static std::string formatClassOptions(uint32_t IndentLevel,
+                                      ClassOptions Options) {
+  std::vector<std::string> Opts;
+  PUSH_FLAG(ClassOptions, HasConstructorOrDestructor, Options,
+            "has ctor / dtor");
+  PUSH_FLAG(ClassOptions, ContainsNestedClass, Options,
+            "contains nested class");
+  PUSH_FLAG(ClassOptions, HasConversionOperator, Options,
+            "conversion operator");
+  PUSH_FLAG(ClassOptions, ForwardReference, Options, "forward ref");
+  PUSH_FLAG(ClassOptions, HasUniqueName, Options, "has unique name");
+  PUSH_FLAG(ClassOptions, Intrinsic, Options, "intrin");
+  PUSH_FLAG(ClassOptions, Nested, Options, "is nested");
+  PUSH_FLAG(ClassOptions, HasOverloadedOperator, Options,
+            "overloaded operator");
+  PUSH_FLAG(ClassOptions, HasOverloadedAssignmentOperator, Options,
+            "overloaded operator=");
+  PUSH_FLAG(ClassOptions, Packed, Options, "packed");
+  PUSH_FLAG(ClassOptions, Scoped, Options, "scoped");
+  PUSH_FLAG(ClassOptions, Sealed, Options, "sealed");
+
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+static std::string pointerOptions(PointerOptions Options) {
+  std::vector<std::string> Opts;
+  PUSH_FLAG(PointerOptions, Flat32, Options, "flat32");
+  PUSH_FLAG(PointerOptions, Volatile, Options, "volatile");
+  PUSH_FLAG(PointerOptions, Const, Options, "const");
+  PUSH_FLAG(PointerOptions, Unaligned, Options, "unaligned");
+  PUSH_FLAG(PointerOptions, Restrict, Options, "restrict");
+  PUSH_FLAG(PointerOptions, WinRTSmartPointer, Options, "winrt");
+  if (Opts.empty())
+    return "None";
+  return join(Opts, " | ");
+}
+
+static std::string modifierOptions(ModifierOptions Options) {
+  std::vector<std::string> Opts;
+  PUSH_FLAG(ModifierOptions, Const, Options, "const");
+  PUSH_FLAG(ModifierOptions, Volatile, Options, "volatile");
+  PUSH_FLAG(ModifierOptions, Unaligned, Options, "unaligned");
+  if (Opts.empty())
+    return "None";
+  return join(Opts, " | ");
+}
+
+static std::string formatCallingConvention(CallingConvention Convention) {
+  switch (Convention) {
+    RETURN_CASE(CallingConvention, AlphaCall, "alphacall");
+    RETURN_CASE(CallingConvention, AM33Call, "am33call");
+    RETURN_CASE(CallingConvention, ArmCall, "armcall");
+    RETURN_CASE(CallingConvention, ClrCall, "clrcall");
+    RETURN_CASE(CallingConvention, FarC, "far cdecl");
+    RETURN_CASE(CallingConvention, FarFast, "far fastcall");
+    RETURN_CASE(CallingConvention, FarPascal, "far pascal");
+    RETURN_CASE(CallingConvention, FarStdCall, "far stdcall");
+    RETURN_CASE(CallingConvention, FarSysCall, "far syscall");
+    RETURN_CASE(CallingConvention, Generic, "generic");
+    RETURN_CASE(CallingConvention, Inline, "inline");
+    RETURN_CASE(CallingConvention, M32RCall, "m32rcall");
+    RETURN_CASE(CallingConvention, MipsCall, "mipscall");
+    RETURN_CASE(CallingConvention, NearC, "cdecl");
+    RETURN_CASE(CallingConvention, NearFast, "fastcall");
+    RETURN_CASE(CallingConvention, NearPascal, "pascal");
+    RETURN_CASE(CallingConvention, NearStdCall, "stdcall");
+    RETURN_CASE(CallingConvention, NearVector, "vectorcall");
+    RETURN_CASE(CallingConvention, PpcCall, "ppccall");
+    RETURN_CASE(CallingConvention, SH5Call, "sh5call");
+    RETURN_CASE(CallingConvention, ThisCall, "thiscall");
+    RETURN_CASE(CallingConvention, TriCall, "tricall");
+  default:
+    return formatUnknownEnum(Convention);
+  }
+  return "";
+}
+
+static std::string formatPointerMode(PointerMode Mode) {
+  switch (Mode) {
+    RETURN_CASE(PointerMode, LValueReference, "ref");
+    RETURN_CASE(PointerMode, Pointer, "pointer");
+    RETURN_CASE(PointerMode, PointerToDataMember, "data member pointer");
+    RETURN_CASE(PointerMode, PointerToMemberFunction, "member fn pointer");
+    RETURN_CASE(PointerMode, RValueReference, "rvalue ref");
+  default:
+    return formatUnknownEnum(Mode);
+  }
+}
+
+static std::string memberAccess(MemberAccess Access) {
+  switch (Access) {
+    RETURN_CASE(MemberAccess, Private, "private");
+    RETURN_CASE(MemberAccess, Protected, "protected");
+    RETURN_CASE(MemberAccess, Public, "public");
+  default:
+    return formatUnknownEnum(Access);
+  }
+}
+
+static std::string methodKind(MethodKind Kind) {
+  switch (Kind) {
+    RETURN_CASE(MethodKind, Vanilla, "");
+    RETURN_CASE(MethodKind, Virtual, "virtual");
+    RETURN_CASE(MethodKind, Static, "static");
+    RETURN_CASE(MethodKind, Friend, "friend");
+    RETURN_CASE(MethodKind, IntroducingVirtual, "intro virtual");
+    RETURN_CASE(MethodKind, PureVirtual, "pure virtual");
+    RETURN_CASE(MethodKind, PureIntroducingVirtual, "pure intro virtual");
+  default:
+    return formatUnknownEnum(Kind);
+  }
+}
+
+static std::string pointerKind(PointerKind Kind) {
+  switch (Kind) {
+    RETURN_CASE(PointerKind, Near16, "ptr16");
+    RETURN_CASE(PointerKind, Far16, "far ptr16");
+    RETURN_CASE(PointerKind, Huge16, "huge ptr16");
+    RETURN_CASE(PointerKind, BasedOnSegment, "segment based");
+    RETURN_CASE(PointerKind, BasedOnValue, "value based");
+    RETURN_CASE(PointerKind, BasedOnSegmentValue, "segment value based");
+    RETURN_CASE(PointerKind, BasedOnAddress, "address based");
+    RETURN_CASE(PointerKind, BasedOnSegmentAddress, "segment address based");
+    RETURN_CASE(PointerKind, BasedOnType, "type based");
+    RETURN_CASE(PointerKind, BasedOnSelf, "self based");
+    RETURN_CASE(PointerKind, Near32, "ptr32");
+    RETURN_CASE(PointerKind, Far32, "far ptr32");
+    RETURN_CASE(PointerKind, Near64, "ptr64");
+  default:
+    return formatUnknownEnum(Kind);
+  }
+}
+
+static std::string memberAttributes(const MemberAttributes &Attrs) {
+  std::vector<std::string> Opts;
+  std::string Access = memberAccess(Attrs.getAccess());
+  std::string Kind = methodKind(Attrs.getMethodKind());
+  if (!Access.empty())
+    Opts.push_back(Access);
+  if (!Kind.empty())
+    Opts.push_back(Kind);
+  MethodOptions Flags = Attrs.getFlags();
+  PUSH_FLAG(MethodOptions, Pseudo, Flags, "pseudo");
+  PUSH_FLAG(MethodOptions, NoInherit, Flags, "noinherit");
+  PUSH_FLAG(MethodOptions, NoConstruct, Flags, "noconstruct");
+  PUSH_FLAG(MethodOptions, CompilerGenerated, Flags, "compiler-generated");
+  PUSH_FLAG(MethodOptions, Sealed, Flags, "sealed");
+  return join(Opts, " ");
+}
+
+static std::string formatPointerAttrs(const PointerRecord &Record) {
+  PointerMode Mode = Record.getMode();
+  PointerOptions Opts = Record.getOptions();
+  PointerKind Kind = Record.getPointerKind();
+  return formatv("mode = {0}, opts = {1}, kind = {2}", formatPointerMode(Mode),
+                 pointerOptions(Opts), pointerKind(Kind));
+}
+
+static std::string formatFunctionOptions(FunctionOptions Options) {
+  std::vector<std::string> Opts;
+
+  PUSH_FLAG(FunctionOptions, CxxReturnUdt, Options, "returns cxx udt");
+  PUSH_FLAG(FunctionOptions, ConstructorWithVirtualBases, Options,
+            "constructor with virtual bases");
+  PUSH_FLAG(FunctionOptions, Constructor, Options, "constructor");
+  if (Opts.empty())
+    return "None";
+  return join(Opts, " | ");
+}
+
+Error MinimalTypeDumpVisitor::visitTypeBegin(CVType &Record, TypeIndex Index) {
+  // formatLine puts the newline at the beginning, so we use formatLine here
+  // to start a new line, and then individual visit methods use format to
+  // append to the existing line.
+  P.formatLine("{0} | {1} [size = {2}]",
+               fmt_align(Index, AlignStyle::Right, Width),
+               getLeafTypeName(Record.Type), Record.length());
+  P.Indent(Width + 3);
+  return Error::success();
+}
+Error MinimalTypeDumpVisitor::visitTypeEnd(CVType &Record) {
+  P.Unindent(Width + 3);
+  if (RecordBytes) {
+    AutoIndent Indent(P, 9);
+    P.formatBinary("Bytes", Record.RecordData, 0);
+  }
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitMemberBegin(CVMemberRecord &Record) {
+  P.formatLine("- {0}", getLeafTypeName(Record.Kind));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitMemberEnd(CVMemberRecord &Record) {
+  if (RecordBytes) {
+    AutoIndent Indent(P, 2);
+    P.formatBinary("Bytes", Record.Data, 0);
+  }
+  return Error::success();
+}
+
+StringRef MinimalTypeDumpVisitor::getTypeName(TypeIndex TI) const {
+  if (TI.isNoneType())
+    return "";
+  return Types.getTypeName(TI);
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               FieldListRecord &FieldList) {
+  if (auto EC = codeview::visitMemberRecordStream(FieldList.Data, *this))
+    return EC;
+
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               StringIdRecord &String) {
+  P.format(" ID: {0}, String: {1}", String.getId(), String.getString());
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               ArgListRecord &Args) {
+  auto Indices = Args.getIndices();
+  if (Indices.empty())
+    return Error::success();
+
+  auto Max = std::max_element(Indices.begin(), Indices.end());
+  uint32_t W = NumDigits(Max->getIndex()) + 2;
+
+  for (auto I : Indices)
+    P.formatLine("{0}: `{1}`", fmt_align(I, AlignStyle::Right, W),
+                 getTypeName(I));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               StringListRecord &Strings) {
+  auto Indices = Strings.getIndices();
+  if (Indices.empty())
+    return Error::success();
+
+  auto Max = std::max_element(Indices.begin(), Indices.end());
+  uint32_t W = NumDigits(Max->getIndex()) + 2;
+
+  for (auto I : Indices)
+    P.formatLine("{0}: `{1}`", fmt_align(I, AlignStyle::Right, W),
+                 getTypeName(I));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               ClassRecord &Class) {
+  P.formatLine("class name: `{0}`", Class.Name);
+  if (Class.hasUniqueName())
+    P.formatLine("unique name: `{0}`", Class.UniqueName);
+  P.formatLine("vtable: {0}, base list: {1}, field list: {2}",
+               Class.VTableShape, Class.DerivationList, Class.FieldList);
+  P.formatLine("options: {0}",
+               formatClassOptions(P.getIndentLevel(), Class.Options));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               UnionRecord &Union) {
+  P.formatLine("class name: `{0}`", Union.Name);
+  if (Union.hasUniqueName())
+    P.formatLine("unique name: `{0}`", Union.UniqueName);
+  P.formatLine("field list: {0}", Union.FieldList);
+  P.formatLine("options: {0}",
+               formatClassOptions(P.getIndentLevel(), Union.Options));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {
+  P.formatLine("name: `{0}`", Enum.Name);
+  if (Enum.hasUniqueName())
+    P.formatLine("unique name: `{0}`", Enum.UniqueName);
+  P.formatLine("field list: {0}, underlying type: {1}", Enum.FieldList,
+               Enum.UnderlyingType);
+  P.formatLine("options: {0}",
+               formatClassOptions(P.getIndentLevel(), Enum.Options));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR, ArrayRecord &AT) {
+  if (AT.Name.empty()) {
+    P.formatLine("size: {0}, index type: {1}, element type: {2}", AT.Size,
+                 AT.IndexType, AT.ElementType);
+  } else {
+    P.formatLine("name: {0}, size: {1}, index type: {2}, element type: {3}",
+                 AT.Name, AT.Size, AT.IndexType, AT.ElementType);
+  }
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               VFTableRecord &VFT) {
+  P.formatLine("offset: {0}, complete class: {1}, overridden vftable: {2}",
+               VFT.VFPtrOffset, VFT.CompleteClass, VFT.OverriddenVFTable);
+  P.formatLine("method names: ");
+  if (!VFT.MethodNames.empty()) {
+    std::string Sep =
+        formatv("\n{0}",
+                fmt_repeat(' ', P.getIndentLevel() + strlen("method names: ")))
+            .str();
+    P.print(join(VFT.MethodNames, Sep));
+  }
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               MemberFuncIdRecord &Id) {
+  P.formatLine("name = {0}, type = {1}, class type = {2}", Id.Name,
+               Id.FunctionType, Id.ClassType);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               ProcedureRecord &Proc) {
+  P.formatLine("return type = {0}, # args = {1}, param list = {2}",
+               Proc.ReturnType, Proc.ParameterCount, Proc.ArgumentList);
+  P.formatLine("calling conv = {0}, options = {1}",
+               formatCallingConvention(Proc.CallConv),
+               formatFunctionOptions(Proc.Options));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               MemberFunctionRecord &MF) {
+  P.formatLine("return type = {0}, # args = {1}, param list = {2}",
+               MF.ParameterCount, MF.ArgumentList, MF.ReturnType);
+  P.formatLine("class type = {0}, this type = {1}, this adjust = {2}",
+               MF.ClassType, MF.ThisType, MF.ThisPointerAdjustment);
+  P.formatLine("calling conv = {0}, options = {1}",
+               formatCallingConvention(MF.CallConv),
+               formatFunctionOptions(MF.Options));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               FuncIdRecord &Func) {
+  P.formatLine("name = {0}, type = {1}, parent scope = {2}", Func.Name,
+               Func.FunctionType, Func.ParentScope);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               TypeServer2Record &TS) {
+  P.formatLine("name = {0}, age = {1}, guid = {2}", TS.Name, TS.Age,
+               fmt_guid(TS.Guid));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               PointerRecord &Ptr) {
+  P.formatLine("referent = {0}, {1}", Ptr.ReferentType,
+               formatPointerAttrs(Ptr));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               ModifierRecord &Mod) {
+  P.formatLine("referent = {0}, modifiers = {1}", Mod.ModifiedType,
+               modifierOptions(Mod.Modifiers));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               VFTableShapeRecord &Shape) {
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               UdtModSourceLineRecord &U) {
+  P.formatLine("udt = {0}, mod = {1}, file = {2}, line = {3}", U.UDT, U.Module,
+               U.SourceFile.getIndex(), U.LineNumber);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               UdtSourceLineRecord &U) {
+  P.formatLine("udt = {0}, file = {1}, line = {2}", U.UDT,
+               U.SourceFile.getIndex(), U.LineNumber);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               BitFieldRecord &BF) {
+  P.formatLine("type = {0}, bit offset = {1}, # bits = {2}", BF.Type,
+               BF.BitOffset, BF.BitSize);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(
+    CVType &CVR, MethodOverloadListRecord &Overloads) {
+  for (auto &M : Overloads.Methods)
+    P.formatLine("- Method [type = {0}, vftable offset = {1}, attrs = {2}]",
+                 M.Type, M.VFTableOffset, memberAttributes(M.Attrs));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
+                                               BuildInfoRecord &BI) {
+  auto Indices = BI.ArgIndices;
+  if (Indices.empty())
+    return Error::success();
+
+  auto Max = std::max_element(Indices.begin(), Indices.end());
+  uint32_t W = NumDigits(Max->getIndex()) + 2;
+
+  for (auto I : Indices)
+    P.formatLine("{0}: `{1}`", fmt_align(I, AlignStyle::Right, W),
+                 getTypeName(I));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR, LabelRecord &R) {
+  std::string Type = (R.Mode == LabelType::Far) ? "far" : "near";
+  P.format(" type = {0}", Type);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               NestedTypeRecord &Nested) {
+  P.format(" [name = `{0}`, parent = {1}]", Nested.Name, Nested.Type);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               OneMethodRecord &Method) {
+  P.format(" [name = `{0}`]", Method.Name);
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, vftable offset = {1}, attrs = {2}", Method.Type,
+               Method.VFTableOffset, memberAttributes(Method.Attrs));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               OverloadedMethodRecord &Method) {
+  P.format(" [name = `{0}`, # overloads = {1}, overload list = {2}]",
+           Method.Name, Method.NumOverloads, Method.MethodList);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               DataMemberRecord &Field) {
+  P.format(" [name = `{0}`, Type = {1}, offset = {2}, attrs = {3}]", Field.Name,
+           Field.Type, Field.FieldOffset, memberAttributes(Field.Attrs));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               StaticDataMemberRecord &Field) {
+  P.format(" [name = `{0}`, type = {1}, attrs = {2}]", Field.Name, Field.Type,
+           memberAttributes(Field.Attrs));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               EnumeratorRecord &Enum) {
+  P.format(" [{0} = {1}]", Enum.Name,
+           Enum.Value.toString(10, Enum.Value.isSigned()));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               BaseClassRecord &Base) {
+  AutoIndent Indent(P);
+  P.formatLine("type = {0}, offset = {1}, attrs = {2}", Base.Type, Base.Offset,
+               memberAttributes(Base.Attrs));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               VirtualBaseClassRecord &Base) {
+  AutoIndent Indent(P);
+  P.formatLine(
+      "base = {0}, vbptr = {1}, vbptr offset = {2}, vtable index = {3}",
+      Base.BaseType, Base.VBPtrType, Base.VBPtrOffset, Base.VTableIndex);
+  P.formatLine("attrs = {0}", memberAttributes(Base.Attrs));
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               ListContinuationRecord &Cont) {
+  P.format(" continuation = {0}", Cont.ContinuationIndex);
+  return Error::success();
+}
+
+Error MinimalTypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+                                               VFPtrRecord &VFP) {
+  P.format(" type = {0}", VFP.Type);
+  return Error::success();
+}
diff --git a/tools/llvm-pdbutil/MinimalTypeDumper.h b/tools/llvm-pdbutil/MinimalTypeDumper.h
new file mode 100644 (file)
index 0000000..f494aaf
--- /dev/null
@@ -0,0 +1,56 @@
+//===- MinimalTypeDumper.h ------------------------------------ *- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVMPDBUTIL_MINIMAL_TYPE_DUMPER_H
+#define LLVM_TOOLS_LLVMPDBUTIL_MINIMAL_TYPE_DUMPER_H
+
+#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
+
+namespace llvm {
+namespace codeview {
+class LazyRandomTypeCollection;
+}
+
+namespace pdb {
+class LinePrinter;
+
+class MinimalTypeDumpVisitor : public codeview::TypeVisitorCallbacks {
+public:
+  MinimalTypeDumpVisitor(LinePrinter &P, uint32_t Width, bool RecordBytes,
+                         codeview::LazyRandomTypeCollection &Types)
+      : P(P), Width(Width), RecordBytes(RecordBytes), Types(Types) {}
+
+  Error visitTypeBegin(codeview::CVType &Record,
+                       codeview::TypeIndex Index) override;
+  Error visitTypeEnd(codeview::CVType &Record) override;
+  Error visitMemberBegin(codeview::CVMemberRecord &Record) override;
+  Error visitMemberEnd(codeview::CVMemberRecord &Record) override;
+
+#define TYPE_RECORD(EnumName, EnumVal, Name)                                   \
+  Error visitKnownRecord(codeview::CVType &CVR,                                \
+                         codeview::Name##Record &Record) override;
+#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
+  Error visitKnownMember(codeview::CVMemberRecord &CVR,                        \
+                         codeview::Name##Record &Record) override;
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+
+private:
+  StringRef getTypeName(codeview::TypeIndex TI) const;
+
+  uint32_t Width;
+  LinePrinter &P;
+  bool RecordBytes = false;
+  codeview::LazyRandomTypeCollection &Types;
+};
+} // namespace pdb
+} // namespace llvm
+
+#endif
diff --git a/tools/llvm-pdbutil/RawOutputStyle.cpp b/tools/llvm-pdbutil/RawOutputStyle.cpp
new file mode 100644 (file)
index 0000000..aba34c1
--- /dev/null
@@ -0,0 +1,669 @@
+//===- RawOutputStyle.cpp ------------------------------------ *- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "RawOutputStyle.h"
+
+#include "CompactTypeDumpVisitor.h"
+#include "FormatUtil.h"
+#include "MinimalSymbolDumper.h"
+#include "MinimalTypeDumper.h"
+#include "StreamUtil.h"
+#include "llvm-pdbutil.h"
+
+#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
+#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
+#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
+#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h"
+#include "llvm/DebugInfo/CodeView/EnumTables.h"
+#include "llvm/DebugInfo/CodeView/Formatters.h"
+#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
+#include "llvm/DebugInfo/CodeView/Line.h"
+#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
+#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
+#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h"
+#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
+#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
+#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
+#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
+#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
+#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
+#include "llvm/DebugInfo/PDB/Native/EnumTables.h"
+#include "llvm/DebugInfo/PDB/Native/GlobalsStream.h"
+#include "llvm/DebugInfo/PDB/Native/ISectionContribVisitor.h"
+#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
+#include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
+#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
+#include "llvm/DebugInfo/PDB/Native/PublicsStream.h"
+#include "llvm/DebugInfo/PDB/Native/RawError.h"
+#include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
+#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
+#include "llvm/DebugInfo/PDB/PDBExtras.h"
+#include "llvm/Object/COFF.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/FormatAdapters.h"
+#include "llvm/Support/FormatVariadic.h"
+
+#include <unordered_map>
+
+using namespace llvm;
+using namespace llvm::codeview;
+using namespace llvm::msf;
+using namespace llvm::pdb;
+
+RawOutputStyle::RawOutputStyle(PDBFile &File)
+    : File(File), P(2, false, outs()) {}
+
+Error RawOutputStyle::dump() {
+  if (opts::raw::DumpSummary) {
+    if (auto EC = dumpFileSummary())
+      return EC;
+    P.NewLine();
+  }
+
+  if (opts::raw::DumpStreams) {
+    if (auto EC = dumpStreamSummary())
+      return EC;
+    P.NewLine();
+  }
+
+  if (opts::raw::DumpBlockRange.hasValue()) {
+    if (auto EC = dumpBlockRanges())
+      return EC;
+    P.NewLine();
+  }
+
+  if (!opts::raw::DumpStreamData.empty()) {
+    if (auto EC = dumpStreamBytes())
+      return EC;
+    P.NewLine();
+  }
+
+  if (opts::raw::DumpStringTable) {
+    if (auto EC = dumpStringTable())
+      return EC;
+    P.NewLine();
+  }
+
+  if (opts::raw::DumpModules) {
+    if (auto EC = dumpModules())
+      return EC;
+  }
+
+  if (opts::raw::DumpTypes) {
+    if (auto EC = dumpTpiStream(StreamTPI))
+      return EC;
+  }
+
+  if (opts::raw::DumpIds) {
+    if (auto EC = dumpTpiStream(StreamIPI))
+      return EC;
+  }
+
+  if (opts::raw::DumpPublics) {
+    if (auto EC = dumpPublics())
+      return EC;
+  }
+
+  if (opts::raw::DumpSymbols) {
+    if (auto EC = dumpModuleSyms())
+      return EC;
+  }
+
+  if (opts::raw::DumpSectionContribs) {
+    if (auto EC = dumpSectionContribs())
+      return EC;
+  }
+
+  if (opts::raw::DumpSectionMap) {
+    if (auto EC = dumpSectionMap())
+      return EC;
+  }
+
+  return Error::success();
+}
+
+static void printHeader(LinePrinter &P, const Twine &S) {
+  P.NewLine();
+  P.formatLine("{0,=60}", S);
+  P.formatLine("{0}", fmt_repeat('=', 60));
+}
+
+Error RawOutputStyle::dumpFileSummary() {
+  printHeader(P, "Summary");
+
+  ExitOnError Err("Invalid PDB Format");
+
+  AutoIndent Indent(P);
+  P.formatLine("Block Size: {0}", File.getBlockSize());
+  P.formatLine("Number of blocks: {0}", File.getBlockCount());
+  P.formatLine("Number of streams: {0}", File.getNumStreams());
+
+  auto &PS = Err(File.getPDBInfoStream());
+  P.formatLine("Signature: {0}", PS.getSignature());
+  P.formatLine("Age: {0}", PS.getAge());
+  P.formatLine("GUID: {0}", fmt_guid(PS.getGuid().Guid));
+  P.formatLine("Features: {0:x+}", static_cast<uint32_t>(PS.getFeatures()));
+  P.formatLine("Has Debug Info: {0}", File.hasPDBDbiStream());
+  P.formatLine("Has Types: {0}", File.hasPDBTpiStream());
+  P.formatLine("Has IDs: {0}", File.hasPDBIpiStream());
+  P.formatLine("Has Globals: {0}", File.hasPDBGlobalsStream());
+  P.formatLine("Has Publics: {0}", File.hasPDBPublicsStream());
+  if (File.hasPDBDbiStream()) {
+    auto &DBI = Err(File.getPDBDbiStream());
+    P.formatLine("Is incrementally linked: {0}", DBI.isIncrementallyLinked());
+    P.formatLine("Has conflicting types: {0}", DBI.hasCTypes());
+    P.formatLine("Is stripped: {0}", DBI.isStripped());
+  }
+
+  return Error::success();
+}
+
+Error RawOutputStyle::dumpStreamSummary() {
+  printHeader(P, "Streams");
+
+  if (StreamPurposes.empty())
+    discoverStreamPurposes(File, StreamPurposes);
+
+  AutoIndent Indent(P);
+  uint32_t StreamCount = File.getNumStreams();
+
+  for (uint16_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {
+    P.formatLine(
+        "Stream {0}: [{1}] ({2} bytes)",
+        fmt_align(StreamIdx, AlignStyle::Right, NumDigits(StreamCount)),
+        StreamPurposes[StreamIdx], File.getStreamByteSize(StreamIdx));
+  }
+
+  return Error::success();
+}
+
+Error RawOutputStyle::dumpBlockRanges() {
+  printHeader(P, "MSF Blocks");
+
+  auto &R = *opts::raw::DumpBlockRange;
+  uint32_t Max = R.Max.getValueOr(R.Min);
+
+  AutoIndent Indent(P);
+  if (Max < R.Min)
+    return make_error<StringError>(
+        "Invalid block range specified.  Max < Min",
+        std::make_error_code(std::errc::bad_address));
+  if (Max >= File.getBlockCount())
+    return make_error<StringError>(
+        "Invalid block range specified.  Requested block out of bounds",
+        std::make_error_code(std::errc::bad_address));
+
+  for (uint32_t I = R.Min; I <= Max; ++I) {
+    auto ExpectedData = File.getBlockData(I, File.getBlockSize());
+    if (!ExpectedData)
+      return ExpectedData.takeError();
+    std::string Label = formatv("Block {0}", I).str();
+    P.formatBinary(Label, *ExpectedData, 0);
+  }
+
+  return Error::success();
+}
+
+static Error parseStreamSpec(StringRef Str, uint32_t &SI, uint32_t &Offset,
+                             uint32_t &Size) {
+  if (Str.consumeInteger(0, SI))
+    return make_error<RawError>(raw_error_code::invalid_format,
+                                "Invalid Stream Specification");
+  if (Str.consume_front(":")) {
+    if (Str.consumeInteger(0, Offset))
+      return make_error<RawError>(raw_error_code::invalid_format,
+                                  "Invalid Stream Specification");
+  }
+  if (Str.consume_front("@")) {
+    if (Str.consumeInteger(0, Size))
+      return make_error<RawError>(raw_error_code::invalid_format,
+                                  "Invalid Stream Specification");
+  }
+  if (!Str.empty())
+    return make_error<RawError>(raw_error_code::invalid_format,
+                                "Invalid Stream Specification");
+  return Error::success();
+}
+
+Error RawOutputStyle::dumpStreamBytes() {
+  if (StreamPurposes.empty())
+    discoverStreamPurposes(File, StreamPurposes);
+
+  printHeader(P, "Stream Data");
+  ExitOnError Err("Unexpected error reading stream data");
+
+  for (auto &Str : opts::raw::DumpStreamData) {
+    uint32_t SI = 0;
+    uint32_t Begin = 0;
+    uint32_t Size = 0;
+    uint32_t End = 0;
+
+    if (auto EC = parseStreamSpec(Str, SI, Begin, Size))
+      return EC;
+
+    AutoIndent Indent(P);
+    if (SI >= File.getNumStreams()) {
+      P.formatLine("Stream {0}: Not present", SI);
+      continue;
+    }
+
+    auto S = MappedBlockStream::createIndexedStream(
+        File.getMsfLayout(), File.getMsfBuffer(), SI, File.getAllocator());
+    if (!S) {
+      P.NewLine();
+      P.formatLine("Stream {0}: Not present", SI);
+      continue;
+    }
+
+    if (Size == 0)
+      End = S->getLength();
+    else
+      End = std::min(Begin + Size, S->getLength());
+
+    P.formatLine("Stream {0} ({1:N} bytes): {2}", SI, S->getLength(),
+                 StreamPurposes[SI]);
+    AutoIndent Indent2(P);
+
+    BinaryStreamReader R(*S);
+    ArrayRef<uint8_t> StreamData;
+    Err(R.readBytes(StreamData, S->getLength()));
+    Size = End - Begin;
+    StreamData = StreamData.slice(Begin, Size);
+    P.formatBinary("Data", StreamData, Begin);
+  }
+  return Error::success();
+}
+
+Error RawOutputStyle::dumpModules() {
+  printHeader(P, "Modules");
+
+  AutoIndent Indent(P);
+  if (!File.hasPDBDbiStream()) {
+    P.formatLine("DBI Stream not present");
+    return Error::success();
+  }
+
+  ExitOnError Err("Unexpected error processing symbols");
+
+  auto &Stream = Err(File.getPDBDbiStream());
+
+  const DbiModuleList &Modules = Stream.modules();
+  uint32_t Count = Modules.getModuleCount();
+  uint32_t Digits = NumDigits(Count);
+  for (uint32_t I = 0; I < Count; ++I) {
+    auto Modi = Modules.getModuleDescriptor(I);
+    P.formatLine("Mod {0:4} | Name: `{1}`: ",
+                 fmt_align(I, AlignStyle::Right, Digits), Modi.getModuleName());
+    P.formatLine("           Obj: `{0}`: ", Modi.getObjFileName());
+    P.formatLine("           debug stream: {0}, # files: {1}, has ec info: {2}",
+                 Modi.getModuleStreamIndex(), Modi.getNumberOfFiles(),
+                 Modi.hasECInfo());
+    if (opts::raw::DumpModuleFiles) {
+      P.formatLine("           contributing source files:");
+      for (const auto &F : Modules.source_files(I)) {
+        P.formatLine("           - {0}", F);
+      }
+    }
+  }
+  return Error::success();
+}
+Error RawOutputStyle::dumpStringTable() {
+  printHeader(P, "String Table");
+
+  AutoIndent Indent(P);
+  auto IS = File.getStringTable();
+  if (!IS) {
+    P.formatLine("Not present in file");
+    consumeError(IS.takeError());
+    return Error::success();
+  }
+
+  if (IS->name_ids().empty()) {
+    P.formatLine("Empty");
+    return Error::success();
+  }
+
+  auto MaxID = std::max_element(IS->name_ids().begin(), IS->name_ids().end());
+  uint32_t Digits = NumDigits(*MaxID);
+
+  P.formatLine("{0} | {1}", fmt_align("ID", AlignStyle::Right, Digits),
+               "String");
+
+  std::vector<uint32_t> SortedIDs(IS->name_ids().begin(), IS->name_ids().end());
+  std::sort(SortedIDs.begin(), SortedIDs.end());
+  for (uint32_t I : SortedIDs) {
+    auto ES = IS->getStringForID(I);
+    llvm::SmallString<32> Str;
+    if (!ES) {
+      consumeError(ES.takeError());
+      Str = "Error reading string";
+    } else if (!ES->empty()) {
+      Str.append("'");
+      Str.append(*ES);
+      Str.append("'");
+    }
+
+    if (!Str.empty())
+      P.formatLine("{0} | {1}", fmt_align(I, AlignStyle::Right, Digits), Str);
+  }
+  return Error::success();
+}
+
+Error RawOutputStyle::dumpTpiStream(uint32_t StreamIdx) {
+  assert(StreamIdx == StreamTPI || StreamIdx == StreamIPI);
+
+  bool Present = false;
+  bool DumpBytes = false;
+  if (StreamIdx == StreamTPI) {
+    printHeader(P, "Types (TPI Stream)");
+    Present = File.hasPDBTpiStream();
+    DumpBytes = opts::raw::DumpTypeData;
+  } else if (StreamIdx == StreamIPI) {
+    printHeader(P, "Types (IPI Stream)");
+    Present = File.hasPDBIpiStream();
+    DumpBytes = opts::raw::DumpIdData;
+  }
+
+  AutoIndent Indent(P);
+  if (!Present) {
+    P.formatLine("Stream not present");
+    return Error::success();
+  }
+
+  ExitOnError Err("Unexpected error processing types");
+
+  auto &Stream = Err((StreamIdx == StreamTPI) ? File.getPDBTpiStream()
+                                              : File.getPDBIpiStream());
+
+  auto &Types = Err(initializeTypeDatabase(StreamIdx));
+
+  P.formatLine("Showing {0:N} records", Stream.getNumTypeRecords());
+  uint32_t Width =
+      NumDigits(TypeIndex::FirstNonSimpleIndex + Stream.getNumTypeRecords());
+
+  MinimalTypeDumpVisitor V(P, Width + 2, DumpBytes, Types);
+
+  Optional<TypeIndex> I = Types.getFirst();
+  if (auto EC = codeview::visitTypeStream(Types, V)) {
+    P.formatLine("An error occurred dumping type records: {0}",
+                 toString(std::move(EC)));
+  }
+  return Error::success();
+}
+
+Expected<codeview::LazyRandomTypeCollection &>
+RawOutputStyle::initializeTypeDatabase(uint32_t SN) {
+  auto &TypeCollection = (SN == StreamTPI) ? TpiTypes : IpiTypes;
+  auto Tpi =
+      (SN == StreamTPI) ? File.getPDBTpiStream() : File.getPDBIpiStream();
+  if (!Tpi)
+    return Tpi.takeError();
+
+  if (!TypeCollection) {
+    auto &Types = Tpi->typeArray();
+    uint32_t Count = Tpi->getNumTypeRecords();
+    auto Offsets = Tpi->getTypeIndexOffsets();
+    TypeCollection =
+        llvm::make_unique<LazyRandomTypeCollection>(Types, Count, Offsets);
+  }
+
+  return *TypeCollection;
+}
+
+Error RawOutputStyle::dumpModuleSyms() {
+  printHeader(P, "Symbols");
+
+  AutoIndent Indent(P);
+  if (!File.hasPDBDbiStream()) {
+    P.formatLine("DBI Stream not present");
+    return Error::success();
+  }
+
+  ExitOnError Err("Unexpected error processing symbols");
+
+  auto &Stream = Err(File.getPDBDbiStream());
+
+  auto &Types = Err(initializeTypeDatabase(StreamTPI));
+
+  const DbiModuleList &Modules = Stream.modules();
+  uint32_t Count = Modules.getModuleCount();
+  uint32_t Digits = NumDigits(Count);
+  for (uint32_t I = 0; I < Count; ++I) {
+    auto Modi = Modules.getModuleDescriptor(I);
+    P.formatLine("Mod {0:4} | `{1}`: ", fmt_align(I, AlignStyle::Right, Digits),
+                 Modi.getModuleName());
+    uint16_t ModiStream = Modi.getModuleStreamIndex();
+    if (ModiStream == kInvalidStreamIndex) {
+      P.formatLine("           <symbols not present>");
+      continue;
+    }
+    auto ModStreamData = MappedBlockStream::createIndexedStream(
+        File.getMsfLayout(), File.getMsfBuffer(), ModiStream,
+        File.getAllocator());
+
+    ModuleDebugStreamRef ModS(Modi, std::move(ModStreamData));
+    if (auto EC = ModS.reload()) {
+      P.formatLine("Error loading module stream {0}.  {1}", I,
+                   toString(std::move(EC)));
+      continue;
+    }
+
+    SymbolVisitorCallbackPipeline Pipeline;
+    SymbolDeserializer Deserializer(nullptr, CodeViewContainer::Pdb);
+    MinimalSymbolDumper Dumper(P, opts::raw::DumpSymRecordBytes, Types);
+
+    Pipeline.addCallbackToPipeline(Deserializer);
+    Pipeline.addCallbackToPipeline(Dumper);
+    CVSymbolVisitor Visitor(Pipeline);
+    if (auto EC = Visitor.visitSymbolStream(ModS.getSymbolArray())) {
+      P.formatLine("Error while processing symbol records.  {0}",
+                   toString(std::move(EC)));
+      continue;
+    }
+  }
+  return Error::success();
+}
+
+Error RawOutputStyle::dumpPublics() {
+  printHeader(P, "Public Symbols");
+
+  AutoIndent Indent(P);
+  if (!File.hasPDBPublicsStream()) {
+    P.formatLine("Publics stream not present");
+    return Error::success();
+  }
+
+  ExitOnError Err("Error dumping publics stream");
+
+  auto &Types = Err(initializeTypeDatabase(StreamTPI));
+  auto &Publics = Err(File.getPDBPublicsStream());
+  SymbolVisitorCallbackPipeline Pipeline;
+  SymbolDeserializer Deserializer(nullptr, CodeViewContainer::Pdb);
+  MinimalSymbolDumper Dumper(P, opts::raw::DumpSymRecordBytes, Types);
+
+  Pipeline.addCallbackToPipeline(Deserializer);
+  Pipeline.addCallbackToPipeline(Dumper);
+  CVSymbolVisitor Visitor(Pipeline);
+  auto ExpectedSymbols = Publics.getSymbolArray();
+  if (!ExpectedSymbols) {
+    P.formatLine("Could not read public symbol record stream");
+    return Error::success();
+  }
+
+  if (auto EC = Visitor.visitSymbolStream(*ExpectedSymbols))
+    P.formatLine("Error while processing public symbol records.  {0}",
+                 toString(std::move(EC)));
+
+  return Error::success();
+}
+
+static std::string formatSectionCharacteristics(uint32_t IndentLevel,
+                                                uint32_t C) {
+  using SC = COFF::SectionCharacteristics;
+  std::vector<std::string> Opts;
+  if (C == COFF::SC_Invalid)
+    return "invalid";
+  if (C == 0)
+    return "none";
+
+  PUSH_FLAG(SC, IMAGE_SCN_TYPE_NOLOAD, C, "IMAGE_SCN_TYPE_NOLOAD");
+  PUSH_FLAG(SC, IMAGE_SCN_TYPE_NO_PAD, C, "IMAGE_SCN_TYPE_NO_PAD");
+  PUSH_FLAG(SC, IMAGE_SCN_CNT_CODE, C, "IMAGE_SCN_CNT_CODE");
+  PUSH_FLAG(SC, IMAGE_SCN_CNT_INITIALIZED_DATA, C,
+            "IMAGE_SCN_CNT_INITIALIZED_DATA");
+  PUSH_FLAG(SC, IMAGE_SCN_CNT_UNINITIALIZED_DATA, C,
+            "IMAGE_SCN_CNT_UNINITIALIZED_DATA");
+  PUSH_FLAG(SC, IMAGE_SCN_LNK_OTHER, C, "IMAGE_SCN_LNK_OTHER");
+  PUSH_FLAG(SC, IMAGE_SCN_LNK_INFO, C, "IMAGE_SCN_LNK_INFO");
+  PUSH_FLAG(SC, IMAGE_SCN_LNK_REMOVE, C, "IMAGE_SCN_LNK_REMOVE");
+  PUSH_FLAG(SC, IMAGE_SCN_LNK_COMDAT, C, "IMAGE_SCN_LNK_COMDAT");
+  PUSH_FLAG(SC, IMAGE_SCN_GPREL, C, "IMAGE_SCN_GPREL");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_PURGEABLE, C, "IMAGE_SCN_MEM_PURGEABLE");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_16BIT, C, "IMAGE_SCN_MEM_16BIT");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_LOCKED, C, "IMAGE_SCN_MEM_LOCKED");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_PRELOAD, C, "IMAGE_SCN_MEM_PRELOAD");
+  PUSH_FLAG(SC, IMAGE_SCN_GPREL, C, "IMAGE_SCN_GPREL");
+  PUSH_FLAG(SC, IMAGE_SCN_GPREL, C, "IMAGE_SCN_GPREL");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_1BYTES, C,
+                   "IMAGE_SCN_ALIGN_1BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_2BYTES, C,
+                   "IMAGE_SCN_ALIGN_2BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_4BYTES, C,
+                   "IMAGE_SCN_ALIGN_4BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_8BYTES, C,
+                   "IMAGE_SCN_ALIGN_8BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_16BYTES, C,
+                   "IMAGE_SCN_ALIGN_16BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_32BYTES, C,
+                   "IMAGE_SCN_ALIGN_32BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_64BYTES, C,
+                   "IMAGE_SCN_ALIGN_64BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_128BYTES, C,
+                   "IMAGE_SCN_ALIGN_128BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_256BYTES, C,
+                   "IMAGE_SCN_ALIGN_256BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_512BYTES, C,
+                   "IMAGE_SCN_ALIGN_512BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_1024BYTES, C,
+                   "IMAGE_SCN_ALIGN_1024BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_2048BYTES, C,
+                   "IMAGE_SCN_ALIGN_2048BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_4096BYTES, C,
+                   "IMAGE_SCN_ALIGN_4096BYTES");
+  PUSH_MASKED_FLAG(SC, 0xF00000, IMAGE_SCN_ALIGN_8192BYTES, C,
+                   "IMAGE_SCN_ALIGN_8192BYTES");
+  PUSH_FLAG(SC, IMAGE_SCN_LNK_NRELOC_OVFL, C, "IMAGE_SCN_LNK_NRELOC_OVFL");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_DISCARDABLE, C, "IMAGE_SCN_MEM_DISCARDABLE");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_NOT_CACHED, C, "IMAGE_SCN_MEM_NOT_CACHED");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_NOT_PAGED, C, "IMAGE_SCN_MEM_NOT_PAGED");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_SHARED, C, "IMAGE_SCN_MEM_SHARED");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_EXECUTE, C, "IMAGE_SCN_MEM_EXECUTE");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_READ, C, "IMAGE_SCN_MEM_READ");
+  PUSH_FLAG(SC, IMAGE_SCN_MEM_WRITE, C, "IMAGE_SCN_MEM_WRITE");
+  return typesetItemList(Opts, 3, IndentLevel, " | ");
+}
+
+static std::string formatSegMapDescriptorFlag(uint32_t IndentLevel,
+                                              OMFSegDescFlags Flags) {
+  std::vector<std::string> Opts;
+  if (Flags == OMFSegDescFlags::None)
+    return "none";
+
+  PUSH_FLAG(OMFSegDescFlags, Read, Flags, "read");
+  PUSH_FLAG(OMFSegDescFlags, Write, Flags, "write");
+  PUSH_FLAG(OMFSegDescFlags, Execute, Flags, "execute");
+  PUSH_FLAG(OMFSegDescFlags, AddressIs32Bit, Flags, "32 bit addr");
+  PUSH_FLAG(OMFSegDescFlags, IsSelector, Flags, "selector");
+  PUSH_FLAG(OMFSegDescFlags, IsAbsoluteAddress, Flags, "absolute addr");
+  PUSH_FLAG(OMFSegDescFlags, IsGroup, Flags, "group");
+  return typesetItemList(Opts, 4, IndentLevel, " | ");
+}
+
+Error RawOutputStyle::dumpSectionContribs() {
+  printHeader(P, "Section Contributions");
+  ExitOnError Err("Error dumping publics stream");
+
+  AutoIndent Indent(P);
+  if (!File.hasPDBDbiStream()) {
+    P.formatLine(
+        "Section contribs require a DBI Stream, which could not be loaded");
+    return Error::success();
+  }
+
+  auto &Dbi = Err(File.getPDBDbiStream());
+
+  class Visitor : public ISectionContribVisitor {
+  public:
+    Visitor(LinePrinter &P, DbiStream &DS) : P(P), DS(DS) {}
+    void visit(const SectionContrib &SC) override {
+      P.formatLine(
+          "SC  | mod = {2}, {0}, size = {1}, data crc = {3}, reloc crc = {4}",
+          formatSegmentOffset(SC.ISect, SC.Off), SC.Size, SC.Imod, SC.DataCrc,
+          SC.RelocCrc);
+      P.formatLine("      {0}",
+                   formatSectionCharacteristics(P.getIndentLevel() + 6,
+                                                SC.Characteristics));
+    }
+    void visit(const SectionContrib2 &SC) override {
+      P.formatLine("SC2 | mod = {2}, {0}, size = {1}, data crc = {3}, reloc "
+                   "crc = {4}, coff section = {5}",
+                   formatSegmentOffset(SC.Base.ISect, SC.Base.Off),
+                   SC.Base.Size, SC.Base.Imod, SC.Base.DataCrc,
+                   SC.Base.RelocCrc, SC.ISectCoff);
+      P.formatLine("      {0}",
+                   formatSectionCharacteristics(P.getIndentLevel() + 6,
+                                                SC.Base.Characteristics));
+    }
+
+  private:
+    LinePrinter &P;
+    DbiStream &DS;
+  };
+
+  Visitor V(P, Dbi);
+  Dbi.visitSectionContributions(V);
+  return Error::success();
+}
+
+Error RawOutputStyle::dumpSectionMap() {
+  printHeader(P, "Section Map");
+  ExitOnError Err("Error dumping section map");
+
+  AutoIndent Indent(P);
+  if (!File.hasPDBDbiStream()) {
+    P.formatLine("Dumping the section map requires a DBI Stream, which could "
+                 "not be loaded");
+    return Error::success();
+  }
+
+  auto &Dbi = Err(File.getPDBDbiStream());
+
+  uint32_t I = 0;
+  for (auto &M : Dbi.getSectionMap()) {
+    P.formatLine(
+        "Section {0:4} | ovl = {0}, group = {1}, frame = {2}, name = {3}", I,
+        M.Ovl, M.Group, M.Frame, M.SecName);
+    P.formatLine("               class = {0}, offset = {1}, size = {2}",
+                 M.ClassName, M.Offset, M.SecByteLength);
+    P.formatLine("               flags = {0}",
+                 formatSegMapDescriptorFlag(
+                     P.getIndentLevel() + 13,
+                     static_cast<OMFSegDescFlags>(uint16_t(M.Flags))));
+    ++I;
+  }
+  return Error::success();
+}
similarity index 62%
rename from tools/llvm-pdbutil/LLVMOutputStyle.h
rename to tools/llvm-pdbutil/RawOutputStyle.h
index 184dc4e1f44d91c00ddc8ad0b58b19798692b62f..4c381c2a80b80771acaba86ecee23db3a87aab33 100644 (file)
@@ -1,4 +1,4 @@
-//===- LLVMOutputStyle.h -------------------------------------- *- C++ --*-===//
+//===- RawOutputStyle.h -------------------------------------- *- C++ --*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,15 +7,15 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_LLVMOUTPUTSTYLE_H
-#define LLVM_TOOLS_LLVMPDBDUMP_LLVMOUTPUTSTYLE_H
+#ifndef LLVM_TOOLS_LLVMPDBDUMP_RAWOUTPUTSTYLE_H
+#define LLVM_TOOLS_LLVMPDBDUMP_RAWOUTPUTSTYLE_H
 
+#include "LinePrinter.h"
 #include "OutputStyle.h"
 
 #include "llvm/ADT/Optional.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/DebugInfo/CodeView/TypeDatabase.h"
-#include "llvm/Support/ScopedPrinter.h"
 
 #include <string>
 
@@ -27,9 +27,9 @@ class LazyRandomTypeCollection;
 }
 
 namespace pdb {
-class LLVMOutputStyle : public OutputStyle {
+class RawOutputStyle : public OutputStyle {
 public:
-  LLVMOutputStyle(PDBFile &File);
+  RawOutputStyle(PDBFile &File);
 
   Error dump() override;
 
@@ -37,34 +37,25 @@ private:
   Expected<codeview::LazyRandomTypeCollection &>
   initializeTypeDatabase(uint32_t SN);
 
-  Error dumpFileHeaders();
+  Error dumpFileSummary();
   Error dumpStreamSummary();
-  Error dumpFreePageMap();
   Error dumpBlockRanges();
-  Error dumpGlobalsStream();
   Error dumpStreamBytes();
-  Error dumpStreamBlocks();
   Error dumpStringTable();
-  Error dumpInfoStream();
   Error dumpTpiStream(uint32_t StreamIdx);
-  Error dumpDbiStream();
+  Error dumpModules();
+  Error dumpModuleSyms();
+  Error dumpPublics();
   Error dumpSectionContribs();
   Error dumpSectionMap();
-  Error dumpPublicsStream();
-  Error dumpSectionHeaders();
-  Error dumpFpoStream();
-
-  void dumpBitVector(StringRef Name, const BitVector &V);
-
-  void flush();
 
   PDBFile &File;
-  ScopedPrinter P;
+  LinePrinter P;
   std::unique_ptr<codeview::LazyRandomTypeCollection> TpiTypes;
   std::unique_ptr<codeview::LazyRandomTypeCollection> IpiTypes;
   SmallVector<std::string, 32> StreamPurposes;
 };
-}
-}
+} // namespace pdb
+} // namespace llvm
 
 #endif
index 8f7aba6d30c8b81246e4da374eee79e7b0ac56ec..ae3138efb13a167f6801591de5c41e7fdcb05301 100644 (file)
@@ -32,6 +32,13 @@ using namespace llvm;
 using namespace llvm::codeview;
 using namespace llvm::pdb;
 
+static bool checkModuleSubsection(opts::ModuleSubsection MS) {
+  return any_of(opts::pdb2yaml::DumpModuleSubsections,
+                [=](opts::ModuleSubsection M) {
+                  return M == MS || M == opts::ModuleSubsection::All;
+                });
+}
+
 YAMLOutputStyle::YAMLOutputStyle(PDBFile &File)
     : File(File), Out(outs()), Obj(File.getAllocator()) {
   Out.setWriteDefaultValues(!opts::pdb2yaml::Minimal);
@@ -93,8 +100,8 @@ Error YAMLOutputStyle::dumpFileHeaders() {
 }
 
 Error YAMLOutputStyle::dumpStringTable() {
-  bool RequiresStringTable = opts::shared::DumpModuleFiles ||
-                             !opts::shared::DumpModuleSubsections.empty();
+  bool RequiresStringTable = opts::pdb2yaml::DumpModuleFiles ||
+                             !opts::pdb2yaml::DumpModuleSubsections.empty();
   bool RequestedStringTable = opts::pdb2yaml::StringTable;
   if (!RequiresStringTable && !RequestedStringTable)
     return Error::success();
@@ -201,7 +208,7 @@ Error YAMLOutputStyle::dumpDbiStream() {
   Obj.DbiStream->PdbDllRbld = DS.getPdbDllRbld();
   Obj.DbiStream->PdbDllVersion = DS.getPdbDllVersion();
   Obj.DbiStream->VerHeader = DS.getDbiVersion();
-  if (opts::shared::DumpModules) {
+  if (opts::pdb2yaml::DumpModules) {
     const auto &Modules = DS.modules();
     for (uint32_t I = 0; I < Modules.getModuleCount(); ++I) {
       DbiModuleDescriptor MI = Modules.getModuleDescriptor(I);
@@ -211,7 +218,7 @@ Error YAMLOutputStyle::dumpDbiStream() {
 
       DMI.Mod = MI.getModuleName();
       DMI.Obj = MI.getObjFileName();
-      if (opts::shared::DumpModuleFiles) {
+      if (opts::pdb2yaml::DumpModuleFiles) {
         auto Files = Modules.source_files(I);
         DMI.SourceFiles.assign(Files.begin(), Files.end());
       }
@@ -231,7 +238,7 @@ Error YAMLOutputStyle::dumpDbiStream() {
       auto ExpectedST = File.getStringTable();
       if (!ExpectedST)
         return ExpectedST.takeError();
-      if (!opts::shared::DumpModuleSubsections.empty() &&
+      if (!opts::pdb2yaml::DumpModuleSubsections.empty() &&
           ModS.hasDebugSubsections()) {
         auto ExpectedChecksums = ModS.findChecksumsSubsection();
         if (!ExpectedChecksums)
@@ -242,7 +249,7 @@ Error YAMLOutputStyle::dumpDbiStream() {
 
         for (const auto &SS : ModS.subsections()) {
           opts::ModuleSubsection OptionKind = convertSubsectionKind(SS.kind());
-          if (!opts::checkModuleSubsection(OptionKind))
+          if (!checkModuleSubsection(OptionKind))
             continue;
 
           auto Converted =
@@ -253,7 +260,7 @@ Error YAMLOutputStyle::dumpDbiStream() {
         }
       }
 
-      if (opts::shared::DumpModuleSyms) {
+      if (opts::pdb2yaml::DumpModuleSyms) {
         DMI.Modi.emplace();
 
         DMI.Modi->Signature = ModS.signature();
index 3826ba79a208aa1231641147aba1c9b519d7c873..18fda036ee7faa340626ee24f040f8693a8f19c3 100644 (file)
@@ -15,7 +15,6 @@
 
 #include "Analyze.h"
 #include "Diff.h"
-#include "LLVMOutputStyle.h"
 #include "LinePrinter.h"
 #include "OutputStyle.h"
 #include "PrettyCompilandDumper.h"
@@ -23,6 +22,7 @@
 #include "PrettyFunctionDumper.h"
 #include "PrettyTypeDumper.h"
 #include "PrettyVariableDumper.h"
+#include "RawOutputStyle.h"
 #include "YAMLOutputStyle.h"
 
 #include "llvm/ADT/ArrayRef.h"
@@ -266,6 +266,8 @@ cl::list<std::string> InputFilenames(cl::Positional,
                                      cl::OneOrMore, cl::sub(DiffSubcommand));
 }
 
+cl::OptionCategory FileOptions("Module & File Options");
+
 namespace raw {
 
 cl::OptionCategory MsfOptions("MSF Container Options");
@@ -274,18 +276,11 @@ cl::OptionCategory SymbolOptions("Symbol Options");
 cl::OptionCategory MiscOptions("Miscellaneous Options");
 
 // MSF OPTIONS
-cl::opt<bool> DumpHeaders("headers", cl::desc("dump PDB headers"),
+cl::opt<bool> DumpSummary("summary", cl::desc("dump file summary"),
+                          cl::cat(MsfOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpStreams("streams",
+                          cl::desc("dump summary of the PDB streams"),
                           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));
-cl::opt<bool> DumpPageStats(
-    "page-stats",
-    cl::desc("dump allocation stats of the pages in the MSF file"),
-    cl::cat(MsfOptions), cl::sub(RawSubcommand));
 cl::opt<std::string>
     DumpBlockRangeOpt("block-data", cl::value_desc("start[-end]"),
                       cl::desc("Dump binary data from specified range."),
@@ -299,40 +294,45 @@ cl::list<std::string>
                    cl::cat(MsfOptions), cl::sub(RawSubcommand));
 
 // TYPE OPTIONS
-cl::opt<bool>
-    CompactRecords("compact-records",
-                   cl::desc("Dump type and symbol records with less detail"),
-                   cl::cat(TypeOptions), cl::sub(RawSubcommand));
-
-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::opt<bool> DumpTypes("types",
+                        cl::desc("dump CodeView type records from TPI stream"),
+                        cl::cat(TypeOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpTypeData(
+    "type-data",
     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> DumpTypeHashes("type-hash",
+                             cl::desc("dump CodeView TPI hash stream"),
+                             cl::cat(TypeOptions), cl::sub(RawSubcommand));
+
+cl::opt<bool> DumpIds("ids",
+                      cl::desc("dump CodeView type records from IPI 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));
+    DumpIdData("id-data",
+               cl::desc("dump CodeView type record raw bytes from IPI stream"),
+               cl::cat(TypeOptions), cl::sub(RawSubcommand));
 
 // SYMBOL OPTIONS
-cl::opt<bool> DumpGlobals("globals", cl::desc("dump globals stream data"),
-                          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> DumpSymbols("symbols", cl::desc("dump module symbols"),
+                          cl::cat(SymbolOptions), cl::sub(RawSubcommand));
+
 cl::opt<bool>
-    DumpSymRecordBytes("sym-record-bytes",
+    DumpSymRecordBytes("sym-data",
                        cl::desc("dump CodeView symbol record raw bytes"),
                        cl::cat(SymbolOptions), cl::sub(RawSubcommand));
 
+// MODULE & FILE OPTIONS
+cl::opt<bool> DumpModules("modules", cl::desc("dump compiland information"),
+                          cl::cat(FileOptions), cl::sub(RawSubcommand));
+cl::opt<bool> DumpModuleFiles(
+    "files",
+    cl::desc("for each module dumped, dump the contributing source files"),
+    cl::cat(FileOptions), cl::sub(RawSubcommand));
+
 // MISCELLANEOUS OPTIONS
 cl::opt<bool> DumpStringTable("string-table", cl::desc("dump PDB String Table"),
                               cl::cat(MiscOptions), cl::sub(RawSubcommand));
@@ -342,11 +342,6 @@ cl::opt<bool> DumpSectionContribs("section-contribs",
                                   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<bool> RawAll("all", cl::desc("Implies most other options."),
                      cl::cat(MiscOptions), cl::sub(RawSubcommand));
@@ -404,20 +399,11 @@ cl::opt<bool> IpiStream("ipi-stream",
                         cl::desc("Dump the IPI Stream (Stream 5)"),
                         cl::sub(PdbToYamlSubcommand), cl::init(false));
 
-cl::list<std::string> InputFilename(cl::Positional,
-                                    cl::desc("<input PDB file>"), cl::Required,
-                                    cl::sub(PdbToYamlSubcommand));
-}
-
-namespace shared {
-cl::OptionCategory FileOptions("Module & File Options");
-
 // MODULE & FILE OPTIONS
 cl::opt<bool> DumpModules("modules", cl::desc("dump compiland information"),
-                          cl::cat(FileOptions), cl::sub(RawSubcommand),
-                          cl::sub(PdbToYamlSubcommand));
+                          cl::cat(FileOptions), cl::sub(PdbToYamlSubcommand));
 cl::opt<bool> DumpModuleFiles("module-files", cl::desc("dump file information"),
-                              cl::cat(FileOptions), cl::sub(RawSubcommand),
+                              cl::cat(FileOptions),
                               cl::sub(PdbToYamlSubcommand));
 cl::list<ModuleSubsection> DumpModuleSubsections(
     "subsections", cl::ZeroOrMore, cl::CommaSeparated,
@@ -448,11 +434,15 @@ cl::list<ModuleSubsection> DumpModuleSubsections(
         clEnumValN(ModuleSubsection::Unknown, "unknown",
                    "Any subsection not covered by another option"),
         clEnumValN(ModuleSubsection::All, "all", "All known subsections")),
-    cl::cat(FileOptions), cl::sub(RawSubcommand), cl::sub(PdbToYamlSubcommand));
+    cl::cat(FileOptions), cl::sub(PdbToYamlSubcommand));
 cl::opt<bool> DumpModuleSyms("module-syms", cl::desc("dump module symbols"),
-                             cl::cat(FileOptions), cl::sub(RawSubcommand),
+                             cl::cat(FileOptions),
                              cl::sub(PdbToYamlSubcommand));
-} // namespace shared
+
+cl::list<std::string> InputFilename(cl::Positional,
+                                    cl::desc("<input PDB file>"), cl::Required,
+                                    cl::sub(PdbToYamlSubcommand));
+} // namespace pdb2yaml
 
 namespace analyze {
 cl::opt<bool> StringTable("hash-collisions", cl::desc("Find hash collisions"),
@@ -474,13 +464,6 @@ cl::opt<std::string>
 
 static ExitOnError ExitOnErr;
 
-bool opts::checkModuleSubsection(opts::ModuleSubsection MS) {
-  return any_of(opts::shared::DumpModuleSubsections,
-                [=](opts::ModuleSubsection M) {
-                  return M == MS || M == opts::ModuleSubsection::All;
-                });
-}
-
 static void yamlToPdb(StringRef Path) {
   BumpPtrAllocator Allocator;
   ErrorOr<std::unique_ptr<MemoryBuffer>> ErrorOrBuffer =
@@ -611,7 +594,7 @@ static void dumpRaw(StringRef Path) {
   std::unique_ptr<IPDBSession> Session;
   auto &File = loadPDB(Path, Session);
 
-  auto O = llvm::make_unique<LLVMOutputStyle>(File);
+  auto O = llvm::make_unique<RawOutputStyle>(File);
 
   ExitOnErr(O->dump());
 }
@@ -904,49 +887,21 @@ int main(int argc_, const char *argv_[]) {
     }
   }
 
-  if ((opts::RawSubcommand && opts::raw::RawAll) ||
-      (opts::PdbToYamlSubcommand && opts::pdb2yaml::All)) {
-    opts::shared::DumpModules = true;
-    opts::shared::DumpModuleFiles = true;
-    opts::shared::DumpModuleSyms = true;
-    opts::shared::DumpModuleSubsections.push_back(opts::ModuleSubsection::All);
-    if (llvm::is_contained(opts::shared::DumpModuleSubsections,
-                           opts::ModuleSubsection::All)) {
-      opts::shared::DumpModuleSubsections.reset();
-      opts::shared::DumpModuleSubsections.push_back(
-          opts::ModuleSubsection::All);
-    }
-  }
-
-  if (opts::shared::DumpModuleSyms || opts::shared::DumpModuleFiles)
-    opts::shared::DumpModules = true;
-
-  if (opts::shared::DumpModules)
-    opts::pdb2yaml::DbiStream = true;
-
   if (opts::RawSubcommand) {
     if (opts::raw::RawAll) {
-      opts::raw::DumpHeaders = true;
-      opts::raw::DumpGlobals = true;
+      opts::raw::DumpIds = true;
       opts::raw::DumpPublics = true;
-      opts::raw::DumpSectionHeaders = true;
-      opts::raw::DumpStreamSummary = true;
-      opts::raw::DumpPageStats = 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::DumpFpo = true;
+      opts::raw::DumpSectionMap = true;
+      opts::raw::DumpStreams = true;
       opts::raw::DumpStringTable = true;
-    }
-
-    if (opts::raw::CompactRecords &&
-        (opts::raw::DumpTpiRecordBytes || opts::raw::DumpIpiRecordBytes)) {
-      errs() << "-compact-records is incompatible with -tpi-record-bytes and "
-                "-ipi-record-bytes.\n";
-      exit(1);
+      opts::raw::DumpSummary = true;
+      opts::raw::DumpSymbols = true;
+      opts::raw::DumpIds = true;
+      opts::raw::DumpTypes = true;
+      opts::raw::DumpTypeHashes = true;
+      opts::raw::DumpModules = true;
+      opts::raw::DumpModuleFiles = true;
     }
   }
   if (opts::PdbToYamlSubcommand) {
@@ -958,7 +913,24 @@ int main(int argc_, const char *argv_[]) {
       opts::pdb2yaml::DbiStream = true;
       opts::pdb2yaml::TpiStream = true;
       opts::pdb2yaml::IpiStream = true;
+      opts::pdb2yaml::DumpModules = true;
+      opts::pdb2yaml::DumpModuleFiles = true;
+      opts::pdb2yaml::DumpModuleSyms = true;
+      opts::pdb2yaml::DumpModuleSubsections.push_back(
+          opts::ModuleSubsection::All);
+      if (llvm::is_contained(opts::pdb2yaml::DumpModuleSubsections,
+                             opts::ModuleSubsection::All)) {
+        opts::pdb2yaml::DumpModuleSubsections.reset();
+        opts::pdb2yaml::DumpModuleSubsections.push_back(
+            opts::ModuleSubsection::All);
+      }
     }
+
+    if (opts::pdb2yaml::DumpModuleSyms || opts::pdb2yaml::DumpModuleFiles)
+      opts::pdb2yaml::DumpModules = true;
+
+    if (opts::pdb2yaml::DumpModules)
+      opts::pdb2yaml::DbiStream = true;
   }
 
   llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
index f1699d0bb557535bec7ee0c2b9a41ee46cc62e3e..37c4ca3ee5d5a1aebf398482b03b52209a8df02d 100644 (file)
@@ -27,6 +27,8 @@ uint32_t getTypeLength(const PDBSymbolData &Symbol);
 
 namespace opts {
 
+enum class DumpLevel { None, Basic, Verbose };
+
 enum class ModuleSubsection {
   Unknown,
   Lines,
@@ -41,15 +43,6 @@ enum class ModuleSubsection {
   All
 };
 
-bool checkModuleSubsection(ModuleSubsection Kind);
-
-template <typename... Ts>
-bool checkModuleSubsection(ModuleSubsection K1, ModuleSubsection K2,
-                           Ts &&... Rest) {
-  return checkModuleSubsection(K1) ||
-         checkModuleSubsection(K2, std::forward<Ts>(Rest)...);
-}
-
 namespace pretty {
 
 enum class ClassDefinitionFormat { None, Layout, All };
@@ -105,27 +98,24 @@ struct BlockRange {
   llvm::Optional<uint32_t> Max;
 };
 
+extern llvm::cl::opt<bool> DumpSummary;
+extern llvm::cl::opt<bool> DumpStreams;
 extern llvm::Optional<BlockRange> DumpBlockRange;
 extern llvm::cl::list<std::string> DumpStreamData;
-
-extern llvm::cl::opt<bool> CompactRecords;
-extern llvm::cl::opt<bool> DumpGlobals;
-extern llvm::cl::opt<bool> DumpHeaders;
-extern llvm::cl::opt<bool> DumpStreamBlocks;
-extern llvm::cl::opt<bool> DumpStreamSummary;
-extern llvm::cl::opt<bool> DumpPageStats;
-extern llvm::cl::opt<bool> DumpTpiHash;
-extern llvm::cl::opt<bool> DumpTpiRecordBytes;
-extern llvm::cl::opt<bool> DumpTpiRecords;
-extern llvm::cl::opt<bool> DumpIpiRecords;
-extern llvm::cl::opt<bool> DumpIpiRecordBytes;
+extern llvm::cl::opt<bool> DumpStringTable;
+extern llvm::cl::opt<bool> DumpTypes;
+extern llvm::cl::opt<bool> DumpTypeData;
+extern llvm::cl::opt<bool> DumpTypeHashes;
+extern llvm::cl::opt<bool> DumpIds;
+extern llvm::cl::opt<bool> DumpIdData;
+extern llvm::cl::opt<bool> DumpSymbols;
+extern llvm::cl::opt<bool> DumpSymRecordBytes;
 extern llvm::cl::opt<bool> DumpPublics;
 extern llvm::cl::opt<bool> DumpSectionContribs;
 extern llvm::cl::opt<bool> DumpSectionMap;
-extern llvm::cl::opt<bool> DumpSymRecordBytes;
-extern llvm::cl::opt<bool> DumpSectionHeaders;
-extern llvm::cl::opt<bool> DumpFpo;
-extern llvm::cl::opt<bool> DumpStringTable;
+extern llvm::cl::opt<bool> DumpModules;
+extern llvm::cl::opt<bool> DumpModuleFiles;
+extern llvm::cl::opt<bool> RawAll;
 }
 
 namespace diff {
@@ -144,14 +134,11 @@ extern llvm::cl::opt<bool> DbiStream;
 extern llvm::cl::opt<bool> TpiStream;
 extern llvm::cl::opt<bool> IpiStream;
 extern llvm::cl::list<std::string> InputFilename;
-}
-
-namespace shared {
 extern llvm::cl::opt<bool> DumpModules;
 extern llvm::cl::opt<bool> DumpModuleFiles;
 extern llvm::cl::list<ModuleSubsection> DumpModuleSubsections;
 extern llvm::cl::opt<bool> DumpModuleSyms;
-} // namespace shared
+} // namespace pdb2yaml
 }
 
 #endif