]> granicus.if.org Git - clang/commitdiff
ir-gen for nonfragile ivar bitfield access (objc2 nonfragile abi).
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 3 Feb 2009 19:03:09 +0000 (19:03 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 3 Feb 2009 19:03:09 +0000 (19:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63644 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp
lib/CodeGen/CGObjCGNU.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CGObjCRuntime.h
lib/CodeGen/CodeGenFunction.h

index 4f8bd46b52421f9a9ada136680fe6ee9c75ca0d6..f085127da2ab3b7d2caaced0107dcd8602ec29b5 100644 (file)
@@ -850,8 +850,8 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
 
 LValue CodeGenFunction::EmitLValueForBitfield(llvm::Value* BaseValue,
                                               FieldDecl* Field,
-                                              unsigned CVRQualifiers,
-                                              unsigned idx) {
+                                              unsigned CVRQualifiers) {
+   unsigned idx = CGM.getTypes().getLLVMFieldNo(Field);                                         
   // FIXME: CodeGenTypes should expose a method to get the appropriate
   // type for FieldTy (the appropriate type is ABI-dependent).
   const llvm::Type *FieldTy = CGM.getTypes().ConvertTypeForMem(Field->getType());
@@ -877,11 +877,10 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue,
                                            bool isUnion,
                                            unsigned CVRQualifiers)
 {
-  unsigned idx = CGM.getTypes().getLLVMFieldNo(Field);
-
   if (Field->isBitField())
-    return EmitLValueForBitfield(BaseValue, Field, CVRQualifiers, idx);
+    return EmitLValueForBitfield(BaseValue, Field, CVRQualifiers);
   
+  unsigned idx = CGM.getTypes().getLLVMFieldNo(Field);
   llvm::Value *V = Builder.CreateStructGEP(BaseValue, idx, "tmp");
 
   // Match union field type.
@@ -1028,19 +1027,12 @@ LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy,
   // See comment in EmitIvarOffset.
   if (CGM.getObjCRuntime().LateBoundIVars())
     assert(0 && "late-bound ivars are unsupported");
-  // TODO:  Add a special case for isa (index 0)
-  unsigned Index = CGM.getTypes().getLLVMFieldNo(Field);
   
-  if (Ivar->isBitField()) {
-    return EmitLValueForBitfield(BaseValue, const_cast<FieldDecl *>(Field), 
-                                 CVRQualifiers, Index);
-  }
-  llvm::Value *V = CGM.getObjCRuntime().EmitObjCValueForIvar(*this,
-                                                             ObjectTy,
-                                       BaseValue, Ivar, Field, CVRQualifiers);
-  LValue LV = LValue::MakeAddr(V, Ivar->getType().getCVRQualifiers()|CVRQualifiers);
+  LValue LV =  CGM.getObjCRuntime().EmitObjCValueForIvar(*this,
+                                                         ObjectTy,
+                                                         BaseValue, Ivar, Field, 
+                                                         CVRQualifiers);
   SetVarDeclObjCAttribute(getContext(), Ivar, Ivar->getType(), LV);
-  LValue::SetObjCIvar(LV, true);
   return LV;
 }
 
index d3b57b0e9afa185671c2f451231e27cb9d74f4ff..bd1ba68cdef1609e2c6466a80934b84927355364 100644 (file)
@@ -140,12 +140,12 @@ 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,
-                                            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
 
@@ -1037,16 +1037,22 @@ void CGObjCGNU::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
   return;
 }
 
-llvm::Value *CGObjCGNU::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
-                                             QualType ObjectTy,
-                                             llvm::Value *BaseValue,
-                                             const ObjCIvarDecl *Ivar,
-                                             const FieldDecl *Field,
-                                             unsigned CVRQualifiers) {
+LValue CGObjCGNU::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;
 }
 
 CodeGen::CGObjCRuntime *CodeGen::CreateGNUObjCRuntime(CodeGen::CodeGenModule &CGM){
index c7af972e9a765605698738e536defa7c0753d245..06343f80c941a84ebb245cf36a28f89b978811d7 100644 (file)
@@ -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;
 }
 
 /* *** */
index ade77af1561b2d9083d8e8d780089d84ae86405b..c85e9debb6e1373d67178d17c6b86088d6357119 100644 (file)
@@ -157,12 +157,12 @@ public:
   virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
                                         llvm::Value *src, llvm::Value *dest) = 0;
   
-  virtual llvm::Value *EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
-                                            QualType ObjectTy,
-                                            llvm::Value *BaseValue,
-                                            const ObjCIvarDecl *Ivar,
-                                            const FieldDecl *Field,
-                                            unsigned CVRQualifiers) = 0;
+  virtual LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
+                                      QualType ObjectTy,
+                                      llvm::Value *BaseValue,
+                                      const ObjCIvarDecl *Ivar,
+                                      const FieldDecl *Field,
+                                      unsigned CVRQualifiers) = 0;
 };
 
 /// Creates an instance of an Objective-C runtime class.  
index 31b2c4e4e4081c0a085f2e30885f59657fb1acf6..0e6660c686a0280bc66bf407558b1cd08ce55465 100644 (file)
@@ -531,7 +531,7 @@ public:
                            unsigned CVRQualifiers);
 
   LValue EmitLValueForBitfield(llvm::Value* Base, FieldDecl* Field,
-                                unsigned CVRQualifiers, unsigned idx);
+                                unsigned CVRQualifiers);
 
   LValue EmitCXXConditionDeclLValue(const CXXConditionDeclExpr *E);