From c41ce8355f88ce522dabde2b435bfe83d550a379 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Tue, 18 Sep 2018 16:35:05 +0000 Subject: [PATCH] [PDB] Better support for enumerating pointer types. There were several issues with the previous implementation. 1) There were no tests. 2) We didn't support creating PDBSymbolTypePointer records for builtin types since those aren't described by LF_POINTER records. 3) We didn't support a wide enough variety of builtin types even ignoring pointers. This patch fixes all of these issues. In order to add tests, it's helpful to be able to ignore the symbol index id hierarchy because it makes the golden output from the DIA version not match our output, so I've extended the dumper to disable dumping of id fields. llvm-svn: 342493 --- llvm/include/llvm/DebugInfo/CodeView/TypeIndex.h | 2 + llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h | 3 +- llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h | 23 +- .../DebugInfo/PDB/Native/NativeCompilandSymbol.h | 3 +- .../llvm/DebugInfo/PDB/Native/NativeRawSymbol.h | 3 +- .../DebugInfo/PDB/Native/NativeSymbolEnumerator.h | 3 +- .../llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h | 3 +- .../llvm/DebugInfo/PDB/Native/NativeTypeEnum.h | 3 +- .../llvm/DebugInfo/PDB/Native/NativeTypePointer.h | 11 +- llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h | 3 +- llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp | 40 ++- .../DebugInfo/PDB/Native/NativeCompilandSymbol.cpp | 11 +- llvm/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp | 11 +- .../PDB/Native/NativeSymbolEnumerator.cpp | 17 +- .../lib/DebugInfo/PDB/Native/NativeTypeBuiltin.cpp | 5 +- llvm/lib/DebugInfo/PDB/Native/NativeTypeEnum.cpp | 17 +- .../lib/DebugInfo/PDB/Native/NativeTypePointer.cpp | 79 ++++- llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp | 24 +- llvm/lib/DebugInfo/PDB/PDBSymbol.cpp | 39 ++- llvm/test/DebugInfo/PDB/Inputs/every-pointer.cpp | 48 +++ llvm/test/DebugInfo/PDB/Inputs/every-pointer.pdb | Bin 0 -> 110592 bytes .../PDB/Native/pdb-native-compilands.test | 6 +- .../DebugInfo/PDB/Native/pdb-native-enums.test | 100 +++--- .../DebugInfo/PDB/Native/pdb-native-pointers.test | 358 +++++++++++++++++++++ llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 26 +- 25 files changed, 720 insertions(+), 118 deletions(-) create mode 100644 llvm/test/DebugInfo/PDB/Inputs/every-pointer.cpp create mode 100644 llvm/test/DebugInfo/PDB/Inputs/every-pointer.pdb create mode 100644 llvm/test/DebugInfo/PDB/Native/pdb-native-pointers.test diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeIndex.h b/llvm/include/llvm/DebugInfo/CodeView/TypeIndex.h index c71281d..681b5f3 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeIndex.h +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeIndex.h @@ -134,6 +134,8 @@ public: return static_cast(Index & SimpleModeMask); } + TypeIndex makeDirect() const { return TypeIndex{getSimpleKind()}; } + static TypeIndex None() { return TypeIndex(SimpleTypeKind::None); } static TypeIndex Void() { return TypeIndex(SimpleTypeKind::Void); } static TypeIndex VoidPointer32() { diff --git a/llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h b/llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h index b7ffa12..5d4f855 100644 --- a/llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h +++ b/llvm/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h @@ -20,7 +20,8 @@ class DIARawSymbol : public IPDBRawSymbol { public: DIARawSymbol(const DIASession &PDBSession, CComPtr DiaSymbol); - void dump(raw_ostream &OS, int Indent) const override; + void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const override; CComPtr getDiaSymbol() const { return Symbol; } diff --git a/llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h b/llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h index 9444676..40a5b3b 100644 --- a/llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h +++ b/llvm/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h @@ -11,6 +11,7 @@ #define LLVM_DEBUGINFO_PDB_IPDBRAWSYMBOL_H #include "PDBTypes.h" +#include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/DebugInfo/CodeView/CodeView.h" @@ -21,9 +22,21 @@ class raw_ostream; namespace pdb { +class IPDBSession; class PDBSymbolTypeVTable; class PDBSymbolTypeVTableShape; +enum class PdbSymbolIdField : uint32_t { + None = 0, + SymIndexId = 1 << 0, + LexicalParent = 1 << 1, + ClassParent = 1 << 2, + Type = 1 << 3, + UnmodifiedType = 1 << 4, + All = 0xFFFFFFFF, + LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ All) +}; + template void dumpSymbolField(raw_ostream &OS, StringRef Name, T Value, int Indent) { OS << "\n"; @@ -31,6 +44,11 @@ void dumpSymbolField(raw_ostream &OS, StringRef Name, T Value, int Indent) { OS << Name << ": " << Value; } +void dumpSymbolIdField(raw_ostream &OS, StringRef Name, SymIndexId Value, + int Indent, const IPDBSession &Session, + PdbSymbolIdField FieldId, PdbSymbolIdField ShowFlags, + PdbSymbolIdField RecurseFlags); + /// IPDBRawSymbol defines an interface used to represent an arbitrary symbol. /// It exposes a monolithic interface consisting of accessors for the union of /// all properties that are valid for any symbol type. This interface is then @@ -40,7 +58,8 @@ class IPDBRawSymbol { public: virtual ~IPDBRawSymbol(); - virtual void dump(raw_ostream &OS, int Indent) const = 0; + virtual void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const = 0; virtual std::unique_ptr findChildren(PDB_SymType Type) const = 0; @@ -244,6 +263,8 @@ public: virtual std::string getUnused() const = 0; }; +LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); + } // namespace pdb } // namespace llvm diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h b/llvm/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h index e1420fe..3cd4655 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h @@ -21,7 +21,8 @@ public: NativeCompilandSymbol(NativeSession &Session, SymIndexId SymbolId, DbiModuleDescriptor MI); - void dump(raw_ostream &OS, int Indent) const override; + void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const override; PDB_SymType getSymTag() const override; bool isEditAndContinueEnabled() const override; diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h b/llvm/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h index 647654b8..86c7a4c4 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h @@ -24,7 +24,8 @@ public: NativeRawSymbol(NativeSession &PDBSession, PDB_SymType Tag, SymIndexId SymbolId); - void dump(raw_ostream &OS, int Indent) const override; + void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const override; std::unique_ptr findChildren(PDB_SymType Type) const override; diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h b/llvm/include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h index 925f3f1..acc5eb8 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/NativeSymbolEnumerator.h @@ -26,7 +26,8 @@ public: ~NativeSymbolEnumerator() override; - void dump(raw_ostream &OS, int Indent) const override; + void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const override; SymIndexId getClassParentId() const override; SymIndexId getLexicalParentId() const override; diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h b/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h index 2d874b3..725dfb8 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeBuiltin.h @@ -26,7 +26,8 @@ public: uint64_t L); ~NativeTypeBuiltin() override; - void dump(raw_ostream &OS, int Indent) const override; + void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const override; PDB_SymType getSymTag() const override; diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h b/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h index c8eab14..3c6915e 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypeEnum.h @@ -31,7 +31,8 @@ public: codeview::EnumRecord EnumRecord); ~NativeTypeEnum() override; - void dump(raw_ostream &OS, int Indent) const override; + void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const override; std::unique_ptr findChildren(PDB_SymType Type) const override; diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h b/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h index 2a91932..a2fd07a 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/NativeTypePointer.h @@ -11,6 +11,7 @@ #ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEPOINTER_H #define LLVM_DEBUGINFO_PDB_NATIVE_NATIVETYPEPOINTER_H +#include "llvm/ADT/Optional.h" #include "llvm/DebugInfo/CodeView/CodeView.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" #include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h" @@ -21,11 +22,17 @@ namespace pdb { class NativeTypePointer : public NativeRawSymbol { public: + // Create a pointer record for a simple type. + NativeTypePointer(NativeSession &Session, SymIndexId Id, + codeview::TypeIndex TI); + + // Create a pointer record for a non-simple type. NativeTypePointer(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI, codeview::PointerRecord PR); ~NativeTypePointer() override; - void dump(raw_ostream &OS, int Indent) const override; + void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const override; bool isConstType() const override; uint64_t getLength() const override; @@ -40,7 +47,7 @@ public: protected: codeview::TypeIndex TI; - codeview::PointerRecord Record; + Optional Record; }; } // namespace pdb diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h b/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h index 7f063e2..3a74f7c 100644 --- a/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h +++ b/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h @@ -112,7 +112,8 @@ public: /// normally goes on the right side of the symbol. virtual void dumpRight(PDBSymDumper &Dumper) const {} - void defaultDump(raw_ostream &OS, int Indent) const; + void defaultDump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowFlags, + PdbSymbolIdField RecurseFlags) const; void dumpProperties() const; void dumpChildStats() const; diff --git a/llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp b/llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp index 0b4b127..46b7ab0 100644 --- a/llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp +++ b/llvm/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp @@ -150,6 +150,17 @@ void DumpDIAValueAs(llvm::raw_ostream &OS, int Indent, StringRef Name, dumpSymbolField(OS, Name, static_cast(Value), Indent); } +void DumpDIAIdValue(llvm::raw_ostream &OS, int Indent, StringRef Name, + IDiaSymbol *Symbol, + HRESULT (__stdcall IDiaSymbol::*Method)(DWORD *), + const IPDBSession &Session, PdbSymbolIdField FieldId, + PdbSymbolIdField ShowFlags, PdbSymbolIdField RecurseFlags) { + DWORD Value; + if (S_OK == (Symbol->*Method)(&Value)) + dumpSymbolIdField(OS, Name, Value, Indent, Session, FieldId, ShowFlags, + RecurseFlags); +} + template void DumpDIAValue(llvm::raw_ostream &OS, int Indent, StringRef Name, IDiaSymbol *Symbol, @@ -199,6 +210,12 @@ DIARawSymbol::DIARawSymbol(const DIASession &PDBSession, CComPtr DiaSymbol) : Session(PDBSession), Symbol(DiaSymbol) {} +#define RAW_ID_METHOD_DUMP(Stream, Method, Session, FieldId, ShowFlags, \ + RecurseFlags) \ + DumpDIAIdValue(Stream, Indent, StringRef{#Method}, Symbol, \ + &IDiaSymbol::get_##Method, Session, FieldId, ShowFlags, \ + RecurseFlags); + #define RAW_METHOD_DUMP(Stream, Method) \ DumpDIAValue(Stream, Indent, StringRef{#Method}, Symbol, \ &IDiaSymbol::get_##Method); @@ -207,9 +224,12 @@ DIARawSymbol::DIARawSymbol(const DIASession &PDBSession, DumpDIAValueAs(Stream, Indent, StringRef{#Method}, Symbol, \ &IDiaSymbol::get_##Method); -void DIARawSymbol::dump(raw_ostream &OS, int Indent) const { - RAW_METHOD_DUMP(OS, symIndexId); - RAW_METHOD_DUMP(OS, symTag); +void DIARawSymbol::dump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const { + RAW_ID_METHOD_DUMP(OS, symIndexId, Session, PdbSymbolIdField::SymIndexId, + ShowIdFields, RecurseIdFields); + RAW_METHOD_DUMP_AS(OS, symTag, PDB_SymType); RAW_METHOD_DUMP(OS, access); RAW_METHOD_DUMP(OS, addressOffset); @@ -226,7 +246,8 @@ void DIARawSymbol::dump(raw_ostream &OS, int Indent) const { RAW_METHOD_DUMP(OS, baseType); RAW_METHOD_DUMP(OS, bitPosition); RAW_METHOD_DUMP(OS, callingConvention); - RAW_METHOD_DUMP(OS, classParentId); + RAW_ID_METHOD_DUMP(OS, classParentId, Session, PdbSymbolIdField::ClassParent, + ShowIdFields, RecurseIdFields); RAW_METHOD_DUMP(OS, compilerName); RAW_METHOD_DUMP(OS, count); RAW_METHOD_DUMP(OS, countLiveRanges); @@ -234,7 +255,9 @@ void DIARawSymbol::dump(raw_ostream &OS, int Indent) const { RAW_METHOD_DUMP(OS, frontEndMinor); RAW_METHOD_DUMP(OS, frontEndBuild); RAW_METHOD_DUMP(OS, frontEndQFE); - RAW_METHOD_DUMP(OS, lexicalParentId); + RAW_ID_METHOD_DUMP(OS, lexicalParentId, Session, + PdbSymbolIdField::LexicalParent, ShowIdFields, + RecurseIdFields); RAW_METHOD_DUMP(OS, libraryName); RAW_METHOD_DUMP(OS, liveRangeStartAddressOffset); RAW_METHOD_DUMP(OS, liveRangeStartAddressSection); @@ -272,10 +295,13 @@ void DIARawSymbol::dump(raw_ostream &OS, int Indent) const { RAW_METHOD_DUMP(OS, textureSlot); RAW_METHOD_DUMP(OS, timeStamp); RAW_METHOD_DUMP(OS, token); - RAW_METHOD_DUMP(OS, typeId); + RAW_ID_METHOD_DUMP(OS, typeId, Session, PdbSymbolIdField::Type, ShowIdFields, + RecurseIdFields); RAW_METHOD_DUMP(OS, uavSlot); RAW_METHOD_DUMP(OS, undecoratedName); - RAW_METHOD_DUMP(OS, unmodifiedTypeId); + RAW_ID_METHOD_DUMP(OS, unmodifiedTypeId, Session, + PdbSymbolIdField::UnmodifiedType, ShowIdFields, + RecurseIdFields); RAW_METHOD_DUMP(OS, upperBoundId); RAW_METHOD_DUMP(OS, virtualBaseDispIndex); RAW_METHOD_DUMP(OS, virtualBaseOffset); diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp index 64ddf75..efa70b0 100644 --- a/llvm/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h" +#include "llvm/DebugInfo/PDB/Native/NativeSession.h" #include "llvm/ADT/STLExtras.h" @@ -23,10 +24,14 @@ PDB_SymType NativeCompilandSymbol::getSymTag() const { return PDB_SymType::Compiland; } -void NativeCompilandSymbol::dump(raw_ostream &OS, int Indent) const { - NativeRawSymbol::dump(OS, Indent); +void NativeCompilandSymbol::dump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const { + NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields); - dumpSymbolField(OS, "lexicalParentId", 0, Indent); + dumpSymbolIdField(OS, "lexicalParentId", 0, Indent, Session, + PdbSymbolIdField::LexicalParent, ShowIdFields, + RecurseIdFields); dumpSymbolField(OS, "libraryName", getLibraryName(), Indent); dumpSymbolField(OS, "name", getName(), Indent); dumpSymbolField(OS, "editAndContinueEnabled", isEditAndContinueEnabled(), diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp index e36d5343..1a8c75d 100644 --- a/llvm/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp @@ -9,6 +9,7 @@ #include "llvm/DebugInfo/PDB/Native/NativeRawSymbol.h" #include "llvm/DebugInfo/PDB/IPDBLineNumber.h" +#include "llvm/DebugInfo/PDB/Native/NativeSession.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h" #include "llvm/Support/FormatVariadic.h" @@ -19,9 +20,13 @@ NativeRawSymbol::NativeRawSymbol(NativeSession &PDBSession, PDB_SymType Tag, SymIndexId SymbolId) : Session(PDBSession), Tag(Tag), SymbolId(SymbolId) {} -void NativeRawSymbol::dump(raw_ostream &OS, int Indent) const { - dumpSymbolField(OS, "symIndexId", SymbolId, Indent); - dumpSymbolField(OS, "symTag", static_cast(Tag), Indent); +void NativeRawSymbol::dump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const { + dumpSymbolIdField(OS, "symIndexId", SymbolId, Indent, Session, + PdbSymbolIdField::SymIndexId, ShowIdFields, + RecurseIdFields); + dumpSymbolField(OS, "symTag", Tag, Indent); } std::unique_ptr diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeSymbolEnumerator.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeSymbolEnumerator.cpp index 18b13b0..6ebb8ca 100644 --- a/llvm/lib/DebugInfo/PDB/Native/NativeSymbolEnumerator.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeSymbolEnumerator.cpp @@ -25,12 +25,19 @@ NativeSymbolEnumerator::NativeSymbolEnumerator( NativeSymbolEnumerator::~NativeSymbolEnumerator() {} -void NativeSymbolEnumerator::dump(raw_ostream &OS, int Indent) const { - NativeRawSymbol::dump(OS, Indent); - dumpSymbolField(OS, "classParentId", getClassParentId(), Indent); - dumpSymbolField(OS, "lexicalParentId", getLexicalParentId(), Indent); +void NativeSymbolEnumerator::dump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const { + NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields); + dumpSymbolIdField(OS, "classParentId", getClassParentId(), Indent, Session, + PdbSymbolIdField::ClassParent, ShowIdFields, + RecurseIdFields); + dumpSymbolIdField(OS, "lexicalParentId", getLexicalParentId(), Indent, + Session, PdbSymbolIdField::LexicalParent, ShowIdFields, + RecurseIdFields); dumpSymbolField(OS, "name", getName(), Indent); - dumpSymbolField(OS, "typeId", getTypeId(), Indent); + dumpSymbolIdField(OS, "typeId", getTypeId(), Indent, Session, + PdbSymbolIdField::Type, ShowIdFields, RecurseIdFields); dumpSymbolField(OS, "dataKind", getDataKind(), Indent); dumpSymbolField(OS, "locationType", getLocationType(), Indent); dumpSymbolField(OS, "constType", isConstType(), Indent); diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeTypeBuiltin.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeTypeBuiltin.cpp index a9197b7..824d9bd 100644 --- a/llvm/lib/DebugInfo/PDB/Native/NativeTypeBuiltin.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeTypeBuiltin.cpp @@ -21,8 +21,9 @@ NativeTypeBuiltin::NativeTypeBuiltin(NativeSession &PDBSession, SymIndexId Id, NativeTypeBuiltin::~NativeTypeBuiltin() {} -void NativeTypeBuiltin::dump(raw_ostream &OS, int Indent) const { -} +void NativeTypeBuiltin::dump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const {} PDB_SymType NativeTypeBuiltin::getSymTag() const { return PDB_SymType::BuiltinType; diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeTypeEnum.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeTypeEnum.cpp index e833b6d..0994be4 100644 --- a/llvm/lib/DebugInfo/PDB/Native/NativeTypeEnum.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeTypeEnum.cpp @@ -130,16 +130,23 @@ NativeTypeEnum::NativeTypeEnum(NativeSession &Session, SymIndexId Id, NativeTypeEnum::~NativeTypeEnum() {} -void NativeTypeEnum::dump(raw_ostream &OS, int Indent) const { - NativeRawSymbol::dump(OS, Indent); +void NativeTypeEnum::dump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const { + NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields); dumpSymbolField(OS, "baseType", static_cast(getBuiltinType()), Indent); - dumpSymbolField(OS, "lexicalParentId", 0, Indent); + dumpSymbolIdField(OS, "lexicalParentId", 0, Indent, Session, + PdbSymbolIdField::LexicalParent, ShowIdFields, + RecurseIdFields); dumpSymbolField(OS, "name", getName(), Indent); - dumpSymbolField(OS, "typeId", getTypeId(), Indent); + dumpSymbolIdField(OS, "typeId", getTypeId(), Indent, Session, + PdbSymbolIdField::Type, ShowIdFields, RecurseIdFields); if (Modifiers.hasValue()) - dumpSymbolField(OS, "unmodifiedTypeId", getUnmodifiedTypeId(), Indent); + dumpSymbolIdField(OS, "unmodifiedTypeId", getUnmodifiedTypeId(), Indent, + Session, PdbSymbolIdField::UnmodifiedType, ShowIdFields, + RecurseIdFields); dumpSymbolField(OS, "length", getLength(), Indent); dumpSymbolField(OS, "constructor", hasConstructor(), Indent); dumpSymbolField(OS, "constType", isConstType(), Indent); diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeTypePointer.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeTypePointer.cpp index f41d0a2..4545f7e 100644 --- a/llvm/lib/DebugInfo/PDB/Native/NativeTypePointer.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeTypePointer.cpp @@ -18,6 +18,13 @@ using namespace llvm::codeview; using namespace llvm::pdb; NativeTypePointer::NativeTypePointer(NativeSession &Session, SymIndexId Id, + codeview::TypeIndex TI) + : NativeRawSymbol(Session, PDB_SymType::PointerType, Id), TI(TI) { + assert(TI.isSimple()); + assert(TI.getSimpleMode() != SimpleTypeMode::Direct); +} + +NativeTypePointer::NativeTypePointer(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI, codeview::PointerRecord Record) : NativeRawSymbol(Session, PDB_SymType::PointerType, Id), TI(TI), @@ -25,11 +32,16 @@ NativeTypePointer::NativeTypePointer(NativeSession &Session, SymIndexId Id, NativeTypePointer::~NativeTypePointer() {} -void NativeTypePointer::dump(raw_ostream &OS, int Indent) const { - NativeRawSymbol::dump(OS, Indent); +void NativeTypePointer::dump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowIdFields, + PdbSymbolIdField RecurseIdFields) const { + NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields); - dumpSymbolField(OS, "lexicalParentId", 0, Indent); - dumpSymbolField(OS, "typeId", getTypeId(), Indent); + dumpSymbolIdField(OS, "lexicalParentId", 0, Indent, Session, + PdbSymbolIdField::LexicalParent, ShowIdFields, + RecurseIdFields); + dumpSymbolIdField(OS, "typeId", getTypeId(), Indent, Session, + PdbSymbolIdField::Type, ShowIdFields, RecurseIdFields); dumpSymbolField(OS, "length", getLength(), Indent); dumpSymbolField(OS, "constType", isConstType(), Indent); dumpSymbolField(OS, "isPointerToDataMember", isPointerToDataMember(), Indent); @@ -42,45 +54,82 @@ void NativeTypePointer::dump(raw_ostream &OS, int Indent) const { dumpSymbolField(OS, "volatileType", isVolatileType(), Indent); } -uint64_t NativeTypePointer::getLength() const { return Record.getSize(); } +uint64_t NativeTypePointer::getLength() const { + if (Record) + return Record->getSize(); + + switch (TI.getSimpleMode()) { + case SimpleTypeMode::NearPointer: + case SimpleTypeMode::FarPointer: + case SimpleTypeMode::HugePointer: + return 2; + case SimpleTypeMode::NearPointer32: + case SimpleTypeMode::FarPointer32: + return 4; + case SimpleTypeMode::NearPointer64: + return 8; + case SimpleTypeMode::NearPointer128: + return 16; + default: + assert(false && "invalid simple type mode!"); + } + return 0; +} SymIndexId NativeTypePointer::getTypeId() const { // This is the pointee SymIndexId. - return Session.getSymbolCache().findSymbolByTypeIndex(Record.ReferentType); + TypeIndex Referent = Record ? Record->ReferentType : TI.makeDirect(); + + return Session.getSymbolCache().findSymbolByTypeIndex(Referent); } bool NativeTypePointer::isReference() const { - return Record.getMode() == PointerMode::LValueReference || - isRValueReference(); + if (!Record) + return false; + return Record->getMode() == PointerMode::LValueReference; } bool NativeTypePointer::isRValueReference() const { - return Record.getMode() == PointerMode::RValueReference; + if (!Record) + return false; + return Record->getMode() == PointerMode::RValueReference; } bool NativeTypePointer::isPointerToDataMember() const { - return Record.getMode() == PointerMode::PointerToDataMember; + if (!Record) + return false; + return Record->getMode() == PointerMode::PointerToDataMember; } bool NativeTypePointer::isPointerToMemberFunction() const { - return Record.getMode() == PointerMode::PointerToMemberFunction; + if (!Record) + return false; + return Record->getMode() == PointerMode::PointerToMemberFunction; } bool NativeTypePointer::isConstType() const { - return (Record.getOptions() & PointerOptions::Const) != PointerOptions::None; + if (!Record) + return false; + return (Record->getOptions() & PointerOptions::Const) != PointerOptions::None; } bool NativeTypePointer::isRestrictedType() const { - return (Record.getOptions() & PointerOptions::Restrict) != + if (!Record) + return false; + return (Record->getOptions() & PointerOptions::Restrict) != PointerOptions::None; } bool NativeTypePointer::isVolatileType() const { - return (Record.getOptions() & PointerOptions::Volatile) != + if (!Record) + return false; + return (Record->getOptions() & PointerOptions::Volatile) != PointerOptions::None; } bool NativeTypePointer::isUnalignedType() const { - return (Record.getOptions() & PointerOptions::Unaligned) != + if (!Record) + return false; + return (Record->getOptions() & PointerOptions::Unaligned) != PointerOptions::None; } diff --git a/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp b/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp index a4b1ecf..a661227 100644 --- a/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/SymbolCache.cpp @@ -65,18 +65,20 @@ SymbolCache::createTypeEnumerator(codeview::TypeLeafKind Kind) { SymIndexId SymbolCache::createSimpleType(TypeIndex Index, ModifierOptions Mods) { - // FIXME: We will eventually need to handle pointers to other simple types, - // which are still simple types in the world of CodeView TypeIndexes. - if (Index.getSimpleMode() != codeview::SimpleTypeMode::Direct) - return 0; + if (Index.getSimpleMode() != codeview::SimpleTypeMode::Direct) { + SymIndexId Id = Cache.size(); + Cache.emplace_back( + llvm::make_unique(Session, Id, Index)); + return Id; + } + SymIndexId Id = Cache.size(); const auto Kind = Index.getSimpleKind(); const auto It = std::find_if( std::begin(BuiltinTypes), std::end(BuiltinTypes), [Kind](const BuiltinTypeEntry &Builtin) { return Builtin.Kind == Kind; }); if (It == std::end(BuiltinTypes)) return 0; - SymIndexId Id = Cache.size(); Cache.emplace_back(llvm::make_unique(Session, Id, Mods, It->Type, It->Size)); TypeIndexToSymbolId[Index] = Id; @@ -175,12 +177,16 @@ SymbolCache::getSymbolById(SymIndexId SymbolId) const { assert(SymbolId < Cache.size()); // Id 0 is reserved. - if (SymbolId == 0) + if (SymbolId == 0 || SymbolId >= Cache.size()) + return nullptr; + + // Make sure to handle the case where we've inserted a placeholder symbol + // for types we don't yet suppport. + NativeRawSymbol *NRS = Cache[SymbolId].get(); + if (!NRS) return nullptr; - // If the caller has a SymbolId, it'd better be in our SymbolCache. - return SymbolId < Cache.size() ? PDBSymbol::create(Session, *Cache[SymbolId]) - : nullptr; + return PDBSymbol::create(Session, *NRS); } NativeRawSymbol &SymbolCache::getNativeSymbolById(SymIndexId SymbolId) const { diff --git a/llvm/lib/DebugInfo/PDB/PDBSymbol.cpp b/llvm/lib/DebugInfo/PDB/PDBSymbol.cpp index 22ce972..d492eda 100644 --- a/llvm/lib/DebugInfo/PDB/PDBSymbol.cpp +++ b/llvm/lib/DebugInfo/PDB/PDBSymbol.cpp @@ -115,13 +115,15 @@ std::unique_ptr PDBSymbol::create(const IPDBSession &PDBSession, return SymbolPtr; } -void PDBSymbol::defaultDump(raw_ostream &OS, int Indent) const { - RawSymbol->dump(OS, Indent); +void PDBSymbol::defaultDump(raw_ostream &OS, int Indent, + PdbSymbolIdField ShowFlags, + PdbSymbolIdField RecurseFlags) const { + RawSymbol->dump(OS, Indent, ShowFlags, RecurseFlags); } void PDBSymbol::dumpProperties() const { outs() << "\n"; - defaultDump(outs(), 0); + defaultDump(outs(), 0, PdbSymbolIdField::All, PdbSymbolIdField::None); outs().flush(); } @@ -180,3 +182,34 @@ PDBSymbol::getChildStats(TagStats &Stats) const { std::unique_ptr PDBSymbol::getSymbolByIdHelper(uint32_t Id) const { return Session.getSymbolById(Id); } + +void llvm::pdb::dumpSymbolIdField(raw_ostream &OS, StringRef Name, + SymIndexId Value, int Indent, + const IPDBSession &Session, + PdbSymbolIdField FieldId, + PdbSymbolIdField ShowFlags, + PdbSymbolIdField RecurseFlags) { + if ((FieldId & ShowFlags) == PdbSymbolIdField::None) + return; + + OS << "\n"; + OS.indent(Indent); + OS << Name << ": " << Value; + // Don't recurse unless the user requested it. + if ((FieldId & RecurseFlags) == PdbSymbolIdField::None) + return; + // And obviously don't recurse on the symbol itself. + if (FieldId == PdbSymbolIdField::SymIndexId) + return; + + auto Child = Session.getSymbolById(Value); + + // It could have been a placeholder symbol for a type we don't yet support, + // so just exit in that case. + if (!Child) + return; + + // Don't recurse more than once, so pass PdbSymbolIdField::None) for the + // recurse flags. + Child->defaultDump(OS, Indent + 2, ShowFlags, PdbSymbolIdField::None); +} diff --git a/llvm/test/DebugInfo/PDB/Inputs/every-pointer.cpp b/llvm/test/DebugInfo/PDB/Inputs/every-pointer.cpp new file mode 100644 index 0000000..7f7fab9 --- /dev/null +++ b/llvm/test/DebugInfo/PDB/Inputs/every-pointer.cpp @@ -0,0 +1,48 @@ +// Build with "cl.exe /Zi /GR- /GX- every-pointer.cpp /link /debug /nodefaultlib /incremental:no /entry:main" + +#include + +// clang-format off +void *__purecall = 0; + +void __cdecl operator delete(void *,unsigned int) {} +void __cdecl operator delete(void *,unsigned __int64) {} + + +struct Foo { + int X = 0; + int func() { return 42; } +}; + +int *IntP = nullptr; +Foo *FooP = nullptr; + +Foo F; + +Foo __unaligned *UFooP = &F; +Foo * __restrict RFooP = &F; + +const Foo * CFooP = &F; +volatile Foo * VFooP = &F; +const volatile Foo * CVFooP = &F; + +template void f(T t) {} + +int main(int argc, char **argv) { + f(IntP); + f(FooP); + + f(UFooP); + f(RFooP); + + f(CFooP); + f(VFooP); + f(CVFooP); + + f(F); + f(static_cast(F)); + + f(&Foo::X); + f(&Foo::func); + return 0; +} diff --git a/llvm/test/DebugInfo/PDB/Inputs/every-pointer.pdb b/llvm/test/DebugInfo/PDB/Inputs/every-pointer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e911f3937aa9c9aafe1f19aff33a54bb44b0ea57 GIT binary patch literal 110592 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 literal 0 HcmV?d00001 diff --git a/llvm/test/DebugInfo/PDB/Native/pdb-native-compilands.test b/llvm/test/DebugInfo/PDB/Native/pdb-native-compilands.test index 7dca036..620c4f0 100644 --- a/llvm/test/DebugInfo/PDB/Native/pdb-native-compilands.test +++ b/llvm/test/DebugInfo/PDB/Native/pdb-native-compilands.test @@ -68,16 +68,14 @@ BIGREAD: * Linker * DUMP: { DUMP-NEXT: symIndexId: 2 -DUMP-NEXT: symTag: 2 -DUMP-NEXT: lexicalParentId: 0 +DUMP-NEXT: symTag: Compiland DUMP-NEXT: libraryName: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj DUMP-NEXT: name: d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj DUMP-NEXT: editAndContinueEnabled: 0 DUMP-NEXT: } DUMP-NEXT: { DUMP-NEXT: symIndexId: 3 -DUMP-NEXT: symTag: 2 -DUMP-NEXT: lexicalParentId: 0 +DUMP-NEXT: symTag: Compiland DUMP-NEXT: libraryName: DUMP-NEXT: name: * Linker * DUMP-NEXT: editAndContinueEnabled: 0 diff --git a/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test b/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test index 480fd03..c456964 100644 --- a/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test +++ b/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test @@ -10,7 +10,7 @@ ; RUN: llvm-pdbutil pretty -native -enums %p/../Inputs/every-enum.pdb \ ; RUN: | FileCheck -check-prefix=ENUMS %s -; RUN: llvm-pdbutil diadump -native -enums %p/../Inputs/every-enum.pdb \ +; RUN: llvm-pdbutil diadump -hierarchy -native -enums %p/../Inputs/every-enum.pdb \ ; RUN: | FileCheck -check-prefix=DUMP %s @@ -81,7 +81,7 @@ ENUMS: const volatile enum EC DUMP: { DUMP: symIndexId: 2 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 2 DUMP: lexicalParentId: 0 DUMP: name: I8 @@ -104,7 +104,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 4 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 2 DUMP: lexicalParentId: 0 DUMP: name: I8A @@ -118,7 +118,7 @@ DUMP: value: -128 DUMP: } DUMP: { DUMP: symIndexId: 5 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 2 DUMP: lexicalParentId: 0 DUMP: name: I8B @@ -132,7 +132,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 6 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 2 DUMP: lexicalParentId: 0 DUMP: name: I8C @@ -147,7 +147,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 7 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 6 DUMP: lexicalParentId: 0 DUMP: name: I16 @@ -170,7 +170,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 9 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 7 DUMP: lexicalParentId: 0 DUMP: name: I16A @@ -184,7 +184,7 @@ DUMP: value: -32768 DUMP: } DUMP: { DUMP: symIndexId: 10 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 7 DUMP: lexicalParentId: 0 DUMP: name: I16B @@ -198,7 +198,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 11 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 7 DUMP: lexicalParentId: 0 DUMP: name: I16C @@ -213,7 +213,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 12 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 6 DUMP: lexicalParentId: 0 DUMP: name: I32 @@ -236,7 +236,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 14 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 12 DUMP: lexicalParentId: 0 DUMP: name: I32A @@ -250,7 +250,7 @@ DUMP: value: -2147483648 DUMP: } DUMP: { DUMP: symIndexId: 15 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 12 DUMP: lexicalParentId: 0 DUMP: name: I32B @@ -264,7 +264,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 16 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 12 DUMP: lexicalParentId: 0 DUMP: name: I32C @@ -279,7 +279,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 17 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 6 DUMP: lexicalParentId: 0 DUMP: name: I64 @@ -302,7 +302,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 19 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 17 DUMP: lexicalParentId: 0 DUMP: name: I64A @@ -316,7 +316,7 @@ DUMP: value: -9223372036854775808 DUMP: } DUMP: { DUMP: symIndexId: 20 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 17 DUMP: lexicalParentId: 0 DUMP: name: I64B @@ -330,7 +330,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 21 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 17 DUMP: lexicalParentId: 0 DUMP: name: I64C @@ -345,7 +345,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 22 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 2 DUMP: lexicalParentId: 0 DUMP: name: U8 @@ -368,7 +368,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 24 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 22 DUMP: lexicalParentId: 0 DUMP: name: U8A @@ -382,7 +382,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 25 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 22 DUMP: lexicalParentId: 0 DUMP: name: U8B @@ -397,7 +397,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 26 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 7 DUMP: lexicalParentId: 0 DUMP: name: U16 @@ -420,7 +420,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 28 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 26 DUMP: lexicalParentId: 0 DUMP: name: U16A @@ -434,7 +434,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 29 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 26 DUMP: lexicalParentId: 0 DUMP: name: U16B @@ -449,7 +449,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 30 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 7 DUMP: lexicalParentId: 0 DUMP: name: U32 @@ -472,7 +472,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 32 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 30 DUMP: lexicalParentId: 0 DUMP: name: U32A @@ -486,7 +486,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 33 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 30 DUMP: lexicalParentId: 0 DUMP: name: U32B @@ -501,7 +501,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 34 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 7 DUMP: lexicalParentId: 0 DUMP: name: U64 @@ -524,7 +524,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 36 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 34 DUMP: lexicalParentId: 0 DUMP: name: U64A @@ -538,7 +538,7 @@ DUMP: value: 0 DUMP: } DUMP: { DUMP: symIndexId: 37 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 34 DUMP: lexicalParentId: 0 DUMP: name: U64B @@ -553,7 +553,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 38 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 7 DUMP: lexicalParentId: 0 DUMP: name: Char16 @@ -576,7 +576,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 39 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 38 DUMP: lexicalParentId: 0 DUMP: name: C16A @@ -590,7 +590,7 @@ DUMP: value: 97 DUMP: } DUMP: { DUMP: symIndexId: 40 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 38 DUMP: lexicalParentId: 0 DUMP: name: C16B @@ -605,7 +605,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 41 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 7 DUMP: lexicalParentId: 0 DUMP: name: Char32 @@ -628,7 +628,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 43 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 41 DUMP: lexicalParentId: 0 DUMP: name: C32A @@ -642,7 +642,7 @@ DUMP: value: 97 DUMP: } DUMP: { DUMP: symIndexId: 44 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 41 DUMP: lexicalParentId: 0 DUMP: name: C32B @@ -657,7 +657,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 45 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 7 DUMP: lexicalParentId: 0 DUMP: name: WChar @@ -680,7 +680,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 46 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 45 DUMP: lexicalParentId: 0 DUMP: name: WCA @@ -694,7 +694,7 @@ DUMP: value: 97 DUMP: } DUMP: { DUMP: symIndexId: 47 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 45 DUMP: lexicalParentId: 0 DUMP: name: WCB @@ -709,7 +709,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 48 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 10 DUMP: lexicalParentId: 0 DUMP: name: Bool @@ -732,7 +732,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 50 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 48 DUMP: lexicalParentId: 0 DUMP: name: BA @@ -746,7 +746,7 @@ DUMP: value: true DUMP: } DUMP: { DUMP: symIndexId: 51 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 48 DUMP: lexicalParentId: 0 DUMP: name: BB @@ -760,7 +760,7 @@ DUMP: value: false DUMP: } DUMP: { DUMP: symIndexId: 113 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 6 DUMP: lexicalParentId: 0 DUMP: name: EC @@ -783,7 +783,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 114 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 113 DUMP: lexicalParentId: 0 DUMP: name: A @@ -797,7 +797,7 @@ DUMP: value: 1 DUMP: } DUMP: { DUMP: symIndexId: 115 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 113 DUMP: lexicalParentId: 0 DUMP: name: B @@ -812,7 +812,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 116 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 6 DUMP: lexicalParentId: 0 DUMP: name: Struct::Nested @@ -835,7 +835,7 @@ DUMP: isValueUdt: 0 DUMP: volatileType: 0 DUMP: { DUMP: symIndexId: 114 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 113 DUMP: lexicalParentId: 0 DUMP: name: A @@ -849,7 +849,7 @@ DUMP: value: 1 DUMP: } DUMP: { DUMP: symIndexId: 115 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 113 DUMP: lexicalParentId: 0 DUMP: name: B @@ -864,7 +864,7 @@ DUMP: } DUMP: } DUMP: { DUMP: symIndexId: 117 -DUMP: symTag: 12 +DUMP: symTag: Enum DUMP: baseType: 6 DUMP: lexicalParentId: 0 DUMP: name: EC @@ -887,7 +887,7 @@ DUMP: unalignedType: 0 DUMP: isValueUdt: 0 DUMP: volatileType: 1 { DUMP: symIndexId: 114 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 113 DUMP: lexicalParentId: 0 DUMP: name: A @@ -901,7 +901,7 @@ DUMP: value: 1 DUMP: } DUMP: { DUMP: symIndexId: 115 -DUMP: symTag: 7 +DUMP: symTag: Data DUMP: classParentId: 113 DUMP: lexicalParentId: 0 DUMP: name: B diff --git a/llvm/test/DebugInfo/PDB/Native/pdb-native-pointers.test b/llvm/test/DebugInfo/PDB/Native/pdb-native-pointers.test new file mode 100644 index 0000000..5bc739b --- /dev/null +++ b/llvm/test/DebugInfo/PDB/Native/pdb-native-pointers.test @@ -0,0 +1,358 @@ +; Test that the native PDB reader can enumerate pointer types. The output +; being checked against is golden output generated by llvm-pdbutil without +; the -native flag. Then we check that we generate the same output. + +; RUN: llvm-pdbutil diadump -no-ids -native -pointers \ +; RUN: %p/../Inputs/every-pointer.pdb | FileCheck %s + +; CHECK: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 1 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 1 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 1 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 1 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 1 +; FIXME: isSingleInheritance: 1 # DIA has this property for member pointers +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 4 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 1 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; FIXME: isSingleInheritance: 1 # DIA has this property for member pointers +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 1 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; FIXME: isSingleInheritance: 1 # DIA has this property for member pointers +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 1 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 1 +; CHECK-NEXT: reference: 0 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: symTag: PointerType +; CHECK-NEXT: length: 8 +; CHECK-NEXT: constType: 0 +; CHECK-NEXT: isPointerToDataMember: 0 +; CHECK-NEXT: isPointerToMemberFunction: 0 +; CHECK-NEXT: RValueReference: 0 +; CHECK-NEXT: reference: 1 +; CHECK-NEXT: restrictedType: 0 +; CHECK-NEXT: unalignedType: 0 +; CHECK-NEXT: volatileType: 0 +; CHECK-NEXT: } \ No newline at end of file diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index aba5ca9..51dcd97 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -165,6 +165,20 @@ cl::list InputFilenames(cl::Positional, cl::opt Native("native", cl::desc("Use native PDB reader instead of DIA"), cl::sub(DiaDumpSubcommand)); +static cl::opt + ShowClassHierarchy("hierarchy", cl::desc("Show lexical and class parents"), + cl::sub(DiaDumpSubcommand)); +static cl::opt NoSymIndexIds( + "no-ids", + cl::desc("Don't show any SymIndexId fields (overrides -hierarchy)"), + cl::sub(DiaDumpSubcommand)); + +static cl::opt + Recurse("recurse", + cl::desc("When dumping a SymIndexId, dump the full details of the " + "corresponding record"), + cl::sub(DiaDumpSubcommand)); + static cl::opt Enums("enums", cl::desc("Dump enum types"), cl::sub(DiaDumpSubcommand)); static cl::opt Pointers("pointers", cl::desc("Dump enum types"), @@ -965,16 +979,24 @@ static void dumpDia(StringRef Path) { if (opts::diadump::Pointers) SymTypes.push_back(PDB_SymType::PointerType); + PdbSymbolIdField Ids = opts::diadump::NoSymIndexIds ? PdbSymbolIdField::None + : PdbSymbolIdField::All; + PdbSymbolIdField Recurse = PdbSymbolIdField::None; + if (opts::diadump::Recurse) + Recurse = PdbSymbolIdField::All; + if (!opts::diadump::ShowClassHierarchy) + Ids &= ~(PdbSymbolIdField::ClassParent | PdbSymbolIdField::LexicalParent); + for (PDB_SymType ST : SymTypes) { auto Children = GlobalScope->findAllChildren(ST); while (auto Child = Children->getNext()) { outs() << "{"; - Child->defaultDump(outs(), 2); + Child->defaultDump(outs(), 2, Ids, Recurse); if (auto Enum = dyn_cast(Child.get())) { auto Enumerators = Enum->findAllChildren(); while (auto Enumerator = Enumerators->getNext()) { outs() << " {"; - Enumerator->defaultDump(outs(), 4); + Enumerator->defaultDump(outs(), 4, Ids, Recurse); outs() << "\n }\n"; } } -- 2.7.4