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