| Daniel Dunbar | c17a4d3 | 2008-08-11 02:45:11 +0000 | [diff] [blame] | 1 | //===----- CGObjCRuntime.h - Interface to ObjC Runtimes ---------*- C++ -*-===// | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
 | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
 | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | // | 
 | 10 | // This provides an abstract class for Objective-C code generation.  Concrete | 
 | 11 | // subclasses of this implement code generation for specific Objective-C | 
 | 12 | // runtime libraries. | 
 | 13 | // | 
 | 14 | //===----------------------------------------------------------------------===// | 
 | 15 |  | 
 | 16 | #ifndef CLANG_CODEGEN_OBCJRUNTIME_H | 
 | 17 | #define CLANG_CODEGEN_OBCJRUNTIME_H | 
| Daniel Dunbar | e91593e | 2008-08-11 04:54:23 +0000 | [diff] [blame] | 18 | #include "clang/Basic/IdentifierTable.h" // Selector | 
| Anton Korobeynikov | 20ff310 | 2008-06-01 14:13:53 +0000 | [diff] [blame] | 19 | #include "llvm/ADT/SmallVector.h" | 
| Argyrios Kyrtzidis | 8ef07c0 | 2008-06-01 21:23:24 +0000 | [diff] [blame] | 20 | #include <string> | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 21 |  | 
| Daniel Dunbar | 45d196b | 2008-11-01 01:53:16 +0000 | [diff] [blame^] | 22 | #include "CGBuilder.h" | 
| Daniel Dunbar | 46f45b9 | 2008-09-09 01:06:48 +0000 | [diff] [blame] | 23 | #include "CGCall.h" | 
| Daniel Dunbar | 45d196b | 2008-11-01 01:53:16 +0000 | [diff] [blame^] | 24 | #include "CGValue.h" | 
| Daniel Dunbar | 8f2926b | 2008-08-23 03:46:30 +0000 | [diff] [blame] | 25 |  | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 26 | namespace llvm { | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 27 |   class Constant; | 
 | 28 |   class Type; | 
 | 29 |   class Value; | 
 | 30 |   class Module; | 
| Chris Lattner | 391d77a | 2008-03-30 23:03:07 +0000 | [diff] [blame] | 31 |   class Function; | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 32 | } | 
 | 33 |  | 
 | 34 | namespace clang { | 
| Daniel Dunbar | 46f45b9 | 2008-09-09 01:06:48 +0000 | [diff] [blame] | 35 | namespace CodeGen { | 
 | 36 |   class CodeGenFunction; | 
 | 37 | } | 
| Daniel Dunbar | 8f2926b | 2008-08-23 03:46:30 +0000 | [diff] [blame] | 38 |  | 
| Anders Carlsson | 64d5d6c | 2008-09-09 10:04:29 +0000 | [diff] [blame] | 39 |   class ObjCAtTryStmt; | 
 | 40 |   class ObjCAtThrowStmt; | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 41 |   class ObjCCategoryImplDecl; | 
 | 42 |   class ObjCImplementationDecl; | 
| Daniel Dunbar | ddb2a3d | 2008-08-16 00:25:02 +0000 | [diff] [blame] | 43 |   class ObjCInterfaceDecl; | 
| Daniel Dunbar | 8f2926b | 2008-08-23 03:46:30 +0000 | [diff] [blame] | 44 |   class ObjCMessageExpr; | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 45 |   class ObjCMethodDecl; | 
| Daniel Dunbar | af2f62c | 2008-08-13 00:59:25 +0000 | [diff] [blame] | 46 |   class ObjCProtocolDecl; | 
| Chris Lattner | 8e67b63 | 2008-06-26 04:37:12 +0000 | [diff] [blame] | 47 |   class Selector; | 
| Daniel Dunbar | af2f62c | 2008-08-13 00:59:25 +0000 | [diff] [blame] | 48 |  | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 49 | namespace CodeGen { | 
| Chris Lattner | dce1406 | 2008-06-26 04:19:03 +0000 | [diff] [blame] | 50 |   class CodeGenModule; | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 51 |  | 
| Anton Korobeynikov | 20ff310 | 2008-06-01 14:13:53 +0000 | [diff] [blame] | 52 | //FIXME Several methods should be pure virtual but aren't to avoid the | 
 | 53 | //partially-implemented subclass breaking. | 
 | 54 |  | 
 | 55 | /// Implements runtime-specific code generation functions. | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 56 | class CGObjCRuntime { | 
| Daniel Dunbar | 58bf610 | 2008-08-11 16:50:21 +0000 | [diff] [blame] | 57 |  | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 58 | public: | 
 | 59 |   virtual ~CGObjCRuntime(); | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 60 |  | 
 | 61 |   /// Generate the function required to register all Objective-C components in | 
 | 62 |   /// this compilation unit with the runtime library. | 
 | 63 |   virtual llvm::Function *ModuleInitFunction() = 0; | 
 | 64 |  | 
 | 65 |   /// Get a selector for the specified name and type values. The | 
 | 66 |   /// return value should have the LLVM type for pointer-to | 
 | 67 |   /// ASTContext::getObjCSelType(). | 
| Daniel Dunbar | 45d196b | 2008-11-01 01:53:16 +0000 | [diff] [blame^] | 68 |   virtual llvm::Value *GetSelector(CGBuilderTy &Builder, | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 69 |                                    Selector Sel) = 0; | 
 | 70 |  | 
 | 71 |   /// Generate a constant string object. | 
 | 72 |   virtual llvm::Constant *GenerateConstantString(const std::string &String) = 0; | 
 | 73 |  | 
 | 74 |   /// Generate a category.  A category contains a list of methods (and | 
 | 75 |   /// accompanying metadata) and a list of protocols. | 
 | 76 |   virtual void GenerateCategory(const ObjCCategoryImplDecl *OCD) = 0; | 
 | 77 |  | 
 | 78 |   /// Generate a class stucture for this class. | 
 | 79 |   virtual void GenerateClass(const ObjCImplementationDecl *OID) = 0; | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 80 |    | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 81 |   /// Generate an Objective-C message send operation. | 
| Daniel Dunbar | 8f2926b | 2008-08-23 03:46:30 +0000 | [diff] [blame] | 82 |   virtual CodeGen::RValue  | 
 | 83 |   GenerateMessageSend(CodeGen::CodeGenFunction &CGF, | 
| Daniel Dunbar | 7f8ea5c | 2008-08-30 05:35:15 +0000 | [diff] [blame] | 84 |                       QualType ResultType, | 
 | 85 |                       Selector Sel, | 
| Daniel Dunbar | f56f191 | 2008-08-25 08:19:24 +0000 | [diff] [blame] | 86 |                       llvm::Value *Receiver, | 
| Daniel Dunbar | 19cd87e | 2008-08-30 03:02:31 +0000 | [diff] [blame] | 87 |                       bool IsClassMessage, | 
 | 88 |                       const CallArgList &CallArgs) = 0; | 
| Daniel Dunbar | af2f62c | 2008-08-13 00:59:25 +0000 | [diff] [blame] | 89 |  | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 90 |   /// Generate an Objective-C message send operation to the super | 
| Daniel Dunbar | f56f191 | 2008-08-25 08:19:24 +0000 | [diff] [blame] | 91 |   /// class initiated in a method for Class and with the given Self | 
 | 92 |   /// object. | 
| Daniel Dunbar | 8f2926b | 2008-08-23 03:46:30 +0000 | [diff] [blame] | 93 |   virtual CodeGen::RValue | 
 | 94 |   GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, | 
| Daniel Dunbar | 7f8ea5c | 2008-08-30 05:35:15 +0000 | [diff] [blame] | 95 |                            QualType ResultType, | 
 | 96 |                            Selector Sel, | 
| Daniel Dunbar | f56f191 | 2008-08-25 08:19:24 +0000 | [diff] [blame] | 97 |                            const ObjCInterfaceDecl *Class, | 
 | 98 |                            llvm::Value *Self, | 
| Daniel Dunbar | 19cd87e | 2008-08-30 03:02:31 +0000 | [diff] [blame] | 99 |                            bool IsClassMessage, | 
 | 100 |                            const CallArgList &CallArgs) = 0; | 
| Daniel Dunbar | 98c5ead | 2008-08-12 05:08:18 +0000 | [diff] [blame] | 101 |  | 
 | 102 |   /// Emit the code to return the named protocol as an object, as in a | 
 | 103 |   /// @protocol expression. | 
| Daniel Dunbar | 45d196b | 2008-11-01 01:53:16 +0000 | [diff] [blame^] | 104 |   virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder, | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 105 |                                            const ObjCProtocolDecl *OPD) = 0; | 
| Daniel Dunbar | 98c5ead | 2008-08-12 05:08:18 +0000 | [diff] [blame] | 106 |  | 
| Anton Korobeynikov | 20ff310 | 2008-06-01 14:13:53 +0000 | [diff] [blame] | 107 |   /// Generate the named protocol.  Protocols contain method metadata but no  | 
 | 108 |   /// implementations.  | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 109 |   virtual void GenerateProtocol(const ObjCProtocolDecl *OPD) = 0; | 
