diff options
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h | 23 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/TypeRecord.h | 23 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h | 7 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/TypeRecords.def | 2 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/ListRecordBuilder.cpp | 79 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeDumper.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeRecord.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp | 4 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/enum.ll | 4 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/types-data-members.ll | 20 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll | 8 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/types-recursive-struct.ll | 8 | ||||
-rw-r--r-- | llvm/test/DebugInfo/PDB/pdbdump-headers.test | 6 |
14 files changed, 169 insertions, 40 deletions
diff --git a/llvm/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h b/llvm/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h index 1fa20891608..75a075157d2 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h +++ b/llvm/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h @@ -47,7 +47,7 @@ private: public: FieldListRecordBuilder(); - void reset() { ListRecordBuilder::reset(TypeRecordKind::FieldList); } + void reset() { ListRecordBuilder::reset(); } void writeBaseClass(const BaseClassRecord &Record); void writeEnumerator(const EnumeratorRecord &Record); diff --git a/llvm/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h b/llvm/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h index 0e058d27bb0..cc53b53fe50 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h +++ b/llvm/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h @@ -14,6 +14,7 @@ namespace llvm { namespace codeview { +class TypeTableBuilder; class ListRecordBuilder { private: @@ -28,13 +29,16 @@ protected: public: llvm::StringRef str() { return Builder.str(); } - void reset(TypeRecordKind K) { - Builder.reset(K); + void reset() { + Builder.reset(Kind); ContinuationOffsets.clear(); - SubrecordCount = 0; + SubrecordStart = 0; } - unsigned getSubrecordCount() { return SubrecordCount; } + void writeListContinuation(const ListContinuationRecord &R); + + /// Writes this list record as a possible sequence of records. + TypeIndex writeListRecord(TypeTableBuilder &Table); protected: void finishSubRecord(); @@ -42,9 +46,18 @@ protected: TypeRecordBuilder &getBuilder() { return Builder; } private: + size_t getLastContinuationStart() const { + return ContinuationOffsets.empty() ? 0 : ContinuationOffsets.back(); + } + size_t getLastContinuationEnd() const { return Builder.size(); } + unsigned getLastContinuationSize() const { + return getLastContinuationEnd() - getLastContinuationStart(); + } + + TypeRecordKind Kind; TypeRecordBuilder Builder; SmallVector<size_t, 4> ContinuationOffsets; - unsigned SubrecordCount = 0; + size_t SubrecordStart = 0; }; } } diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeRecord.h b/llvm/include/llvm/DebugInfo/CodeView/TypeRecord.h index 17f31e12db1..1ec05292c3d 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeRecord.h +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeRecord.h @@ -1169,6 +1169,29 @@ private: uint64_t VTableIndex; }; +/// LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST records +/// together. The first will end in an LF_INDEX record that points to the next. +class ListContinuationRecord : public TypeRecord { +public: + ListContinuationRecord(TypeIndex ContinuationIndex) + : TypeRecord(TypeRecordKind::ListContinuation), + ContinuationIndex(ContinuationIndex) {} + + TypeIndex getContinuationIndex() const { return ContinuationIndex; } + + bool remapTypeIndices(ArrayRef<TypeIndex> IndexMap); + + static ErrorOr<ListContinuationRecord> deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data); + +private: + struct Layout { + ulittle16_t Pad0; + TypeIndex ContinuationIndex; + }; + TypeIndex ContinuationIndex; +}; + typedef CVRecord<TypeLeafKind> CVType; typedef VarStreamArray<CVType> CVTypeArray; } diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h b/llvm/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h index 75a8c51ff21..010d06e5e31 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h @@ -43,11 +43,18 @@ public: void writeNullTerminatedString(const char *Value); void writeNullTerminatedString(StringRef Value); void writeGuid(StringRef Guid); + void writeBytes(StringRef Value) { Stream << Value; } llvm::StringRef str(); uint64_t size() const { return Stream.tell(); } + void truncate(uint64_t Size) { + // This works because raw_svector_ostream is not buffered. + assert(Size < Buffer.size()); + Buffer.resize(Size); + } + void reset(TypeRecordKind K) { Buffer.clear(); writeTypeRecordKind(K); diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeRecords.def b/llvm/include/llvm/DebugInfo/CodeView/TypeRecords.def index 41fbeaa5be6..0959f4bf19c 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeRecords.def +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeRecords.def @@ -71,6 +71,7 @@ MEMBER_RECORD(LF_MEMBER, 0x150d, DataMember) MEMBER_RECORD(LF_NESTTYPE, 0x1510, NestedType) MEMBER_RECORD(LF_ONEMETHOD, 0x1511, OneMethod) MEMBER_RECORD(LF_ENUMERATE, 0x1502, Enumerator) +MEMBER_RECORD(LF_INDEX, 0x1404, ListContinuation) // ID leaf records. Subsequent leaf types may be referenced from .debug$S. TYPE_RECORD(LF_FUNC_ID, 0x1601, FuncId) @@ -168,7 +169,6 @@ CV_TYPE(LF_DIMVARLU, 0x120a) // Member type records. These are generally not length prefixed, and appear // inside of a field list record. CV_TYPE(LF_FRIENDFCN_ST, 0x1403) -CV_TYPE(LF_INDEX, 0x1404) CV_TYPE(LF_MEMBER_ST, 0x1405) CV_TYPE(LF_STMEMBER_ST, 0x1406) CV_TYPE(LF_METHOD_ST, 0x1407) diff --git a/llvm/lib/DebugInfo/CodeView/ListRecordBuilder.cpp b/llvm/lib/DebugInfo/CodeView/ListRecordBuilder.cpp index 5bec65a36df..eab5add310e 100644 --- a/llvm/lib/DebugInfo/CodeView/ListRecordBuilder.cpp +++ b/llvm/lib/DebugInfo/CodeView/ListRecordBuilder.cpp @@ -7,27 +7,92 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/SmallString.h" #include "llvm/DebugInfo/CodeView/ListRecordBuilder.h" +#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h" using namespace llvm; using namespace codeview; -ListRecordBuilder::ListRecordBuilder(TypeRecordKind Kind) : Builder(Kind) {} +ListRecordBuilder::ListRecordBuilder(TypeRecordKind Kind) + : Kind(Kind), Builder(Kind) {} -void ListRecordBuilder::finishSubRecord() { - SubrecordCount++; +void ListRecordBuilder::writeListContinuation(const ListContinuationRecord &R) { + TypeRecordBuilder &Builder = getBuilder(); + + assert(getLastContinuationSize() < 65535 - 8 && "continuation won't fit"); + + Builder.writeTypeRecordKind(TypeRecordKind::ListContinuation); + Builder.writeUInt16(0); + Builder.writeTypeIndex(R.getContinuationIndex()); + + // End the current segment manually so that nothing comes after the + // continuation. + ContinuationOffsets.push_back(Builder.size()); + SubrecordStart = Builder.size(); +} +void ListRecordBuilder::finishSubRecord() { // The builder starts at offset 2 in the actual CodeView buffer, so add an // additional offset of 2 before computing the alignment. uint32_t Remainder = (Builder.size() + 2) % 4; if (Remainder != 0) { for (int32_t PaddingBytesLeft = 4 - Remainder; PaddingBytesLeft > 0; --PaddingBytesLeft) { - Builder.writeUInt8(0xf0 + PaddingBytesLeft); + Builder.writeUInt8(LF_PAD0 + PaddingBytesLeft); } } - // TODO: Split the list into multiple records if it's longer than 64KB, using - // a subrecord of TypeRecordKind::Index to chain the records together. - assert(Builder.size() < 65536); + // Check if this subrecord makes the current segment not fit in 64K minus the + // space for a continuation record (8 bytes). If the segment does not fit, + // back up and insert a continuation record, sliding the current subrecord + // down. + if (getLastContinuationSize() > 65535 - 8) { + SmallString<128> SubrecordCopy(Builder.str().slice(SubrecordStart, Builder.size())); + Builder.truncate(SubrecordStart); + + // Write a placeholder continuation record. + Builder.writeTypeRecordKind(TypeRecordKind::ListContinuation); + Builder.writeUInt16(0); + Builder.writeUInt32(0); + ContinuationOffsets.push_back(Builder.size()); + assert(Builder.size() == SubrecordStart + 8 && "wrong continuation size"); + assert(getLastContinuationSize() < 65535 && "segment too big"); + + // Start a new list record of the appropriate kind, and copy the previous + // subrecord into place. + Builder.writeTypeRecordKind(Kind); + Builder.writeBytes(SubrecordCopy); + } + + SubrecordStart = Builder.size(); +} + +TypeIndex ListRecordBuilder::writeListRecord(TypeTableBuilder &Table) { + // Get the continuation segments as a reversed vector of StringRefs for + // convenience. + SmallVector<StringRef, 1> Segments; + StringRef Data = str(); + size_t LastEnd = 0; + for (size_t SegEnd : ContinuationOffsets) { + Segments.push_back(Data.slice(LastEnd, SegEnd)); + LastEnd = SegEnd; + } + Segments.push_back(Data.slice(LastEnd, Builder.size())); + + // Pop the last record off and emit it directly. + StringRef LastRec = Segments.pop_back_val(); + TypeIndex ContinuationIndex = Table.writeRecord(LastRec); + + // Emit each record with a continuation in reverse order, so that each one + // references the previous record. + for (StringRef Rec : reverse(Segments)) { + assert(*reinterpret_cast<const ulittle16_t *>(Rec.data()) == + unsigned(Kind)); + ulittle32_t *ContinuationPtr = + reinterpret_cast<ulittle32_t *>(const_cast<char *>(Rec.end())) - 1; + *ContinuationPtr = ContinuationIndex.getIndex(); + ContinuationIndex = Table.writeRecord(Rec); + } + return ContinuationIndex; } diff --git a/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp b/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp index 316bbb43a11..2ff91e727ee 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp @@ -195,6 +195,8 @@ static StringRef getLeafTypeName(TypeLeafKind LT) { case ename: \ return #name; #include "llvm/DebugInfo/CodeView/TypeRecords.def" + case LF_FIELDLIST: + return "FieldList"; default: break; } @@ -214,6 +216,9 @@ Error CVTypeDumper::visitTypeBegin(const CVRecord<TypeLeafKind> &Record) { } Error CVTypeDumper::visitTypeEnd(const CVRecord<TypeLeafKind> &Record) { + if (Record.Type == LF_FIELDLIST) + Name = "<field list>"; + // Always record some name for every type, even if Name is empty. CVUDTNames // is indexed by type index, and must have one entry for every type. recordType(Name); @@ -612,6 +617,12 @@ Error CVTypeDumper::visitVirtualBaseClass(VirtualBaseClassRecord &Base) { return Error::success(); } +Error CVTypeDumper::visitListContinuation(ListContinuationRecord &Cont) { + DictScope S(*W, "ListContinuation"); + printTypeIndex("ContinuationIndex", Cont.getContinuationIndex()); + return Error::success(); +} + StringRef CVTypeDumper::getTypeName(TypeIndex TI) { if (TI.isNoneType()) return "<no type>"; diff --git a/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp b/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp index cc09abcd988..40f963fe25a 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp @@ -365,6 +365,14 @@ VirtualBaseClassRecord::deserialize(TypeRecordKind Kind, Offset, Index); } +ErrorOr<ListContinuationRecord> +ListContinuationRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { + const Layout *L = nullptr; + CV_DESERIALIZE(Data, L); + return ListContinuationRecord(L->ContinuationIndex); +} + //===----------------------------------------------------------------------===// // Type index remapping //===----------------------------------------------------------------------===// @@ -556,3 +564,7 @@ bool VirtualBaseClassRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) { Success &= remapIndex(IndexMap, VBPtrType); return Success; } + +bool ListContinuationRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) { + return remapIndex(IndexMap, ContinuationIndex); +} diff --git a/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp b/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp index 7ac9581db3f..647538ee8ce 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp @@ -267,9 +267,7 @@ TypeIndex TypeTableBuilder::writeRecord(TypeRecordBuilder &Builder) { } TypeIndex TypeTableBuilder::writeFieldList(FieldListRecordBuilder &FieldList) { - // TODO: Split the list into multiple records if it's longer than 64KB, using - // a subrecord of TypeRecordKind::Index to chain the records together. - return writeRecord(FieldList.str()); + return FieldList.writeListRecord(*this); } TypeIndex TypeTableBuilder::writeMethodOverloadList( diff --git a/llvm/test/DebugInfo/COFF/enum.ll b/llvm/test/DebugInfo/COFF/enum.ll index ca177deb64d..118aee1f843 100644 --- a/llvm/test/DebugInfo/COFF/enum.ll +++ b/llvm/test/DebugInfo/COFF/enum.ll @@ -5,7 +5,7 @@ ; E e; ; CHECK: CodeViewTypes [ -; CHECK: UnknownLeaf (0x1000) { +; CHECK: FieldList (0x1000) { ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK-NEXT: Enumerator { ; CHECK-NEXT: AccessSpecifier: Public (0x3) @@ -19,7 +19,7 @@ ; CHECK-NEXT: Properties [ (0x0) ; CHECK-NEXT: ] ; CHECK-NEXT: UnderlyingType: int (0x74) -; CHECK-NEXT: FieldListType: BLAH (0x1000) +; CHECK-NEXT: FieldListType: <field list> (0x1000) ; CHECK-NEXT: Name: E ; CHECK-NEXT: } diff --git a/llvm/test/DebugInfo/COFF/types-data-members.ll b/llvm/test/DebugInfo/COFF/types-data-members.ll index 785d2b8905d..963c74454d5 100644 --- a/llvm/test/DebugInfo/COFF/types-data-members.ll +++ b/llvm/test/DebugInfo/COFF/types-data-members.ll @@ -81,7 +81,7 @@ ; CHECK: Const (0x1) ; CHECK: ] ; CHECK: } -; CHECK: UnknownLeaf (0x1005) { +; CHECK: FieldList (0x1005) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: DataMember { ; CHECK: AccessSpecifier: Public (0x3) @@ -113,7 +113,7 @@ ; CHECK: Properties [ (0x200) ; CHECK: HasUniqueName (0x200) ; CHECK: ] -; CHECK: FieldList: sdm (0x1005) +; CHECK: FieldList: <field list> (0x1005) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 12 @@ -132,7 +132,7 @@ ; CHECK: Name: Union ; CHECK: LinkageName: .?ATUnion@@ ; CHECK: } -; CHECK: UnknownLeaf (0x1008) { +; CHECK: FieldList (0x1008) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: DataMember { ; CHECK: AccessSpecifier: Public (0x3) @@ -153,7 +153,7 @@ ; CHECK: Properties [ (0x200) ; CHECK: HasUniqueName (0x200) ; CHECK: ] -; CHECK: FieldList: b (0x1008) +; CHECK: FieldList: <field list> (0x1008) ; CHECK: SizeOf: 4 ; CHECK: Name: Union ; CHECK: LinkageName: .?ATUnion@@ @@ -171,7 +171,7 @@ ; CHECK: SizeOf: 0 ; CHECK: Name: Class ; CHECK: } -; CHECK: UnknownLeaf (0x100B) { +; CHECK: FieldList (0x100B) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: DataMember { ; CHECK: AccessSpecifier: Public (0x3) @@ -198,7 +198,7 @@ ; CHECK: Properties [ (0x200) ; CHECK: HasUniqueName (0x200) ; CHECK: ] -; CHECK: FieldList: prot (0x100B) +; CHECK: FieldList: <field list> (0x100B) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 12 @@ -249,7 +249,7 @@ ; CHECK: IsVolatile: 0 ; CHECK: IsUnaligned: 0 ; CHECK: } -; CHECK: UnknownLeaf (0x1011) { +; CHECK: FieldList (0x1011) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: DataMember { ; CHECK: AccessSpecifier: Public (0x3) @@ -270,7 +270,7 @@ ; CHECK: Properties [ (0x200) ; CHECK: HasUniqueName (0x200) ; CHECK: ] -; CHECK: FieldList: d (0x1011) +; CHECK: FieldList: <field list> (0x1011) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 48 @@ -291,7 +291,7 @@ ; CHECK: Name: Nested ; CHECK: LinkageName: .?AUNested@Class@@ ; CHECK: } -; CHECK: UnknownLeaf (0x1014) { +; CHECK: FieldList (0x1014) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: DataMember { ; CHECK: AccessSpecifier: Public (0x3) @@ -306,7 +306,7 @@ ; CHECK: Properties [ (0x200) ; CHECK: HasUniqueName (0x200) ; CHECK: ] -; CHECK: FieldList: n (0x1014) +; CHECK: FieldList: <field list> (0x1014) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 4 diff --git a/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll b/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll index b2fb6c59917..f4d3b5431bc 100644 --- a/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll +++ b/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll @@ -84,7 +84,7 @@ ; CHECK: ArgListType: () (0x1000) ; CHECK: ThisAdjustment: 0 ; CHECK: } -; CHECK: UnknownLeaf (0x1006) { +; CHECK: FieldList (0x1006) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: OneMethod { ; CHECK: AccessSpecifier: Public (0x3) @@ -112,7 +112,7 @@ ; CHECK: MemberCount: 4 ; CHECK: Properties [ (0x0) ; CHECK: ] -; CHECK: FieldList: A::f_public (0x1006) +; CHECK: FieldList: <field list> (0x1006) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 1 @@ -202,7 +202,7 @@ ; CHECK: Type: void B::(int) (0x100E) ; CHECK: ] ; CHECK: } -; CHECK: UnknownLeaf (0x1010) { +; CHECK: FieldList (0x1010) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: OneMethod { ; CHECK: AccessSpecifier: Private (0x1) @@ -220,7 +220,7 @@ ; CHECK: MemberCount: 3 ; CHECK: Properties [ (0x0) ; CHECK: ] -; CHECK: FieldList: B::f (0x1010) +; CHECK: FieldList: <field list> (0x1010) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 1 diff --git a/llvm/test/DebugInfo/COFF/types-recursive-struct.ll b/llvm/test/DebugInfo/COFF/types-recursive-struct.ll index 5351a1666e0..88bab35e20f 100644 --- a/llvm/test/DebugInfo/COFF/types-recursive-struct.ll +++ b/llvm/test/DebugInfo/COFF/types-recursive-struct.ll @@ -77,7 +77,7 @@ ; CHECK: IsVolatile: 0 ; CHECK: IsUnaligned: 0 ; CHECK: } -; CHECK: UnknownLeaf (0x1006) { +; CHECK: FieldList (0x1006) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: DataMember { ; CHECK: AccessSpecifier: Public (0x3) @@ -91,13 +91,13 @@ ; CHECK: MemberCount: 1 ; CHECK: Properties [ (0x0) ; CHECK: ] -; CHECK: FieldList: b (0x1006) +; CHECK: FieldList: <field list> (0x1006) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 8 ; CHECK: Name: A ; CHECK: } -; CHECK: UnknownLeaf (0x1008) { +; CHECK: FieldList (0x1008) { ; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) ; CHECK: DataMember { ; CHECK: AccessSpecifier: Public (0x3) @@ -111,7 +111,7 @@ ; CHECK: MemberCount: 1 ; CHECK: Properties [ (0x0) ; CHECK: ] -; CHECK: FieldList: a (0x1008) +; CHECK: FieldList: <field list> (0x1008) ; CHECK: DerivedFrom: 0x0 ; CHECK: VShape: 0x0 ; CHECK: SizeOf: 8 diff --git a/llvm/test/DebugInfo/PDB/pdbdump-headers.test b/llvm/test/DebugInfo/PDB/pdbdump-headers.test index 2539f00505e..c9c8d13eb36 100644 --- a/llvm/test/DebugInfo/PDB/pdbdump-headers.test +++ b/llvm/test/DebugInfo/PDB/pdbdump-headers.test @@ -105,7 +105,7 @@ ; EMPTY-NEXT: ) ; EMPTY-NEXT: } ; EMPTY-NEXT: { -; EMPTY-NEXT: UnknownLeaf (0x1002) { +; EMPTY-NEXT: FieldList (0x1002) { ; EMPTY-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203) ; EMPTY-NEXT: Enumerator { ; EMPTY-NEXT: AccessSpecifier: Public (0x3) @@ -1112,7 +1112,7 @@ ; ALL: { ; ALL: StringId (0x1058) { ; ALL: TypeLeafKind: LF_STRING_ID (0x1605) -; ALL: Id: managed (0x100C) +; ALL: Id: <field list> (0x100C) ; ALL: StringData: Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X ; ALL: } ; ALL: } @@ -1124,7 +1124,7 @@ ; ALL: ArgType: void __vc_attributes::threadingAttribute::(__vc_attributes::threadingAttribute::threading_e) (0x1007) ; ALL: ArgType: void __vc_attributes::threadingAttribute::() (0x1008) ; ALL: ArgType: 0x1009 -; ALL: ArgType: value (0x100A) +; ALL: ArgType: <field list> (0x100A) ; ALL: ArgType: __vc_attributes::event_receiverAttribute::type_e (0x100D) ; ALL: ] ; ALL: } |