Rewrite llvm-pdbdump in terms of LLVMDebugInfoPDB.
authorZachary Turner <zturner@google.com>
Tue, 10 Feb 2015 22:43:25 +0000 (22:43 +0000)
committerZachary Turner <zturner@google.com>
Tue, 10 Feb 2015 22:43:25 +0000 (22:43 +0000)
This makes llvm-pdbdump available on all platforms, although it
will currently fail to create a dumper if there is no PDB reader
implementation for the current platform.

It implements dumping of compilands and children, which is less
information than was previously available, but it has to be
rewritten from scratch using the new set of interfaces, so the
rest of the functionality will be added back in subsequent commits.

llvm-svn: 228755

90 files changed:
llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h
llvm/include/llvm/DebugInfo/PDB/DIA/DIASession.h
llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h
llvm/include/llvm/DebugInfo/PDB/IPDBSession.h
llvm/include/llvm/DebugInfo/PDB/IPDBSourceFile.h
llvm/include/llvm/DebugInfo/PDB/PDBExtras.h [new file with mode: 0644]
llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolAnnotation.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolBlock.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolCompiland.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolCustom.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolData.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolExe.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolFunc.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolLabel.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolThunk.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeArray.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeCustom.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeDimension.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeFriend.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeManaged.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypePointer.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeVTable.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeVTableShape.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolUnknown.h
llvm/include/llvm/DebugInfo/PDB/PDBSymbolUsingNamespace.h
llvm/include/llvm/DebugInfo/PDB/PDBTypes.h
llvm/lib/DebugInfo/PDB/CMakeLists.txt
llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp
llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp
llvm/lib/DebugInfo/PDB/IPDBSourceFile.cpp [new file with mode: 0644]
llvm/lib/DebugInfo/PDB/PDBExtras.cpp [new file with mode: 0644]
llvm/lib/DebugInfo/PDB/PDBInterfaceAnchors.cpp
llvm/lib/DebugInfo/PDB/PDBSymbol.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolAnnotation.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolBlock.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolCompiland.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolCompilandDetails.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolCompilandEnv.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolCustom.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolData.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolExe.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolFunc.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolFuncDebugEnd.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolFuncDebugStart.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolLabel.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolPublicSymbol.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolThunk.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeArray.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeBaseClass.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeBuiltin.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeCustom.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeDimension.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeEnum.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeFriend.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeFunctionArg.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeFunctionSig.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeManaged.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypePointer.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeTypedef.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeUDT.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeVTable.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolTypeVTableShape.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolUnknown.cpp
llvm/lib/DebugInfo/PDB/PDBSymbolUsingNamespace.cpp
llvm/tools/CMakeLists.txt
llvm/tools/Makefile
llvm/tools/llvm-pdbdump/CMakeLists.txt
llvm/tools/llvm-pdbdump/COMExtras.h [deleted file]
llvm/tools/llvm-pdbdump/DIAExtras.cpp [deleted file]
llvm/tools/llvm-pdbdump/DIAExtras.h [deleted file]
llvm/tools/llvm-pdbdump/DIASymbol.cpp [deleted file]
llvm/tools/llvm-pdbdump/DIASymbol.h [deleted file]
llvm/tools/llvm-pdbdump/LLVMBuild.txt
llvm/tools/llvm-pdbdump/Makefile [new file with mode: 0644]
llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
llvm/tools/llvm-pdbdump/llvm-pdbdump.h [deleted file]
llvm/unittests/DebugInfo/PDB/PDBApiTest.cpp

