diff options
author | Chris Lattner <sabre@nondot.org> | 2008-03-30 23:03:07 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-03-30 23:03:07 +0000 |
commit | 391d77a26382dddf25da73e29fc1fa5aaaea4c6f (patch) | |
tree | b842c678fe95a0feed12419eb419e091d22fff49 /lib/CodeGen/CGExprScalar.cpp | |
parent | a7b402dc258bf38ab5e206dbf4916a69d3ee3cc8 (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.cpp | 12 |
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()); } |