const ObjCProtocolDecl *PD);
virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
virtual llvm::Function *ModuleInitFunction();
+ virtual llvm::Function *GetPropertyGetFunction();
+ virtual llvm::Function *GetPropertySetFunction();
virtual llvm::Function *EnumerationMutationFunction();
virtual void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
return Method;
}
-llvm::Function *CGObjCGNU::EnumerationMutationFunction()
-{
- assert(0 && "No enumeration mutation function in the GNU runtime!");
-
+llvm::Function *CGObjCGNU::GetPropertyGetFunction() {
+ return 0;
+}
+
+llvm::Function *CGObjCGNU::GetPropertySetFunction() {
+ return 0;
+}
+
+llvm::Function *CGObjCGNU::EnumerationMutationFunction() {
return 0;
}
void CGObjCGNU::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
- const ObjCAtTryStmt &S)
-{
+ const ObjCAtTryStmt &S) {
CGF.ErrorUnsupported(&S, "@try statement");
}
void CGObjCGNU::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
- const ObjCAtThrowStmt &S)
-{
+ const ObjCAtThrowStmt &S) {
CGF.ErrorUnsupported(&S, "@throw statement");
}
/// MethodListPtrTy - LLVM type for struct objc_method_list *.
const llvm::Type *MethodListPtrTy;
+ llvm::Function *GetPropertyFn, *SetPropertyFn;
llvm::Function *EnumerationMutationFn;
/// ExceptionDataTy - LLVM type for struct _objc_exception_data.
virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
virtual llvm::Function *ModuleInitFunction();
+ virtual llvm::Function *GetPropertyGetFunction();
+ virtual llvm::Function *GetPropertySetFunction();
virtual llvm::Function *EnumerationMutationFunction();
virtual void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
return NULL;
}
+llvm::Function *CGObjCMac::GetPropertyGetFunction() {
+ return ObjCTypes.GetPropertyFn;
+}
+
+llvm::Function *CGObjCMac::GetPropertySetFunction() {
+ return ObjCTypes.SetPropertyFn;
+}
+
llvm::Function *CGObjCMac::EnumerationMutationFunction()
{
return ObjCTypes.EnumerationMutationFn;
NULL);
CGM.getModule().addTypeName("struct._objc_module", ModuleTy);
- // Message send functions
+ // Message send functions.
std::vector<const llvm::Type*> Params;
Params.push_back(ObjectPtrTy);
"objc_msgSendSuper_stret",
&CGM.getModule());
+ // Property manipulation functions.
+
+ Params.clear();
+ Params.push_back(ObjectPtrTy);
+ Params.push_back(SelectorPtrTy);
+ Params.push_back(LongTy);
+ Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
+ GetPropertyFn =
+ llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
+ Params,
+ false),
+ llvm::Function::ExternalLinkage,
+ "objc_getProperty",
+ &CGM.getModule());
+
+ Params.clear();
+ Params.push_back(ObjectPtrTy);
+ Params.push_back(SelectorPtrTy);
+ Params.push_back(LongTy);
+ Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
+ Params.push_back(Types.ConvertTypeForMem(Ctx.BoolTy));
+ SetPropertyFn =
+ llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
+ Params,
+ false),
+ llvm::Function::ExternalLinkage,
+ "objc_setProperty",
+ &CGM.getModule());
+
// Enumeration mutation.
-
+
Params.clear();
Params.push_back(ObjectPtrTy);
EnumerationMutationFn =
// parameters are passed.
virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD) = 0;
+ /// Return the runtime function for getting properties.
+ virtual llvm::Function *GetPropertyGetFunction() = 0;
+
+ /// Return the runtime function for setting properties.
+ virtual llvm::Function *GetPropertySetFunction() = 0;
+
/// GetClass - Return a reference to the class for the given
/// interface decl.
virtual llvm::Value *GetClass(BuilderType &Builder,