[llvm] r299035 - [codeview] Fix buggy BeginIndexMapSize assertion

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 29 15:51:22 PDT 2017


Author: rnk
Date: Wed Mar 29 17:51:22 2017
New Revision: 299035

URL: http://llvm.org/viewvc/llvm-project?rev=299035&view=rev
Log:
[codeview] Fix buggy BeginIndexMapSize assertion

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.

Added:
    llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj   (with props)
    llvm/trunk/test/tools/llvm-readobj/codeview-merging-anon.test
Modified:
    llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp

Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp?rev=299035&r1=299034&r2=299035&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp Wed Mar 29 17:51:22 2017
@@ -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
 
 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();
 }
 

Added: llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj?rev=299035&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: llvm/trunk/test/tools/llvm-readobj/codeview-merging-anon.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/codeview-merging-anon.test?rev=299035&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/codeview-merging-anon.test (added)
+++ llvm/trunk/test/tools/llvm-readobj/codeview-merging-anon.test Wed Mar 29 17:51:22 2017
@@ -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




More information about the llvm-commits mailing list