index 0890490..6336b31 100644 (file)
@@ -19,8 +19,12 @@ class DIARawSymbol : public IPDBRawSymbol {
 public:
   DIARawSymbol(const DIASession &PDBSession, CComPtr<IDiaSymbol> DiaSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
+  CComPtr<IDiaSymbol> getDiaSymbol() const { return Symbol; }
+
+  std::unique_ptr<IPDBEnumSymbols>
+  DIARawSymbol::findChildren(PDB_SymType Type) const override;
   std::unique_ptr<IPDBEnumSymbols>
   findChildren(PDB_SymType Type, StringRef Name,
                PDB_NameSearchFlags Flags) const override;
@@ -54,7 +58,7 @@ public:
   uint32_t getLiveRangeStartAddressOffset() const override;
   uint32_t getLiveRangeStartAddressSection() const override;
   uint32_t getLiveRangeStartRelativeVirtualAddress() const override;
-  uint32_t getLocalBasePointerRegisterId() const override;
+  PDB_RegisterId getLocalBasePointerRegisterId() const override;
   uint32_t getLowerBoundId() const override;
   uint32_t getMemorySpaceKind() const override;
   std::string getName() const override;
@@ -69,7 +73,7 @@ public:
   uint32_t getOffsetInUdt() const override;
   PDB_Cpu getPlatform() const override;
   uint32_t getRank() const override;
-  uint32_t getRegisterId() const override;
+  PDB_RegisterId getRegisterId() const override;
   uint32_t getRegisterType() const override;
   uint32_t getRelativeVirtualAddress() const override;
   uint32_t getSamplerSlot() const override;
@@ -129,6 +133,7 @@ public:
   bool hasInlAsm() const override;
   bool hasInlineAttribute() const override;
   bool hasInterruptReturn() const override;
+  bool hasFramePointer() const override;
   bool hasLongJump() const override;
   bool hasManagedCode() const override;
   bool hasNestedTypes() const override;
index 7ee0cb0..141b9b0 100644 (file)
@@ -25,6 +25,10 @@ public:
   void setLoadAddress(uint64_t Address) override;
   std::unique_ptr<PDBSymbolExe> getGlobalScope() const override;
   std::unique_ptr<PDBSymbol> getSymbolById(uint32_t SymbolId) const override;
+
+  std::unique_ptr<IPDBEnumSourceFiles> getAllSourceFiles() const override;
+  std::unique_ptr<IPDBEnumSourceFiles> getSourceFilesForCompiland(
+      const PDBSymbolCompiland &Compiland) const override;
   std::unique_ptr<IPDBSourceFile>
   getSourceFileById(uint32_t FileId) const override;
 
index 960821d..5dd103f 100644 (file)
@@ -29,7 +29,10 @@ class IPDBRawSymbol {
 public:
   virtual ~IPDBRawSymbol();
 
-  virtual void dump(llvm::raw_ostream &OS) const = 0;
+  virtual void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const = 0;
+
+  virtual std::unique_ptr<IPDBEnumSymbols>
+  findChildren(PDB_SymType Type) const = 0;
 
   virtual std::unique_ptr<IPDBEnumSymbols>
   findChildren(PDB_SymType Type, StringRef Name,
@@ -64,7 +67,7 @@ public:
   virtual uint32_t getLiveRangeStartAddressOffset() const = 0;
   virtual uint32_t getLiveRangeStartAddressSection() const = 0;
   virtual uint32_t getLiveRangeStartRelativeVirtualAddress() const = 0;
-  virtual uint32_t getLocalBasePointerRegisterId() const = 0;
+  virtual PDB_RegisterId getLocalBasePointerRegisterId() const = 0;
   virtual uint32_t getLowerBoundId() const = 0;
   virtual uint32_t getMemorySpaceKind() const = 0;
   virtual std::string getName() const = 0;
@@ -79,7 +82,7 @@ public:
   virtual uint32_t getOffsetInUdt() const = 0;
   virtual PDB_Cpu getPlatform() const = 0;
   virtual uint32_t getRank() const = 0;
-  virtual uint32_t getRegisterId() const = 0;
+  virtual PDB_RegisterId getRegisterId() const = 0;
   virtual uint32_t getRegisterType() const = 0;
   virtual uint32_t getRelativeVirtualAddress() const = 0;
   virtual uint32_t getSamplerSlot() const = 0;
@@ -136,6 +139,7 @@ public:
   virtual bool hasDebugInfo() const = 0;
   virtual bool hasEH() const = 0;
   virtual bool hasEHa() const = 0;
+  virtual bool hasFramePointer() const = 0;
   virtual bool hasInlAsm() const = 0;
   virtual bool hasInlineAttribute() const = 0;
   virtual bool hasInterruptReturn() const = 0;
index 5f16d94..0e0b2c5 100644 (file)
@@ -16,6 +16,7 @@
 
 namespace llvm {
 
+class PDBSymbolCompiland;
 class PDBSymbolExe;
 
 /// IPDBSession defines an interface used to provide a context for querying
@@ -28,6 +29,10 @@ public:
   virtual void setLoadAddress(uint64_t Address) = 0;
   virtual std::unique_ptr<PDBSymbolExe> getGlobalScope() const = 0;
   virtual std::unique_ptr<PDBSymbol> getSymbolById(uint32_t SymbolId) const = 0;
+
+  virtual std::unique_ptr<IPDBEnumSourceFiles> getAllSourceFiles() const = 0;
+  virtual std::unique_ptr<IPDBEnumSourceFiles>
+  getSourceFilesForCompiland(const PDBSymbolCompiland &Compiland) const = 0;
   virtual std::unique_ptr<IPDBSourceFile>
   getSourceFileById(uint32_t FileId) const = 0;
 
index 2b834e2..ae584d7 100644 (file)
 
 namespace llvm {
 
+class raw_ostream;
+
 /// IPDBSourceFile defines an interface used to represent source files whose
 /// information are stored in the PDB.
 class IPDBSourceFile {
 public:
   virtual ~IPDBSourceFile();
 
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const;
+
   virtual std::string getFileName() const = 0;
   virtual uint32_t getUniqueId() const = 0;
   virtual std::string getChecksum() const = 0;
diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBExtras.h b/llvm/include/llvm/DebugInfo/PDB/PDBExtras.h
new file mode 100644 (file)
index 0000000..5a768e7
--- /dev/null
@@ -0,0 +1,39 @@
+//===- PDBExtras.h - helper functions and classes for PDBs -------*- C++-*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_PDBEXTRAS_H
+#define LLVM_DEBUGINFO_PDB_PDBEXTRAS_H
+
+#include <unordered_map>
+
+#include "PDBTypes.h"
+
+#include "llvm/Support/raw_ostream.h"
+
+namespace llvm {
+typedef std::unordered_map<PDB_SymType, int> TagStats;
+
+struct stream_indent {
+  stream_indent(int IndentWidth) : Width(IndentWidth) {}
+  int Width;
+};
+raw_ostream &operator<<(raw_ostream &OS, const stream_indent &Indent);
+
+raw_ostream &operator<<(raw_ostream &OS, const PDB_RegisterId &Reg);
+raw_ostream &operator<<(raw_ostream &OS, const PDB_LocType &Loc);
+raw_ostream &operator<<(raw_ostream &OS, const PDB_ThunkOrdinal &Thunk);
+raw_ostream &operator<<(raw_ostream &OS, const PDB_Checksum &Checksum);
+raw_ostream &operator<<(raw_ostream &OS, const PDB_Lang &Lang);
+raw_ostream &operator<<(raw_ostream &OS, const PDB_SymType &Tag);
+raw_ostream &operator<<(raw_ostream &OS, const PDB_UniqueId &Id);
+raw_ostream &operator<<(raw_ostream &OS, const VersionInfo &Version);
+raw_ostream &operator<<(raw_ostream &OS, const TagStats &Stats);
+}
+
+#endif
index ada3ab3..95bc7fd 100644 (file)
 #define LLVM_DEBUGINFO_PDB_IPDBSYMBOL_H
 
 #include <memory>
+#include <unordered_map>
 
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Casting.h"
 
 #include "IPDBRawSymbol.h"
+#include "PDBExtras.h"
 #include "PDBTypes.h"
 
 #define FORWARD_SYMBOL_METHOD(MethodName)                                      \
@@ -48,10 +50,12 @@ public:
   /// call dump() on the underlying RawSymbol, which allows us to discover
   /// unknown properties, but individual implementations of PDBSymbol may
   /// override the behavior to only dump known fields.
-  virtual void dump(llvm::raw_ostream &OS) const;
+  virtual void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const = 0;
+  void defaultDump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const;
 
   PDB_SymType getSymTag() const;
 
+  std::unique_ptr<IPDBEnumSymbols> findChildren(PDB_SymType Type) const;
   std::unique_ptr<IPDBEnumSymbols>
   findChildren(PDB_SymType Type, StringRef Name,
                PDB_NameSearchFlags Flags) const;
@@ -61,7 +65,12 @@ public:
                                                      uint32_t RVA) const;
   std::unique_ptr<IPDBEnumSymbols> findInlineFramesByRVA(uint32_t RVA) const;
 
+  const IPDBRawSymbol &getRawSymbol() const { return *RawSymbol; }
+  IPDBRawSymbol &getRawSymbol() { return *RawSymbol; }
+
 protected:
+  std::unique_ptr<IPDBEnumSymbols> getChildStats(TagStats &Stats) const;
+
   const IPDBSession &Session;
   const std::unique_ptr<IPDBRawSymbol> RawSymbol;
 };
index 773c992..5751dcc 100644 (file)
@@ -23,7 +23,7 @@ public:
   PDBSymbolAnnotation(const IPDBSession &PDBSession,
                       std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAddressOffset)
   FORWARD_SYMBOL_METHOD(getAddressSection)
index 5e6c7e1..760324b 100644 (file)
@@ -23,7 +23,7 @@ public:
   PDBSymbolBlock(const IPDBSession &PDBSession,
                  std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAddressOffset)
   FORWARD_SYMBOL_METHOD(getAddressSection)
index b4831aa..b342444 100644 (file)
@@ -23,7 +23,7 @@ public:
   PDBSymbolCompiland(const IPDBSession &PDBSession,
                      std::unique_ptr<IPDBRawSymbol> CompilandSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(isEditAndContinueEnabled)
   FORWARD_SYMBOL_METHOD(getLexicalParentId)
index e498bdd..dcffabf 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolCompilandDetails(const IPDBSession &PDBSession,
                             std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   void getFrontEndVersion(VersionInfo &Version) const {
     RawSymbol->getFrontEndVersion(Version);
index 4e73288..dfff3f7 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolCompilandEnv(const IPDBSession &PDBSession,
                         std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getLexicalParentId)
   FORWARD_SYMBOL_METHOD(getName)
index 3d8c1fb..0c972d8 100644 (file)
@@ -27,7 +27,7 @@ public:
   PDBSymbolCustom(const IPDBSession &PDBSession,
                   std::unique_ptr<IPDBRawSymbol> CustomSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   void getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes);
   FORWARD_SYMBOL_METHOD(getSymIndexId)
index 22098e3..e1c074e 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolData(const IPDBSession &PDBSession,
                 std::unique_ptr<IPDBRawSymbol> DataSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAccess)
   FORWARD_SYMBOL_METHOD(getAddressOffset)
index 5f03c44..caac166 100644 (file)
@@ -24,7 +24,7 @@ public:
   PDBSymbolExe(const IPDBSession &PDBSession,
                std::unique_ptr<IPDBRawSymbol> ExeSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAge)
   FORWARD_SYMBOL_METHOD(getGuid)
index f101d30..4b78c2f 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolFunc(const IPDBSession &PDBSession,
                 std::unique_ptr<IPDBRawSymbol> FuncSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAccess)
   FORWARD_SYMBOL_METHOD(getAddressOffset)
@@ -46,8 +46,10 @@ public:
   FORWARD_SYMBOL_METHOD(isStatic)
   FORWARD_SYMBOL_METHOD(getLength)
   FORWARD_SYMBOL_METHOD(getLexicalParentId)
+  FORWARD_SYMBOL_METHOD(getLocalBasePointerRegisterId)
   FORWARD_SYMBOL_METHOD(getLocationType)
   FORWARD_SYMBOL_METHOD(getName)
+  FORWARD_SYMBOL_METHOD(hasFramePointer)
   FORWARD_SYMBOL_METHOD(hasNoInlineAttribute)
   FORWARD_SYMBOL_METHOD(hasNoReturnAttribute)
   FORWARD_SYMBOL_METHOD(isUnreached)
index 9455961..15ce896 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolFuncDebugEnd(const IPDBSession &PDBSession,
                         std::unique_ptr<IPDBRawSymbol> FuncDebugEndSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAddressOffset)
   FORWARD_SYMBOL_METHOD(getAddressSection)
index c3ccd25..9ad6d38 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolFuncDebugStart(const IPDBSession &PDBSession,
                           std::unique_ptr<IPDBRawSymbol> FuncDebugStartSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAddressOffset)
   FORWARD_SYMBOL_METHOD(getAddressSection)
index 114bb37..d7cb6f5 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolLabel(const IPDBSession &PDBSession,
                  std::unique_ptr<IPDBRawSymbol> LabelSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAddressOffset)
   FORWARD_SYMBOL_METHOD(getAddressSection)
index 98d4c3b..540cf19 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolPublicSymbol(const IPDBSession &PDBSession,
                         std::unique_ptr<IPDBRawSymbol> PublicSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAddressOffset)
   FORWARD_SYMBOL_METHOD(getAddressSection)
index 136b6ca..7a2eab2 100644 (file)
@@ -24,7 +24,7 @@ public:
   PDBSymbolThunk(const IPDBSession &PDBSession,
                  std::unique_ptr<IPDBRawSymbol> ThunkSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAccess)
   FORWARD_SYMBOL_METHOD(getAddressOffset)
index 8100ea7..ef81d79 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeArray(const IPDBSession &PDBSession,
                      std::unique_ptr<IPDBRawSymbol> ArrayTypeSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getArrayIndexTypeId)
   FORWARD_SYMBOL_METHOD(isConstType)
index 60c3dc2..3cc7a02 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeBaseClass(const IPDBSession &PDBSession,
                          std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getAccess)
   FORWARD_SYMBOL_METHOD(getClassParentId)
index ba764dd..769d447 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeBuiltin(const IPDBSession &PDBSession,
                        std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getBuiltinType)
   FORWARD_SYMBOL_METHOD(isConstType)
index a28a6ef..7bdbc9d 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeCustom(const IPDBSession &PDBSession,
                       std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getOemId)
   FORWARD_SYMBOL_METHOD(getOemSymbolId)
index 3039b87..737fdfa 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeDimension(const IPDBSession &PDBSession,
                          std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getLowerBoundId)
   FORWARD_SYMBOL_METHOD(getUpperBoundId)
index c44c4be..63c16b1 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeEnum(const IPDBSession &PDBSession,
                     std::unique_ptr<IPDBRawSymbol> EnumTypeSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getBuiltinType)
   FORWARD_SYMBOL_METHOD(getClassParentId)
index 8e7e93e..0c63da7 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeFriend(const IPDBSession &PDBSession,
                       std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getClassParentId)
   FORWARD_SYMBOL_METHOD(getName)
index c8f1e1d..531ebda 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeFunctionArg(const IPDBSession &PDBSession,
                            std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getClassParentId)
   FORWARD_SYMBOL_METHOD(getLexicalParentId)
index d23d787..91dab3e 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeFunctionSig(const IPDBSession &PDBSession,
                            std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getCallingConvention)
   FORWARD_SYMBOL_METHOD(getClassParentId)
index 436f51e..f5d02f9 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeManaged(const IPDBSession &PDBSession,
                        std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getName)
   FORWARD_SYMBOL_METHOD(getSymIndexId)
index 2236f9a..3a75edd 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypePointer(const IPDBSession &PDBSession,
                        std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(isConstType)
   FORWARD_SYMBOL_METHOD(getLength)
index 4cb13cb..957d184 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeTypedef(const IPDBSession &PDBSession,
                        std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getBuiltinType)
   FORWARD_SYMBOL_METHOD(getClassParentId)
index 7025502..2c86c84 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeUDT(const IPDBSession &PDBSession,
                    std::unique_ptr<IPDBRawSymbol> UDTSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getClassParentId)
   FORWARD_SYMBOL_METHOD(hasConstructor)
index 0055969..0c9a916 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeVTable(const IPDBSession &PDBSession,
                       std::unique_ptr<IPDBRawSymbol> VtblSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getClassParentId)
   FORWARD_SYMBOL_METHOD(isConstType)
index f5d6a4a..5055c8d 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolTypeVTableShape(const IPDBSession &PDBSession,
                            std::unique_ptr<IPDBRawSymbol> VtblShapeSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(isConstType)
   FORWARD_SYMBOL_METHOD(getCount)
index bcdb683..cc8ab37 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolUnknown(const IPDBSession &PDBSession,
                    std::unique_ptr<IPDBRawSymbol> UnknownSymbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   static bool classof(const PDBSymbol *S) {
     return (S->getSymTag() == PDB_SymType::None ||
index 861f81a..535dc8d 100644 (file)
@@ -22,7 +22,7 @@ public:
   PDBSymbolUsingNamespace(const IPDBSession &PDBSession,
                           std::unique_ptr<IPDBRawSymbol> Symbol);
 
-  void dump(llvm::raw_ostream &OS) const override;
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override;
 
   FORWARD_SYMBOL_METHOD(getLexicalParentId)
   FORWARD_SYMBOL_METHOD(getName)
index 836a423..0009b02 100644 (file)
@@ -11,6 +11,7 @@
 #define LLVM_DEBUGINFO_PDB_PDBTYPES_H
 
 #include <stdint.h>
+#include <functional>
 #include "llvm/Config/llvm-config.h"
 
 namespace llvm {
@@ -68,6 +69,12 @@ enum class PDB_ReaderType {
   DIA = 0,
 };
 
+enum class PDB_DumpLevel {
+  Compact,
+  Normal,
+  Detailed,
+};
+
 /// Defines a 128-bit unique identifier.  This maps to a GUID on Windows, but
 /// is abstracted here for the purposes of non-Windows platforms that don't have
 /// the GUID structure defined.
@@ -365,6 +372,58 @@ enum class PDB_BuiltinType {
   HResult = 31
 };
 
+enum class PDB_RegisterId {
+  Unknown = 0,
+  VFrame = 30006,
+  AL = 1,
+  CL = 2,
+  DL = 3,
+  BL = 4,
+  AH = 5,
+  CH = 6,
+  DH = 7,
+  BH = 8,
+  AX = 9,
+  CX = 10,
+  DX = 11,
+  BX = 12,
+  SP = 13,
+  BP = 14,
+  SI = 15,
+  DI = 16,
+  EAX = 17,
+  ECX = 18,
+  EDX = 19,
+  EBX = 20,
+  ESP = 21,
+  EBP = 22,
+  ESI = 23,
+  EDI = 24,
+  ES = 25,
+  CS = 26,
+  SS = 27,
+  DS = 28,
+  FS = 29,
+  GS = 30,
+  IP = 31,
+  RAX = 328,
+  RBX = 329,
+  RCX = 330,
+  RDX = 331,
+  RSI = 332,
+  RDI = 333,
+  RBP = 334,
+  RSP = 335,
+  R8 = 336,
+  R9 = 337,
+  R10 = 338,
+  R11 = 339,
+  R12 = 340,
+  R13 = 341,
+  R14 = 342,
+  R15 = 343,
+};
+
 enum class PDB_MemberAccess { Private = 1, Protected = 2, Public = 3 };
 
 struct VersionInfo {
@@ -376,4 +435,15 @@ struct VersionInfo {
 
 } // namespace llvm
 
+namespace std {
+template <> struct hash<llvm::PDB_SymType> {
+  typedef llvm::PDB_SymType argument_type;
+  typedef std::size_t result_type;
+
+  result_type operator()(const argument_type &Arg) const {
+    return std::hash<int>()(static_cast<int>(Arg));
+  }
+};
+}
+
 #endif
index 007406c..00ad1ca 100644 (file)
@@ -30,7 +30,9 @@ endif()
 list(APPEND LIBPDB_ADDITIONAL_HEADER_DIRS "../../../include/llvm/DebugInfo/PDB")
 
 add_llvm_library(LLVMDebugInfoPDB
+  IPDBSourceFile.cpp
   PDB.cpp
+  PDBExtras.cpp
   PDBInterfaceAnchors.cpp
   PDBSymbol.cpp
   PDBSymbolAnnotation.cpp
index 66d5edc..5c94f6e 100644 (file)
@@ -7,6 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/DebugInfo/PDB/PDBExtras.h"
 #include "llvm/DebugInfo/PDB/DIA/DIAEnumSymbols.h"
 #include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h"
 #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
@@ -54,13 +55,228 @@ PrivateGetDIAValue(IDiaSymbol *Symbol,
   ::memcpy(&IdResult, &Result, sizeof(GUID));
   return IdResult;
 }
+
+template <typename ArgType>
+void DumpDIAValue(llvm::raw_ostream &OS, int Indent, StringRef Name,
+                  IDiaSymbol *Symbol,
+                  HRESULT (__stdcall IDiaSymbol::*Method)(ArgType *)) {
+  ArgType Value;
+  if (S_OK == (Symbol->*Method)(&Value)) {
+    OS.indent(Indent);
+    OS << Name << ": " << Value << "\n";
+  }
+}
+
+void DumpDIAValue(llvm::raw_ostream &OS, int Indent, StringRef Name,
+                  IDiaSymbol *Symbol,
+                  HRESULT (__stdcall IDiaSymbol::*Method)(BSTR *)) {
+  BSTR Value = nullptr;
+  if (S_OK != (Symbol->*Method)(&Value))
+    return;
+  const char *Bytes = reinterpret_cast<const char *>(Value);
+  ArrayRef<char> ByteArray(Bytes, ::SysStringByteLen(Value));
+  std::string Result;
+  if (llvm::convertUTF16ToUTF8String(ByteArray, Result)) {
+    OS.indent(Indent);
+    OS << Name << ": " << Result << "\n";
+  }
+  ::SysFreeString(Value);
+}
+}
+
+namespace llvm {
+raw_ostream &operator<<(raw_ostream &OS, const GUID &Guid) {
+  const PDB_UniqueId *Id = reinterpret_cast<const PDB_UniqueId *>(&Guid);
+  OS << *Id;
+  return OS;
+}
 }
 
 DIARawSymbol::DIARawSymbol(const DIASession &PDBSession,
                            CComPtr<IDiaSymbol> DiaSymbol)
     : Session(PDBSession), Symbol(DiaSymbol) {}
 
-void DIARawSymbol::dump(llvm::raw_ostream &OS) const {}
+#define RAW_METHOD_DUMP(Stream, Method)                                        \
+  DumpDIAValue(Stream, Indent, StringRef(#Method), Symbol, &IDiaSymbol::Method);
+
+void DIARawSymbol::dump(raw_ostream &OS, int Indent,
+                        PDB_DumpLevel Level) const {
+  RAW_METHOD_DUMP(OS, get_access)
+  RAW_METHOD_DUMP(OS, get_addressOffset)
+  RAW_METHOD_DUMP(OS, get_addressSection)
+  RAW_METHOD_DUMP(OS, get_age)
+  RAW_METHOD_DUMP(OS, get_arrayIndexTypeId)
+  RAW_METHOD_DUMP(OS, get_backEndMajor)
+  RAW_METHOD_DUMP(OS, get_backEndMinor)
+  RAW_METHOD_DUMP(OS, get_backEndBuild)
+  RAW_METHOD_DUMP(OS, get_backEndQFE)
+  RAW_METHOD_DUMP(OS, get_baseDataOffset)
+  RAW_METHOD_DUMP(OS, get_baseDataSlot)
+  RAW_METHOD_DUMP(OS, get_baseSymbolId)
+  RAW_METHOD_DUMP(OS, get_builtInKind)
+  RAW_METHOD_DUMP(OS, get_bitPosition)
+  RAW_METHOD_DUMP(OS, get_callingConvention)
+  RAW_METHOD_DUMP(OS, get_classParentId)
+  RAW_METHOD_DUMP(OS, get_compilerName)
+  RAW_METHOD_DUMP(OS, get_count)
+  RAW_METHOD_DUMP(OS, get_countLiveRanges)
+  RAW_METHOD_DUMP(OS, get_frontEndMajor)
+  RAW_METHOD_DUMP(OS, get_frontEndMinor)
+  RAW_METHOD_DUMP(OS, get_frontEndBuild)
+  RAW_METHOD_DUMP(OS, get_frontEndQFE)
+  RAW_METHOD_DUMP(OS, get_count)
+  RAW_METHOD_DUMP(OS, get_lexicalParentId)
+  RAW_METHOD_DUMP(OS, get_libraryName)
+  RAW_METHOD_DUMP(OS, get_liveRangeStartAddressOffset)
+  RAW_METHOD_DUMP(OS, get_liveRangeStartAddressSection)
+  RAW_METHOD_DUMP(OS, get_liveRangeStartRelativeVirtualAddress)
+  RAW_METHOD_DUMP(OS, get_localBasePointerRegisterId)
+  RAW_METHOD_DUMP(OS, get_lowerBoundId)
+  RAW_METHOD_DUMP(OS, get_memorySpaceKind)
+  RAW_METHOD_DUMP(OS, get_name)
+  RAW_METHOD_DUMP(OS, get_numberOfAcceleratorPointerTags)
+  RAW_METHOD_DUMP(OS, get_numberOfColumns)
+  RAW_METHOD_DUMP(OS, get_numberOfModifiers)
+  RAW_METHOD_DUMP(OS, get_numberOfRegisterIndices)
+  RAW_METHOD_DUMP(OS, get_numberOfRows)
+  RAW_METHOD_DUMP(OS, get_objectFileName)
+  RAW_METHOD_DUMP(OS, get_oemId)
+  RAW_METHOD_DUMP(OS, get_oemSymbolId)
+  RAW_METHOD_DUMP(OS, get_offsetInUdt)
+  RAW_METHOD_DUMP(OS, get_platform)
+  RAW_METHOD_DUMP(OS, get_rank)
+  RAW_METHOD_DUMP(OS, get_registerId)
+  RAW_METHOD_DUMP(OS, get_registerType)
+  RAW_METHOD_DUMP(OS, get_relativeVirtualAddress)
+  RAW_METHOD_DUMP(OS, get_samplerSlot)
+  RAW_METHOD_DUMP(OS, get_signature)
+  RAW_METHOD_DUMP(OS, get_sizeInUdt)
+  RAW_METHOD_DUMP(OS, get_slot)
+  RAW_METHOD_DUMP(OS, get_sourceFileName)
+  RAW_METHOD_DUMP(OS, get_stride)
+  RAW_METHOD_DUMP(OS, get_subTypeId)
+  RAW_METHOD_DUMP(OS, get_symbolsFileName)
+  RAW_METHOD_DUMP(OS, get_symIndexId)
+  RAW_METHOD_DUMP(OS, get_targetOffset)
+  RAW_METHOD_DUMP(OS, get_targetRelativeVirtualAddress)
+  RAW_METHOD_DUMP(OS, get_targetVirtualAddress)
+  RAW_METHOD_DUMP(OS, get_targetSection)
+  RAW_METHOD_DUMP(OS, get_textureSlot)
+  RAW_METHOD_DUMP(OS, get_timeStamp)
+  RAW_METHOD_DUMP(OS, get_token)
+  RAW_METHOD_DUMP(OS, get_typeId)
+  RAW_METHOD_DUMP(OS, get_uavSlot)
+  RAW_METHOD_DUMP(OS, get_undecoratedName)
+  RAW_METHOD_DUMP(OS, get_unmodifiedTypeId)
+  RAW_METHOD_DUMP(OS, get_upperBoundId)
+  RAW_METHOD_DUMP(OS, get_virtualBaseDispIndex)
+  RAW_METHOD_DUMP(OS, get_virtualBaseOffset)
+  RAW_METHOD_DUMP(OS, get_virtualTableShapeId)
+  RAW_METHOD_DUMP(OS, get_dataKind)
+  RAW_METHOD_DUMP(OS, get_symTag)
+  RAW_METHOD_DUMP(OS, get_guid)
+  RAW_METHOD_DUMP(OS, get_offset)
+  RAW_METHOD_DUMP(OS, get_thisAdjust)
+  RAW_METHOD_DUMP(OS, get_virtualBasePointerOffset)
+  RAW_METHOD_DUMP(OS, get_locationType)
+  RAW_METHOD_DUMP(OS, get_machineType)
+  RAW_METHOD_DUMP(OS, get_thunkOrdinal)
+  RAW_METHOD_DUMP(OS, get_length)
+  RAW_METHOD_DUMP(OS, get_liveRangeLength)
+  RAW_METHOD_DUMP(OS, get_virtualAddress)
+  RAW_METHOD_DUMP(OS, get_udtKind)
+  RAW_METHOD_DUMP(OS, get_constructor)
+  RAW_METHOD_DUMP(OS, get_customCallingConvention)
+  RAW_METHOD_DUMP(OS, get_farReturn)
+  RAW_METHOD_DUMP(OS, get_code)
+  RAW_METHOD_DUMP(OS, get_compilerGenerated)
+  RAW_METHOD_DUMP(OS, get_constType)
+  RAW_METHOD_DUMP(OS, get_editAndContinueEnabled)
+  RAW_METHOD_DUMP(OS, get_function)
+  RAW_METHOD_DUMP(OS, get_stride)
+  RAW_METHOD_DUMP(OS, get_noStackOrdering)
+  RAW_METHOD_DUMP(OS, get_hasAlloca)
+  RAW_METHOD_DUMP(OS, get_hasAssignmentOperator)
+  RAW_METHOD_DUMP(OS, get_isCTypes)
+  RAW_METHOD_DUMP(OS, get_hasCastOperator)
+  RAW_METHOD_DUMP(OS, get_hasDebugInfo)
+  RAW_METHOD_DUMP(OS, get_hasEH)
+  RAW_METHOD_DUMP(OS, get_hasEHa)
+  RAW_METHOD_DUMP(OS, get_hasInlAsm)
+  RAW_METHOD_DUMP(OS, get_framePointerPresent)
+  RAW_METHOD_DUMP(OS, get_inlSpec)
+  RAW_METHOD_DUMP(OS, get_interruptReturn)
+  RAW_METHOD_DUMP(OS, get_hasLongJump)
+  RAW_METHOD_DUMP(OS, get_hasManagedCode)
+  RAW_METHOD_DUMP(OS, get_hasNestedTypes)
+  RAW_METHOD_DUMP(OS, get_noInline)
+  RAW_METHOD_DUMP(OS, get_noReturn)
+  RAW_METHOD_DUMP(OS, get_optimizedCodeDebugInfo)
+  RAW_METHOD_DUMP(OS, get_overloadedOperator)
+  RAW_METHOD_DUMP(OS, get_hasSEH)
+  RAW_METHOD_DUMP(OS, get_hasSecurityChecks)
+  RAW_METHOD_DUMP(OS, get_hasSetJump)
+  RAW_METHOD_DUMP(OS, get_strictGSCheck)
+  RAW_METHOD_DUMP(OS, get_isAcceleratorGroupSharedLocal)
+  RAW_METHOD_DUMP(OS, get_isAcceleratorPointerTagLiveRange)
+  RAW_METHOD_DUMP(OS, get_isAcceleratorStubFunction)
+  RAW_METHOD_DUMP(OS, get_isAggregated)
+  RAW_METHOD_DUMP(OS, get_intro)
+  RAW_METHOD_DUMP(OS, get_isCVTCIL)
+  RAW_METHOD_DUMP(OS, get_isConstructorVirtualBase)
+  RAW_METHOD_DUMP(OS, get_isCxxReturnUdt)
+  RAW_METHOD_DUMP(OS, get_isDataAligned)
+  RAW_METHOD_DUMP(OS, get_isHLSLData)
+  RAW_METHOD_DUMP(OS, get_isHotpatchable)
+  RAW_METHOD_DUMP(OS, get_indirectVirtualBaseClass)
+  RAW_METHOD_DUMP(OS, get_isInterfaceUdt)
+  RAW_METHOD_DUMP(OS, get_intrinsic)
+  RAW_METHOD_DUMP(OS, get_isLTCG)
+  RAW_METHOD_DUMP(OS, get_isLocationControlFlowDependent)
+  RAW_METHOD_DUMP(OS, get_isMSILNetmodule)
+  RAW_METHOD_DUMP(OS, get_isMatrixRowMajor)
+  RAW_METHOD_DUMP(OS, get_managed)
+  RAW_METHOD_DUMP(OS, get_msil)
+  RAW_METHOD_DUMP(OS, get_isMultipleInheritance)
+  RAW_METHOD_DUMP(OS, get_isNaked)
+  RAW_METHOD_DUMP(OS, get_nested)
+  RAW_METHOD_DUMP(OS, get_isOptimizedAway)
+  RAW_METHOD_DUMP(OS, get_packed)
+  RAW_METHOD_DUMP(OS, get_isPointerBasedOnSymbolValue)
+  RAW_METHOD_DUMP(OS, get_isPointerToDataMember)
+  RAW_METHOD_DUMP(OS, get_isPointerToMemberFunction)
+  RAW_METHOD_DUMP(OS, get_pure)
+  RAW_METHOD_DUMP(OS, get_RValueReference)
+  RAW_METHOD_DUMP(OS, get_isRefUdt)
+  RAW_METHOD_DUMP(OS, get_reference)
+  RAW_METHOD_DUMP(OS, get_restrictedType)
+  RAW_METHOD_DUMP(OS, get_isReturnValue)
+  RAW_METHOD_DUMP(OS, get_isSafeBuffers)
+  RAW_METHOD_DUMP(OS, get_scoped)
+  RAW_METHOD_DUMP(OS, get_isSdl)
+  RAW_METHOD_DUMP(OS, get_isSingleInheritance)
+  RAW_METHOD_DUMP(OS, get_isSplitted)
+  RAW_METHOD_DUMP(OS, get_isStatic)
+  RAW_METHOD_DUMP(OS, get_isStripped)
+  RAW_METHOD_DUMP(OS, get_unalignedType)
+  RAW_METHOD_DUMP(OS, get_notReached)
+  RAW_METHOD_DUMP(OS, get_isValueUdt)
+  RAW_METHOD_DUMP(OS, get_virtual)
+  RAW_METHOD_DUMP(OS, get_virtualBaseClass)
+  RAW_METHOD_DUMP(OS, get_isVirtualInheritance)
+  RAW_METHOD_DUMP(OS, get_volatileType)
+}
+
+std::unique_ptr<IPDBEnumSymbols>
+DIARawSymbol::findChildren(PDB_SymType Type) const {
+  enum SymTagEnum EnumVal = static_cast<enum SymTagEnum>(Type);
+
+  CComPtr<IDiaEnumSymbols> DiaEnumerator;
+  if (S_OK != Symbol->findChildren(EnumVal, nullptr, nsNone, &DiaEnumerator))
+    return nullptr;
+
+  return std::make_unique<DIAEnumSymbols>(Session, DiaEnumerator);
+}
 
 std::unique_ptr<IPDBEnumSymbols>
 DIARawSymbol::findChildren(PDB_SymType Type, StringRef Name,
@@ -198,7 +414,7 @@ void DIARawSymbol::getFrontEndVersion(VersionInfo &Version) const {
 }
 
 PDB_Lang DIARawSymbol::getLanguage() const {
-  return PrivateGetDIAValue<DWORD, PDB_Lang>(Symbol, &IDiaSymbol::get_count);
+  return PrivateGetDIAValue<DWORD, PDB_Lang>(Symbol, &IDiaSymbol::get_language);
 }
 
 uint32_t DIARawSymbol::getLexicalParentId() const {
@@ -224,9 +440,9 @@ uint32_t DIARawSymbol::getLiveRangeStartRelativeVirtualAddress() const {
       Symbol, &IDiaSymbol::get_liveRangeStartRelativeVirtualAddress);
 }
 
-uint32_t DIARawSymbol::getLocalBasePointerRegisterId() const {
-  return PrivateGetDIAValue(Symbol,
-                            &IDiaSymbol::get_localBasePointerRegisterId);
+PDB_RegisterId DIARawSymbol::getLocalBasePointerRegisterId() const {
+  return PrivateGetDIAValue<DWORD, PDB_RegisterId>(
+      Symbol, &IDiaSymbol::get_localBasePointerRegisterId);
 }
 
 uint32_t DIARawSymbol::getLowerBoundId() const {
@@ -286,8 +502,9 @@ uint32_t DIARawSymbol::getRank() const {
   return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_rank);
 }
 
-uint32_t DIARawSymbol::getRegisterId() const {
-  return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_registerId);
+PDB_RegisterId DIARawSymbol::getRegisterId() const {
+  return PrivateGetDIAValue<DWORD, PDB_RegisterId>(Symbol,
+                                                   &IDiaSymbol::get_registerId);
 }
 
 uint32_t DIARawSymbol::getRegisterType() const {
@@ -486,7 +703,7 @@ bool DIARawSymbol::isFunction() const {
 }
 
 bool DIARawSymbol::getAddressTaken() const {
-  return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_stride);
+  return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_addressTaken);
 }
 
 bool DIARawSymbol::getNoStackOrdering() const {
@@ -533,6 +750,10 @@ bool DIARawSymbol::hasInterruptReturn() const {
   return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_interruptReturn);
 }
 
+bool DIARawSymbol::hasFramePointer() const {
+  return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_framePointerPresent);
+}
+
 bool DIARawSymbol::hasLongJump() const {
   return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_hasLongJump);
 }
index 3b5c951..0df2354 100644 (file)
@@ -7,11 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
+
 #include "llvm/DebugInfo/PDB/DIA/DIAEnumDebugStreams.h"
+#include "llvm/DebugInfo/PDB/DIA/DIAEnumSourceFiles.h"
 #include "llvm/DebugInfo/PDB/DIA/DIARawSymbol.h"
 #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
 #include "llvm/DebugInfo/PDB/DIA/DIASourceFile.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
 #include "llvm/Support/ConvertUTF.h"
 
 using namespace llvm;
@@ -75,6 +78,27 @@ std::unique_ptr<PDBSymbol> DIASession::getSymbolById(uint32_t SymbolId) const {
   return PDBSymbol::create(*this, std::move(RawSymbol));
 }
 
+std::unique_ptr<IPDBEnumSourceFiles> DIASession::getAllSourceFiles() const {
+  CComPtr<IDiaEnumSourceFiles> Files;
+  if (S_OK != Session->findFile(nullptr, nullptr, nsNone, &Files))
+    return nullptr;
+
+  return std::make_unique<DIAEnumSourceFiles>(*this, Files);
+}
+
+std::unique_ptr<IPDBEnumSourceFiles> DIASession::getSourceFilesForCompiland(
+    const PDBSymbolCompiland &Compiland) const {
+  CComPtr<IDiaEnumSourceFiles> Files;
+
+  const DIARawSymbol &RawSymbol =
+      static_cast<const DIARawSymbol &>(Compiland.getRawSymbol());
+  if (S_OK !=
+      Session->findFile(RawSymbol.getDiaSymbol(), nullptr, nsNone, &Files))
+    return nullptr;
+
+  return std::make_unique<DIAEnumSourceFiles>(*this, Files);
+}
+
 std::unique_ptr<IPDBSourceFile>
 DIASession::getSourceFileById(uint32_t FileId) const {
   CComPtr<IDiaSourceFile> LocatedFile;
diff --git a/llvm/lib/DebugInfo/PDB/IPDBSourceFile.cpp b/llvm/lib/DebugInfo/PDB/IPDBSourceFile.cpp
new file mode 100644 (file)
index 0000000..f3e0284
--- /dev/null
@@ -0,0 +1,34 @@
+//===- IPDBSourceFile.cpp - base interface for a PDB source file *- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
+#include "llvm/DebugInfo/PDB/PDBExtras.h"
+#include "llvm/Support/Format.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace llvm;
+
+IPDBSourceFile::~IPDBSourceFile() {}
+
+void IPDBSourceFile::dump(raw_ostream &OS, int Indent,
+                          PDB_DumpLevel Level) const {
+  if (Level == PDB_DumpLevel::Compact) {
+    OS.indent(Indent);
+    PDB_Checksum ChecksumType = getChecksumType();
+    OS << "[";
+    if (ChecksumType != PDB_Checksum::None) {
+      OS << ChecksumType << ": ";
+      std::string Checksum = getChecksum();
+      for (uint8_t c : Checksum)
+        OS << format_hex_no_prefix(c, 2, true);
+    } else
+      OS << "No checksum";
+    OS << "] " << getFileName() << "\n";
+  }
+}
diff --git a/llvm/lib/DebugInfo/PDB/PDBExtras.cpp b/llvm/lib/DebugInfo/PDB/PDBExtras.cpp
new file mode 100644 (file)
index 0000000..60e5368
--- /dev/null
@@ -0,0 +1,219 @@
+//===- PDBExtras.cpp - helper functions and classes for PDBs -----*- C++-*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/PDB/PDBExtras.h"
+#include "llvm/ADT/ArrayRef.h"
+
+using namespace llvm;
+
+#define CASE_OUTPUT_ENUM_CLASS_STR(Class, Value, Str, Stream)                  \
+  case Class::Value:                                                           \
+    Stream << Str;                                                             \
+    break;
+
+#define CASE_OUTPUT_ENUM_CLASS_NAME(Class, Value, Stream)                      \
+  CASE_OUTPUT_ENUM_CLASS_STR(Class, Value, #Value, Stream)
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const stream_indent &Indent) {
+  OS.indent(Indent.Width);
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_RegisterId &Reg) {
+  switch (Reg) {
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, AL, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, CL, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, DL, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, BL, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, AH, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, CH, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, DH, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, BH, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, AX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, CX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, DX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, BX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, SP, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, BP, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, SI, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, DI, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, EAX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, ECX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, EDX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, EBX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, ESP, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, EBP, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, ESI, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, EDI, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, ES, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, CS, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, SS, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, DS, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, FS, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, GS, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, IP, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RAX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RBX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RCX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RDX, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RSI, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RDI, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RBP, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, RSP, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R8, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R9, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R10, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R11, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R12, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R13, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R14, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_RegisterId, R15, OS)
+  default:
+    OS << "Unknown";
+  }
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_LocType &Loc) {
+  switch (Loc) {
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, Static, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, TLS, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, RegRel, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, ThisRel, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, Enregistered, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, BitField, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, Slot, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, IlRel, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, MetaData, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_LocType, Constant, OS)
+  default:
+    OS << "Unknown";
+  }
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_ThunkOrdinal &Thunk) {
+  switch (Thunk) {
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_ThunkOrdinal, BranchIsland, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_ThunkOrdinal, Pcode, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_ThunkOrdinal, Standard, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_ThunkOrdinal, ThisAdjustor, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_ThunkOrdinal, TrampIncremental, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_ThunkOrdinal, UnknownLoad, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_ThunkOrdinal, Vcall, OS)
+  default:
+    OS << "Unknown";
+  }
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_Checksum &Checksum) {
+  switch (Checksum) {
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Checksum, None, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Checksum, MD5, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Checksum, SHA1, OS)
+  default:
+    OS << "Unknown";
+  }
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_Lang &Lang) {
+  switch (Lang) {
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, C, OS)
+    CASE_OUTPUT_ENUM_CLASS_STR(PDB_Lang, Cpp, "C++", OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Fortran, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Masm, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Pascal, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Basic, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Cobol, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Link, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Cvtres, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Cvtpgd, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, CSharp, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, VB, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, ILAsm, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, Java, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, JScript, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, MSIL, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_Lang, HLSL, OS)
+  default:
+    OS << "Unknown";
+  }
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_SymType &Tag) {
+  switch (Tag) {
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Exe, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Compiland, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CompilandDetails, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CompilandEnv, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Function, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Block, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Data, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Annotation, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Label, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, PublicSymbol, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, UDT, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Enum, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FunctionSig, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, PointerType, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, ArrayType, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, BuiltinType, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Typedef, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, BaseClass, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Friend, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FunctionArg, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FuncDebugStart, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, FuncDebugEnd, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, UsingNamespace, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, VTableShape, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, VTable, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Custom, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Thunk, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, CustomType, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, ManagedType, OS)
+    CASE_OUTPUT_ENUM_CLASS_NAME(PDB_SymType, Dimension, OS)
+  default:
+    OS << "Unknown";
+  }
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_UniqueId &Id) {
+  static const char *Lookup = "0123456789ABCDEF";
+
+  static_assert(sizeof(PDB_UniqueId) == 16, "Expected 16-byte GUID");
+  ArrayRef<uint8_t> GuidBytes(reinterpret_cast<const uint8_t*>(&Id), 16);
+  OS << "{";
+  for (int i=0; i < 16;) {
+    uint8_t Byte = GuidBytes[i];
+    uint8_t HighNibble = (Byte >> 4) & 0xF;
+    uint8_t LowNibble = Byte & 0xF;
+    OS << Lookup[HighNibble] << Lookup[LowNibble];
+    ++i;
+    if (i>=4 && i<=10 && i%2==0)
+      OS << "-";
+  }
+  OS << "}";
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const VersionInfo &Version) {
+  OS << Version.Major << "." << Version.Minor << "." << Version.Build;
+  return OS;
+}
+
+raw_ostream &llvm::operator<<(raw_ostream &OS, const TagStats &Stats) {
+  for (auto Tag : Stats) {
+    OS << Tag.first << ":" << Tag.second << " ";
+  }
+  return OS;
+}
index 8b430cf..1183af1 100644 (file)
@@ -25,6 +25,4 @@ IPDBDataStream::~IPDBDataStream() {}
 
 IPDBRawSymbol::~IPDBRawSymbol() {}
 
-IPDBSourceFile::~IPDBSourceFile() {}
-
 IPDBLineNumber::~IPDBLineNumber() {}
index bbc3952..d65a153 100644 (file)
@@ -98,10 +98,17 @@ PDBSymbol::create(const IPDBSession &PDBSession,
   }
 }
 
-void PDBSymbol::dump(llvm::raw_ostream &OS) const { RawSymbol->dump(OS); }
+void PDBSymbol::defaultDump(raw_ostream &OS, int Indent,
+                            PDB_DumpLevel Level) const {
+  RawSymbol->dump(OS, Indent, Level);
+}
 
 PDB_SymType PDBSymbol::getSymTag() const { return RawSymbol->getSymTag(); }
 
+std::unique_ptr<IPDBEnumSymbols> PDBSymbol::findChildren(PDB_SymType Type) const {
+  return RawSymbol->findChildren(Type);
+}
+
 std::unique_ptr<IPDBEnumSymbols>
 PDBSymbol::findChildren(PDB_SymType Type, StringRef Name,
                         PDB_NameSearchFlags Flags) const {
@@ -118,3 +125,14 @@ std::unique_ptr<IPDBEnumSymbols>
 PDBSymbol::findInlineFramesByRVA(uint32_t RVA) const {
   return RawSymbol->findInlineFramesByRVA(RVA);
 }
+
+std::unique_ptr<IPDBEnumSymbols>
+PDBSymbol::getChildStats(TagStats &Stats) const {
+  std::unique_ptr<IPDBEnumSymbols> Result(findChildren(PDB_SymType::None));
+  Stats.clear();
+  while (auto Child = Result->getNext()) {
+    ++Stats[Child->getSymTag()];
+  }
+  Result->reset();
+  return Result;
+}
index ed30c7d..224a9a5 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolAnnotation::PDBSymbolAnnotation(const IPDBSession &PDBSession,
                                          std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolAnnotation::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolAnnotation::dump(raw_ostream &OS, int Indent,
+                               PDB_DumpLevel Level) const {}
index b5c738f..9f40106 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolBlock::PDBSymbolBlock(const IPDBSession &PDBSession,
                                std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolBlock::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolBlock::dump(raw_ostream &OS, int Indent,
+                          PDB_DumpLevel Level) const {}
index 02a48fd..13f6ccc 100644 (file)
@@ -8,11 +8,16 @@
 //===----------------------------------------------------------------------===//
 
 #include <utility>
+#include <vector>
 
 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
+#include "llvm/DebugInfo/PDB/IPDBSession.h"
+#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
+#include "llvm/DebugInfo/PDB/PDBExtras.h"
 #include "llvm/DebugInfo/PDB/PDBSymbol.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace llvm;
@@ -21,5 +26,73 @@ PDBSymbolCompiland::PDBSymbolCompiland(const IPDBSession &PDBSession,
                                        std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolCompiland::dump(llvm::raw_ostream &OS) const {
+void PDBSymbolCompiland::dump(raw_ostream &OS, int Indent,
+                              PDB_DumpLevel Level) const {
+  std::string Name = getName();
+  OS << "---- [IDX: " << getSymIndexId() << "] Compiland: " << Name
+     << " ----\n";
+
+  std::string Source = getSourceFileName();
+  std::string Library = getLibraryName();
+  if (!Source.empty())
+    OS << stream_indent(Indent + 2) << "Source: " << this->getSourceFileName()
+       << "\n";
+  if (!Library.empty())
+    OS << stream_indent(Indent + 2) << "Library: " << this->getLibraryName()
+       << "\n";
+
+  TagStats Stats;
+  auto ChildrenEnum = getChildStats(Stats);
+  OS << stream_indent(Indent + 2) << "Children: " << Stats << "\n";
+  if (Level >= PDB_DumpLevel::Normal) {
+    while (auto Child = ChildrenEnum->getNext()) {
+      if (llvm::isa<PDBSymbolCompilandDetails>(*Child))
+        continue;
+      if (llvm::isa<PDBSymbolCompilandEnv>(*Child))
+        continue;
+      Child->dump(OS, Indent + 4, PDB_DumpLevel::Compact);
+    }
+  }
+
+  std::unique_ptr<IPDBEnumSymbols> DetailsEnum(
+      findChildren(PDB_SymType::CompilandDetails));
+  if (auto DetailsPtr = DetailsEnum->getNext()) {
+    const auto *CD = dyn_cast<PDBSymbolCompilandDetails>(DetailsPtr.get());
+    assert(CD && "We only asked for compilands, but got something else!");
+    VersionInfo FE;
+    VersionInfo BE;
+    CD->getFrontEndVersion(FE);
+    CD->getBackEndVersion(BE);
+    OS << stream_indent(Indent + 2) << "Compiler: " << CD->getCompilerName()
+       << "\n";
+    OS << stream_indent(Indent + 2) << "Version: " << FE << ", " << BE << "\n";
+
+    OS << stream_indent(Indent + 2) << "Lang: " << CD->getLanguage() << "\n";
+    OS << stream_indent(Indent + 2) << "Attributes: ";
+    if (CD->hasDebugInfo())
+      OS << "DebugInfo ";
+    if (CD->isDataAligned())
+      OS << "DataAligned ";
+    if (CD->isLTCG())
+      OS << "LTCG ";
+    if (CD->hasSecurityChecks())
+      OS << "SecurityChecks ";
+    if (CD->isHotpatchable())
+      OS << "HotPatchable";
+
+    OS << "\n";
+    auto Files(Session.getSourceFilesForCompiland(*this));
+    if (Level >= PDB_DumpLevel::Detailed) {
+      OS << stream_indent(Indent + 2) << Files->getChildCount()
+         << " source files:\n";
+      while (auto File = Files->getNext())
+        File->dump(OS, Indent + 4, PDB_DumpLevel::Compact);
+    } else {
+      OS << stream_indent(Indent + 2) << Files->getChildCount()
+         << " source files\n";
+    }
+  }
+  uint32_t Count = DetailsEnum->getChildCount();
+  if (Count > 1)
+    OS << stream_indent(Indent + 2) << "(" << Count - 1 << " more omitted)\n";
 }
index c50848e..86844be 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolCompilandDetails::PDBSymbolCompilandDetails(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolCompilandDetails::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolCompilandDetails::dump(raw_ostream &OS, int Indent,
+                                     PDB_DumpLevel Level) const {}
index 8ad90ee..ad15339 100644 (file)
@@ -24,4 +24,5 @@ std::string PDBSymbolCompilandEnv::getValue() const {
   return std::string();
 }
 
-void PDBSymbolCompilandEnv::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolCompilandEnv::dump(raw_ostream &OS, int Indent,
+                                 PDB_DumpLevel Level) const {}
index 0d44334..55334f3 100644 (file)
@@ -23,4 +23,5 @@ void PDBSymbolCustom::getDataBytes(llvm::SmallVector<uint8_t, 32> &bytes) {
   RawSymbol->getDataBytes(bytes);
 }
 
-void PDBSymbolCustom::dump(llvm::raw_ostream &OS) const {}
\ No newline at end of file
+void PDBSymbolCustom::dump(raw_ostream &OS, int Indent,
+                           PDB_DumpLevel Level) const {}
\ No newline at end of file
index e93307f..f605af2 100644 (file)
@@ -8,12 +8,59 @@
 //===----------------------------------------------------------------------===//
 
 #include <utility>
+#include "llvm/DebugInfo/PDB/PDBExtras.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
 
+#include "llvm/Support/Format.h"
+
 using namespace llvm;
 
 PDBSymbolData::PDBSymbolData(const IPDBSession &PDBSession,
                              std::unique_ptr<IPDBRawSymbol> DataSymbol)
     : PDBSymbol(PDBSession, std::move(DataSymbol)) {}
 
-void PDBSymbolData::dump(llvm::raw_ostream &OS) const {}
\ No newline at end of file
+void PDBSymbolData::dump(raw_ostream &OS, int Indent,
+                         PDB_DumpLevel Level) const {
+  OS.indent(Indent);
+  if (Level == PDB_DumpLevel::Compact) {
+    PDB_LocType Loc = getLocationType();
+    OS << Loc << " data [";
+    switch (Loc) {
+    case PDB_LocType::Static:
+      OS << format_hex(getRelativeVirtualAddress(), 10);
+      break;
+    case PDB_LocType::TLS:
+      OS << getAddressSection() << ":" << format_hex(getAddressOffset(), 10);
+      break;
+    case PDB_LocType::RegRel:
+      OS << getRegisterId() << " + " << getOffset() << "]";
+      break;
+    case PDB_LocType::ThisRel:
+      OS << "this + " << getOffset() << "]";
+      break;
+    case PDB_LocType::Enregistered:
+      OS << getRegisterId() << "]";
+      break;
+    case PDB_LocType::BitField: {
+      uint32_t Offset = getOffset();
+      uint32_t BitPos = getBitPosition();
+      uint32_t Length = getLength();
+      uint32_t StartBits = 8 - BitPos;
+      uint32_t MiddleBytes = (Length - StartBits) / 8;
+      uint32_t EndBits = Length - StartBits - MiddleBytes * 8;
+      OS << format_hex(Offset, 10) << ":" << BitPos;
+      OS << " - " << format_hex(Offset + MiddleBytes, 10) << ":" << EndBits;
+      break;
+    }
+    case PDB_LocType::Slot:
+      OS << getSlot();
+    case PDB_LocType::IlRel:
+    case PDB_LocType::MetaData:
+    case PDB_LocType::Constant:
+    default:
+      OS << "???";
+    }
+    OS << "] ";
+  }
+  OS << getName() << "\n";
+}
\ No newline at end of file
index 494c51c..c058949 100644 (file)
@@ -9,6 +9,8 @@
 
 #include <utility>
 
+#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
+#include "llvm/DebugInfo/PDB/PDBExtras.h"
 #include "llvm/DebugInfo/PDB/PDBSymbol.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
 #include "llvm/Support/ConvertUTF.h"
@@ -21,5 +23,28 @@ PDBSymbolExe::PDBSymbolExe(const IPDBSession &PDBSession,
                            std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolExe::dump(llvm::raw_ostream &OS) const {
+void PDBSymbolExe::dump(raw_ostream &OS, int Indent,
+                        PDB_DumpLevel Level) const {
+  std::string FileName(getSymbolsFileName());
+
+  OS << "Summary for " << FileName << "\n";
+
+  TagStats Stats;
+  auto ChildrenEnum = getChildStats(Stats);
+  OS << stream_indent(Indent + 2) << "Children: " << Stats << "\n";
+
+  uint64_t FileSize = 0;
+  if (!llvm::sys::fs::file_size(FileName, FileSize))
+    OS << "  Size: " << FileSize << " bytes\n";
+  else
+    OS << "  Size: (Unable to obtain file size)\n";
+  PDB_UniqueId Guid = getGuid();
+  OS << "  Guid: " << Guid << "\n";
+  OS << "  Age: " << getAge() << "\n";
+  OS << "  Attributes: ";
+  if (hasCTypes())
+    OS << "HasCTypes ";
+  if (hasPrivateSymbols())
+    OS << "HasPrivateSymbols ";
+  OS << "\n";
 }
index 38959f1..fcd533c 100644 (file)
@@ -9,13 +9,55 @@
 
 #include <utility>
 
+#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
 #include "llvm/DebugInfo/PDB/PDBSymbol.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
 
-using namespace llvm;
+#include "llvm/Support/Format.h"
 
+using namespace llvm;
 PDBSymbolFunc::PDBSymbolFunc(const IPDBSession &PDBSession,
                              std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolFunc::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolFunc::dump(raw_ostream &OS, int Indent,
+                         PDB_DumpLevel Level) const {
+  bool doFullDump = false;
+  if (Level == PDB_DumpLevel::Compact) {
+    uint32_t FuncStart = getRelativeVirtualAddress();
+    uint32_t FuncEnd = FuncStart + getLength();
+    auto DebugEndSymbol = findChildren(PDB_SymType::FuncDebugEnd);
+    OS << stream_indent(Indent);
+    OS << "[" << format_hex(FuncStart, 8);
+    if (auto DebugStartEnum = findChildren(PDB_SymType::FuncDebugStart)) {
+      if (auto StartSym = DebugStartEnum->getNext()) {
+        auto DebugStart = dyn_cast<PDBSymbolFuncDebugStart>(StartSym.get());
+        OS << "+" << DebugStart->getRelativeVirtualAddress() - FuncStart;
+      }
+    }
+    OS << " - " << format_hex(FuncEnd, 8);
+    if (auto DebugEndEnum = findChildren(PDB_SymType::FuncDebugEnd)) {
+      if (auto DebugEndSym = DebugEndEnum->getNext()) {
+        auto DebugEnd = dyn_cast<PDBSymbolFuncDebugEnd>(DebugEndSym.get());
+        OS << "-" << FuncEnd - DebugEnd->getRelativeVirtualAddress();
+      }
+    }
+    OS << "] ";
+    PDB_RegisterId Reg = getLocalBasePointerRegisterId();
+    if (Reg == PDB_RegisterId::VFrame)
+      OS << "(VFrame)";
+    else if (hasFramePointer()) {
+      if (Reg == PDB_RegisterId::EBP)
+        OS << "(EBP)";
+      else
+        OS << "(" << (int)Reg << ")";
+    } else {
+      OS << "(FPO)";
+      doFullDump = true;
+    }
+    OS << " " << getName() << "\n";
+  }
+  OS.flush();
+}
index 826d835..29766d0 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolFuncDebugEnd::PDBSymbolFuncDebugEnd(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolFuncDebugEnd::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolFuncDebugEnd::dump(raw_ostream &OS, int Indent,
+                                 PDB_DumpLevel Level) const {}
index 3ad10d0..d78d945 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolFuncDebugStart::PDBSymbolFuncDebugStart(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolFuncDebugStart::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolFuncDebugStart::dump(raw_ostream &OS, int Indent,
+                                   PDB_DumpLevel Level) const {}
index ab2d1a7..50d1e2a 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolLabel::PDBSymbolLabel(const IPDBSession &PDBSession,
                                std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolLabel::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolLabel::dump(raw_ostream &OS, int Indent,
+                          PDB_DumpLevel Level) const {}
index b94374a..bb4400a 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolPublicSymbol::PDBSymbolPublicSymbol(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolPublicSymbol::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolPublicSymbol::dump(raw_ostream &OS, int Indent,
+                                 PDB_DumpLevel Level) const {}
index f1a8936..a7bd96a 100644 (file)
 #include "llvm/DebugInfo/PDB/PDBSymbol.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
 
+#include "llvm/Support/Format.h"
+
 using namespace llvm;
 
 PDBSymbolThunk::PDBSymbolThunk(const IPDBSession &PDBSession,
                                std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolThunk::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolThunk::dump(raw_ostream &OS, int Indent,
+                          PDB_DumpLevel Level) const {
+  if (Level == PDB_DumpLevel::Compact) {
+    OS.indent(Indent);
+    PDB_ThunkOrdinal Ordinal = getThunkOrdinal();
+    OS << "THUNK[" << Ordinal << "] ";
+    OS << "[" << format_hex(getRelativeVirtualAddress(), 10);
+    if (Ordinal == PDB_ThunkOrdinal::TrampIncremental)
+      OS << " -> " << format_hex(getTargetRelativeVirtualAddress(), 10);
+    OS << "] ";
+    std::string Name = getName();
+    if (!Name.empty())
+      OS << Name;
+    OS << "\n";
+  }
+}
index 12fe865..856d3aa 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeArray::PDBSymbolTypeArray(const IPDBSession &PDBSession,
                                        std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeArray::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeArray::dump(raw_ostream &OS, int Indent,
+                              PDB_DumpLevel Level) const {}
index 7a94aa5..31a2e51 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeBaseClass::PDBSymbolTypeBaseClass(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeBaseClass::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeBaseClass::dump(raw_ostream &OS, int Indent,
+                                  PDB_DumpLevel Level) const {}
index e1d00ae..1a68f8c 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeBuiltin::PDBSymbolTypeBuiltin(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeBuiltin::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeBuiltin::dump(raw_ostream &OS, int Indent,
+                                PDB_DumpLevel Level) const {}
index 2b78c90..da9d41d 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeCustom::PDBSymbolTypeCustom(const IPDBSession &PDBSession,
                                          std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeCustom::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeCustom::dump(raw_ostream &OS, int Indent,
+                               PDB_DumpLevel Level) const {}
index 7912164..4bf20d0 100644 (file)
@@ -19,4 +19,5 @@ PDBSymbolTypeDimension::PDBSymbolTypeDimension(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeDimension::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeDimension::dump(raw_ostream &OS, int Indent,
+                                  PDB_DumpLevel Level) const {}
index 133ccea..4bc3b7b 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeEnum::PDBSymbolTypeEnum(const IPDBSession &PDBSession,
                                      std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeEnum::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeEnum::dump(raw_ostream &OS, int Indent,
+                             PDB_DumpLevel Level) const {}
index 303d2b1..ce02d51 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeFriend::PDBSymbolTypeFriend(const IPDBSession &PDBSession,
                                          std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeFriend::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeFriend::dump(raw_ostream &OS, int Indent,
+                               PDB_DumpLevel Level) const {}
index 9a1af4f..86c337d 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeFunctionArg::PDBSymbolTypeFunctionArg(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeFunctionArg::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeFunctionArg::dump(raw_ostream &OS, int Indent,
+                                    PDB_DumpLevel Level) const {}
index c31185e..99953ad 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeFunctionSig::PDBSymbolTypeFunctionSig(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeFunctionSig::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeFunctionSig::dump(raw_ostream &OS, int Indent,
+                                    PDB_DumpLevel Level) const {}
index 2a024f5..d3728ea 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeManaged::PDBSymbolTypeManaged(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeManaged::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeManaged::dump(raw_ostream &OS, int Indent,
+                                PDB_DumpLevel Level) const {}
index 95ea850..a6625b3 100644 (file)
@@ -19,4 +19,5 @@ PDBSymbolTypePointer::PDBSymbolTypePointer(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypePointer::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypePointer::dump(raw_ostream &OS, int Indent,
+                                PDB_DumpLevel Level) const {}
index 8b4fd5d..74cfeeb 100644 (file)
 
 #include <utility>
 
+#include "llvm/DebugInfo/PDB/IPDBSession.h"
 #include "llvm/DebugInfo/PDB/PDBSymbol.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
-
+#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
 using namespace llvm;
 
 PDBSymbolTypeTypedef::PDBSymbolTypeTypedef(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeTypedef::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeTypedef::dump(raw_ostream &OS, int Indent,
+                                PDB_DumpLevel Level) const {
+  OS.indent(Indent);
+  OS << "typedef:" << getName() << " -> ";
+  std::string TargetTypeName;
+  auto TypeSymbol = Session.getSymbolById(getTypeId());
+  if (PDBSymbolTypeUDT *UDT = dyn_cast<PDBSymbolTypeUDT>(TypeSymbol.get())) {
+    TargetTypeName = UDT->getName();
+  }
+  OS << TargetTypeName << "\n";
+}
index bd09fba..13f6223 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeUDT::PDBSymbolTypeUDT(const IPDBSession &PDBSession,
                                    std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeUDT::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeUDT::dump(raw_ostream &OS, int Indent,
+                            PDB_DumpLevel Level) const {}
index 52169bb..31c41d1 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeVTable::PDBSymbolTypeVTable(const IPDBSession &PDBSession,
                                          std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeVTable::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeVTable::dump(raw_ostream &OS, int Indent,
+                               PDB_DumpLevel Level) const {}
index 186f86f..5a2fac0 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolTypeVTableShape::PDBSymbolTypeVTableShape(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolTypeVTableShape::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolTypeVTableShape::dump(raw_ostream &OS, int Indent,
+                                    PDB_DumpLevel Level) const {}
index 56b7023..5db34e5 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolUnknown::PDBSymbolUnknown(const IPDBSession &PDBSession,
                                    std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolUnknown::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolUnknown::dump(raw_ostream &OS, int Indent,
+                            PDB_DumpLevel Level) const {}
index 0559067..0d4b2fe 100644 (file)
@@ -18,4 +18,5 @@ PDBSymbolUsingNamespace::PDBSymbolUsingNamespace(
     const IPDBSession &PDBSession, std::unique_ptr<IPDBRawSymbol> Symbol)
     : PDBSymbol(PDBSession, std::move(Symbol)) {}
 
-void PDBSymbolUsingNamespace::dump(llvm::raw_ostream &OS) const {}
+void PDBSymbolUsingNamespace::dump(raw_ostream &OS, int Indent,
+                                   PDB_DumpLevel Level) const {}
index 26d2dfd..1f415b6 100644 (file)
@@ -61,14 +61,7 @@ add_llvm_tool_subdirectory(yaml2obj)
 
 add_llvm_tool_subdirectory(llvm-go)
 
-if(MSVC AND NOT(MSVC_VERSION LESS 1800))
-  # Certain aspects of llvm-pdbdump require language support only present in
-  # MSVC 2013 and higher.  Since this is strictly a utility, and since we hope
-  # to drop support for MSVC 2012 soon, don't build this for MSVC < 2013.
-  add_llvm_tool_subdirectory(llvm-pdbdump)
-else()
-  ignore_llvm_tool_subdirectory(llvm-pdbdump)
-endif()
+add_llvm_tool_subdirectory(llvm-pdbdump)
 
 if(NOT CYGWIN AND LLVM_ENABLE_PIC)
   add_llvm_tool_subdirectory(lto)
index b559eda..fcb6c64 100644 (file)
@@ -33,7 +33,7 @@ PARALLEL_DIRS := opt llvm-as llvm-dis llc llvm-ar llvm-nm llvm-link \
                  macho-dump llvm-objdump llvm-readobj llvm-rtdyld \
                  llvm-dwarfdump llvm-cov llvm-size llvm-stress llvm-mcmarkup \
                  llvm-profdata llvm-symbolizer obj2yaml yaml2obj llvm-c-test \
-                 llvm-vtabledump verify-uselistorder dsymutil
+                 llvm-vtabledump verify-uselistorder dsymutil llvm-pdbdump
 
 # If Intel JIT Events support is configured, build an extra tool to test it.
 ifeq ($(USE_INTEL_JITEVENTS), 1)
index 6cad395..a3bb408 100644 (file)
@@ -1,28 +1,8 @@
-set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
+set(LLVM_LINK_COMPONENTS
+  Support
+  DebugInfoPDB
+  )
 
-# Due to a bug in MSVC 2013's installation software, it is possible
-# for MSVC 2013 to write the DIA SDK into the Visual Studio 2012
-# install directory.  If this happens, the installation is corrupt
-# and there's nothing we can do.  It happens with enough frequency
-# though that we should handle it.  We do so by simply checking that
-# the DIA SDK folder exists.  Should this happen you will need to
-# uninstall VS 2012 and then re-install VS 2013.
-if (IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
-  set(LLVM_LINK_COMPONENTS
-    Support
-    )
-
-  include_directories(${MSVC_DIA_SDK_DIR}/include)
-  if (CMAKE_SIZEOF_VOID_P EQUAL 8)
-    link_directories(${MSVC_DIA_SDK_DIR}/lib/amd64)
-  else()
-    link_directories(${MSVC_DIA_SDK_DIR}/lib)
-  endif()
-
-  add_llvm_tool(llvm-pdbdump
-    llvm-pdbdump.cpp
-    DIAExtras.cpp
-    DIASymbol.cpp
-    )
-  target_link_libraries(llvm-pdbdump diaguids)
-endif()
+add_llvm_tool(llvm-pdbdump
+  llvm-pdbdump.cpp
+  )
diff --git a/llvm/tools/llvm-pdbdump/COMExtras.h b/llvm/tools/llvm-pdbdump/COMExtras.h
deleted file mode 100644 (file)
index 500f571..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-//===- COMExtras.h - Helper files for COM operations -------------*- 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_LLVM_PDBDUMP_COMEXTRAS_H
-#define LLVM_TOOLS_LLVM_PDBDUMP_COMEXTRAS_H
-
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/ConvertUTF.h"
-
-#include <tuple>
-
-namespace llvm {
-
-template <typename F> struct function_traits;
-
-#if LLVM_HAS_VARIADIC_TEMPLATES
-template <typename R, typename... Args>
-struct function_traits<R (*)(Args...)> : public function_traits<R(Args...)> {};
-
-template <typename C, typename R, typename... Args>
-struct function_traits<R (__stdcall C::*)(Args...)> {
-  using args_tuple = std::tuple<Args...>;
-};
-#else
-
-// For the sake of COM, we only need a 3 argument version and a 5 argument
-// version. We could provide 1, 2, 4, and other length of argument lists if
-// this were intended to be more generic.  Alternatively, this will "just work"
-// if VS2012 support is dropped and we can use the variadic template case
-// exclusively.
-template <typename C, typename R, typename A1, typename A2, typename A3>
-struct function_traits<R (__stdcall C::*)(A1, A2, A3)> {
-  typedef std::tuple<A1, A2, A3> args_tuple;
-};
-
-template <typename C, typename R, typename A1, typename A2, typename A3,
-          typename A4, typename A5>
-struct function_traits<R (__stdcall C::*)(A1, A2, A3, A4, A5)> {
-  typedef std::tuple<A1, A2, A3, A4, A5> args_tuple;
-};
-#endif
-
-template <class FuncTraits, std::size_t arg> struct function_arg {
-  // Writing function_arg as a separate class that accesses the tuple from
-  // function_traits is necessary due to what appears to be a bug in MSVC.
-  // If you write a nested class inside function_traits like this:
-  // template<std::size_t ArgIndex>
-  // struct Argument
-  // {
-  //   typedef typename
-  //     std::tuple_element<ArgIndex, std::tuple<Args...>>::type type;
-  // };
-  // MSVC encounters a parsing error.
-  typedef
-      typename std::tuple_element<arg, typename FuncTraits::args_tuple>::type
-          type;
-};
-
-template <class T> struct remove_double_pointer {};
-template <class T> struct remove_double_pointer<T **> { typedef T type; };
-
-namespace sys {
-namespace windows {
-
-/// A helper class for allowing the use of COM enumerators in range-based
-/// for loops.
-///
-/// A common idiom in the COM world is to have an enumerator interface, say
-/// IMyEnumerator.  It's responsible for enumerating over some child data type,
-/// say IChildType.  You do the enumeration by calling IMyEnumerator::Next()
-/// one of whose arguments will be an IChildType**.  Eventually Next() fails,
-/// indicating that there are no more items.
-///
-/// com_iterator represents a single point-in-time of this iteration.  It is
-/// used by ComEnumerator to support iterating in this fashion via range-based
-/// for loops and other common C++ paradigms.
-template <class EnumeratorType, std::size_t ArgIndex> class com_iterator {
-  using FunctionTraits = function_traits<decltype(&EnumeratorType::Next)>;
-  typedef typename function_arg<FunctionTraits, ArgIndex>::type FuncArgType;
-  // FuncArgType is now something like ISomeCOMInterface **.  Remove both
-  // pointers, so we can make a CComPtr<T> out of it.
-  typedef typename remove_double_pointer<FuncArgType>::type EnumDataType;
-
-  CComPtr<EnumeratorType> EnumeratorObject;
-  CComPtr<EnumDataType> CurrentItem;
-
-public:
-  typedef CComPtr<EnumDataType> value_type;
-  typedef std::ptrdiff_t difference_type;
-  typedef value_type *pointer_type;
-  typedef value_type &reference_type;
-  typedef std::forward_iterator_tag iterator_category;
-
-  explicit com_iterator(CComPtr<EnumeratorType> Enumerator,
-                        CComPtr<EnumDataType> Current)
-      : EnumeratorObject(Enumerator), CurrentItem(Current) {}
-  com_iterator() {}
-
-  com_iterator &operator++() {
-    // EnumeratorObject->Next() expects CurrentItem to be NULL.
-    CurrentItem.Release();
-    ULONG Count = 0;
-    HRESULT hr = EnumeratorObject->Next(1, &CurrentItem, &Count);
-    if (FAILED(hr) || Count == 0)
-      *this = com_iterator();
-
-    return *this;
-  }
-
-  value_type operator*() { return CurrentItem; }
-
-  bool operator==(const com_iterator &other) const {
-    return (EnumeratorObject == other.EnumeratorObject) &&
-           (CurrentItem == other.CurrentItem);
-  }
-
-  bool operator!=(const com_iterator &other) const { return !(*this == other); }
-
-  com_iterator &operator=(const com_iterator &other) {
-    EnumeratorObject = other.EnumeratorObject;
-    CurrentItem = other.CurrentItem;
-    return *this;
-  }
-};
-
-/// ComEnumerator implements the interfaced required for C++ to allow its use
-/// in range-based for loops.  In particular, a begin() and end() method.
-/// These methods simply construct and return an appropriate ComIterator
-/// instance.
-template <class EnumeratorType, std::size_t ArgIndex> class com_enumerator {
-  typedef function_traits<decltype(&EnumeratorType::Next)> FunctionTraits;
-  typedef typename function_arg<FunctionTraits, ArgIndex>::type FuncArgType;
-  typedef typename remove_double_pointer<FuncArgType>::type EnumDataType;
-
-  CComPtr<EnumeratorType> EnumeratorObject;
-
-public:
-  com_enumerator(CComPtr<EnumeratorType> Enumerator)
-      : EnumeratorObject(Enumerator) {}
-
-  com_iterator<EnumeratorType, ArgIndex> begin() {
-    if (!EnumeratorObject)
-      return end();
-
-    EnumeratorObject->Reset();
-    ULONG Count = 0;
-    CComPtr<EnumDataType> FirstItem;
-    HRESULT hr = EnumeratorObject->Next(1, &FirstItem, &Count);
-    return (FAILED(hr) || Count == 0) ? end()
-                                      : com_iterator<EnumeratorType, ArgIndex>(
-                                            EnumeratorObject, FirstItem);
-  }
-
-  com_iterator<EnumeratorType, ArgIndex> end() {
-    return com_iterator<EnumeratorType, ArgIndex>();
-  }
-};
-
-/// A helper class for allowing the use of COM record enumerators in range-
-/// based for loops.
-///
-/// A record enumerator is almost the same as a regular enumerator, except
-/// that it returns raw byte-data instead of interfaces to other COM objects.
-/// As a result, the enumerator's Next() method has a slightly different
-/// signature, and an iterator dereferences to an ArrayRef instead of a
-/// CComPtr.
-template <class EnumeratorType> class com_data_record_iterator {
-public:
-  typedef llvm::ArrayRef<uint8_t> value_type;
-  typedef std::ptrdiff_t difference_type;
-  typedef value_type *pointer_type;
-  typedef value_type &reference_type;
-  typedef std::forward_iterator_tag iterator_category;
-
-  explicit com_data_record_iterator(CComPtr<EnumeratorType> enumerator)
-      : Enumerator(enumerator), CurrentRecord(0) {
-    // Make sure we start at the beginning.  If there are no records,
-    // immediately set ourselves equal to end().
-    if (enumerator)
-      enumerator->Reset();
-
-    if (!ReadNextRecord())
-      *this = com_data_record_iterator();
-  }
-  com_data_record_iterator() {}
-
-  com_data_record_iterator &operator++() {
-    ++CurrentRecord;
-    // If we can't read any more records, either because there are no more
-    // or because we encountered an error, we should compare equal to end.
-    if (!ReadNextRecord())
-      *this = com_data_record_iterator();
-    return *this;
-  }
-
-  value_type operator*() {
-    return llvm::ArrayRef<uint8_t>(RecordData.begin(), RecordData.end());
-  }
-
-  bool operator==(const com_data_record_iterator &other) const {
-    return (Enumerator == other.Enumerator) &&
-           (CurrentRecord == other.CurrentRecord);
-  }
-
-  bool operator!=(const com_data_record_iterator &other) const {
-    return !(*this == other);
-  }
-
-private:
-  bool ReadNextRecord() {
-    RecordData.clear();
-    ULONG Count = 0;
-    DWORD RequiredBufferSize;
-    HRESULT hr = Enumerator->Next(1, 0, &RequiredBufferSize, nullptr, &Count);
-    if (hr == S_OK) {
-      RecordData.resize(RequiredBufferSize);
-      DWORD BytesRead = 0;
-      hr = Enumerator->Next(1, RequiredBufferSize, &BytesRead,
-                            RecordData.data(), &Count);
-    }
-    if (hr != S_OK)
-      RecordData.clear();
-    return (hr == S_OK);
-  }
-
-  CComPtr<EnumeratorType> Enumerator;
-  uint32_t CurrentRecord;
-  llvm::SmallVector<uint8_t, 32> RecordData;
-};
-
-/// Similar to ComEnumerator, com_data_record_enumerator implements the range
-/// interface for ComDataRecordIterators.
-template <class EnumeratorType> class com_data_record_enumerator {
-public:
-  com_data_record_enumerator(CComPtr<EnumeratorType> enumerator)
-      : Enumerator(enumerator) {}
-
-  com_data_record_iterator<EnumeratorType> begin() {
-    return com_data_record_iterator<EnumeratorType>(Enumerator);
-  }
-
-  com_data_record_iterator<EnumeratorType> end() {
-    LONG NumElts = 0;
-    HRESULT hr = Enumerator->get_Count(&NumElts);
-    return (FAILED(hr)) ? com_data_record_iterator<EnumeratorType>(Enumerator)
-                        : com_data_record_iterator<EnumeratorType>();
-  }
-
-private:
-  CComPtr<EnumeratorType> Enumerator;
-};
-
-/// com_enumerator is a simple helper function to allow the enumerator
-/// class's type to be inferred automatically.
-/// This allows you to write simply:
-///   for (auto item : com_enumerator(MyEnumerator)) {
-///   }
-template <class EnumeratorType>
-com_enumerator<EnumeratorType, 1>
-make_com_enumerator(CComPtr<EnumeratorType> Enumerator) {
-  return com_enumerator<EnumeratorType, 1>(Enumerator);
-}
-
-/// com_data_record_enumerator is a simple helper function to allow the
-/// enumerator class's type to be inferred automatically.
-/// This allows you to write simply:
-///   for (auto item : com_data_record_enumerator(MyEnumerator)) {
-///   }
-//=============================================================================
-template <class EnumeratorType>
-com_data_record_enumerator<EnumeratorType>
-make_com_data_record_enumerator(CComPtr<EnumeratorType> Enumerator) {
-  return com_data_record_enumerator<EnumeratorType>(Enumerator);
-}
-
-inline bool BSTRToUTF8(BSTR String16, std::string &String8) {
-  UINT ByteLength = ::SysStringByteLen(String16);
-  char *Bytes = reinterpret_cast<char *>(String16);
-  String8.clear();
-  return llvm::convertUTF16ToUTF8String(ArrayRef<char>(Bytes, ByteLength),
-                                        String8);
-}
-
-} // namespace windows
-} // namespace sys
-} // namespace llvm
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/DIAExtras.cpp b/llvm/tools/llvm-pdbdump/DIAExtras.cpp
deleted file mode 100644 (file)
index f08c42e..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-//===- DIAExtras.cpp - Helper classes and functions for DIA C++ ---------*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#include "llvm/Support/Format.h"
-#include "llvm/Support/raw_ostream.h"
-
-#include "llvm-pdbdump.h"
-#include "DIAExtras.h"
-
-using namespace llvm;
-using namespace llvm::sys::windows;
-
-#define PRINT_ENUM_VALUE_CASE(Value, Name)                                     \
-  case Value:                                                                  \
-    outs() << Name;                                                            \
-    break;
-
-raw_ostream &llvm::operator<<(raw_ostream &Stream, DiaSymTagEnum SymTag) {
-  switch (SymTag) {
-    PRINT_ENUM_VALUE_CASE(SymTagNull, "Null")
-    PRINT_ENUM_VALUE_CASE(SymTagExe, "Exe")
-    PRINT_ENUM_VALUE_CASE(SymTagCompiland, "Compiland")
-    PRINT_ENUM_VALUE_CASE(SymTagCompilandDetails, "CompilandDetails")
-    PRINT_ENUM_VALUE_CASE(SymTagCompilandEnv, "CompilandEnv")
-    PRINT_ENUM_VALUE_CASE(SymTagFunction, "Function")
-    PRINT_ENUM_VALUE_CASE(SymTagBlock, "Block")
-    PRINT_ENUM_VALUE_CASE(SymTagData, "Data")
-    PRINT_ENUM_VALUE_CASE(SymTagAnnotation, "Annotation")
-    PRINT_ENUM_VALUE_CASE(SymTagLabel, "Label")
-    PRINT_ENUM_VALUE_CASE(SymTagPublicSymbol, "PublicSymbol")
-    PRINT_ENUM_VALUE_CASE(SymTagUDT, "UDT")
-    PRINT_ENUM_VALUE_CASE(SymTagEnum, "Enum")
-    PRINT_ENUM_VALUE_CASE(SymTagFunctionType, "FunctionType")
-    PRINT_ENUM_VALUE_CASE(SymTagPointerType, "PointerType")
-    PRINT_ENUM_VALUE_CASE(SymTagArrayType, "ArrayType")
-    PRINT_ENUM_VALUE_CASE(SymTagBaseType, "BaseType")
-    PRINT_ENUM_VALUE_CASE(SymTagTypedef, "Typedef")
-    PRINT_ENUM_VALUE_CASE(SymTagBaseClass, "BaseClass")
-    PRINT_ENUM_VALUE_CASE(SymTagFriend, "Friend")
-    PRINT_ENUM_VALUE_CASE(SymTagFunctionArgType, "FunctionArgType")
-    PRINT_ENUM_VALUE_CASE(SymTagFuncDebugStart, "FuncDebugStart")
-    PRINT_ENUM_VALUE_CASE(SymTagFuncDebugEnd, "FuncDebugEnd")
-    PRINT_ENUM_VALUE_CASE(SymTagUsingNamespace, "UsingNamespace")
-    PRINT_ENUM_VALUE_CASE(SymTagVTableShape, "VTableShape")
-    PRINT_ENUM_VALUE_CASE(SymTagVTable, "VTable")
-    PRINT_ENUM_VALUE_CASE(SymTagCustom, "Custom")
-    PRINT_ENUM_VALUE_CASE(SymTagThunk, "Thunk")
-    PRINT_ENUM_VALUE_CASE(SymTagCustomType, "CustomType")
-    PRINT_ENUM_VALUE_CASE(SymTagManagedType, "ManagedType")
-    PRINT_ENUM_VALUE_CASE(SymTagDimension, "Dimension")
-    PRINT_ENUM_VALUE_CASE(SymTagCallSite, "CallSite")
-    PRINT_ENUM_VALUE_CASE(SymTagInlineSite, "InlineSite")
-    PRINT_ENUM_VALUE_CASE(SymTagBaseInterface, "BaseInterface")
-    PRINT_ENUM_VALUE_CASE(SymTagVectorType, "VectorType")
-    PRINT_ENUM_VALUE_CASE(SymTagMatrixType, "MatrixType")
-    PRINT_ENUM_VALUE_CASE(SymTagHLSLType, "HLSLType")
-#if (_MSC_FULL_VER >= 180031101)
-    PRINT_ENUM_VALUE_CASE(SymTagCaller, "Caller")
-    PRINT_ENUM_VALUE_CASE(SymTagCallee, "Callee")
-#endif
-    PRINT_ENUM_VALUE_CASE(SymTagMax, "Max")
-  }
-  outs() << " {" << (DWORD)SymTag << "}";
-  return Stream;
-}
-
-raw_ostream &llvm::operator<<(raw_ostream &Stream, CV_CPU_TYPE_e CpuType) {
-  switch (CpuType) {
-    PRINT_ENUM_VALUE_CASE(CV_CFL_8080, "8080")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_8086, "8086")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_80286, "80286")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_80386, "80386")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_80486, "80486")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PENTIUM, "Pentium")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PENTIUMPRO, "Pentium Pro")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PENTIUMIII, "Pentium III")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPS, "MIPS")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPS16, "MIPS 16")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPS32, "MIPS 32")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPS64, "MIPS 64")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPSI, "MIPS I")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPSII, "MIPS II")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPSIII, "MIPS III")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPSIV, "MIPS IV")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_MIPSV, "MIPS V")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_M68000, "M68000")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_M68010, "M68010")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_M68020, "M68020")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_M68030, "M68030")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_M68040, "M68040")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ALPHA, "Alpha")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ALPHA_21164, "Alpha 21164")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ALPHA_21164A, "Alpha 21164A")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ALPHA_21264, "Alpha 21264")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ALPHA_21364, "21364")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PPC601, "PowerPC 601")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PPC603, "PowerPC 603")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PPC604, "PowerPC 604")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PPC620, "PowerPC 620")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PPCFP, "PowerPC FP")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_PPCBE, "PowerPC BE")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_SH3, "SH3")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_SH3E, "SH3-E")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_SH3DSP, "SH3-DSP")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_SH4, "SH4")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_SHMEDIA, "SH Media")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM3, "ARM 3")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM4, "ARM 4")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM4T, "ARM 4T")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM5, "ARM 5")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM5T, "ARM 5T")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM6, "ARM 6")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM_XMAC, "ARM XMAC")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM_WMMX, "ARM WMMX")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM7, "ARM 7")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_OMNI, "Omni")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_IA64, "IA64")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_IA64_2, "IA64-2")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_CEE, "CEE")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_AM33, "AM33")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_M32R, "M32R")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_TRICORE, "TriCore")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_X64, "X64")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_EBC, "EBC")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_THUMB, "Thumb")
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARMNT, "ARM NT")
-#if (_MSC_FULL_VER >= 180031101)
-    PRINT_ENUM_VALUE_CASE(CV_CFL_ARM64, "ARM 64")
-#endif
-    PRINT_ENUM_VALUE_CASE(CV_CFL_D3D11_SHADER, "D3D11 Shader")
-  }
-  outs() << " {" << llvm::format_hex((DWORD)CpuType, 2, true) << "}";
-  return Stream;
-}
-
-raw_ostream &llvm::operator<<(raw_ostream &Stream,
-                              MachineTypeEnum MachineType) {
-  switch (MachineType) {
-    PRINT_ENUM_VALUE_CASE(MachineTypeUnknown, "Unknown")
-    PRINT_ENUM_VALUE_CASE(MachineTypeX86, "x86")
-    PRINT_ENUM_VALUE_CASE(MachineTypeR3000, "R3000")
-    PRINT_ENUM_VALUE_CASE(MachineTypeR4000, "R4000")
-    PRINT_ENUM_VALUE_CASE(MachineTypeR10000, "R10000")
-    PRINT_ENUM_VALUE_CASE(MachineTypeWCEMIPSv2, "WCE MIPSv2")
-    PRINT_ENUM_VALUE_CASE(MachineTypeAlpha, "Alpha")
-    PRINT_ENUM_VALUE_CASE(MachineTypeSH3, "SH3")
-    PRINT_ENUM_VALUE_CASE(MachineTypeSH3DSP, "SH3-DSP")
-    PRINT_ENUM_VALUE_CASE(MachineTypeSH3E, "SH3-E")
-    PRINT_ENUM_VALUE_CASE(MachineTypeSH4, "SH4")
-    PRINT_ENUM_VALUE_CASE(MachineTypeSH5, "SH5")
-    PRINT_ENUM_VALUE_CASE(MachineTypeArm, "ARM")
-    PRINT_ENUM_VALUE_CASE(MachineTypeThumb, "Thumb")
-    PRINT_ENUM_VALUE_CASE(MachineTypeArmNT, "ARM NT")
-    PRINT_ENUM_VALUE_CASE(MachineTypeAM33, "AM33")
-    PRINT_ENUM_VALUE_CASE(MachineTypePowerPC, "PowerPC")
-    PRINT_ENUM_VALUE_CASE(MachineTypePowerPCFP, "PowerPC FP")
-    PRINT_ENUM_VALUE_CASE(MachineTypeIa64, "IA 64")
-    PRINT_ENUM_VALUE_CASE(MachineTypeMips16, "MIPS 16")
-    PRINT_ENUM_VALUE_CASE(MachineTypeAlpha64, "Alpha 64")
-    PRINT_ENUM_VALUE_CASE(MachineTypeMipsFpu, "FPU")
-    PRINT_ENUM_VALUE_CASE(MachineTypeMipsFpu16, "FPU 16")
-    PRINT_ENUM_VALUE_CASE(MachineTypeTriCore, "TriCore")
-    PRINT_ENUM_VALUE_CASE(MachineTypeCEF, "CEF")
-    PRINT_ENUM_VALUE_CASE(MachineTypeEBC, "EBC")
-    PRINT_ENUM_VALUE_CASE(MachineTypeAmd64, "x64")
-    PRINT_ENUM_VALUE_CASE(MachineTypeM32R, "M32R")
-    PRINT_ENUM_VALUE_CASE(MachineTypeCEE, "CEE")
-  }
-  outs() << " {" << llvm::format_hex((DWORD)MachineType, 2, true) << "}";
-  return Stream;
-}
-
-raw_ostream &llvm::operator<<(raw_ostream &Stream, HashAlgorithm Algorithm) {
-  switch (Algorithm) {
-    PRINT_ENUM_VALUE_CASE(HashNone, "None")
-    PRINT_ENUM_VALUE_CASE(HashMD5, "MD5")
-    PRINT_ENUM_VALUE_CASE(HashSHA1, "SHA-1")
-  default:
-    outs() << "(Unknown)";
-    break;
-  }
-  outs() << " {" << (DWORD)Algorithm << "}";
-  return Stream;
-}
diff --git a/llvm/tools/llvm-pdbdump/DIAExtras.h b/llvm/tools/llvm-pdbdump/DIAExtras.h
deleted file mode 100644 (file)
index aeef197..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-//===- DIAExtras.h - Helper classes and functions for accessing DIA C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Defines helper types, classes, and functions for working with DIA.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_DIAEXTRAS_H
-#define LLVM_TOOLS_LLVMPDBDUMP_DIAEXTRAS_H
-
-#include "llvm/ADT/SmallString.h"
-#include "llvm/Support/raw_ostream.h"
-
-#include "COMExtras.h"
-
-namespace llvm {
-namespace sys {
-namespace windows {
-
-typedef llvm::SmallString<16> DIAString;
-
-template <class T> class DIAResult {
-public:
-  DIAResult() : IsValid(false) {}
-  DIAResult(const T &ResultValue) : Result(ResultValue), IsValid(true) {}
-
-  bool hasValue() const { return IsValid; }
-  T value() const { return Result; }
-
-  void dump(StringRef Name, unsigned IndentLevel) const {
-    if (!hasValue())
-      return;
-    outs().indent(IndentLevel);
-    outs() << Name << ": " << value() << "\n";
-  }
-
-private:
-  T Result;
-  bool IsValid;
-};
-
-template <>
-void DIAResult<BOOL>::dump(StringRef Name, unsigned IndentLevel) const {
-  if (!hasValue())
-    return;
-  outs().indent(IndentLevel);
-  outs() << Name << ": " << (value() ? "true" : "false") << "\n";
-}
-
-template <>
-void DIAResult<GUID>::dump(StringRef Name, unsigned IndentLevel) const {
-  if (!hasValue())
-    return;
-  std::string Guid8;
-  CComBSTR GuidBSTR(value());
-  BSTRToUTF8(GuidBSTR.m_str, Guid8);
-
-  outs().indent(IndentLevel);
-  outs() << Name << ": " << Guid8 << "\n";
-}
-
-// MSDN documents the IDiaSymbol::get_machineType method as returning a value
-// from the CV_CPU_TYPE_e enumeration.  This documentation is wrong, however,
-// and this method actually returns a value from the IMAGE_FILE_xxx set of
-// defines from winnt.h.  These correspond to the platform magic number in
-// the COFF file.  This enumeration is built from the set of values in winnt.h
-enum MachineTypeEnum {
-  MachineTypeUnknown = IMAGE_FILE_MACHINE_UNKNOWN,
-  MachineTypeX86 = IMAGE_FILE_MACHINE_I386,
-  MachineTypeR3000 = IMAGE_FILE_MACHINE_R3000,
-  MachineTypeR4000 = IMAGE_FILE_MACHINE_R4000,
-  MachineTypeR10000 = IMAGE_FILE_MACHINE_R10000,
-  MachineTypeWCEMIPSv2 = IMAGE_FILE_MACHINE_WCEMIPSV2,
-  MachineTypeAlpha = IMAGE_FILE_MACHINE_ALPHA,
-  MachineTypeSH3 = IMAGE_FILE_MACHINE_SH3,
-  MachineTypeSH3DSP = IMAGE_FILE_MACHINE_SH3DSP,
-  MachineTypeSH3E = IMAGE_FILE_MACHINE_SH3E,
-  MachineTypeSH4 = IMAGE_FILE_MACHINE_SH4,
-  MachineTypeSH5 = IMAGE_FILE_MACHINE_SH5,
-  MachineTypeArm = IMAGE_FILE_MACHINE_ARM,
-  MachineTypeThumb = IMAGE_FILE_MACHINE_THUMB,
-  MachineTypeArmNT = IMAGE_FILE_MACHINE_ARMNT,
-  MachineTypeAM33 = IMAGE_FILE_MACHINE_AM33,
-  MachineTypePowerPC = IMAGE_FILE_MACHINE_POWERPC,
-  MachineTypePowerPCFP = IMAGE_FILE_MACHINE_POWERPCFP,
-  MachineTypeIa64 = IMAGE_FILE_MACHINE_IA64,
-  MachineTypeMips16 = IMAGE_FILE_MACHINE_MIPS16,
-  MachineTypeAlpha64 = IMAGE_FILE_MACHINE_ALPHA64,
-  MachineTypeMipsFpu = IMAGE_FILE_MACHINE_MIPSFPU,
-  MachineTypeMipsFpu16 = IMAGE_FILE_MACHINE_MIPSFPU16,
-  MachineTypeTriCore = IMAGE_FILE_MACHINE_TRICORE,
-  MachineTypeCEF = IMAGE_FILE_MACHINE_CEF,
-  MachineTypeEBC = IMAGE_FILE_MACHINE_EBC,
-  MachineTypeAmd64 = IMAGE_FILE_MACHINE_AMD64,
-  MachineTypeM32R = IMAGE_FILE_MACHINE_M32R,
-  MachineTypeCEE = IMAGE_FILE_MACHINE_CEE,
-};
-
-enum HashAlgorithm { HashNone = 0, HashMD5 = 1, HashSHA1 = 2 };
-
-// SymTagEnum has the unfortunate property that it is not only the name of
-// the enum, but also the name of one of the values of the enum.  So that we
-// don't have to always type "enum SymTagEnum", we typedef this to a different
-// name so that we can refer to it more easily.
-typedef enum SymTagEnum DiaSymTagEnum;
-
-typedef CComPtr<IDiaSymbol> DiaSymbolPtr;
-
-} // namespace windows
-} // namespace sys
-} // namespace llvm
-
-namespace llvm {
-class raw_ostream;
-
-raw_ostream &operator<<(raw_ostream &Stream,
-                        llvm::sys::windows::DiaSymTagEnum SymTag);
-raw_ostream &operator<<(raw_ostream &Stream, CV_CPU_TYPE_e CpuType);
-raw_ostream &operator<<(raw_ostream &Stream,
-                        llvm::sys::windows::MachineTypeEnum CpuType);
-raw_ostream &operator<<(raw_ostream &Stream,
-                        llvm::sys::windows::HashAlgorithm Algorithm);
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/DIASymbol.cpp b/llvm/tools/llvm-pdbdump/DIASymbol.cpp
deleted file mode 100644 (file)
index 753f6f9..0000000
+++ /dev/null
@@ -1,968 +0,0 @@
-//===- DIASymbol.cpp - Dump debug info from a PDB file ----------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm-pdbdump.h"
-#include "DIASymbol.h"
-
-using namespace llvm::sys::windows;
-
-DIASymbol::DIASymbol(IDiaSymbol *DiaSymbol) : Symbol(DiaSymbol) {
-  Symbol->AddRef();
-}
-
-DIASymbol::~DIASymbol() { Symbol->Release(); }
-
-void DIASymbol::fullDump(int IndentLevel) {
-  getLexicalParent().dump("Lexical parent", IndentLevel);
-  getClassParent().dump("Class parent", IndentLevel);
-  getType().dump("Type", IndentLevel);
-  getArrayIndexType().dump("Array index type", IndentLevel);
-  getVirtualTableShape().dump("Vtable shape", IndentLevel);
-  getLowerBound().dump("Lower bound", IndentLevel);
-  getUpperBound().dump("Upper bound", IndentLevel);
-  getObjectPointerType().dump("Object pointer type", IndentLevel);
-  getContainer().dump("Container", IndentLevel);
-  getVirtualBaseTableType().dump("Virtual base table type", IndentLevel);
-  getUnmodifiedType().dump("Unmodified type", IndentLevel);
-  getSubType().dump("Sub type", IndentLevel);
-  getBaseSymbol().dump("Base symbol", IndentLevel);
-
-#if (_MSC_FULL_VER >= 180031101)
-  // These methods are only available on VS 2013 SP4 and higher.
-  isPGO().dump("Is PGO", IndentLevel);
-  hasValidPGOCounts().dump("Has valid PGO counts", IndentLevel);
-  isOptimizedForSpeed().dump("Is optimized for speed", IndentLevel);
-  getPGOEntryCount().dump("PGO entry count", IndentLevel);
-  getPGOEdgeCount().dump("PGO edge count", IndentLevel);
-  getPGODynamicInstructionCount().dump("PGO dynamic instruction count",
-                                       IndentLevel);
-  getStaticSize().dump("Static size", IndentLevel);
-  getFinalLiveStaticSize().dump("Final live static size", IndentLevel);
-  getPhaseName().dump("Phase name", IndentLevel);
-  hasControlFlowCheck().dump("Has control flow check", IndentLevel);
-#endif
-
-  getAccess().dump("Access", IndentLevel);
-  getAddressOffset().dump("Address Offset", IndentLevel);
-  getAddressSection().dump("Address Section", IndentLevel);
-  getAddressTaken().dump("Address Taken", IndentLevel);
-  getAge().dump("Age", IndentLevel);
-  getArrayIndexTypeId().dump("Array Index Type Id", IndentLevel);
-  getBackEndMajor().dump("Back End Major", IndentLevel);
-  getBackEndMinor().dump("Back End Minor", IndentLevel);
-  getBackEndBuild().dump("Back End Build", IndentLevel);
-  getBaseDataOffset().dump("Base Data Offset", IndentLevel);
-  getBaseDataSlot().dump("Base Data Slot", IndentLevel);
-  getBaseSymbolId().dump("Base Symbol Id", IndentLevel);
-  getBaseType().dump("Base Type", IndentLevel);
-  getBitPosition().dump("Bit Position", IndentLevel);
-  getBuiltInKind().dump("Built In Kind", IndentLevel);
-  getCallingConvention().dump("Calling Convention", IndentLevel);
-  getClassParentId().dump("Class Parent Id", IndentLevel);
-  isCode().dump("Code", IndentLevel);
-  isCompilerGenerated().dump("Compiler Generated", IndentLevel);
-  getCompilerName().dump("Compiler Name", IndentLevel);
-  hasConstructor().dump("Constructor", IndentLevel);
-  isConstType().dump("Const Type", IndentLevel);
-  getCount().dump("Count", IndentLevel);
-  getCountLiveRanges().dump("Count Live Ranges", IndentLevel);
-  hasCustomCallingConvention().dump("Custom Calling Convention", IndentLevel);
-  getDataKind().dump("Data Kind", IndentLevel);
-  isEditAndContinueEnabled().dump("Edit and Continue Enabled", IndentLevel);
-  hasFarReturn().dump("Far Return", IndentLevel);
-  getFrontEndMajor().dump("Front End Major", IndentLevel);
-  getFrontEndMinor().dump("Front End Minor", IndentLevel);
-  getFrontEndBuild().dump("Front End Build", IndentLevel);
-  isFunction().dump("Function", IndentLevel);
-  getGuid().dump("GUID", IndentLevel);
-  hasAlloca().dump("Has Alloca", IndentLevel);
-  hasAssignmentOperator().dump("Has Assignment Operator", IndentLevel);
-  hasCastOperator().dump("Has Cast Operator", IndentLevel);
-  hasDebugInfo().dump("Has Debug Info", IndentLevel);
-  hasEH().dump("Has EH", IndentLevel);
-  hasEHa().dump("Has EHa", IndentLevel);
-  hasInlAsm().dump("Has Inline Asm", IndentLevel);
-  hasLongJump().dump("Has longjmp", IndentLevel);
-  hasManagedCode().dump("Has Managed Code", IndentLevel);
-  hasNestedTypes().dump("Has Nested Types", IndentLevel);
-  hasSecurityChecks().dump("Has Security Checks", IndentLevel);
-  hasSEH().dump("Has SEH", IndentLevel);
-  hasSetJump().dump("Has setjmp", IndentLevel);
-  isIndirectVirtualBaseClass().dump("Is indirect virtual base", IndentLevel);
-  hasInlineAttribute().dump("Has inline declspec", IndentLevel);
-  hasInterruptReturn().dump("Has interrupt return", IndentLevel);
-  isBaseVirtualFunction().dump("Is base virtual function", IndentLevel);
-  isAcceleratorGroupSharedLocal().dump("Is Accelerator Group Shared Local",
-                                       IndentLevel);
-  isAcceleratorPointerTagLiveRange().dump(
-      "Is Accelerator Pointer Tag Live Range", IndentLevel);
-  isAcceleratorStubFunction().dump("Is Accelerator Stub Function", IndentLevel);
-  isAggregated().dump("Is aggregated", IndentLevel);
-  hasCTypes().dump("Has C types", IndentLevel);
-  isCVTCIL().dump("Was converted from MSIL", IndentLevel);
-  isDataAligned().dump("Is data aligned", IndentLevel);
-  isHLSLData().dump("Is HLSL data", IndentLevel);
-  isHotpatchable().dump("Is hot-patchable", IndentLevel);
-  isLTCG().dump("Is LTCG", IndentLevel);
-  isMatrixRowMajor().dump("Is matrix row major", IndentLevel);
-  isMSILNetmodule().dump("Is MSIL .netmodule", IndentLevel);
-  isMultipleInheritance().dump("Is multiple inheritance", IndentLevel);
-  isNaked().dump("Is naked", IndentLevel);
-  isOptimizedAway().dump("Is optimized away", IndentLevel);
-  isPointerBasedOnSymbolValue().dump("Is pointer based on symbol value",
-                                     IndentLevel);
-  isPointerToDataMember().dump("Is pointer to data member", IndentLevel);
-  isPointerToMemberFunction().dump("Is pointer to member function",
-                                   IndentLevel);
-  isReturnValue().dump("Is return value", IndentLevel);
-  isSdl().dump("Is SDL", IndentLevel);
-  isSingleInheritance().dump("Is single inheritance", IndentLevel);
-  isSplitted().dump("Is splitted", IndentLevel);
-  isStatic().dump("Is staic", IndentLevel);
-  isStripped().dump("Is stripped", IndentLevel);
-  isVirtualInheritance().dump("Is virtual inheritance", IndentLevel);
-  getLanguage().dump("Language", IndentLevel);
-  getLength().dump("Length", IndentLevel);
-  getLexicalParentId().dump("Lexical parent id", IndentLevel);
-  getLibraryName().dump("Library name", IndentLevel);
-  getLiveRangeLength().dump("Live range length", IndentLevel);
-  getLiveRangeStartAddressSection().dump("Live range start address section",
-                                         IndentLevel);
-  getLiveRangeStartAddressOffset().dump("Live range start address offset",
-                                        IndentLevel);
-  getLiveRangeStartRelativeVirtualAddress().dump("Live range start address RVA",
-                                                 IndentLevel);
-  getLocationType().dump("Location type", IndentLevel);
-  getLowerBoundId().dump("Lower bound id", IndentLevel);
-  getMachineType().dump("Machine type", IndentLevel);
-  isManagedRef().dump("Managed", IndentLevel);
-  getMemorySpaceKind().dump("Memory space kind", IndentLevel);
-  isMsilRef().dump("MSIL", IndentLevel);
-  getName().dump("Name", IndentLevel);
-  isNested().dump("Nested", IndentLevel);
-  hasNoInlineAttribute().dump("Has noinline declspec", IndentLevel);
-  hasNoReturnAttribute().dump("Has noreturn declspec", IndentLevel);
-  getNoStackOrdering().dump("No stack ordering", IndentLevel);
-  isUnreached().dump("Not reached", IndentLevel);
-  getNumberOfAcceleratorPointerTags().dump("Number of accelerator pointer tags",
-                                           IndentLevel);
-  getNumberOfModifiers().dump("Number of modifiers", IndentLevel);
-  getNumberOfRegisterIndices().dump("Number of register indices", IndentLevel);
-  getNumberOfRows().dump("Number of rows", IndentLevel);
-  getNumberOfColumns().dump("Number of columns", IndentLevel);
-  getObjectFileName().dump("Object file name", IndentLevel);
-  getOemSymbolId().dump("OEM symbol id", IndentLevel);
-  getOffset().dump("Offset", IndentLevel);
-  hasOptimizedCodeDebugInfo().dump("Optimized code debug info", IndentLevel);
-  hasOverloadedOperator().dump("Overloaded operator", IndentLevel);
-  isPacked().dump("Packed", IndentLevel);
-  getPlatform().dump("Platform", IndentLevel);
-  isPureVirtual().dump("Pure", IndentLevel);
-  getRank().dump("Rank", IndentLevel);
-  isReference().dump("Reference", IndentLevel);
-  getRegisterId().dump("Register ID", IndentLevel);
-  getRegisterType().dump("Register type", IndentLevel);
-  getRelativeVirtualAddress().dump("RVA", IndentLevel);
-  isRestrictedType().dump("Restricted type", IndentLevel);
-  getSamplerSlot().dump("Sampler slot", IndentLevel);
-  isScoped().dump("Scoped", IndentLevel);
-  getSignature().dump("Signature", IndentLevel);
-  getSizeInUdt().dump("Size in UDT", IndentLevel);
-  getSlot().dump("Slot", IndentLevel);
-  getSourceFileName().dump("Source file name", IndentLevel);
-  getStride().dump("Stride", IndentLevel);
-  getSubTypeId().dump("Sub type ID", IndentLevel);
-  getSymbolsFileName().dump("File name", IndentLevel);
-  getSymIndexId().dump("Sym index ID", IndentLevel);
-  getSymTag().dump("Sym tag", IndentLevel);
-  getTargetOffset().dump("Target offset", IndentLevel);
-  getTargetRelativeVirtualAddress().dump("Target RVA", IndentLevel);
-  getTargetSection().dump("Target section", IndentLevel);
-  getTargetVirtualAddress().dump("Target virtual address", IndentLevel);
-  getTextureSlot().dump("Texture slot", IndentLevel);
-  getThisAdjust().dump("This adjust", IndentLevel);
-  getThunkOrdinal().dump("Thunk ordinal", IndentLevel);
-  getTimeStamp().dump("Time stamp", IndentLevel);
-  getToken().dump("Token", IndentLevel);
-  getUavSlot().dump("UAV slot", IndentLevel);
-  getUdtKind().dump("UDT kind", IndentLevel);
-  isUnalignedType().dump("Unaligned type", IndentLevel);
-  getUndecoratedName().dump("Undecorated name", IndentLevel);
-  getUnmodifiedTypeId().dump("Unmodified type id", IndentLevel);
-  getUpperBoundId().dump("Upper bound id", IndentLevel);
-  isVirtual().dump("Virtual", IndentLevel);
-  getVirtualAddress().dump("Virtual address", IndentLevel);
-  isVirtualBaseClass().dump("Virtual base class", IndentLevel);
-  getVirtualBaseDispIndex().dump("Virtual base disp index", IndentLevel);
-  getVirtualBaseOffset().dump("Virtual base offset", IndentLevel);
-  getVirtualBasePointerOffset().dump("Virtual base pointer offset",
-                                     IndentLevel);
-  getVirtualTableShapeId().dump("Vtable shape ID", IndentLevel);
-  isVolatileType().dump("Volatile type", IndentLevel);
-}
-
-#if (_MSC_FULL_VER >= 180031101)
-DIAResult<BOOL> DIASymbol::isPGO() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isPGO);
-}
-
-DIAResult<BOOL> DIASymbol::hasValidPGOCounts() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasValidPGOCounts);
-}
-
-DIAResult<BOOL> DIASymbol::isOptimizedForSpeed() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isOptimizedForSpeed);
-}
-
-DIAResult<DWORD> DIASymbol::getPGOEntryCount() {
-  return InternalGetDIAValue(&IDiaSymbol::get_PGOEntryCount);
-}
-
-DIAResult<DWORD> DIASymbol::getPGOEdgeCount() {
-  return InternalGetDIAValue(&IDiaSymbol::get_PGOEdgeCount);
-}
-
-DIAResult<ULONGLONG> DIASymbol::getPGODynamicInstructionCount() {
-  return InternalGetDIAValue(&IDiaSymbol::get_PGODynamicInstructionCount);
-}
-
-DIAResult<DWORD> DIASymbol::getStaticSize() {
-  return InternalGetDIAValue(&IDiaSymbol::get_staticSize);
-}
-
-DIAResult<DWORD> DIASymbol::getFinalLiveStaticSize() {
-  return InternalGetDIAValue(&IDiaSymbol::get_finalLiveStaticSize);
-}
-
-DIAResult<DIAString> DIASymbol::getPhaseName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_phaseName);
-}
-
-DIAResult<BOOL> DIASymbol::hasControlFlowCheck() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasControlFlowCheck);
-}
-#endif
-
-DIAResult<DiaSymbolPtr> DIASymbol::getClassParent() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_classParent);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getType() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(&IDiaSymbol::get_type);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getArrayIndexType() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_arrayIndexType);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getVirtualTableShape() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_virtualTableShape);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getLowerBound() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_lowerBound);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getUpperBound() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_upperBound);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getObjectPointerType() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_objectPointerType);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getContainer() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_container);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getVirtualBaseTableType() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_virtualBaseTableType);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getUnmodifiedType() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_unmodifiedType);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getSubType() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_subType);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getBaseSymbol() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_baseSymbol);
-}
-
-DIAResult<DWORD> DIASymbol::getAccess() {
-  return InternalGetDIAValue(&IDiaSymbol::get_access);
-}
-
-DIAResult<DWORD> DIASymbol::getAddressOffset() {
-  return InternalGetDIAValue(&IDiaSymbol::get_addressOffset);
-}
-
-DIAResult<DWORD> DIASymbol::getAddressSection() {
-  return InternalGetDIAValue(&IDiaSymbol::get_addressSection);
-}
-
-DIAResult<BOOL> DIASymbol::getAddressTaken() {
-  return InternalGetDIAValue(&IDiaSymbol::get_addressTaken);
-}
-
-DIAResult<DWORD> DIASymbol::getAge() {
-  return InternalGetDIAValue(&IDiaSymbol::get_age);
-}
-
-DIAResult<DWORD> DIASymbol::getArrayIndexTypeId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_arrayIndexTypeId);
-}
-
-DIAResult<DWORD> DIASymbol::getBackEndMajor() {
-  return InternalGetDIAValue(&IDiaSymbol::get_backEndMajor);
-}
-
-DIAResult<DWORD> DIASymbol::getBackEndMinor() {
-
-  return InternalGetDIAValue(&IDiaSymbol::get_backEndMinor);
-}
-
-DIAResult<DWORD> DIASymbol::getBackEndBuild() {
-  return InternalGetDIAValue(&IDiaSymbol::get_backEndBuild);
-}
-
-DIAResult<DWORD> DIASymbol::getBackEndQFE() {
-  return InternalGetDIAValue(&IDiaSymbol::get_backEndQFE);
-}
-
-DIAResult<DWORD> DIASymbol::getBaseDataOffset() {
-  return InternalGetDIAValue(&IDiaSymbol::get_baseDataOffset);
-}
-
-DIAResult<DWORD> DIASymbol::getBaseDataSlot() {
-  return InternalGetDIAValue(&IDiaSymbol::get_baseDataSlot);
-}
-
-DIAResult<DWORD> DIASymbol::getBaseSymbolId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_baseSymbolId);
-}
-
-DIAResult<DWORD> DIASymbol::getBaseType() {
-  return InternalGetDIAValue(&IDiaSymbol::get_baseType);
-}
-
-DIAResult<DWORD> DIASymbol::getBitPosition() {
-  return InternalGetDIAValue(&IDiaSymbol::get_bitPosition);
-}
-
-DIAResult<DWORD> DIASymbol::getBuiltInKind() {
-  return InternalGetDIAValue(&IDiaSymbol::get_builtInKind);
-}
-
-DIAResult<CV_call_e> DIASymbol::getCallingConvention() {
-  return InternalGetDIAValue<DWORD, CV_call_e>(
-      &IDiaSymbol::get_callingConvention);
-}
-
-DIAResult<DWORD> DIASymbol::getClassParentId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_classParentId);
-}
-
-DIAResult<BOOL> DIASymbol::isCode() {
-  return InternalGetDIAValue(&IDiaSymbol::get_code);
-}
-
-DIAResult<BOOL> DIASymbol::isCompilerGenerated() {
-  return InternalGetDIAValue(&IDiaSymbol::get_compilerGenerated);
-}
-
-DIAResult<DIAString> DIASymbol::getCompilerName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_compilerName);
-}
-
-DIAResult<BOOL> DIASymbol::hasConstructor() {
-  return InternalGetDIAValue(&IDiaSymbol::get_constructor);
-}
-
-DIAResult<BOOL> DIASymbol::isConstType() {
-  return InternalGetDIAValue(&IDiaSymbol::get_constType);
-}
-
-DIAResult<DWORD> DIASymbol::getCount() {
-  return InternalGetDIAValue(&IDiaSymbol::get_count);
-}
-
-DIAResult<DWORD> DIASymbol::getCountLiveRanges() {
-  return InternalGetDIAValue(&IDiaSymbol::get_countLiveRanges);
-}
-
-DIAResult<BOOL> DIASymbol::hasCustomCallingConvention() {
-  return InternalGetDIAValue(&IDiaSymbol::get_customCallingConvention);
-}
-
-DIAResult<DataKind> DIASymbol::getDataKind() {
-  return InternalGetDIAValue<DWORD, DataKind>(&IDiaSymbol::get_dataKind);
-}
-
-DIAResult<BOOL> DIASymbol::isEditAndContinueEnabled() {
-  return InternalGetDIAValue(&IDiaSymbol::get_editAndContinueEnabled);
-}
-
-DIAResult<BOOL> DIASymbol::hasFarReturn() {
-  return InternalGetDIAValue(&IDiaSymbol::get_farReturn);
-}
-
-DIAResult<DWORD> DIASymbol::getFrontEndMajor() {
-  return InternalGetDIAValue(&IDiaSymbol::get_frontEndMajor);
-}
-
-DIAResult<DWORD> DIASymbol::getFrontEndMinor() {
-  return InternalGetDIAValue(&IDiaSymbol::get_frontEndMinor);
-}
-
-DIAResult<DWORD> DIASymbol::getFrontEndBuild() {
-  return InternalGetDIAValue(&IDiaSymbol::get_frontEndBuild);
-}
-
-DIAResult<DWORD> DIASymbol::getFrontEndQFE() {
-  return InternalGetDIAValue(&IDiaSymbol::get_frontEndQFE);
-}
-
-DIAResult<BOOL> DIASymbol::isFunction() {
-  return InternalGetDIAValue(&IDiaSymbol::get_function);
-}
-
-DIAResult<GUID> DIASymbol::getGuid() {
-  return InternalGetDIAValue(&IDiaSymbol::get_guid);
-}
-
-DIAResult<BOOL> DIASymbol::hasAlloca() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasAlloca);
-}
-
-DIAResult<BOOL> DIASymbol::hasAssignmentOperator() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasAssignmentOperator);
-}
-
-DIAResult<BOOL> DIASymbol::hasCastOperator() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasCastOperator);
-}
-
-DIAResult<BOOL> DIASymbol::hasDebugInfo() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasDebugInfo);
-}
-
-DIAResult<BOOL> DIASymbol::hasEH() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasEH);
-}
-
-DIAResult<BOOL> DIASymbol::hasEHa() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasEHa);
-}
-
-DIAResult<BOOL> DIASymbol::hasInlAsm() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasInlAsm);
-}
-
-DIAResult<BOOL> DIASymbol::hasLongJump() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasLongJump);
-}
-
-DIAResult<BOOL> DIASymbol::hasManagedCode() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasManagedCode);
-}
-
-DIAResult<BOOL> DIASymbol::hasNestedTypes() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasNestedTypes);
-}
-
-DIAResult<BOOL> DIASymbol::hasSecurityChecks() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasSecurityChecks);
-}
-
-DIAResult<BOOL> DIASymbol::hasSEH() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasSEH);
-}
-
-DIAResult<BOOL> DIASymbol::hasSetJump() {
-  return InternalGetDIAValue(&IDiaSymbol::get_hasSetJump);
-}
-
-DIAResult<BOOL> DIASymbol::isIndirectVirtualBaseClass() {
-  return InternalGetDIAValue(&IDiaSymbol::get_indirectVirtualBaseClass);
-}
-
-DIAResult<BOOL> DIASymbol::hasInlineAttribute() {
-  return InternalGetDIAValue(&IDiaSymbol::get_inlSpec);
-}
-
-DIAResult<BOOL> DIASymbol::hasInterruptReturn() {
-  return InternalGetDIAValue(&IDiaSymbol::get_interruptReturn);
-}
-
-DIAResult<BOOL> DIASymbol::isBaseVirtualFunction() {
-  return InternalGetDIAValue(&IDiaSymbol::get_intro);
-}
-
-DIAResult<BOOL> DIASymbol::isIntrinsic() {
-  return InternalGetDIAValue(&IDiaSymbol::get_intrinsic);
-}
-
-DIAResult<BOOL> DIASymbol::isAcceleratorGroupSharedLocal() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isAcceleratorGroupSharedLocal);
-}
-
-DIAResult<BOOL> DIASymbol::isAcceleratorPointerTagLiveRange() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isAcceleratorPointerTagLiveRange);
-}
-
-DIAResult<BOOL> DIASymbol::isAcceleratorStubFunction() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isAcceleratorStubFunction);
-}
-
-DIAResult<BOOL> DIASymbol::isAggregated() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isAggregated);
-}
-
-DIAResult<BOOL> DIASymbol::isConstructorVirtualBase() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isConstructorVirtualBase);
-}
-
-DIAResult<BOOL> DIASymbol::hasStrictGSCheck() {
-  return InternalGetDIAValue(&IDiaSymbol::get_strictGSCheck);
-}
-
-DIAResult<BOOL> DIASymbol::isLocationControlFlowDependent() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isLocationControlFlowDependent);
-}
-
-DIAResult<BOOL> DIASymbol::hasCTypes() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isCTypes);
-}
-
-DIAResult<BOOL> DIASymbol::isCVTCIL() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isCVTCIL);
-}
-
-DIAResult<BOOL> DIASymbol::isDataAligned() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isDataAligned);
-}
-
-DIAResult<BOOL> DIASymbol::isHLSLData() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isHLSLData);
-}
-
-DIAResult<BOOL> DIASymbol::isHotpatchable() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isHotpatchable);
-}
-
-DIAResult<BOOL> DIASymbol::isLTCG() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isLTCG);
-}
-
-DIAResult<BOOL> DIASymbol::isMatrixRowMajor() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isMatrixRowMajor);
-}
-
-DIAResult<BOOL> DIASymbol::isMSILNetmodule() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isMSILNetmodule);
-}
-
-DIAResult<BOOL> DIASymbol::isMultipleInheritance() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isMultipleInheritance);
-}
-
-DIAResult<BOOL> DIASymbol::isNaked() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isNaked);
-}
-
-DIAResult<BOOL> DIASymbol::isOptimizedAway() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isOptimizedAway);
-}
-
-DIAResult<BOOL> DIASymbol::isPointerBasedOnSymbolValue() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isPointerBasedOnSymbolValue);
-}
-
-DIAResult<BOOL> DIASymbol::isPointerToDataMember() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isPointerToDataMember);
-}
-
-DIAResult<BOOL> DIASymbol::isPointerToMemberFunction() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isPointerToMemberFunction);
-}
-
-DIAResult<BOOL> DIASymbol::isReturnValue() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isReturnValue);
-}
-
-DIAResult<BOOL> DIASymbol::isSdl() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isSdl);
-}
-
-DIAResult<BOOL> DIASymbol::isSingleInheritance() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isSingleInheritance);
-}
-
-DIAResult<BOOL> DIASymbol::isSplitted() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isSplitted);
-}
-
-DIAResult<BOOL> DIASymbol::isStatic() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isStatic);
-}
-
-DIAResult<BOOL> DIASymbol::isStripped() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isStripped);
-}
-
-DIAResult<BOOL> DIASymbol::isVirtualInheritance() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isVirtualInheritance);
-}
-
-DIAResult<CV_CFL_LANG> DIASymbol::getLanguage() {
-  return InternalGetDIAValue<DWORD, CV_CFL_LANG>(&IDiaSymbol::get_language);
-}
-
-DIAResult<BOOL> DIASymbol::isSafeBuffers() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isSafeBuffers);
-}
-
-DIAResult<ULONGLONG> DIASymbol::getLength() {
-  return InternalGetDIAValue(&IDiaSymbol::get_length);
-}
-
-DIAResult<DWORD> DIASymbol::getLexicalParentId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_lexicalParentId);
-}
-
-DIAResult<DiaSymbolPtr> DIASymbol::getLexicalParent() {
-  return InternalGetDIAValue<IDiaSymbol *, DiaSymbolPtr>(
-      &IDiaSymbol::get_lexicalParent);
-}
-
-DIAResult<DWORD> DIASymbol::getLocalBasePointerRegisterId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_localBasePointerRegisterId);
-}
-
-DIAResult<DIAString> DIASymbol::getLibraryName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_libraryName);
-}
-
-DIAResult<ULONGLONG> DIASymbol::getLiveRangeLength() {
-  return InternalGetDIAValue(&IDiaSymbol::get_liveRangeLength);
-}
-
-DIAResult<DWORD> DIASymbol::getLiveRangeStartAddressSection() {
-  return InternalGetDIAValue(&IDiaSymbol::get_liveRangeStartAddressSection);
-}
-
-DIAResult<DWORD> DIASymbol::getLiveRangeStartAddressOffset() {
-  return InternalGetDIAValue(&IDiaSymbol::get_liveRangeStartAddressOffset);
-}
-
-DIAResult<DWORD> DIASymbol::getLiveRangeStartRelativeVirtualAddress() {
-  return InternalGetDIAValue(
-      &IDiaSymbol::get_liveRangeStartRelativeVirtualAddress);
-}
-
-DIAResult<LocationType> DIASymbol::getLocationType() {
-  return InternalGetDIAValue<DWORD, LocationType>(
-      &IDiaSymbol::get_locationType);
-}
-
-DIAResult<DWORD> DIASymbol::getLowerBoundId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_lowerBoundId);
-}
-
-DIAResult<MachineTypeEnum> DIASymbol::getMachineType() {
-  return InternalGetDIAValue<DWORD, MachineTypeEnum>(
-      &IDiaSymbol::get_machineType);
-}
-
-DIAResult<BOOL> DIASymbol::isManagedRef() {
-  return InternalGetDIAValue(&IDiaSymbol::get_managed);
-}
-
-DIAResult<DWORD> DIASymbol::getMemorySpaceKind() {
-  return InternalGetDIAValue(&IDiaSymbol::get_memorySpaceKind);
-}
-
-DIAResult<BOOL> DIASymbol::isMsilRef() {
-  return InternalGetDIAValue(&IDiaSymbol::get_msil);
-}
-
-DIAResult<DIAString> DIASymbol::getName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_name);
-}
-
-DIAResult<BOOL> DIASymbol::isNested() {
-  return InternalGetDIAValue(&IDiaSymbol::get_nested);
-}
-
-DIAResult<BOOL> DIASymbol::hasNoInlineAttribute() {
-  return InternalGetDIAValue(&IDiaSymbol::get_noInline);
-}
-
-DIAResult<BOOL> DIASymbol::hasNoReturnAttribute() {
-  return InternalGetDIAValue(&IDiaSymbol::get_noReturn);
-}
-
-DIAResult<BOOL> DIASymbol::getNoStackOrdering() {
-  return InternalGetDIAValue(&IDiaSymbol::get_noStackOrdering);
-}
-
-DIAResult<BOOL> DIASymbol::isUnreached() {
-  return InternalGetDIAValue(&IDiaSymbol::get_notReached);
-}
-
-DIAResult<DWORD> DIASymbol::getNumberOfAcceleratorPointerTags() {
-  return InternalGetDIAValue(&IDiaSymbol::get_numberOfAcceleratorPointerTags);
-}
-
-DIAResult<DWORD> DIASymbol::getNumberOfModifiers() {
-  return InternalGetDIAValue(&IDiaSymbol::get_numberOfModifiers);
-}
-
-DIAResult<DWORD> DIASymbol::getNumberOfRegisterIndices() {
-  return InternalGetDIAValue(&IDiaSymbol::get_numberOfRegisterIndices);
-}
-
-DIAResult<DWORD> DIASymbol::getNumberOfRows() {
-  return InternalGetDIAValue(&IDiaSymbol::get_numberOfRows);
-}
-
-DIAResult<DWORD> DIASymbol::getNumberOfColumns() {
-  return InternalGetDIAValue(&IDiaSymbol::get_numberOfColumns);
-}
-
-DIAResult<DIAString> DIASymbol::getObjectFileName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_objectFileName);
-}
-
-DIAResult<DWORD> DIASymbol::getOemSymbolId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_oemSymbolId);
-}
-
-DIAResult<LONG> DIASymbol::getOffset() {
-  return InternalGetDIAValue(&IDiaSymbol::get_offset);
-}
-
-DIAResult<DWORD> DIASymbol::getOffsetInUdt() {
-  return InternalGetDIAValue(&IDiaSymbol::get_offsetInUdt);
-}
-
-DIAResult<BOOL> DIASymbol::hasOptimizedCodeDebugInfo() {
-  return InternalGetDIAValue(&IDiaSymbol::get_optimizedCodeDebugInfo);
-}
-
-DIAResult<BOOL> DIASymbol::hasOverloadedOperator() {
-  return InternalGetDIAValue(&IDiaSymbol::get_overloadedOperator);
-}
-
-DIAResult<BOOL> DIASymbol::isPacked() {
-  return InternalGetDIAValue(&IDiaSymbol::get_packed);
-}
-
-DIAResult<CV_CPU_TYPE_e> DIASymbol::getPlatform() {
-  return InternalGetDIAValue<DWORD, CV_CPU_TYPE_e>(&IDiaSymbol::get_platform);
-}
-
-DIAResult<BOOL> DIASymbol::isPureVirtual() {
-  return InternalGetDIAValue(&IDiaSymbol::get_pure);
-}
-
-DIAResult<DWORD> DIASymbol::getRank() {
-  return InternalGetDIAValue(&IDiaSymbol::get_rank);
-}
-
-DIAResult<BOOL> DIASymbol::isReference() {
-  return InternalGetDIAValue(&IDiaSymbol::get_reference);
-}
-
-DIAResult<BOOL> DIASymbol::isRValueReference() {
-  return InternalGetDIAValue(&IDiaSymbol::get_RValueReference);
-}
-
-DIAResult<DWORD> DIASymbol::getRegisterId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_registerId);
-}
-
-DIAResult<DWORD> DIASymbol::getRegisterType() {
-  return InternalGetDIAValue(&IDiaSymbol::get_registerType);
-}
-
-DIAResult<DWORD> DIASymbol::getRelativeVirtualAddress() {
-  return InternalGetDIAValue(&IDiaSymbol::get_relativeVirtualAddress);
-}
-
-DIAResult<BOOL> DIASymbol::isRestrictedType() {
-  return InternalGetDIAValue(&IDiaSymbol::get_restrictedType);
-}
-
-DIAResult<DWORD> DIASymbol::getSamplerSlot() {
-  return InternalGetDIAValue(&IDiaSymbol::get_samplerSlot);
-}
-
-DIAResult<BOOL> DIASymbol::isScoped() {
-  return InternalGetDIAValue(&IDiaSymbol::get_scoped);
-}
-
-DIAResult<BOOL> DIASymbol::isRefUdt() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isRefUdt);
-}
-
-DIAResult<BOOL> DIASymbol::isValueUdt() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isValueUdt);
-}
-
-DIAResult<BOOL> DIASymbol::isInterfaceUdt() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isInterfaceUdt);
-}
-
-DIAResult<BOOL> DIASymbol::isCxxReturnUdt() {
-  return InternalGetDIAValue(&IDiaSymbol::get_isCxxReturnUdt);
-}
-
-DIAResult<DWORD> DIASymbol::getSignature() {
-  return InternalGetDIAValue(&IDiaSymbol::get_signature);
-}
-
-DIAResult<DWORD> DIASymbol::getSizeInUdt() {
-  return InternalGetDIAValue(&IDiaSymbol::get_sizeInUdt);
-}
-
-DIAResult<DWORD> DIASymbol::getSlot() {
-  return InternalGetDIAValue(&IDiaSymbol::get_slot);
-}
-
-DIAResult<DIAString> DIASymbol::getSourceFileName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_sourceFileName);
-}
-
-DIAResult<DWORD> DIASymbol::getStride() {
-  return InternalGetDIAValue(&IDiaSymbol::get_stride);
-}
-
-DIAResult<DWORD> DIASymbol::getSubTypeId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_subTypeId);
-}
-
-DIAResult<DIAString> DIASymbol::getSymbolsFileName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_symbolsFileName);
-}
-
-DIAResult<DWORD> DIASymbol::getSymIndexId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_symIndexId);
-}
-
-DIAResult<DiaSymTagEnum> DIASymbol::getSymTag() {
-  return InternalGetDIAValue<DWORD, DiaSymTagEnum>(&IDiaSymbol::get_symTag);
-}
-
-DIAResult<DWORD> DIASymbol::getTargetOffset() {
-  return InternalGetDIAValue(&IDiaSymbol::get_targetOffset);
-}
-
-DIAResult<DWORD> DIASymbol::getTargetRelativeVirtualAddress() {
-  return InternalGetDIAValue(&IDiaSymbol::get_targetRelativeVirtualAddress);
-}
-
-DIAResult<DWORD> DIASymbol::getTargetSection() {
-  return InternalGetDIAValue(&IDiaSymbol::get_targetSection);
-}
-
-DIAResult<ULONGLONG> DIASymbol::getTargetVirtualAddress() {
-  return InternalGetDIAValue(&IDiaSymbol::get_targetVirtualAddress);
-}
-
-DIAResult<DWORD> DIASymbol::getTextureSlot() {
-  return InternalGetDIAValue(&IDiaSymbol::get_textureSlot);
-}
-
-DIAResult<LONG> DIASymbol::getThisAdjust() {
-  return InternalGetDIAValue(&IDiaSymbol::get_thisAdjust);
-}
-
-DIAResult<THUNK_ORDINAL> DIASymbol::getThunkOrdinal() {
-  return InternalGetDIAValue<DWORD, THUNK_ORDINAL>(
-      &IDiaSymbol::get_thunkOrdinal);
-}
-
-DIAResult<DWORD> DIASymbol::getTimeStamp() {
-  return InternalGetDIAValue(&IDiaSymbol::get_timeStamp);
-}
-
-DIAResult<DWORD> DIASymbol::getToken() {
-  return InternalGetDIAValue(&IDiaSymbol::get_token);
-}
-
-DIAResult<DWORD> DIASymbol::getUavSlot() {
-  return InternalGetDIAValue(&IDiaSymbol::get_uavSlot);
-}
-
-DIAResult<UdtKind> DIASymbol::getUdtKind() {
-  return InternalGetDIAValue<DWORD, UdtKind>(&IDiaSymbol::get_udtKind);
-}
-
-DIAResult<BOOL> DIASymbol::isUnalignedType() {
-  return InternalGetDIAValue(&IDiaSymbol::get_unalignedType);
-}
-
-DIAResult<DIAString> DIASymbol::getUndecoratedName() {
-  return InternalGetDIAStringValue(&IDiaSymbol::get_undecoratedName);
-}
-
-DIAResult<DWORD> DIASymbol::getUnmodifiedTypeId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_unmodifiedTypeId);
-}
-
-DIAResult<DWORD> DIASymbol::getUpperBoundId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_upperBoundId);
-}
-
-DIAResult<BOOL> DIASymbol::isVirtual() {
-  return InternalGetDIAValue(&IDiaSymbol::get_virtual);
-}
-
-DIAResult<ULONGLONG> DIASymbol::getVirtualAddress() {
-  return InternalGetDIAValue(&IDiaSymbol::get_virtualAddress);
-}
-
-DIAResult<BOOL> DIASymbol::isVirtualBaseClass() {
-  return InternalGetDIAValue(&IDiaSymbol::get_virtualBaseClass);
-}
-
-DIAResult<DWORD> DIASymbol::getVirtualBaseDispIndex() {
-  return InternalGetDIAValue(&IDiaSymbol::get_virtualBaseDispIndex);
-}
-
-DIAResult<DWORD> DIASymbol::getVirtualBaseOffset() {
-  return InternalGetDIAValue(&IDiaSymbol::get_virtualBaseOffset);
-}
-
-DIAResult<LONG> DIASymbol::getVirtualBasePointerOffset() {
-  return InternalGetDIAValue(&IDiaSymbol::get_virtualBasePointerOffset);
-}
-
-DIAResult<DWORD> DIASymbol::getVirtualTableShapeId() {
-  return InternalGetDIAValue(&IDiaSymbol::get_virtualTableShapeId);
-}
-
-DIAResult<BOOL> DIASymbol::isVolatileType() {
-  return InternalGetDIAValue(&IDiaSymbol::get_volatileType);
-}
diff --git a/llvm/tools/llvm-pdbdump/DIASymbol.h b/llvm/tools/llvm-pdbdump/DIASymbol.h
deleted file mode 100644 (file)
index 3e908e1..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-//===- DIASymbol.h - Dump debug info from a PDB file ------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Provides a wrapper around the IDiaSymbol interface.  IDiaSymbol is used to
-// represent any kind of symbol from functions, to compilands, to source files.
-// It provides a monolithic interface of close to 200 operations, and the set
-// of operations that are valid depends on the type of the symbol.  Since it is
-// not clearly documented which set of operations is valid for which type of
-// symbol, the best way of figuring it out is to dump every method for every
-// symbol, and see which methods return errors.  This wrapper provides a clean
-// way of doing this without involving needing to embed lots of unsightly
-// HRESULT checking at every callsite.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_DIASYMBOL_H
-#define LLVM_TOOLS_LLVMPDBDUMP_DIASYMBOL_H
-
-#include "DIAExtras.h"
-#include "llvm/ADT/SmallString.h"
-
-namespace llvm {
-namespace sys {
-namespace windows {
-
-class DIASymbol {
-public:
-  DIASymbol(IDiaSymbol *DiaSymbol);
-  ~DIASymbol();
-
-  /// Dumps the value of every property (if it exists) with a default name.
-  /// This is useful for understanding what symbol types support what methods
-  /// during development time.
-  void fullDump(int IndentLevel);
-
-// TODO: The following methods are present on IDiaSymbol but do not yet have
-// wrapper methods.
-//
-// HRESULT get_value(VARIANT *pRetVal) = 0;
-// HRESULT get_undecoratedNameEx(DWORD undecorateOptions, BSTR *name) = 0;
-// HRESULT getSrcLineOnTypeDefn(IDiaLineNumber **ppResult) = 0;
-// HRESULT get_dataBytes(DWORD cbData, DWORD *pcbData, BYTE *pbData) = 0;
-// HRESULT get_types(DWORD cTypes, DWORD *pcTypes, IDiaSymbol **pTypes) = 0;
-// HRESULT get_typeIds(DWORD cTypeIds, DWORD *pcTypeIds, DWORD *pdwTypeIds) = 0;
-// HRESULT get_numericProperties(DWORD cnt, DWORD *pcnt,
-//                               DWORD *pProperties) = 0;
-// HRESULT get_modifierValues(DWORD cnt, DWORD *pcnt, WORD *pModifiers) = 0;
-// HRESULT get_acceleratorPointerTags(DWORD cnt, DWORD *pcnt, DWORD
-//                                    *pPointerTags) = 0;
-// HRESULT get_hfaFloat(BOOL *pRetVal) = 0;
-// HRESULT get_hfaDouble(BOOL *pRetVal) = 0;
-// HRESULT get_paramBasePointerRegisterId(DWORD *pRetVal) = 0;
-// HRESULT get_isWinRTPointer(BOOL *pRetVal) = 0;
-
-#if (_MSC_FULL_VER >= 180031101)
-  // These methods are only available on VS 2013 SP 4 and higher.
-  DIAResult<BOOL> isPGO();
-  DIAResult<BOOL> hasValidPGOCounts();
-  DIAResult<BOOL> isOptimizedForSpeed();
-  DIAResult<DWORD> getPGOEntryCount();
-  DIAResult<DWORD> getPGOEdgeCount();
-  DIAResult<ULONGLONG> getPGODynamicInstructionCount();
-  DIAResult<DWORD> getStaticSize();
-  DIAResult<DWORD> getFinalLiveStaticSize();
-  DIAResult<DIAString> getPhaseName();
-  DIAResult<BOOL> hasControlFlowCheck();
-#endif
-
-  DIAResult<DiaSymbolPtr> getLexicalParent();
-  DIAResult<DiaSymbolPtr> getClassParent();
-  DIAResult<DiaSymbolPtr> getType();
-  DIAResult<DiaSymbolPtr> getArrayIndexType();
-  DIAResult<DiaSymbolPtr> getVirtualTableShape();
-  DIAResult<DiaSymbolPtr> getLowerBound();
-  DIAResult<DiaSymbolPtr> getUpperBound();
-  DIAResult<DiaSymbolPtr> getObjectPointerType();
-  DIAResult<DiaSymbolPtr> getContainer();
-  DIAResult<DiaSymbolPtr> getVirtualBaseTableType();
-  DIAResult<DiaSymbolPtr> getUnmodifiedType();
-  DIAResult<DiaSymbolPtr> getSubType();
-  DIAResult<DiaSymbolPtr> getBaseSymbol();
-
-  DIAResult<DWORD> getAccess();
-  DIAResult<DWORD> getAddressOffset();
-  DIAResult<DWORD> getAddressSection();
-  DIAResult<DWORD> getAge();
-  DIAResult<DWORD> getArrayIndexTypeId();
-  DIAResult<DWORD> getBackEndBuild();
-  DIAResult<DWORD> getBackEndMajor();
-  DIAResult<DWORD> getBackEndMinor();
-  DIAResult<DWORD> getBackEndQFE();
-  DIAResult<DWORD> getBaseDataOffset();
-  DIAResult<DWORD> getBaseDataSlot();
-  DIAResult<DWORD> getBaseSymbolId();
-  DIAResult<DWORD> getBaseType();
-  DIAResult<DWORD> getBitPosition();
-  DIAResult<DWORD> getBuiltInKind();
-  DIAResult<CV_call_e> getCallingConvention();
-  DIAResult<DWORD> getClassParentId();
-  DIAResult<DIAString> getCompilerName();
-  DIAResult<DWORD> getCount();
-  DIAResult<DWORD> getCountLiveRanges();
-  DIAResult<DWORD> getFrontEndBuild();
-  DIAResult<DWORD> getFrontEndMajor();
-  DIAResult<DWORD> getFrontEndMinor();
-  DIAResult<DWORD> getFrontEndQFE();
-  DIAResult<CV_CFL_LANG> getLanguage();
-  DIAResult<DWORD> getLexicalParentId();
-  DIAResult<DIAString> getLibraryName();
-  DIAResult<DWORD> getLiveRangeStartAddressOffset();
-  DIAResult<DWORD> getLiveRangeStartAddressSection();
-  DIAResult<DWORD> getLiveRangeStartRelativeVirtualAddress();
-  DIAResult<DWORD> getLocalBasePointerRegisterId();
-  DIAResult<DWORD> getLowerBoundId();
-  DIAResult<DWORD> getMemorySpaceKind();
-  DIAResult<DIAString> getName();
-  DIAResult<DWORD> getNumberOfAcceleratorPointerTags();
-  DIAResult<DWORD> getNumberOfColumns();
-  DIAResult<DWORD> getNumberOfModifiers();
-  DIAResult<DWORD> getNumberOfRegisterIndices();
-  DIAResult<DWORD> getNumberOfRows();
-  DIAResult<DIAString> getObjectFileName();
-  DIAResult<DWORD> getOemSymbolId();
-  DIAResult<DWORD> getOffsetInUdt();
-  DIAResult<CV_CPU_TYPE_e> getPlatform();
-  DIAResult<DWORD> getRank();
-  DIAResult<DWORD> getRegisterId();
-  DIAResult<DWORD> getRegisterType();
-  DIAResult<DWORD> getRelativeVirtualAddress();
-  DIAResult<DWORD> getSamplerSlot();
-  DIAResult<DWORD> getSignature();
-  DIAResult<DWORD> getSizeInUdt();
-  DIAResult<DWORD> getSlot();
-  DIAResult<DIAString> getSourceFileName();
-  DIAResult<DWORD> getStride();
-  DIAResult<DWORD> getSubTypeId();
-  DIAResult<DIAString> getSymbolsFileName();
-  DIAResult<DWORD> getSymIndexId();
-  DIAResult<DWORD> getTargetOffset();
-  DIAResult<DWORD> getTargetRelativeVirtualAddress();
-  DIAResult<DWORD> getTargetSection();
-  DIAResult<DWORD> getTextureSlot();
-  DIAResult<DWORD> getTimeStamp();
-  DIAResult<DWORD> getToken();
-  DIAResult<DWORD> getUavSlot();
-  DIAResult<DIAString> getUndecoratedName();
-  DIAResult<DWORD> getUnmodifiedTypeId();
-  DIAResult<DWORD> getUpperBoundId();
-  DIAResult<DWORD> getVirtualBaseDispIndex();
-  DIAResult<DWORD> getVirtualBaseOffset();
-  DIAResult<DWORD> getVirtualTableShapeId();
-  DIAResult<DataKind> getDataKind();
-  DIAResult<DiaSymTagEnum> getSymTag();
-  DIAResult<GUID> getGuid();
-  DIAResult<LONG> getOffset();
-  DIAResult<LONG> getThisAdjust();
-  DIAResult<LONG> getVirtualBasePointerOffset();
-  DIAResult<LocationType> getLocationType();
-  DIAResult<MachineTypeEnum> getMachineType();
-  DIAResult<THUNK_ORDINAL> getThunkOrdinal();
-  DIAResult<ULONGLONG> getLength();
-  DIAResult<ULONGLONG> getLiveRangeLength();
-  DIAResult<ULONGLONG> getTargetVirtualAddress();
-  DIAResult<ULONGLONG> getVirtualAddress();
-  DIAResult<UdtKind> getUdtKind();
-  DIAResult<BOOL> hasConstructor();
-  DIAResult<BOOL> hasCustomCallingConvention();
-  DIAResult<BOOL> hasFarReturn();
-  DIAResult<BOOL> isCode();
-  DIAResult<BOOL> isCompilerGenerated();
-  DIAResult<BOOL> isConstType();
-  DIAResult<BOOL> isEditAndContinueEnabled();
-  DIAResult<BOOL> isFunction();
-  DIAResult<BOOL> getAddressTaken();
-  DIAResult<BOOL> getNoStackOrdering();
-  DIAResult<BOOL> hasAlloca();
-  DIAResult<BOOL> hasAssignmentOperator();
-  DIAResult<BOOL> hasCTypes();
-  DIAResult<BOOL> hasCastOperator();
-  DIAResult<BOOL> hasDebugInfo();
-  DIAResult<BOOL> hasEH();
-  DIAResult<BOOL> hasEHa();
-  DIAResult<BOOL> hasInlAsm();
-  DIAResult<BOOL> hasInlineAttribute();
-  DIAResult<BOOL> hasInterruptReturn();
-  DIAResult<BOOL> hasLongJump();
-  DIAResult<BOOL> hasManagedCode();
-  DIAResult<BOOL> hasNestedTypes();
-  DIAResult<BOOL> hasNoInlineAttribute();
-  DIAResult<BOOL> hasNoReturnAttribute();
-  DIAResult<BOOL> hasOptimizedCodeDebugInfo();
-  DIAResult<BOOL> hasOverloadedOperator();
-  DIAResult<BOOL> hasSEH();
-  DIAResult<BOOL> hasSecurityChecks();
-  DIAResult<BOOL> hasSetJump();
-  DIAResult<BOOL> hasStrictGSCheck();
-  DIAResult<BOOL> isAcceleratorGroupSharedLocal();
-  DIAResult<BOOL> isAcceleratorPointerTagLiveRange();
-  DIAResult<BOOL> isAcceleratorStubFunction();
-  DIAResult<BOOL> isAggregated();
-  DIAResult<BOOL> isBaseVirtualFunction();
-  DIAResult<BOOL> isCVTCIL();
-  DIAResult<BOOL> isConstructorVirtualBase();
-  DIAResult<BOOL> isCxxReturnUdt();
-  DIAResult<BOOL> isDataAligned();
-  DIAResult<BOOL> isHLSLData();
-  DIAResult<BOOL> isHotpatchable();
-  DIAResult<BOOL> isIndirectVirtualBaseClass();
-  DIAResult<BOOL> isInterfaceUdt();
-  DIAResult<BOOL> isIntrinsic();
-  DIAResult<BOOL> isLTCG();
-  DIAResult<BOOL> isLocationControlFlowDependent();
-  DIAResult<BOOL> isMSILNetmodule();
-  DIAResult<BOOL> isManagedRef();
-  DIAResult<BOOL> isMatrixRowMajor();
-  DIAResult<BOOL> isMsilRef();
-  DIAResult<BOOL> isMultipleInheritance();
-  DIAResult<BOOL> isNaked();
-  DIAResult<BOOL> isNested();
-  DIAResult<BOOL> isOptimizedAway();
-  DIAResult<BOOL> isPacked();
-  DIAResult<BOOL> isPointerBasedOnSymbolValue();
-  DIAResult<BOOL> isPointerToDataMember();
-  DIAResult<BOOL> isPointerToMemberFunction();
-  DIAResult<BOOL> isPureVirtual();
-  DIAResult<BOOL> isRValueReference();
-  DIAResult<BOOL> isRefUdt();
-  DIAResult<BOOL> isReference();
-  DIAResult<BOOL> isRestrictedType();
-  DIAResult<BOOL> isReturnValue();
-  DIAResult<BOOL> isSafeBuffers();
-  DIAResult<BOOL> isScoped();
-  DIAResult<BOOL> isSdl();
-  DIAResult<BOOL> isSingleInheritance();
-  DIAResult<BOOL> isSplitted();
-  DIAResult<BOOL> isStatic();
-  DIAResult<BOOL> isStripped();
-  DIAResult<BOOL> isUnalignedType();
-  DIAResult<BOOL> isUnreached();
-  DIAResult<BOOL> isValueUdt();
-  DIAResult<BOOL> isVirtual();
-  DIAResult<BOOL> isVirtualBaseClass();
-  DIAResult<BOOL> isVirtualInheritance();
-  DIAResult<BOOL> isVolatileType();
-
-private:
-  template <class T, class U = T>
-  DIAResult<U>
-  InternalGetDIAValue(HRESULT (__stdcall IDiaSymbol::*Method)(T *)) {
-    T Value;
-    if (S_OK == (Symbol->*Method)(&Value))
-      return DIAResult<U>(U(Value));
-    else
-      return DIAResult<U>();
-  }
-
-  DIAResult<DIAString>
-  InternalGetDIAStringValue(HRESULT (__stdcall IDiaSymbol::*Method)(BSTR *)) {
-    BSTR String16;
-    if (S_OK == (Symbol->*Method)(&String16)) {
-      std::string String8;
-      llvm::sys::windows::BSTRToUTF8(String16, String8);
-      SysFreeString(String16);
-      return DIAResult<DIAString>(DIAString(String8));
-    } else
-      return DIAResult<DIAString>();
-  }
-
-  IDiaSymbol *Symbol;
-};
-
-} // namespace windows
-} // namespace sys
-} // namespace llvm
-
-#endif
index 29d40de..4877689 100644 (file)
@@ -19,5 +19,5 @@
 type = Tool
 name = llvm-pdbdump
 parent = Tools
