Change construction of common ObjC functions to use CGCall

infrastructure to construct function type.
 - For consistencty, we should probably always use this to construct
   function types, but these are absolutely necessary to ensure that
   we can emit calls to these functions.

llvm-svn: 63695
This commit is contained in:
Daniel Dunbar 2009-02-04 00:44:42 +00:00
parent 153a0f1f52
commit 4d22e4975a
1 changed files with 41 additions and 57 deletions

View File

@ -2622,75 +2622,59 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
// Property manipulation functions.
QualType IdType = Ctx.getObjCIdType();
QualType SelType = Ctx.getObjCSelType();
llvm::SmallVector<QualType,16> Params;
const llvm::FunctionType *FTy;
// id objc_getProperty (id, SEL, ptrdiff_t, bool)
std::vector<const llvm::Type*> Params;
Params.push_back(ObjectPtrTy);
Params.push_back(SelectorPtrTy);
Params.push_back(LongTy);
Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
GetPropertyFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
"objc_getProperty");
Params.push_back(IdType);
Params.push_back(SelType);
Params.push_back(Ctx.LongTy);
Params.push_back(Ctx.BoolTy);
FTy = Types.GetFunctionType(Types.getFunctionInfo(IdType, Params),
false);
GetPropertyFn = CGM.CreateRuntimeFunction(FTy, "objc_getProperty");
// void objc_setProperty (id, SEL, ptrdiff_t, id, bool, bool)
Params.clear();
Params.push_back(ObjectPtrTy);
Params.push_back(SelectorPtrTy);
Params.push_back(LongTy);
Params.push_back(ObjectPtrTy);
Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
SetPropertyFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
false),
"objc_setProperty");
Params.push_back(IdType);
Params.push_back(SelType);
Params.push_back(Ctx.LongTy);
Params.push_back(IdType);
Params.push_back(Ctx.BoolTy);
Params.push_back(Ctx.BoolTy);
FTy = Types.GetFunctionType(Types.getFunctionInfo(Ctx.VoidTy, Params), false);
SetPropertyFn = CGM.CreateRuntimeFunction(FTy, "objc_setProperty");
// Enumeration mutation.
// void objc_enumerationMutation (id)
Params.clear();
Params.push_back(ObjectPtrTy);
EnumerationMutationFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(llvm::Type::VoidTy,
Params,
false),
"objc_enumerationMutation");
Params.push_back(IdType);
FTy = Types.GetFunctionType(Types.getFunctionInfo(Ctx.VoidTy, Params), false);
EnumerationMutationFn = CGM.CreateRuntimeFunction(FTy,
"objc_enumerationMutation");
// gc's API
// id objc_read_weak (id *)
Params.clear();
Params.push_back(PtrObjectPtrTy);
GcReadWeakFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
"objc_read_weak");
// id objc_assign_weak (id, id *)
Params.push_back(Ctx.getPointerType(IdType));
FTy = Types.GetFunctionType(Types.getFunctionInfo(IdType, Params), false);
GcReadWeakFn = CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
// id objc_assign_weak (id, id *)
Params.clear();
Params.push_back(ObjectPtrTy);
Params.push_back(PtrObjectPtrTy);
GcAssignWeakFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
"objc_assign_weak");
GcAssignGlobalFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
"objc_assign_global");
GcAssignIvarFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
"objc_assign_ivar");
GcAssignStrongCastFn =
CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
Params,
false),
"objc_assign_strongCast");
Params.push_back(IdType);
Params.push_back(Ctx.getPointerType(IdType));
FTy = Types.GetFunctionType(Types.getFunctionInfo(IdType, Params), false);
GcAssignWeakFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_weak");
GcAssignGlobalFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
GcAssignIvarFn = CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
GcAssignStrongCastFn =
CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
}
ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)