| Daniel Dunbar | af2f62c | 2008-08-13 00:59:25 +0000 | [diff] [blame] | 110 |  | 
| Daniel Dunbar | 7ded7f4 | 2008-08-15 22:20:32 +0000 | [diff] [blame] | 111 |   /// Generate a function preamble for a method with the specified | 
 | 112 |   /// types.   | 
 | 113 |  | 
 | 114 |   // FIXME: Current this just generates the Function definition, but | 
 | 115 |   // really this should also be generating the loads of the | 
 | 116 |   // parameters, as the runtime should have full control over how | 
 | 117 |   // parameters are passed. | 
 | 118 |   virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD) = 0; | 
| Daniel Dunbar | af2f62c | 2008-08-13 00:59:25 +0000 | [diff] [blame] | 119 |  | 
| Daniel Dunbar | 49f6602 | 2008-09-24 03:38:44 +0000 | [diff] [blame] | 120 |   /// Return the runtime function for getting properties. | 
 | 121 |   virtual llvm::Function *GetPropertyGetFunction() = 0; | 
 | 122 |    | 
 | 123 |   /// Return the runtime function for setting properties. | 
 | 124 |   virtual llvm::Function *GetPropertySetFunction() = 0; | 
 | 125 |  | 
| Daniel Dunbar | ddb2a3d | 2008-08-16 00:25:02 +0000 | [diff] [blame] | 126 |   /// GetClass - Return a reference to the class for the given | 
 | 127 |   /// interface decl. | 
