Add assert to detect incomplete implementation work.

llvm-svn: 44974
This commit is contained in:
Devang Patel 2007-12-13 01:24:16 +00:00
parent 272ee458cf
commit 527048247b
1 changed files with 13 additions and 8 deletions

View File

@ -594,6 +594,11 @@ void RecordOrganizer::placeBitField(const FieldDecl *FD) {
}
}
} else if (ExtraBits >= BitFieldSize) {
const llvm::Type *Ty = CGT.ConvertType(FD->getType());
uint64_t TySize = CGT.getTargetData().getABITypeSizeInBits(Ty);
assert ( Cursor - CurrentFieldStart + BitFieldSize <= TySize
&& "Incomplete layout. struct {char a; int b:10; int c:18;};");
// Reuse existing llvm field
ExtraBits = ExtraBits - BitFieldSize;
CGT.addFieldInfo(FD, FieldNo, Cursor - CurrentFieldStart, ExtraBits);
@ -604,13 +609,13 @@ void RecordOrganizer::placeBitField(const FieldDecl *FD) {
const llvm::Type *Ty = CGT.ConvertType(FD->getType());
const llvm::Type *PrevTy = LLVMFields.back();
uint64_t TySize = CGT.getTargetData().getABITypeSizeInBits(Ty);
if (CGT.getTargetData().getABITypeSizeInBits(PrevTy) >= TySize) {
// Previous field does not allow sharing of ExtraBits. Use new field.
// struct { char a; char b:5; char c:4; } where c is current FD.
Cursor += ExtraBits;
ExtraBits = 0;
addLLVMField(Ty, TySize, FD, 0, BitFieldSize);
} else
assert (!FD->isBitField() && "Bit fields are not yet supported");
assert (CGT.getTargetData().getABITypeSizeInBits(PrevTy) >= TySize
&& "Unable to handle bit field");
// Previous field does not allow sharing of ExtraBits. Use new field.
// struct { char a; char b:5; char c:4; } where c is current FD.
Cursor += ExtraBits;
ExtraBits = 0;
addLLVMField(Ty, TySize, FD, 0, BitFieldSize);
}
}