aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2008-08-27 06:57:25 +0000
committerDaniel Dunbar <daniel@zuster.org>2008-08-27 06:57:25 +0000
commit9c3fc703b29a31d40bcf5027dbb4784dd393804e (patch)
treeacbfc451d53b7828a3f09c4bb5ddcab489fad7b8 /lib
parent8a7267ef413d84a907d178cee9eb32294cf6b13b (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.cpp17
-rw-r--r--lib/CodeGen/CGExprScalar.cpp32
-rw-r--r--lib/CodeGen/CGObjC.cpp20
-rw-r--r--lib/CodeGen/CodeGenFunction.h1
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);
//===--------------------------------------------------------------------===//