diff options
author | Anders Carlsson <andersca@mac.com> | 2008-08-25 01:53:23 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-08-25 01:53:23 +0000 |
commit | c13b85a6b8187349684dcc896326002a525c2410 (patch) | |
tree | afd7c8caf8e591d65f7fe7892a6f49f7e4957be1 | |
parent | 4c03d98e4506d189afc30d4146ddecb68ee68fef (diff) | |
download | bcm5719-llvm-c13b85a6b8187349684dcc896326002a525c2410.tar.gz bcm5719-llvm-c13b85a6b8187349684dcc896326002a525c2410.zip |
Make code generation of ivar ref exprs more like member exprs.
llvm-svn: 55298
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index a191610d1f5..de0f634bdf5 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -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, |