diff options
Diffstat (limited to 'clang/lib/CodeGen/CGObjCRuntime.h')
-rw-r--r-- | clang/lib/CodeGen/CGObjCRuntime.h | 78 |
1 files changed, 33 insertions, 45 deletions
diff --git a/clang/lib/CodeGen/CGObjCRuntime.h b/clang/lib/CodeGen/CGObjCRuntime.h index a354aa19c2c..83ca0e638c9 100644 --- a/clang/lib/CodeGen/CGObjCRuntime.h +++ b/clang/lib/CodeGen/CGObjCRuntime.h @@ -29,6 +29,9 @@ namespace llvm { } namespace clang { + class ObjCCategoryImplDecl; + class ObjCImplementationDecl; + class ObjCMethodDecl; class ObjCProtocolDecl; class Selector; @@ -44,49 +47,37 @@ class CGObjCRuntime { public: virtual ~CGObjCRuntime(); - - /// Generate an Objective-C message send operation - virtual llvm::Value *GenerateMessageSend(BuilderType &Builder, - const llvm::Type *ReturnTy, - llvm::Value *Receiver, - Selector Sel, - llvm::Value** ArgV, - unsigned ArgC) =0; /// Generate the function required to register all Objective-C components in /// this compilation unit with the runtime library. - virtual llvm::Function *ModuleInitFunction() =0; + virtual llvm::Function *ModuleInitFunction() = 0; - /// Get a selector for the specified name and type values + /// Get a selector for the specified name and type values. The + /// return value should have the LLVM type for pointer-to + /// ASTContext::getObjCSelType(). virtual llvm::Value *GetSelector(BuilderType &Builder, - Selector Sel) =0; + Selector Sel) = 0; - /// Generate a constant string object + /// Generate a constant string object. virtual llvm::Constant *GenerateConstantString(const std::string &String) = 0; /// Generate a category. A category contains a list of methods (and /// accompanying metadata) and a list of protocols. - virtual void GenerateCategory(const char *ClassName, const char *CategoryName, - const llvm::SmallVectorImpl<Selector> &InstanceMethodSels, - const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes, - const llvm::SmallVectorImpl<Selector> &ClassMethodSels, - const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes, - const llvm::SmallVectorImpl<std::string> &Protocols) =0; + virtual void GenerateCategory(const ObjCCategoryImplDecl *OCD) = 0; /// Generate a class stucture for this class. - virtual void GenerateClass( - const char *ClassName, - const char *SuperClassName, - const int instanceSize, - const llvm::SmallVectorImpl<llvm::Constant *> &IvarNames, - const llvm::SmallVectorImpl<llvm::Constant *> &IvarTypes, - const llvm::SmallVectorImpl<llvm::Constant *> &IvarOffsets, - const llvm::SmallVectorImpl<Selector> &InstanceMethodSels, - const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes, - const llvm::SmallVectorImpl<Selector> &ClassMethodSels, - const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes, - const llvm::SmallVectorImpl<std::string> &Protocols) =0; + virtual void GenerateClass(const ObjCImplementationDecl *OID) = 0; + + /// Generate an Objective-C message send operation. + virtual llvm::Value *GenerateMessageSend(BuilderType &Builder, + const llvm::Type *ReturnTy, + llvm::Value *Receiver, + Selector Sel, + llvm::Value** ArgV, + unsigned ArgC) = 0; + /// Generate an Objective-C message send operation to the super + /// class. virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<true> &Builder, const llvm::Type *ReturnTy, const char *SuperClassName, @@ -98,27 +89,24 @@ public: /// Emit the code to return the named protocol as an object, as in a /// @protocol expression. virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<true> &Builder, - const ObjCProtocolDecl *PD) = 0; + const ObjCProtocolDecl *OPD) = 0; /// Generate the named protocol. Protocols contain method metadata but no /// implementations. - virtual void GenerateProtocol(const ObjCProtocolDecl *PD) = 0; - - /// Generate a function preamble for a method with the specified types - virtual llvm::Function *MethodPreamble( - const std::string &ClassName, - const std::string &CategoryName, - const std::string &MethodName, - const llvm::Type *ReturnTy, - const llvm::Type *SelfTy, - const llvm::Type **ArgTy, - unsigned ArgC, - bool isClassMethod, - bool isVarArg) = 0; + virtual void GenerateProtocol(const ObjCProtocolDecl *OPD) = 0; + + /// Generate a function preamble for a method with the specified + /// types. + + // FIXME: Current this just generates the Function definition, but + // really this should also be generating the loads of the + // parameters, as the runtime should have full control over how + // parameters are passed. + virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD) = 0; /// Look up the class for the specified name virtual llvm::Value *LookupClass(BuilderType &Builder, - llvm::Value *ClassName) =0; + llvm::Value *ClassName) = 0; /// If instance variable addresses are determined at runtime then this should /// return true, otherwise instance variables will be accessed directly from |