aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprScalar.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-03-30 23:25:33 +0000
committerChris Lattner <sabre@nondot.org>2008-03-30 23:25:33 +0000
commitce5605ecf76d8cde6372138f830bb144d174ced9 (patch)
treef3aa9a95602ec48d6fa560d2c4c1599d543a9ed6 /lib/CodeGen/CGExprScalar.cpp
parent391d77a26382dddf25da73e29fc1fa5aaaea4c6f (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.cpp26
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) {