diff options
author | Chris Lattner <sabre@nondot.org> | 2008-03-30 23:25:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-03-30 23:25:33 +0000 |
commit | ce5605ecf76d8cde6372138f830bb144d174ced9 (patch) | |
tree | f3aa9a95602ec48d6fa560d2c4c1599d543a9ed6 /lib/CodeGen/CGExprScalar.cpp | |
parent | 391d77a26382dddf25da73e29fc1fa5aaaea4c6f (diff) |
some cleanups on top of David's patch. There are still two
remaining open issues I've communicated to him:
1) self can be assigned to, and his patch didn't handle it correctly.
2) CollectObjCIvarTypes is N^2 (because each subclass reprocesses
all parent class ivars) and flattens classes. If A derives from B,
and both have an int, I'd expect to get { {i32}, i32}, not { i32, i32}.
David, please review.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48970 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 6c5326105f..9497ece6fb 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -19,7 +19,6 @@ #include "llvm/GlobalVariable.h" #include "llvm/Intrinsics.h" #include "llvm/Support/Compiler.h" -#include "llvm/ValueSymbolTable.h" #include <cstdarg> using namespace clang; @@ -51,7 +50,6 @@ public: Builder(CGF.Builder), Runtime(CGF.CGM.getObjCRuntime()) { } - //===--------------------------------------------------------------------===// // Utilities @@ -127,7 +125,7 @@ public: return EmitLoadOfLValue(E); } Value *VisitObjCMessageExpr(ObjCMessageExpr *E); - Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E); + Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { return EmitLoadOfLValue(E);} Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E); Value *VisitMemberExpr(Expr *E) { return EmitLoadOfLValue(E); } Value *VisitOCUVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); } @@ -451,22 +449,18 @@ 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 // arguments in generic code. // Find the receiver - llvm::Value * Receiver = CGF.EmitScalarExpr(E->getReceiver()); + llvm::Value *Receiver = CGF.EmitScalarExpr(E->getReceiver()); // Process the arguments - unsigned int ArgC = E->getNumArgs(); + unsigned ArgC = E->getNumArgs(); llvm::SmallVector<llvm::Value*, 16> Args; - for(unsigned i=0 ; i<ArgC ; i++) { + for (unsigned i = 0; i != ArgC; ++i) { Expr *ArgExpr = E->getArg(i); QualType ArgTy = ArgExpr->getType(); if (!CGF.hasAggregateLLVMType(ArgTy)) { @@ -489,13 +483,11 @@ Value *ScalarExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) { llvm::Constant *Selector = CGF.CGM.GetAddrOfConstantString(SelStr); llvm::Value *SelPtr = Builder.CreateStructGEP(Selector, 0); - return Runtime->generateMessageSend(Builder, - ConvertType(E->getType()), - CGF.CurFn->getValueSymbolTable().lookup("self"), - Receiver, - SelPtr, - &Args[0], - Args.size()); + return Runtime->generateMessageSend(Builder, ConvertType(E->getType()), + // FIXME: Self can be assigned to! + CGF.CurFn->arg_begin(), + Receiver, SelPtr, + &Args[0], Args.size()); } Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { |