diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-08-27 06:57:25 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-27 06:57:25 +0000 |
commit | 9c3fc703b29a31d40bcf5027dbb4784dd393804e (patch) | |
tree | acbfc451d53b7828a3f09c4bb5ddcab489fad7b8 /lib | |
parent | 8a7267ef413d84a907d178cee9eb32294cf6b13b (diff) |
Initial support for Obj-C dot-syntax for getters.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55410 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/CGExprAgg.cpp | 17 | ||||
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 32 | ||||
-rw-r--r-- | lib/CodeGen/CGObjC.cpp | 20 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 1 |
4 files changed, 47 insertions, 23 deletions
diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp index c3db624478..d335ea9c3f 100644 --- a/lib/CodeGen/CGExprAgg.cpp +++ b/lib/CodeGen/CGExprAgg.cpp @@ -91,10 +91,7 @@ public: void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { EmitAggLoadOfLValue(E); } - void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { - // FIXME: Implement! - CGF.ErrorUnsupported(E, "aggregate expression (Objective-C property reference)"); - } + void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E); void VisitConditionalOperator(const ConditionalOperator *CO); void VisitInitListExpr(InitListExpr *E); @@ -219,6 +216,18 @@ void AggExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) { EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType()); } +void AggExprEmitter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { + RValue RV = CGF.EmitObjCPropertyGet(E); + assert(RV.isAggregate() && "Return value must be aggregate value!"); + + // If the result is ignored, don't copy from the value. + if (DestPtr == 0) + // FIXME: If the source is volatile, we must read from it. + return; + + EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType()); +} + void AggExprEmitter::VisitOverloadExpr(const OverloadExpr *E) { RValue RV = CGF.EmitCallExpr(E->getFn(), E->arg_begin(), E->arg_end(CGF.getContext())); diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 11d1e8dfdb..cee8852cdc 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -134,14 +134,20 @@ public: return llvm::ConstantInt::get(EC->getInitVal()); return EmitLoadOfLValue(E); } - Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E); - Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E); - Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { return EmitLoadOfLValue(E);} + Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) { + return CGF.EmitObjCSelectorExpr(E); + } + Value *VisitObjCProtocolExpr(ObjCProtocolExpr *E) { + return CGF.EmitObjCProtocolExpr(E); + } + Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { + return EmitLoadOfLValue(E); + } Value *VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { - CGF.ErrorUnsupported(E, "scalar expression (Objective-C property reference)"); - if (E->getType()->isVoidType()) - return 0; - return llvm::UndefValue::get(CGF.ConvertType(E->getType())); + return CGF.EmitObjCPropertyGet(E).getScalarVal(); + } + Value *VisitObjCMessageExpr(ObjCMessageExpr *E) { + return CGF.EmitObjCMessageExpr(E).getScalarVal(); } Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E); @@ -196,10 +202,6 @@ public: return CGF.EmitCallExpr(E).getScalarVal(); } - Value *VisitObjCMessageExpr(ObjCMessageExpr *E) { - return CGF.EmitObjCMessageExpr(E).getScalarVal(); - } - Value *VisitStmtExpr(const StmtExpr *E); // Unary Operators. @@ -481,14 +483,6 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { return Builder.CreateShuffleVector(V1, V2, SV, "shuffle"); } -Value *ScalarExprEmitter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { - return CGF.EmitObjCSelectorExpr(E); -} - -Value *ScalarExprEmitter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { - return CGF.EmitObjCProtocolExpr(E); -} - Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { // Emit subscript expressions in rvalue context's. For most cases, this just // loads the lvalue formed by the subscript expr. However, we have to be diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp index 93567a4f8f..cec75dea9b 100644 --- a/lib/CodeGen/CGObjC.cpp +++ b/lib/CodeGen/CGObjC.cpp @@ -218,4 +218,24 @@ llvm::Value *CodeGenFunction::LoadObjCSelf(void) { return Builder.CreateLoad(LocalDeclMap[OMD->getSelfDecl()], "self"); } +RValue CodeGenFunction::EmitObjCPropertyGet(const ObjCPropertyRefExpr *E) { + // Determine getter selector. + Selector S; + if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(E->getDecl())) { + S = MD->getSelector(); + } else { + S = cast<ObjCPropertyDecl>(E->getDecl())->getGetterName(); + } + + // FIXME: Improve location information. + SourceLocation Loc = E->getLocation(); + // PropertyRefExprs are always instance messages. + // FIXME: Is there any reason to try and pass the method here? + ObjCMessageExpr GetExpr(const_cast<Expr*>(E->getBase()), + S, E->getType(), 0, Loc, Loc, + 0, 0); + + return EmitObjCMessageExpr(&GetExpr); +} + CGObjCRuntime::~CGObjCRuntime() {} diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 4eed9a7173..0178f8a3e3 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -326,6 +326,7 @@ public: llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E); llvm::Value *EmitObjCSelectorExpr(const ObjCSelectorExpr *E); RValue EmitObjCMessageExpr(const ObjCMessageExpr *E); + RValue EmitObjCPropertyGet(const ObjCPropertyRefExpr *E); //===--------------------------------------------------------------------===// |