summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp25
-rw-r--r--llvm/test/tools/llvm-readobj/Inputs/codeview-merging-anon.objbin0 -> 1181 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/codeview-merging-anon.test29
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
new file mode 100644
index 00000000000..3cb58fbd4d5
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj
Binary files differ
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
OpenPOWER on IntegriCloud