From: Fariborz Jahanian Date: Mon, 2 Feb 2009 20:02:29 +0000 (+0000) Subject: Refactored code gen for ivar access in preparation for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0bb20361a321593887f067515dd04cf109f4c74a;p=clang Refactored code gen for ivar access in preparation for objc2 nonfragile ivar access code gen. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63541 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 5c304d19a5..726755dc84 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -1034,7 +1034,8 @@ LValue CodeGenFunction::EmitLValueForIvar(llvm::Value *BaseValue, return EmitLValueForBitfield(BaseValue, const_cast(Field), CVRQualifiers, Index); } - llvm::Value *V = Builder.CreateStructGEP(BaseValue, Index, "tmp"); + llvm::Value *V = CGM.getObjCRuntime().EmitObjCValueForIvar(*this, + BaseValue, Ivar, Field, CVRQualifiers); LValue LV = LValue::MakeAddr(V, Ivar->getType().getCVRQualifiers()|CVRQualifiers); SetVarDeclObjCAttribute(getContext(), Ivar, Ivar->getType(), LV); LValue::SetObjCIvar(LV, true); diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index 10ceee9c6b..bfe92b303e 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -140,6 +140,11 @@ public: llvm::Value *src, llvm::Value *dest); virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, llvm::Value *dest); + virtual llvm::Value *EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned CVRQualifiers); }; } // end anonymous namespace @@ -1028,6 +1033,17 @@ void CGObjCGNU::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, return; } +llvm::Value *CGObjCGNU::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned 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; +} + CodeGen::CGObjCRuntime *CodeGen::CreateGNUObjCRuntime(CodeGen::CodeGenModule &CGM){ return new CGObjCGNU(CGM); } diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 23d62097e6..1bea633589 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -549,6 +549,12 @@ private: llvm::Value *src, llvm::Value *dest); virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, llvm::Value *dest); + + virtual llvm::Value *EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned CVRQualifiers); }; class CGObjCNonFragileABIMac : public CGObjCCommonMac { @@ -669,6 +675,13 @@ public: virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, llvm::Value *dest) { return; } + virtual llvm::Value *EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned CVRQualifiers) + { return 0; } + }; } // end anonymous namespace @@ -2097,6 +2110,19 @@ void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, return; } +/// EmitObjCValueForIvar - Code Gen for ivar reference. +/// +llvm::Value *CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned 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; +} + /* *** Private Interface *** */ /// EmitImageInfo - Emit the image info marker used to encode some module diff --git a/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h index 01543c53e2..ded1db2c0b 100644 --- a/lib/CodeGen/CGObjCRuntime.h +++ b/lib/CodeGen/CGObjCRuntime.h @@ -47,6 +47,7 @@ namespace CodeGen { class ObjCMethodDecl; class ObjCProtocolDecl; class Selector; + class ObjCIvarDecl; namespace CodeGen { class CodeGenModule; @@ -155,6 +156,12 @@ public: llvm::Value *src, llvm::Value *dest) = 0; virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, llvm::Value *src, llvm::Value *dest) = 0; + + virtual llvm::Value *EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, + llvm::Value *BaseValue, + const ObjCIvarDecl *Ivar, + const FieldDecl *Field, + unsigned CVRQualifiers) = 0; }; /// Creates an instance of an Objective-C runtime class.