From 19db4433102fbc4f8a8bcbe68fae2ee2a7c3f5ed Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 29 Mar 2017 22:51:22 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299035 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 25 ++++++++------- .../Inputs/codeview-merging-anon.obj | Bin 0 -> 1181 bytes .../llvm-readobj/codeview-merging-anon.test | 29 ++++++++++++++++++ 3 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj create mode 100644 test/tools/llvm-readobj/codeview-merging-anon.test diff --git a/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/lib/DebugInfo/CodeView/TypeStreamMerger.cpp index 07d6a5684bb..9d7af8db9e6 100644 --- a/lib/DebugInfo/CodeView/TypeStreamMerger.cpp +++ b/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 &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 &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 index 0000000000000000000000000000000000000000..3cb58fbd4d54f3efb289b54ab3eee0d9fd3851b5 GIT binary patch literal 1181 zcmb7E-EI<55T0cL`;(HQDHmRCh%suir^`>Ol171TF(e=cs5WL(UCu7J&Hj*O7aK1~ zFB-4B@UAb=x9}x=0DTDB3-7FRU@2gvrjyLhoY`+?XXfmT_L+yDPk!wG;sKUnOhj{a z>h<;D2%D&UnH(l^WgUp7xBSk%#>8}n$~WY9+}ILAk%#qSfNPGe04MmO7honfh7$x~ zb7!|y*sC-vRis&O*sKrRP$`H2ap=b)7@3 zLuvVjsVN?DT8EH>?Kr##_zrgveR{xM$*MtJr{}ai;X(bOQ0sbzWqdO1jvzZ$*D!T= z^sRODiosf(W6FpexIj6nhUK$_9ED1J6*0%bc@<6qZ3S4~G2m~nZSdfs4sZlp5ZS;O zA-IYQh}-sUTeWme^wiEXAkPbXbC!G_>y9K?1bR)~6wZe+h$dLhA!L?oGVoj2FZ4-I zF|X>i7xls*tyIf$z1A3{h@`xhm7-xQs-1XwNQdF?z(=Hl`1Y|NR-1xY#*Zur zVA$03HT_zQ>X}xXD*uMQDQDzTdXQ35(gcAjkw_|=d78m2ed>CDh5xTl?}O^<+D*ND z3wwsQn_&HoVxLRci(4pf8t9{8vz(ineSHNa}(IkpJqX?6v$ fap$=+d@^lHv*V9j1~F^_%##xw*=#Thji%%ew<7%g literal 0 HcmV?d00001 diff --git a/test/tools/llvm-readobj/codeview-merging-anon.test b/test/tools/llvm-readobj/codeview-merging-anon.test new file mode 100644 index 00000000000..cf0484074d0 --- /dev/null +++ b/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: (0x1000) +CHECK: Name: +CHECK: LinkageName: .?AU@@ +CHECK: } +CHECK-LABEL: StringId -- 2.40.0