aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprScalar.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-03-30 23:03:07 +0000
committerChris Lattner <sabre@nondot.org>2008-03-30 23:03:07 +0000
commit391d77a26382dddf25da73e29fc1fa5aaaea4c6f (patch)
treeb842c678fe95a0feed12419eb419e091d22fff49 /lib/CodeGen/CGExprScalar.cpp
parenta7b402dc258bf38ab5e206dbf4916a69d3ee3cc8 (diff)
Add initial support for objc codegen for methods, ivars, and the
etoile runtime, patch by David Chisnall! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48969 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
-rw-r--r--lib/CodeGen/CGExprScalar.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 2d42f8f812..6c5326105f 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -19,6 +19,7 @@
#include "llvm/GlobalVariable.h"
#include "llvm/Intrinsics.h"
#include "llvm/Support/Compiler.h"
+#include "llvm/ValueSymbolTable.h"
#include <cstdarg>
using namespace clang;
@@ -126,6 +127,7 @@ public:
return EmitLoadOfLValue(E);
}
Value *VisitObjCMessageExpr(ObjCMessageExpr *E);
+ Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
Value *VisitMemberExpr(Expr *E) { return EmitLoadOfLValue(E); }
Value *VisitOCUVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); }
@@ -449,6 +451,10 @@ Value *ScalarExprEmitter::VisitExpr(Expr *E) {
return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
}
+Value *ScalarExprEmitter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
+ return Builder.CreateLoad(CGF.EmitObjCIvarRefLValue(E).getAddress());
+}
+
Value *ScalarExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
// Only the lookup mechanism and first two arguments of the method
// implementation vary between runtimes. We can get the receiver and
@@ -481,11 +487,13 @@ Value *ScalarExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
// Get the selector string
std::string SelStr = E->getSelector().getName();
llvm::Constant *Selector = CGF.CGM.GetAddrOfConstantString(SelStr);
- ConvertType(E->getType());
+
+ llvm::Value *SelPtr = Builder.CreateStructGEP(Selector, 0);
return Runtime->generateMessageSend(Builder,
ConvertType(E->getType()),
+ CGF.CurFn->getValueSymbolTable().lookup("self"),
Receiver,
- Selector,
+ SelPtr,
&Args[0],
Args.size());
}