| Daniel Dunbar | 45d196b | 2008-11-01 01:53:16 +0000 | [diff] [blame^] | 128 |   virtual llvm::Value *GetClass(CGBuilderTy &Builder,  | 
| Daniel Dunbar | ddb2a3d | 2008-08-16 00:25:02 +0000 | [diff] [blame] | 129 |                                 const ObjCInterfaceDecl *OID) = 0; | 
| Daniel Dunbar | af2f62c | 2008-08-13 00:59:25 +0000 | [diff] [blame] | 130 |  | 
| Anders Carlsson | 2abd89c | 2008-08-31 04:05:03 +0000 | [diff] [blame] | 131 |   /// EnumerationMutationFunction - Return the function that's called by the | 
 | 132 |   /// compiler when a mutation is detected during foreach iteration. | 
 | 133 |   virtual llvm::Function *EnumerationMutationFunction() = 0; | 
 | 134 |      | 
| Chris Lattner | 391d77a | 2008-03-30 23:03:07 +0000 | [diff] [blame] | 135 |   /// If instance variable addresses are determined at runtime then this should | 
 | 136 |   /// return true, otherwise instance variables will be accessed directly from | 
 | 137 |   /// the structure.  If this returns true then @defs is invalid for this | 
 | 138 |   /// runtime and a warning should be generated. | 
| Daniel Dunbar | 19cd87e | 2008-08-30 03:02:31 +0000 | [diff] [blame] | 139 |   virtual bool LateBoundIVars() const { return false; } | 
| Anders Carlsson | 64d5d6c | 2008-09-09 10:04:29 +0000 | [diff] [blame] | 140 |  | 
 | 141 |   virtual void EmitTryStmt(CodeGen::CodeGenFunction &CGF, | 
 | 142 |                            const ObjCAtTryStmt &S) = 0; | 
 | 143 |   virtual void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, | 
 | 144 |                              const ObjCAtThrowStmt &S) = 0; | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 145 | }; | 
 | 146 |  | 
| Chris Lattner | 391d77a | 2008-03-30 23:03:07 +0000 | [diff] [blame] | 147 | /// Creates an instance of an Objective-C runtime class.   | 
 | 148 | //TODO: This should include some way of selecting which runtime to target. | 
| Daniel Dunbar | c17a4d3 | 2008-08-11 02:45:11 +0000 | [diff] [blame] | 149 | CGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM); | 
 | 150 | CGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM); | 
| Chris Lattner | 0f98426 | 2008-03-01 08:50:34 +0000 | [diff] [blame] | 151 | } | 
 | 152 | } | 
 | 153 | #endif |