]> granicus.if.org Git - llvm/commitdiff
[codeview] Fix buggy BeginIndexMapSize assertion
authorReid Kleckner <rnk@google.com>
Wed, 29 Mar 2017 22:51:22 +0000 (22:51 +0000)
committerReid Kleckner <rnk@google.com>
Wed, 29 Mar 2017 22:51:22 +0000 (22:51 +0000)
This assert is just trying to test that processing each record adds
exactly one entry to the index map. The assert logic was wrong when the
first record in the type stream was a field list.

I've simplified the code by moving the LF_FIELDLIST-specific logic into
the callback for that record type.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299035 91177308-0d34-0410-b5e6-96231b3b80d8

lib/DebugInfo/CodeView/TypeStreamMerger.cpp
test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj [new file with mode: 0644]
test/tools/llvm-readobj/codeview-merging-anon.test [new file with mode: 0644]

index 07d6a5684bbcf20934398d62d3c3adf071f55048..9d7af8db9e662eae63d7e7d7824095951842265a 100644 (file)
@@ -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/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj b/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj
new file mode 100644 (file)
index 0000000..3cb58fb
Binary files /dev/null and b/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj differ
diff --git a/test/tools/llvm-readobj/codeview-merging-anon.test b/test/tools/llvm-readobj/codeview-merging-anon.test
new file mode 100644 (file)
index 0000000..cf04840
--- /dev/null
@@ -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