]> granicus.if.org Git - clang/commitdiff
Make code generation of ivar ref exprs more like member exprs.
authorAnders Carlsson <andersca@mac.com>
Mon, 25 Aug 2008 01:53:23 +0000 (01:53 +0000)
committerAnders Carlsson <andersca@mac.com>
Mon, 25 Aug 2008 01:53:23 +0000 (01:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55298 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp

index a191610d1f54203f9c2a1780c97ed5ce296a17db..de0f634bdf5556623b92cd753422d68a887d6e29 100644 (file)
@@ -762,27 +762,33 @@ LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) {
     assert(0 && "FIXME: Implement support for late-bound instance variables");
     return LValue(); // Not reached.
   }
+
+  // FIXME: A lot of the code below could be shared with EmitMemberExpr.
+  llvm::Value *BaseValue = 0;
+  const Expr *BaseExpr = E->getBase();
+  unsigned CVRQualifiers = 0;
+  if (E->isArrow()) {
+    BaseValue = EmitScalarExpr(BaseExpr);
+    const PointerType *PTy = 
+      cast<PointerType>(getContext().getCanonicalType(BaseExpr->getType()));
+    CVRQualifiers = PTy->getPointeeType().getCVRQualifiers();
+  } else {
+    LValue BaseLV = EmitLValue(BaseExpr);
+    // FIXME: this isn't right for bitfields.
+    BaseValue = BaseLV.getAddress();
+    CVRQualifiers = BaseExpr->getType().getCVRQualifiers();
+  }
   
-  // Get a structure type for the object
-  QualType ExprTy = E->getBase()->getType();
-  const llvm::Type *ObjectType = ConvertType(ExprTy);
+  const ObjCIvarDecl *Field = E->getDecl();
+  assert(!Field->isBitField() && 
+         "Bitfields are currently not supported!");
+   
   // TODO:  Add a special case for isa (index 0)
-  // Work out which index the ivar is
-  const ObjCIvarDecl *Decl = E->getDecl();
-  unsigned Index = CGM.getTypes().getLLVMFieldNo(Decl);
-    
-  // Get object pointer and coerce object pointer to correct type.
-  llvm::Value *Object = EmitLValue(E->getBase()).getAddress();
-  // FIXME: Volatility
-  Object = Builder.CreateLoad(Object, E->getDecl()->getName());
-  if (Object->getType() != ObjectType)
-    Object = Builder.CreateBitCast(Object, ObjectType);
-
-  
-  // Return a pointer to the right element.
-  // FIXME: volatile
-  return LValue::MakeAddr(Builder.CreateStructGEP(Object, Index,
-                                                  Decl->getName()),0);
+  unsigned Index = CGM.getTypes().getLLVMFieldNo(Field);
+  
+  llvm::Value *V = Builder.CreateStructGEP(BaseValue, Index, "tmp");
+  return LValue::MakeAddr(V,
+                          Field->getType().getCVRQualifiers()|CVRQualifiers);
 }
 
 RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType FnType,