mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-10 13:51:37 +00:00
[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. llvm-svn: 299035
This commit is contained in:
parent
5936cb0926
commit
f53e9a4e87
@ -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
|
||||
#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();
|
||||
}
|
||||
|
||||
|
BIN
test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj
Normal file
BIN
test/tools/llvm-readobj/Inputs/codeview-merging-anon.obj
Normal file
Binary file not shown.
29
test/tools/llvm-readobj/codeview-merging-anon.test
Normal file
29
test/tools/llvm-readobj/codeview-merging-anon.test
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user