diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-02-03 19:03:09 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-02-03 19:03:09 +0000 |
commit | 598d3f61b6ca854e9d3c2f3359e24468502a61aa (patch) | |
tree | 1cda9a49dcd97f31871e1e0af6884db0ad63ea03 /lib/CodeGen/CGObjCMac.cpp | |
parent | 45206ecf708bf03b04db07c2476b9f862127a8b1 (diff) |
ir-gen for nonfragile ivar bitfield access (objc2 nonfragile abi).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63644 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index c7af972e9a..06343f80c9 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -550,12 +550,12 @@ private: virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, llvm::Value *dest); - virtual llvm::Value *EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, - QualType ObjectTy, - llvm::Value *BaseValue, - const ObjCIvarDecl *Ivar, - const FieldDecl *Field, - unsigned CVRQualifiers); + virtual LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + QualType ObjectTy, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned CVRQualifiers); }; class CGObjCNonFragileABIMac : public CGObjCCommonMac { @@ -676,12 +676,12 @@ public: virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, llvm::Value *dest) { return; } - virtual llvm::Value *EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, - QualType ObjectTy, - llvm::Value *BaseValue, - const ObjCIvarDecl *Ivar, - const FieldDecl *Field, - unsigned CVRQualifiers); + virtual LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + QualType ObjectTy, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned CVRQualifiers); }; } // end anonymous namespace @@ -2113,16 +2113,22 @@ void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, /// EmitObjCValueForIvar - Code Gen for ivar reference. /// -llvm::Value *CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, - QualType ObjectTy, - llvm::Value *BaseValue, - const ObjCIvarDecl *Ivar, - const FieldDecl *Field, - unsigned CVRQualifiers) { +LValue CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + QualType ObjectTy, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned CVRQualifiers) { + if (Ivar->isBitField()) + return CGF.EmitLValueForBitfield(BaseValue, const_cast<FieldDecl *>(Field), + CVRQualifiers); // TODO: Add a special case for isa (index 0) unsigned Index = CGM.getTypes().getLLVMFieldNo(Field); llvm::Value *V = CGF.Builder.CreateStructGEP(BaseValue, Index, "tmp"); - return V; + LValue LV = LValue::MakeAddr(V, + Ivar->getType().getCVRQualifiers()|CVRQualifiers); + LValue::SetObjCIvar(LV, true); + return LV; } /* *** Private Interface *** */ @@ -4100,7 +4106,7 @@ CGObjCNonFragileABIMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) { /// (type *)((char *)base + _OBJC_IVAR_$_.ivar; /// @encode /// -llvm::Value *CGObjCNonFragileABIMac::EmitObjCValueForIvar( +LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar( CodeGen::CodeGenFunction &CGF, QualType ObjectTy, llvm::Value *BaseValue, @@ -4125,6 +4131,7 @@ llvm::Value *CGObjCNonFragileABIMac::EmitObjCValueForIvar( 0, ExternalName, &CGM.getModule()); + // (char *) BaseValue llvm::Value *V = CGF.Builder.CreateBitCast(BaseValue, ObjCTypes.Int8PtrTy); @@ -4136,7 +4143,15 @@ llvm::Value *CGObjCNonFragileABIMac::EmitObjCValueForIvar( CGM.getTypes().ConvertType(Ivar->getType()); llvm::Type *ptrIvarTy = llvm::PointerType::getUnqual(IvarTy); V = CGF.Builder.CreateBitCast(V, ptrIvarTy); - return V; + + if (Ivar->isBitField()) + return CGF.EmitLValueForBitfield(V, const_cast<FieldDecl *>(Field), + CVRQualifiers); + + LValue LV = LValue::MakeAddr(V, + Ivar->getType().getCVRQualifiers()|CVRQualifiers); + LValue::SetObjCIvar(LV, true); + return LV; } /* *** */ |