diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-09-10 07:00:50 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-09-10 07:00:50 +0000 |
commit | 62d5c1b5038cdaa4a887a03c37fe1e8d00166ea0 (patch) | |
tree | c78895f289418d46af0c29fc930caf0315338231 /lib/CodeGen/CGObjCMac.cpp | |
parent | 45c25ba11cbf8c9a461def5b03f6ee9481e06769 (diff) |
Add CodeGenTypes::GetFunctionType overload for getting the effective
type of a call.
Change NeXT runtime to use this instead of trying to bitcasting
internally (which doesn't respect the ABI).
Fix subtle bug, use of ConvertTypeRecursive instead of ConvertType is
bad inside GetFunctionType.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56050 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 37 |
1 files changed, 10 insertions, 27 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index d63004f212..42f8ef71de 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -158,8 +158,7 @@ public: ObjCTypesHelper(CodeGen::CodeGenModule &cgm); ~ObjCTypesHelper(); - llvm::Value *getMessageSendFn(bool IsSuper, bool isStret, - const llvm::Type *ReturnTy); + llvm::Constant *getMessageSendFn(bool IsSuper, bool isStret); }; class CGObjCMac : public CodeGen::CGObjCRuntime { @@ -529,10 +528,12 @@ CodeGen::RValue CGObjCMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF, CGF.getContext().getObjCSelType())); ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end()); - llvm::Value *Fn = - ObjCTypes.getMessageSendFn(IsSuper, - CGM.ReturnTypeUsesSret(ResultType), - CGM.getTypes().ConvertType(ResultType)); + const llvm::FunctionType *FTy = + CGM.getTypes().GetFunctionType(CGCallInfo(ResultType, ActualArgs), + false); + llvm::Constant *Fn = + ObjCTypes.getMessageSendFn(IsSuper, CGM.ReturnTypeUsesSret(ResultType)); + Fn = llvm::ConstantExpr::getBitCast(Fn, llvm::PointerType::getUnqual(FTy)); return CGF.EmitCall(Fn, ResultType, ActualArgs); } @@ -2199,30 +2200,12 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm) ObjCTypesHelper::~ObjCTypesHelper() { } -llvm::Value *ObjCTypesHelper::getMessageSendFn(bool IsSuper, - bool IsStret, - const llvm::Type *ReturnTy) { - llvm::Function *F; - llvm::FunctionType *CallFTy; - - // FIXME: Should we be caching any of this? +llvm::Constant *ObjCTypesHelper::getMessageSendFn(bool IsSuper, bool IsStret) { if (IsStret) { - F = IsSuper ? MessageSendSuperStretFn : MessageSendStretFn; - std::vector<const llvm::Type*> Params(3); - Params[0] = llvm::PointerType::getUnqual(ReturnTy); - Params[1] = IsSuper ? SuperPtrTy : ObjectPtrTy; - Params[2] = SelectorPtrTy; - CallFTy = llvm::FunctionType::get(llvm::Type::VoidTy, Params, true); + return IsSuper ? MessageSendSuperStretFn : MessageSendStretFn; } else { // FIXME: floating point? - F = IsSuper ? MessageSendSuperFn : MessageSendFn; - std::vector<const llvm::Type*> Params(2); - Params[0] = IsSuper ? SuperPtrTy : ObjectPtrTy; - Params[1] = SelectorPtrTy; - CallFTy = llvm::FunctionType::get(ReturnTy, Params, true); + return IsSuper ? MessageSendSuperFn : MessageSendFn; } - - return llvm::ConstantExpr::getBitCast(F, - llvm::PointerType::getUnqual(CallFTy)); } /* *** */ |