diff options
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 25 | ||||
-rw-r--r-- | llvm/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj | bin | 0 -> 1181 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-readobj/codeview-merging-anon.test | 29 |
3 files changed, 41 insertions, 13 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp index 07d6a5684bb..9d7af8db9e6 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp @@ -126,8 +126,11 @@ private: FieldListRecordBuilder FieldListBuilder; TypeServerHandler *Handler; - bool IsInFieldList = false; +#ifndef NDEBUG + /// Track the size of the index map in visitTypeBegin so we can check it in + /// visitTypeEnd. size_t BeginIndexMapSize = 0; +#endif /// Map from source type index to destination type index. Indexed by source /// type index minus 0x1000. @@ -137,26 +140,19 @@ private: } // end anonymous namespace Error TypeStreamMerger::visitTypeBegin(CVRecord<TypeLeafKind> &Rec) { - if (Rec.Type == TypeLeafKind::LF_FIELDLIST) { - assert(!IsInFieldList); - IsInFieldList = true; - FieldListBuilder.begin(); - } else - BeginIndexMapSize = IndexMap.size(); +#ifndef NDEBUG + BeginIndexMapSize = IndexMap.size(); +#endif return Error::success(); } Error TypeStreamMerger::visitTypeEnd(CVRecord<TypeLeafKind> &Rec) { - if (Rec.Type == TypeLeafKind::LF_FIELDLIST) { - TypeIndex Index = FieldListBuilder.end(); - IndexMap.push_back(Index); - IsInFieldList = false; - } + assert(IndexMap.size() == BeginIndexMapSize + 1 && + "visitKnownRecord should add one index map entry"); return Error::success(); } Error TypeStreamMerger::visitMemberEnd(CVMemberRecord &Rec) { - assert(IndexMap.size() == BeginIndexMapSize + 1); return Error::success(); } @@ -322,9 +318,12 @@ Error TypeStreamMerger::visitKnownRecord(CVType &, Error TypeStreamMerger::visitKnownRecord(CVType &, FieldListRecord &R) { // Visit the members inside the field list. + FieldListBuilder.begin(); CVTypeVisitor Visitor(*this); if (auto EC = Visitor.visitFieldListMemberStream(R.Data)) return EC; + TypeIndex Index = FieldListBuilder.end(); + IndexMap.push_back(Index); return Error::success(); } diff --git a/llvm/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj b/llvm/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj Binary files differnew file mode 100644 index 00000000000..3cb58fbd4d5 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj diff --git a/llvm/test/tools/llvm-readobj/codeview-merging-anon.test b/llvm/test/tools/llvm-readobj/codeview-merging-anon.test new file mode 100644 index 00000000000..cf0484074d0 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/codeview-merging-anon.test @@ -0,0 +1,29 @@ +# Test what happens when the first type record (0x1000) is a LF_FIELDLIST +# record. + +# Steps to regenerate input: +# $ cat t.c +# struct { int x; } o; +# $ cl -Z7 t.c + +RUN: llvm-readobj -codeview %S/Inputs/codeview-merging-anon.obj | FileCheck %s +RUN: llvm-readobj -codeview-merged-types %S/Inputs/codeview-merging-anon.obj | FileCheck %s + +CHECK-LABEL: FieldList (0x1000) { +CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203) +CHECK-NEXT: DataMember { +CHECK-NEXT: TypeLeafKind: LF_MEMBER (0x150D) +CHECK-NEXT: AccessSpecifier: Public (0x3) +CHECK-NEXT: Type: int (0x74) +CHECK-NEXT: FieldOffset: 0x0 +CHECK-NEXT: Name: x +CHECK-NEXT: } +CHECK-NEXT: } +CHECK-LABEL: Struct (0x1001) { +CHECK: TypeLeafKind: LF_STRUCTURE (0x1505) +CHECK: MemberCount: 1 +CHECK: FieldList: <field list> (0x1000) +CHECK: Name: <unnamed-tag> +CHECK: LinkageName: .?AU<unnamed-tag>@@ +CHECK: } +CHECK-LABEL: StringId |