 |
|
 |
|
| Files: |
1 |
|
Branches Taken: |
0.0% |
0 / 0 |
| Generated: |
2010-02-10 01:31 |
|
Branches Executed: |
0.0% |
0 / 0 |
| |
|
Line Coverage: |
100.0% |
1 / 1 |
| |
 |
|
 |
1 : //===----- CGObjCRuntime.h - Interface to ObjC Runtimes ---------*- C++ -*-===//
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
18 : #include "clang/Basic/IdentifierTable.h" // Selector
19 : #include "llvm/ADT/SmallVector.h"
20 : #include "clang/AST/DeclObjC.h"
21 : #include <string>
22 :
23 : #include "CGBuilder.h"
24 : #include "CGCall.h"
25 : #include "CGValue.h"
26 :
27 : namespace llvm {
28 : class Constant;
29 : class Function;
30 : class Module;
31 : class StructLayout;
32 : class StructType;
33 : class Type;
34 : class Value;
35 : }
36 :
37 : namespace clang {
38 : namespace CodeGen {
39 : class CodeGenFunction;
40 : }
41 :
42 : class FieldDecl;
43 : class ObjCAtTryStmt;
44 : class ObjCAtThrowStmt;
45 : class ObjCAtSynchronizedStmt;
46 : class ObjCContainerDecl;
47 : class ObjCCategoryImplDecl;
48 : class ObjCImplementationDecl;
49 : class ObjCInterfaceDecl;
50 : class ObjCMessageExpr;
51 : class ObjCMethodDecl;
52 : class ObjCProtocolDecl;
53 : class Selector;
54 : class ObjCIvarDecl;
55 : class ObjCStringLiteral;
56 :
57 : namespace CodeGen {
58 : class CodeGenModule;
59 :
60 : // FIXME: Several methods should be pure virtual but aren't to avoid the
61 : // partially-implemented subclass breaking.
62 :
63 : /// Implements runtime-specific code generation functions.
64 137: class CGObjCRuntime {
65 : public:
66 : // Utility functions for unified ivar access. These need to
67 : // eventually be folded into other places (the structure layout
68 : // code).
69 :
70 : protected:
71 : /// Compute an offset to the given ivar, suitable for passing to
72 : /// EmitValueForIvarAtOffset. Note that the correct handling of
73 : /// bit-fields is carefully coordinated by these two, use caution!
74 : ///
75 : /// The latter overload is suitable for computing the offset of a
76 : /// sythesized ivar.
77 : uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
78 : const ObjCInterfaceDecl *OID,
79 : const ObjCIvarDecl *Ivar);
80 : uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
81 : const ObjCImplementationDecl *OID,
82 : const ObjCIvarDecl *Ivar);
83 :
84 : LValue EmitValueForIvarAtOffset(CodeGen::CodeGenFunction &CGF,
85 : const ObjCInterfaceDecl *OID,
86 : llvm::Value *BaseValue,
87 : const ObjCIvarDecl *Ivar,
88 : unsigned CVRQualifiers,
89 : llvm::Value *Offset);
90 :
91 : public:
92 : virtual ~CGObjCRuntime();
93 :
94 : /// Generate the function required to register all Objective-C components in
95 : /// this compilation unit with the runtime library.
96 : virtual llvm::Function *ModuleInitFunction() = 0;
97 :
98 : /// Get a selector for the specified name and type values. The
99 : /// return value should have the LLVM type for pointer-to
100 : /// ASTContext::getObjCSelType().
101 : virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
102 : Selector Sel) = 0;
103 :
104 : /// Get a typed selector.
105 : virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
106 : const ObjCMethodDecl *Method) = 0;
107 :
108 : /// Generate a constant string object.
109 : virtual llvm::Constant *GenerateConstantString(const StringLiteral *) = 0;
110 :
111 : /// Generate a category. A category contains a list of methods (and
112 : /// accompanying metadata) and a list of protocols.
113 : virtual void GenerateCategory(const ObjCCategoryImplDecl *OCD) = 0;
114 :
115 : /// Generate a class stucture for this class.
116 : virtual void GenerateClass(const ObjCImplementationDecl *OID) = 0;
117 :
118 : /// Generate an Objective-C message send operation.
119 : ///
120 : /// \param Method - The method being called, this may be null if synthesizing
121 : /// a property setter or getter.
122 : virtual CodeGen::RValue
123 : GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
124 : QualType ResultType,
125 : Selector Sel,
126 : llvm::Value *Receiver,
127 : bool IsClassMessage,
128 : const CallArgList &CallArgs,
129 : const ObjCMethodDecl *Method = 0) = 0;
130 :
131 : /// Generate an Objective-C message send operation to the super
132 : /// class initiated in a method for Class and with the given Self
133 : /// object.
134 : ///
135 : /// \param Method - The method being called, this may be null if synthesizing
136 : /// a property setter or getter.
137 : virtual CodeGen::RValue
138 : GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
139 : QualType ResultType,
140 : Selector Sel,
141 : const ObjCInterfaceDecl *Class,
142 : bool isCategoryImpl,
143 : llvm::Value *Self,
144 : bool IsClassMessage,
145 : const CallArgList &CallArgs,
146 : const ObjCMethodDecl *Method = 0) = 0;
147 :
148 : /// Emit the code to return the named protocol as an object, as in a
149 : /// @protocol expression.
150 : virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
151 : const ObjCProtocolDecl *OPD) = 0;
152 :
153 : /// Generate the named protocol. Protocols contain method metadata but no
154 : /// implementations.
155 : virtual void GenerateProtocol(const ObjCProtocolDecl *OPD) = 0;
156 :
157 : /// Generate a function preamble for a method with the specified
158 : /// types.
159 :
160 : // FIXME: Current this just generates the Function definition, but really this
161 : // should also be generating the loads of the parameters, as the runtime
162 : // should have full control over how parameters are passed.
163 : virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
164 : const ObjCContainerDecl *CD) = 0;
165 :
166 : /// Return the runtime function for getting properties.
167 : virtual llvm::Constant *GetPropertyGetFunction() = 0;
168 :
169 : /// Return the runtime function for setting properties.
170 : virtual llvm::Constant *GetPropertySetFunction() = 0;
171 :
172 : /// GetClass - Return a reference to the class for the given
173 : /// interface decl.
174 : virtual llvm::Value *GetClass(CGBuilderTy &Builder,
175 : const ObjCInterfaceDecl *OID) = 0;
176 :
177 : /// EnumerationMutationFunction - Return the function that's called by the
178 : /// compiler when a mutation is detected during foreach iteration.
179 : virtual llvm::Constant *EnumerationMutationFunction() = 0;
180 :
181 : virtual void EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
182 : const Stmt &S) = 0;
183 : virtual void EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
184 : const ObjCAtThrowStmt &S) = 0;
185 : virtual llvm::Value *EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
186 : llvm::Value *AddrWeakObj) = 0;
187 : virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
188 : llvm::Value *src, llvm::Value *dest) = 0;
189 : virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
190 : llvm::Value *src, llvm::Value *dest) = 0;
191 : virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
192 : llvm::Value *src, llvm::Value *dest,
193 : llvm::Value *ivarOffset) = 0;
194 : virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
195 : llvm::Value *src, llvm::Value *dest) = 0;
196 :
197 : virtual LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
198 : QualType ObjectTy,
199 : llvm::Value *BaseValue,
200 : const ObjCIvarDecl *Ivar,
201 : unsigned CVRQualifiers) = 0;
202 : virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
203 : const ObjCInterfaceDecl *Interface,
204 : const ObjCIvarDecl *Ivar) = 0;
205 : virtual void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
206 : llvm::Value *DestPtr,
207 : llvm::Value *SrcPtr,
208 : QualType Ty) = 0;
209 : };
210 :
211 : /// Creates an instance of an Objective-C runtime class.
212 : //TODO: This should include some way of selecting which runtime to target.
213 : CGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM);
214 : CGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM);
215 : CGObjCRuntime *CreateMacNonFragileABIObjCRuntime(CodeGenModule &CGM);
216 : }
217 : }
218 : #endif
Generated: 2010-02-10 01:31 by zcov