diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-03-09 20:44:22 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-03-09 20:44:22 +0000 |
| commit | de2f33373b6e217452df1aa0b1363b6d79a0c567 (patch) | |
| tree | 73bf1a8a09d89d342a2fa634b982b12637b0aa35 /clang/lib | |
| parent | 4f912e6f986d342a035815067790ab9abcb2b47c (diff) | |
| download | bcm5719-llvm-de2f33373b6e217452df1aa0b1363b6d79a0c567.tar.gz bcm5719-llvm-de2f33373b6e217452df1aa0b1363b6d79a0c567.zip | |
More fix for bitfield ivar meta-data and code gen accessing it.
Now, we can actually execute dejagnu test with bitfield ivars
in non-fragile abi mode.
llvm-svn: 66448
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 9922d82fc2b..5ae32e8737d 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -1842,10 +1842,15 @@ llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD, uint64_t CGObjCCommonMac::GetIvarBaseOffset(const llvm::StructLayout *Layout, FieldDecl *Field) { - return Field->isBitField() - ? CGM.getTypes().getLLVMFieldNo(Field) - : Layout->getElementOffset( - CGM.getTypes().getLLVMFieldNo(Field)); + if (!Field->isBitField()) + return Layout->getElementOffset( + CGM.getTypes().getLLVMFieldNo(Field)); + // FIXME. Must be a better way of getting a bitfield base offset. + uint64_t offset = CGM.getTypes().getLLVMFieldNo(Field); + const llvm::Type *Ty = CGM.getTypes().ConvertTypeForMemRecursive(Field->getType()); + uint64_t size = CGM.getTypes().getTargetData().getTypePaddedSizeInBits(Ty); + offset = (offset*size)/8; + return offset; } llvm::GlobalVariable * @@ -4485,10 +4490,14 @@ LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar( llvm::Type *ptrIvarTy = llvm::PointerType::getUnqual(IvarTy); V = CGF.Builder.CreateBitCast(V, ptrIvarTy); - if (Ivar->isBitField()) - return CGF.EmitLValueForBitfield(V, const_cast<FieldDecl *>(Field), - CVRQualifiers); - + if (Ivar->isBitField()) { + CodeGenTypes::BitFieldInfo bitFieldInfo = + CGM.getTypes().getBitFieldInfo(Field); + return LValue::MakeBitfield(V, bitFieldInfo.Begin, bitFieldInfo.Size, + Field->getType()->isSignedIntegerType(), + Field->getType().getCVRQualifiers()|CVRQualifiers); + } + LValue LV = LValue::MakeAddr(V, Ivar->getType().getCVRQualifiers()|CVRQualifiers, CGM.getContext().getObjCGCAttrKind(Ivar->getType())); |

