This patch generates messaging code for objc2's non-fragile abi.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63810 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
index a8ea12d..cce12a4 100644
--- a/lib/CodeGen/CGObjCMac.cpp
+++ b/lib/CodeGen/CGObjCMac.cpp
@@ -276,6 +276,9 @@
// MessageRefCPtrTy - clang type for struct _message_ref_t*
QualType MessageRefCPtrTy;
+ // MessengerTy - Type of the messenger (shown as IMP above)
+ const llvm::FunctionType *MessengerTy;
+
// SuperMessageRefTy - LLVM for:
// struct _super_message_ref_t {
// SUPER_IMP messenger;
@@ -3235,10 +3238,11 @@
Params.clear();
Params.push_back(ObjectPtrTy);
Params.push_back(MessageRefPtrTy);
+ MessengerTy = llvm::FunctionType::get(ObjectPtrTy,
+ Params,
+ true);
MessageSendFixupFn =
- CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
- Params,
- true),
+ CGM.CreateRuntimeFunction(MessengerTy,
"objc_msgSend_fixup");
// id objc_msgSend_fpret_fixup (id, struct message_ref_t*, ...)
@@ -4290,6 +4294,8 @@
CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy, "tmp");
// Find the message function name.
+ // FIXME. This is too much work to get the ABI-specific result type
+ // needed to find the message name.
const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType,
llvm::SmallVector<QualType, 16>());
llvm::Constant *Fn;
@@ -4346,12 +4352,23 @@
UsedGlobals.push_back(GV);
}
llvm::Value *Arg1 = CGF.Builder.CreateBitCast(GV, ObjCTypes.MessageRefPtrTy);
+
CallArgList ActualArgs;
ActualArgs.push_back(std::make_pair(RValue::get(Arg0), Arg0Ty));
ActualArgs.push_back(std::make_pair(RValue::get(Arg1),
ObjCTypes.MessageRefCPtrTy));
ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
- return RValue::get(0);
+ const CGFunctionInfo &FnInfo1 = Types.getFunctionInfo(ResultType, ActualArgs);
+ llvm::Value *Callee = CGF.Builder.CreateStructGEP(Arg1, 0);
+ Callee = CGF.Builder.CreateLoad(Callee);
+ const llvm::Type *T = llvm::PointerType::getUnqual(ObjCTypes.MessengerTy);
+ T = llvm::PointerType::getUnqual(T);
+ Callee = CGF.Builder.CreateBitCast(Callee, T);
+ Callee = CGF.Builder.CreateLoad(Callee);
+ const llvm::FunctionType *FTy = Types.GetFunctionType(FnInfo1, false);
+ Callee = CGF.Builder.CreateBitCast(Callee,
+ llvm::PointerType::getUnqual(FTy));
+ return CGF.EmitCall(FnInfo1, Callee, ActualArgs);
}
/// Generate code for a message send expression in the nonfragile abi.