Refactor handling of calls:
- Added CodeGenFunction::EmitCall which just takes the callee, return
type, and a list of (Value*,QualType) pairs.
- Added CodeGenFunction::EmitCallArg which handles emitting code for
a call argument and turning it into an appropriate
(Value*,QualType) pair.
- Changed Objective-C runtime interface so that the actual emission
of arguments for message sends is (once again) done in the code to
emit a message send.
No intended functionality change, this is prep work for better ABI
support and for Objective-C property setter support.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55560 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index 1b254c0..e5a5d05 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -98,13 +98,15 @@
GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
const ObjCMessageExpr *E,
llvm::Value *Receiver,
- bool IsClassMessage);
+ bool IsClassMessage,
+ const CallArgList &CallArgs);
virtual CodeGen::RValue
GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
const ObjCMessageExpr *E,
const ObjCInterfaceDecl *Class,
llvm::Value *Receiver,
- bool IsClassMessage);
+ bool IsClassMessage,
+ const CallArgList &CallArgs);
virtual llvm::Value *GetClass(llvm::IRBuilder<> &Builder,
const ObjCInterfaceDecl *OID);
virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
@@ -240,7 +242,8 @@
const ObjCMessageExpr *E,
const ObjCInterfaceDecl *Class,
llvm::Value *Receiver,
- bool IsClassMessage) {
+ bool IsClassMessage,
+ const CallArgList &CallArgs) {
const ObjCInterfaceDecl *SuperClass = Class->getSuperClass();
const llvm::Type *ReturnTy = CGM.getTypes().ConvertType(E->getType());
// TODO: This should be cached, not looked up every time.
@@ -273,11 +276,13 @@
lookupArgs+2);
// Call the method
- llvm::Value *Args[2];
- Args[0] = Receiver;
- Args[1] = cmd;
- return CGF.EmitCallExprExt(imp, E->getType(), E->arg_begin(), E->arg_end(),
- Args, 2);
+ CallArgList ActualArgs;
+ ActualArgs.push_back(std::make_pair(Receiver,
+ CGF.getContext().getObjCIdType()));
+ ActualArgs.push_back(std::make_pair(cmd,
+ CGF.getContext().getObjCSelType()));
+ ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
+ return CGF.EmitCall(imp, E->getType(), ActualArgs);
}
/// Generate code for a message send expression.
@@ -285,7 +290,8 @@
CGObjCGNU::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
const ObjCMessageExpr *E,
llvm::Value *Receiver,
- bool IsClassMessage) {
+ bool IsClassMessage,
+ const CallArgList &CallArgs) {
const llvm::Type *ReturnTy = CGM.getTypes().ConvertType(E->getType());
llvm::Value *cmd = GetSelector(CGF.Builder, E->getSelector());
@@ -316,11 +322,13 @@
llvm::Value *imp = CGF.Builder.CreateCall2(lookupFunction, Receiver, cmd);
// Call the method.
- llvm::Value *Args[2];
- Args[0] = Receiver;
- Args[1] = cmd;
- return CGF.EmitCallExprExt(imp, E->getType(), E->arg_begin(), E->arg_end(),
- Args, 2);
+ CallArgList ActualArgs;
+ ActualArgs.push_back(std::make_pair(Receiver,
+ CGF.getContext().getObjCIdType()));
+ ActualArgs.push_back(std::make_pair(cmd,
+ CGF.getContext().getObjCSelType()));
+ ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
+ return CGF.EmitCall(imp, E->getType(), ActualArgs);
}
/// Generates a MethodList. Used in construction of a objc_class and