diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2008-08-20 00:28:19 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-20 00:28:19 +0000 |
| commit | 66912a1a6d2af64e602cd6e3002a730fd5e8b2ae (patch) | |
| tree | 1ede5fcf40bc7999fe5257975ae81fa03e87abfa /clang | |
| parent | f00f3055d8f926db8cc4bdb984df93775f1149cc (diff) | |
| download | bcm5719-llvm-66912a1a6d2af64e602cd6e3002a730fd5e8b2ae.tar.gz bcm5719-llvm-66912a1a6d2af64e602cd6e3002a730fd5e8b2ae.zip | |
Move all Obj-C runtime interaction into CodeGenFunction.
- Drop duplicate (and broken) code for sending messages.
- Add EmitObjCProtocolExpr to CodeGenFunction.
llvm-svn: 55024
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 44 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 2 |
3 files changed, 10 insertions, 41 deletions
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 4eb906269ae..8228dd6d84c 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -13,7 +13,6 @@ #include "CodeGenFunction.h" #include "CodeGenModule.h" -#include "CGObjCRuntime.h" #include "clang/AST/ASTContext.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/StmtVisitor.h" @@ -45,15 +44,11 @@ class VISIBILITY_HIDDEN ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, Value*> { CodeGenFunction &CGF; llvm::IRBuilder<> &Builder; - CGObjCRuntime *Runtime; public: ScalarExprEmitter(CodeGenFunction &cgf) : CGF(cgf), - Builder(CGF.Builder), - Runtime(0) { - if (CGF.CGM.hasObjCRuntime()) - Runtime = &CGF.CGM.getObjCRuntime(); + Builder(CGF.Builder) { } //===--------------------------------------------------------------------===// @@ -472,46 +467,15 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { } 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()); - - // Process the arguments - unsigned ArgC = E->getNumArgs(); - llvm::SmallVector<llvm::Value*, 16> Args; - for (unsigned i = 0; i != ArgC; ++i) { - Expr *ArgExpr = E->getArg(i); - QualType ArgTy = ArgExpr->getType(); - if (!CGF.hasAggregateLLVMType(ArgTy)) { - // Scalar argument is passed by-value. - Args.push_back(CGF.EmitScalarExpr(ArgExpr)); - } else if (ArgTy->isAnyComplexType()) { - // Make a temporary alloca to pass the argument. - llvm::Value *DestMem = CGF.CreateTempAlloca(ConvertType(ArgTy)); - CGF.EmitComplexExprIntoAddr(ArgExpr, DestMem, false); - Args.push_back(DestMem); - } else { - llvm::Value *DestMem = CGF.CreateTempAlloca(ConvertType(ArgTy)); - CGF.EmitAggExpr(ArgExpr, DestMem, false); - Args.push_back(DestMem); - } - } - - return Runtime->GenerateMessageSend(Builder, ConvertType(E->getType()), - Receiver, E->getSelector(), - &Args[0], Args.size()); + return CGF.EmitObjCMessageExpr(E); } Value *ScalarExprEmitter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { - return Runtime->GetSelector(Builder, E->getSelector()); + return CGF.EmitObjCSelectorExpr(E); } Value *ScalarExprEmitter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { - // FIXME: This should pass the Decl not the name. - return Runtime->GenerateProtocolRef(Builder, E->getProtocol()); + return CGF.EmitObjCProtocolExpr(E); } Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 2b4eb5b5284..5e4b958807d 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -23,6 +23,7 @@ using namespace CodeGen; llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E) { std::string String(E->getString()->getStrData(), E->getString()->getByteLength()); llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(String); + // FIXME: This bitcast should just be made an invariant on the Runtime. return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType())); } @@ -35,6 +36,10 @@ llvm::Value *CodeGenFunction::EmitObjCSelectorExpr(const ObjCSelectorExpr *E) { return CGM.getObjCRuntime().GetSelector(Builder, E->getSelector()); } +llvm::Value *CodeGenFunction::EmitObjCProtocolExpr(const ObjCProtocolExpr *E) { + // FIXME: This should pass the Decl not the name. + return CGM.getObjCRuntime().GenerateProtocolRef(Builder, E->getProtocol()); +} llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index e4061ec4f2b..8642c1b861f 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -475,12 +475,12 @@ public: llvm::Value *EmitVector(llvm::Value * const *Vals, unsigned NumVals, bool isSplat = false); + llvm::Value *EmitObjCProtocolExpr(const ObjCProtocolExpr *E); llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E); llvm::Value *EmitObjCSelectorExpr(const ObjCSelectorExpr *E); llvm::Value *EmitObjCMessageExpr(const ObjCMessageExpr *E); - //===--------------------------------------------------------------------===// // Expression Emission //===--------------------------------------------------------------------===// |