-required_libraries = 
+required_libraries = DebugInfoPDB
 
diff --git a/llvm/tools/llvm-pdbdump/Makefile b/llvm/tools/llvm-pdbdump/Makefile
new file mode 100644 (file)
index 0000000..18aafc4
--- /dev/null
@@ -0,0 +1,17 @@
+##===- tools/llvm-pdbdump/Makefile -------------------------*- Makefile -*-===##
+#
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL := ../..
+TOOLNAME := llvm-pdbdump
+LINK_COMPONENTS := DebugInfoPDB Object
+
+# This tool has no plugins, optimize startup time.
+TOOL_NO_EXPORTS := 1
+
+include $(LEVEL)/Makefile.common
index 2c51098..e2db7f6 100644 (file)
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/DebugInfo/PDB/PDB.h"
+#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
+#include "llvm/DebugInfo/PDB/IPDBSession.h"
+#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
+#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ConvertUTF.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/PrettyStackTrace.h"
 #include "llvm/Support/Signals.h"
 
-#include "llvm-pdbdump.h"
-#include "COMExtras.h"
-#include "DIAExtras.h"
-#include "DIASymbol.h"
+#include <Windows.h>
 
 using namespace llvm;
-using namespace llvm::sys::windows;
 
 namespace opts {
 cl::list<std::string> InputFilenames(cl::Positional,
                                      cl::desc("<input PDB files>"),
                                      cl::OneOrMore);
 
-cl::opt<bool> Streams("streams", cl::desc("Display data stream information"));
-cl::alias StreamsShort("x", cl::desc("Alias for --streams"),
-                       cl::aliasopt(Streams));
-
-cl::opt<bool> StreamData("stream-data",
-                         cl::desc("Dumps stream record data as bytes"));
-cl::alias StreamDataShort("X", cl::desc("Alias for --stream-data"),
-                          cl::aliasopt(StreamData));
-
-cl::opt<bool> Tables("tables",
-                     cl::desc("Display summary information for all of the "
-                              "debug tables in the input file"));
-cl::alias TablesShort("t", cl::desc("Alias for --tables"),
-                      cl::aliasopt(Tables));
-
-cl::opt<bool> SourceFiles("source-files",
-                          cl::desc("Display a list of the source files "
-                                   "contained in the PDB"));
-cl::alias SourceFilesShort("f", cl::desc("Alias for --source-files"),
-                           cl::aliasopt(SourceFiles));
-
 cl::opt<bool> Compilands("compilands",
                          cl::desc("Display a list of compilands (e.g. object "
-                                  "files) and their source file composition"));
+                                  "files) and symbols for each one."));
 cl::alias CompilandsShort("c", cl::desc("Alias for --compilands"),
                           cl::aliasopt(Compilands));
