summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-03-09 20:44:22 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-03-09 20:44:22 +0000
commitde2f33373b6e217452df1aa0b1363b6d79a0c567 (patch)
tree73bf1a8a09d89d342a2fa634b982b12637b0aa35 /clang/lib
parent4f912e6f986d342a035815067790ab9abcb2b47c (diff)
downloadbcm5719-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.cpp25
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()));
OpenPOWER on IntegriCloud