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.
} // 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();
}
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();
}
--- /dev/null
+# 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