-
-cl::opt<bool> Symbols("symbols", cl::desc("Display symbols"));
-cl::alias SymbolsShort("s", cl::desc("Alias for --symbols"),
-                       cl::aliasopt(Symbols));
-
-cl::opt<bool> SymbolDetails("symbol-details",
-                            cl::desc("Display symbol details"));
-cl::alias SymbolDetailsShort("S", cl::desc("Alias for --symbol-details"),
-                             cl::aliasopt(SymbolDetails));
-}
-
-template <typename TableType>
-static HRESULT getDIATable(IDiaSession *Session, TableType **Table) {
-  CComPtr<IDiaEnumTables> EnumTables = nullptr;
-  HRESULT Error = S_OK;
-  if (FAILED(Error = Session->getEnumTables(&EnumTables)))
-    return Error;
-
-  for (auto CurTable : make_com_enumerator(EnumTables)) {
-    TableType *ResultTable = nullptr;
-    if (FAILED(CurTable->QueryInterface(
-            __uuidof(TableType), reinterpret_cast<void **>(&ResultTable))))
-      continue;
-
-    *Table = ResultTable;
-    return S_OK;
-  }
-  return E_FAIL;
-}
-
-static void dumpBasicFileInfo(StringRef Path, IDiaSession *Session) {
-  CComPtr<IDiaSymbol> GlobalScope;
-  HRESULT hr = Session->get_globalScope(&GlobalScope);
-  DIASymbol GlobalScopeSymbol(GlobalScope);
-  if (S_OK == hr)
-    GlobalScopeSymbol.getSymbolsFileName().dump("File", 0);
-  else
-    outs() << "File: " << Path << "\n";
-  HANDLE FileHandle = ::CreateFile(
-      Path.data(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr,
-      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
-  LARGE_INTEGER FileSize;
-  if (INVALID_HANDLE_VALUE != FileHandle) {
-    outs().indent(2);
-    if (::GetFileSizeEx(FileHandle, &FileSize))
-      outs() << "Size: " << FileSize.QuadPart << " bytes\n";
-    else
-      outs() << "Size: (Unable to obtain file size)\n";
-    FILETIME ModifiedTime;
-    outs().indent(2);
-    if (::GetFileTime(FileHandle, nullptr, nullptr, &ModifiedTime)) {
-      ULARGE_INTEGER TimeInteger;
-      TimeInteger.LowPart = ModifiedTime.dwLowDateTime;
-      TimeInteger.HighPart = ModifiedTime.dwHighDateTime;
-      llvm::sys::TimeValue Time;
-      Time.fromWin32Time(TimeInteger.QuadPart);
-      outs() << "Timestamp: " << Time.str() << "\n";
-    } else {
-      outs() << "Timestamp: (Unable to obtain time stamp)\n";
-    }
-    ::CloseHandle(FileHandle);
-  }
-
-  if (S_OK == hr)
-    GlobalScopeSymbol.fullDump(2);
-  outs() << "\n";
-  outs().flush();
 }
 
-static void dumpDataStreams(IDiaSession *Session) {
-  CComPtr<IDiaEnumDebugStreams> DebugStreams = nullptr;
-  if (FAILED(Session->getEnumDebugStreams(&DebugStreams)))
-    return;
-
-  LONG Count = 0;
-  if (FAILED(DebugStreams->get_Count(&Count)))
+static void dumpInput(StringRef Path) {
+  std::unique_ptr<IPDBSession> Session(
+      llvm::createPDBReader(PDB_ReaderType::DIA, Path));
+  if (!Session) {
+    outs() << "Unable to create PDB reader.  Check that a valid implementation";
+    outs() << " is available for your platform.";
     return;
-  outs() << "Data Streams [count=" << Count << "]\n";
-
-  std::string Name8;
-
-  for (auto Stream : make_com_enumerator(DebugStreams)) {
-    BSTR Name16;
-    if (FAILED(Stream->get_name(&Name16)))
-      continue;
-    if (BSTRToUTF8(Name16, Name8))
-      outs() << "  " << Name8;
-    ::SysFreeString(Name16);
-    if (FAILED(Stream->get_Count(&Count))) {
-      outs() << "\n";
-      continue;
-    }
-
-    outs() << " [" << Count << " records]\n";
-    if (opts::StreamData) {
-      int RecordIndex = 0;
-      for (auto StreamRecord : make_com_data_record_enumerator(Stream)) {
-        outs() << "    Record " << RecordIndex << " [" << StreamRecord.size()
-               << " bytes]";
-        for (uint8_t byte : StreamRecord) {
-          outs() << " " << llvm::format_hex_no_prefix(byte, 2, true);
-        }
-        outs() << "\n";
-        ++RecordIndex;
-      }
-    }
   }
-  outs() << "\n";
-  outs().flush();
-}
-
-static void dumpDebugTables(IDiaSession *Session) {
-  CComPtr<IDiaEnumTables> EnumTables = nullptr;
-  if (SUCCEEDED(Session->getEnumTables(&EnumTables))) {
-    LONG Count = 0;
-    if (FAILED(EnumTables->get_Count(&Count)))
-      return;
-
-    outs() << "Debug Tables [count=" << Count << "]\n";
 
-    std::string Name8;
-    for (auto Table : make_com_enumerator(EnumTables)) {
-      BSTR Name16;
-      if (FAILED(Table->get_name(&Name16)))
-        continue;
-      if (BSTRToUTF8(Name16, Name8))
-        outs() << "  " << Name8;
-      ::SysFreeString(Name16);
-      if (SUCCEEDED(Table->get_Count(&Count))) {
-        outs() << " [" << Count << " items]\n";
-      } else
-        outs() << "\n";
-    }
-  }
-  outs() << "\n";
-  outs().flush();
-}
-
-static void dumpSourceFiles(IDiaSession *Session) {
-  CComPtr<IDiaEnumSourceFiles> EnumSourceFileList;
-  if (FAILED(getDIATable(Session, &EnumSourceFileList)))
-    return;
-
-  LONG SourceFileCount = 0;
-  EnumSourceFileList->get_Count(&SourceFileCount);
-
-  outs() << "Dumping source files [" << SourceFileCount << " files]\n";
-  for (auto SourceFile : make_com_enumerator(EnumSourceFileList)) {
-    CComBSTR SourceFileName;
-    if (S_OK != SourceFile->get_fileName(&SourceFileName))
-      continue;
-    outs().indent(2);
-    std::string SourceFileName8;
-    BSTRToUTF8(SourceFileName, SourceFileName8);
-    outs() << SourceFileName8 << "\n";
-  }
-  outs() << "\n";
+  auto GlobalScope(Session->getGlobalScope());
+  GlobalScope->dump(outs(), 0, PDB_DumpLevel::Normal);
   outs().flush();
-}
-
-static void dumpCompilands(IDiaSession *Session) {
-  CComPtr<IDiaEnumSourceFiles> EnumSourceFileList;
-  if (FAILED(getDIATable(Session, &EnumSourceFileList)))
-    return;
-
-  LONG SourceFileCount = 0;
-  EnumSourceFileList->get_Count(&SourceFileCount);
-
-  CComPtr<IDiaSymbol> GlobalScope;
-  HRESULT hr = Session->get_globalScope(&GlobalScope);
-  DIASymbol GlobalScopeSymbol(GlobalScope);
-  if (S_OK != hr)
-    return;
-
-  CComPtr<IDiaEnumSymbols> EnumCompilands;
-  if (S_OK !=
-      GlobalScope->findChildren(SymTagCompiland, nullptr, nsNone,
-                                &EnumCompilands))
-    return;
-
-  LONG CompilandCount = 0;
-  EnumCompilands->get_Count(&CompilandCount);
-  outs() << "Dumping compilands [" << CompilandCount
-         << " compilands containing " << SourceFileCount << " source files]\n";
-
-  for (auto Compiland : make_com_enumerator(EnumCompilands)) {
-    DIASymbol CompilandSymbol(Compiland);
-    outs().indent(2);
-    outs() << CompilandSymbol.getName().value() << "\n";
 
-    CComPtr<IDiaEnumSourceFiles> EnumFiles;
-    if (S_OK != Session->findFile(Compiland, nullptr, nsNone, &EnumFiles))
-      continue;
-
-    for (auto SourceFile : make_com_enumerator(EnumFiles)) {
-      DWORD ChecksumType = 0;
-      DWORD ChecksumSize = 0;
-      std::vector<uint8_t> Checksum;
-      outs().indent(4);
-      SourceFile->get_checksumType(&ChecksumType);
-      if (S_OK == SourceFile->get_checksum(0, &ChecksumSize, nullptr)) {
-        Checksum.resize(ChecksumSize);
-        if (S_OK ==
-            SourceFile->get_checksum(ChecksumSize, &ChecksumSize,
-                                     &Checksum[0])) {
-          outs() << "[" << ((ChecksumType == HashMD5) ? "MD5  " : "SHA-1")
-                 << ": ";
-          for (auto byte : Checksum)
-            outs() << format_hex_no_prefix(byte, 2, true);
-          outs() << "] ";
-        }
+  if (opts::Compilands) {
+    auto Compilands = GlobalScope->findChildren(PDB_SymType::Compiland);
+    if (Compilands) {
+      while (auto Compiland = Compilands->getNext()) {
+        Compiland->dump(outs(), 0, PDB_DumpLevel::Normal);
       }
-      CComBSTR SourceFileName;
-      if (S_OK != SourceFile->get_fileName(&SourceFileName))
-        continue;
-
-      std::string SourceFileName8;
-      BSTRToUTF8(SourceFileName, SourceFileName8);
-      outs() << SourceFileName8 << "\n";
     }
   }
-
-  outs() << "\n";
   outs().flush();
 }
 
-static void dumpSymbols(IDiaSession *Session) {
-  CComPtr<IDiaEnumSymbols> EnumSymbols;
-  if (FAILED(getDIATable(Session, &EnumSymbols)))
-    return;
-
-  LONG SymbolCount = 0;
-  EnumSymbols->get_Count(&SymbolCount);
-
-  outs() << "Dumping symbols [" << SymbolCount << " symbols]\n";
-  int UnnamedSymbolCount = 0;
-  for (auto Symbol : make_com_enumerator(EnumSymbols)) {
-    DIASymbol SymbolSymbol(Symbol);
-    DIAResult<DIAString> SymbolName = SymbolSymbol.getName();
-    if (!SymbolName.hasValue() || SymbolName.value().empty()) {
-      ++UnnamedSymbolCount;
-      outs() << "  (Unnamed symbol)\n";
-    } else {
-      outs() << "  " << SymbolSymbol.getName().value() << "\n";
-    }
-    if (opts::SymbolDetails)
-      SymbolSymbol.fullDump(4);
-  }
-  outs() << "(Found " << UnnamedSymbolCount << " unnamed symbols)\n";
-  outs().flush();
-}
-
-static void dumpInput(StringRef Path) {
-  SmallVector<UTF16, 128> Path16String;
-  llvm::convertUTF8ToUTF16String(Path, Path16String);
-  wchar_t *Path16 = reinterpret_cast<wchar_t *>(Path16String.data());
-  CComPtr<IDiaDataSource> source;
-  HRESULT hr =
-      ::CoCreateInstance(CLSID_DiaSource, nullptr, CLSCTX_INPROC_SERVER,
-                         __uuidof(IDiaDataSource), (void **)&source);
-  if (FAILED(hr))
-    return;
-  if (FAILED(source->loadDataFromPdb(Path16)))
-    return;
-  CComPtr<IDiaSession> Session;
-  if (FAILED(source->openSession(&Session)))
-    return;
-
-  dumpBasicFileInfo(Path, Session);
-  if (opts::Streams || opts::StreamData) {
-    dumpDataStreams(Session);
-  }
-
-  if (opts::Tables) {
-    dumpDebugTables(Session);
-  }
-
-  if (opts::SourceFiles) {
-    dumpSourceFiles(Session);
-  }
-
-  if (opts::Compilands) {
-    dumpCompilands(Session);
-  }
-
-  if (opts::Symbols || opts::SymbolDetails) {
-    dumpSymbols(Session);
-  }
-}
-
 int main(int argc_, const char *argv_[]) {
   // Print a stack trace if we signal out.
   sys::PrintStackTraceOnErrorSignal();
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
deleted file mode 100644 (file)
index e73289c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//===- llvm-pdbdump.h - Common includes for llvm-pdbdump --------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-// Common defines and header includes for all llvm-pdbdump.  The definitions
-// here configure the necessary #defines and include system headers in the
-// proper order for using DIA.
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
-#define LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
-
-#define NTDDI_VERSION NTDDI_VISTA
-#define _WIN32_WINNT _WIN32_WINNT_VISTA
-#define WINVER _WIN32_WINNT_VISTA
-#ifndef NOMINMAX
-#define NOMINMAX
-#endif
-
-// atlbase.h has to come before windows.h
-#include <atlbase.h>
-#include <windows.h>
-
-// DIA headers must come after windows headers.
-#include <cvconst.h>
-#include <dia2.h>
-
-#endif
\ No newline at end of file
index 5c9b377..fd65d10 100644 (file)
@@ -7,7 +7,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include <type_traits>
 #include <unordered_map>
 
 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
 #include "gtest/gtest.h"
 using namespace llvm;
 
-namespace std {
-  template<>
-  struct hash<PDB_SymType> {
-  public:
-    std::size_t operator()(PDB_SymType Symbol) const {
-      return std::hash<int>()(static_cast<int>(Symbol));
-    }
-  };
-}
-
 namespace {
 
 #define MOCK_SYMBOL_ACCESSOR(Func)                                             \
@@ -82,18 +71,27 @@ class MockSession : public IPDBSession {
   getSourceFileById(uint32_t SymbolId) const override {
     return nullptr;
   }
-  std::unique_ptr<IPDBEnumDataStreams> getDebugStreams() const override {
+  std::unique_ptr<IPDBEnumSourceFiles> getAllSourceFiles() const override {
+    return nullptr;
+  }
+  std::unique_ptr<IPDBEnumSourceFiles> getSourceFilesForCompiland(
+      const PDBSymbolCompiland &Compiland) const override {
     return nullptr;
   }
 };
 
 class MockRawSymbol : public IPDBRawSymbol {
 public:
-  MockRawSymbol(PDB_SymType SymType) : Type(SymType) {}
+  MockRawSymbol(const IPDBSession &PDBSession, PDB_SymType SymType)
+      : Session(PDBSession), Type(SymType) {}
 
-  void dump(llvm::raw_ostream &OS) const override {}
+  void dump(raw_ostream &OS, int Indent, PDB_DumpLevel Level) const override {}
 
   std::unique_ptr<IPDBEnumSymbols>
+  findChildren(PDB_SymType Type) const override {
+    return nullptr;
+  }
+  std::unique_ptr<IPDBEnumSymbols>
   findChildren(PDB_SymType Type, StringRef Name,
                PDB_NameSearchFlags Flags) const override {
     return nullptr;
@@ -206,6 +204,7 @@ public:
   MOCK_SYMBOL_ACCESSOR(hasDebugInfo)
   MOCK_SYMBOL_ACCESSOR(hasEH)
   MOCK_SYMBOL_ACCESSOR(hasEHa)
+  MOCK_SYMBOL_ACCESSOR(hasFramePointer)
   MOCK_SYMBOL_ACCESSOR(hasInlAsm)
   MOCK_SYMBOL_ACCESSOR(hasInlineAttribute)
   MOCK_SYMBOL_ACCESSOR(hasInterruptReturn)
@@ -270,6 +269,7 @@ public:
   MOCK_SYMBOL_ACCESSOR(isVolatileType)
 
 private:
+  const IPDBSession &Session;
   PDB_SymType Type;
 };
 
@@ -334,7 +334,7 @@ private:
   std::unique_ptr<IPDBSession> Session;
 
   void InsertItemWithTag(PDB_SymType Tag) {
-    auto RawSymbol = std::unique_ptr<IPDBRawSymbol>(new MockRawSymbol(Tag));
+    auto RawSymbol = std::make_unique<MockRawSymbol>(*Session, Tag);
     auto Symbol = PDBSymbol::create(*Session, std::move(RawSymbol));
     SymbolMap.insert(std::make_pair(Tag, std::move(Symbol)));
   }