NeXT: Update to use CreateRuntimeFunction for the routines it imports.

llvm-svn: 56902
This commit is contained in:
Daniel Dunbar 2008-10-01 01:06:06 +00:00
parent 920f6d588e
commit fbe68a84f8
2 changed files with 82 additions and 80 deletions

View File

@ -2208,47 +2208,40 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
std::vector<const llvm::Type*> Params;
Params.push_back(ObjectPtrTy);
Params.push_back(SelectorPtrTy);
MessageSendFn = llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
MessageSendFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
true),
llvm::Function::ExternalLinkage,
"objc_msgSend",
&CGM.getModule());
"objc_msgSend");
Params.clear();
Params.push_back(Int8PtrTy);
Params.push_back(ObjectPtrTy);
Params.push_back(SelectorPtrTy);
MessageSendStretFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
true),
llvm::Function::ExternalLinkage,
"objc_msgSend_stret",
&CGM.getModule());
"objc_msgSend_stret");
Params.clear();
Params.push_back(SuperPtrTy);
Params.push_back(SelectorPtrTy);
MessageSendSuperFn =
llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
true),
llvm::Function::ExternalLinkage,
"objc_msgSendSuper",
&CGM.getModule());
"objc_msgSendSuper");
Params.clear();
Params.push_back(Int8PtrTy);
Params.push_back(SuperPtrTy);
Params.push_back(SelectorPtrTy);
MessageSendSuperStretFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
true),
llvm::Function::ExternalLinkage,
"objc_msgSendSuper_stret",
&CGM.getModule());
"objc_msgSendSuper_stret");
// Property manipulation functions.
@ -2258,12 +2251,10 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
Params.push_back(LongTy);
Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
GetPropertyFn =
llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_getProperty",
&CGM.getModule());
"objc_getProperty");
Params.clear();
Params.push_back(ObjectPtrTy);
@ -2273,24 +2264,20 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
SetPropertyFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_setProperty",
&CGM.getModule());
"objc_setProperty");
// Enumeration mutation.
Params.clear();
Params.push_back(ObjectPtrTy);
EnumerationMutationFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_enumerationMutation",
&CGM.getModule());
"objc_enumerationMutation");
// FIXME: This is the size of the setjmp buffer and should be
// target specific. 18 is what's used on 32-bit X86.
@ -2310,58 +2297,45 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
Params.clear();
Params.push_back(ObjectPtrTy);
ExceptionThrowFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_exception_throw",
&CGM.getModule());
"objc_exception_throw");
Params.clear();
Params.push_back(llvm::PointerType::getUnqual(ExceptionDataTy));
ExceptionTryEnterFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_exception_try_enter",
&CGM.getModule());
"objc_exception_try_enter");
ExceptionTryExitFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_exception_try_exit",
&CGM.getModule());
"objc_exception_try_exit");
ExceptionExtractFn =
llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_exception_extract",
&CGM.getModule());
"objc_exception_extract");
Params.clear();
Params.push_back(ClassPtrTy);
Params.push_back(ObjectPtrTy);
ExceptionMatchFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::Int32Ty,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::Int32Ty,
Params,
false),
llvm::Function::ExternalLinkage,
"objc_exception_match",
&CGM.getModule());
"objc_exception_match");
Params.clear();
Params.push_back(llvm::PointerType::getUnqual(llvm::Type::Int32Ty));
SetJmpFn =
llvm::Function::Create(llvm::FunctionType::get(llvm::Type::Int32Ty,
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::Int32Ty,
Params,
false),
llvm::Function::ExternalLinkage,
"_setjmp",
&CGM.getModule());
"_setjmp");
}
ObjCTypesHelper::~ObjCTypesHelper() {

View File

@ -0,0 +1,28 @@
// RUN: clang -fnext-runtime -emit-llvm -o %t %s &&
// RUN: grep -e "^de.*objc_msgSend[0-9]*(" %t | count 1 &&
// RUN: clang -DWITHDEF -fnext-runtime -emit-llvm -o %t %s &&
// RUN: grep -e "^de.*objc_msgSend[0-9]*(" %t | count 1
id objc_msgSend(int x);
@interface A @end
@implementation A
-(void) f0 {
objc_msgSend(12);
}
-(void) hello {
}
@end
void f0(id x) {
[x hello];
}
#ifdef WITHDEF
// This isn't a very good send function.
id objc_msgSend(int x) {
return 0;
}
#endif