Mercurial > hg > CbC > CbC_gcc
comparison gcc/objc/objc-act.h @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 /* Declarations for objc-act.c. | |
2 Copyright (C) 1990-2017 Free Software Foundation, Inc. | |
3 | |
4 This file is part of GCC. | |
5 | |
6 GCC is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 3, or (at your option) | |
9 any later version. | |
10 | |
11 GCC is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GCC; see the file COPYING3. If not see | |
18 <http://www.gnu.org/licenses/>. */ | |
19 | |
20 | |
21 #ifndef GCC_OBJC_ACT_H | |
22 #define GCC_OBJC_ACT_H | |
23 | |
24 /*** Language hooks ***/ | |
25 | |
26 bool objc_init (void); | |
27 const char *objc_printable_name (tree, int); | |
28 int objc_gimplify_expr (tree *, gimple_seq *, gimple_seq *); | |
29 void objc_common_init_ts (void); | |
30 | |
31 /* NB: The remaining public functions are prototyped in c-common.h, for the | |
32 benefit of stub-objc.c and objc-act.c. */ | |
33 | |
34 /* Objective-C structures */ | |
35 | |
36 #define CLASS_LANG_SLOT_ELTS 7 | |
37 #define PROTOCOL_LANG_SLOT_ELTS 7 | |
38 #define OBJC_INFO_SLOT_ELTS 2 | |
39 | |
40 /* KEYWORD_DECL */ | |
41 #define KEYWORD_KEY_NAME(DECL) (KEYWORD_DECL_CHECK (DECL)->decl_minimal.name) | |
42 #define KEYWORD_ARG_NAME(DECL) (KEYWORD_DECL_CHECK (DECL)->decl_common.size) | |
43 | |
44 #define INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK(NODE) \ | |
45 TREE_CHECK2(NODE,INSTANCE_METHOD_DECL,CLASS_METHOD_DECL) | |
46 | |
47 /* INSTANCE_METHOD_DECL, CLASS_METHOD_DECL */ | |
48 #define METHOD_SEL_NAME(DECL) \ | |
49 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_minimal.name) | |
50 #define METHOD_SEL_ARGS(DECL) \ | |
51 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.size) | |
52 #define METHOD_ADD_ARGS(DECL) \ | |
53 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_non_common.result) | |
54 #define METHOD_ADD_ARGS_ELLIPSIS_P(DECL) \ | |
55 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.lang_flag_0) | |
56 #define METHOD_DEFINITION(DECL) \ | |
57 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.initial) | |
58 #define METHOD_ENCODING(DECL) \ | |
59 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_minimal.context) | |
60 #define METHOD_TYPE_ATTRIBUTES(DECL) \ | |
61 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.abstract_origin) | |
62 #define METHOD_PROPERTY_CONTEXT(DECL) \ | |
63 (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.size_unit) | |
64 | |
65 | |
66 /* PROPERTY_DECL. A PROPERTY_DECL repesents a @property declaration | |
67 (when attached to the list of properties of an interface) or a | |
68 @synthesize or @dynamic declaration (when attached to the list of | |
69 properties of an implementation). */ | |
70 | |
71 /* TREE_TYPE is the type (int, float, etc) of the property. */ | |
72 | |
73 /* DECL_ARTIFICIAL is set to 1 if the PROPERTY_DECL is an artificial | |
74 property declaration created when the dot-syntax object.component | |
75 is used with no actual @property matching the component, but a | |
76 valid getter/setter. */ | |
77 | |
78 /* PROPERTY_NAME is the name of the property. */ | |
79 #define PROPERTY_NAME(DECL) \ | |
80 DECL_NAME(PROPERTY_DECL_CHECK (DECL)) | |
81 | |
82 /* PROPERTY_GETTER_NAME is the identifier of the getter method. */ | |
83 #define PROPERTY_GETTER_NAME(DECL)\ | |
84 (PROPERTY_DECL_CHECK (DECL)->decl_common.size) | |
85 | |
86 /* PROPERTY_SETTER_NAME is the identifier of the setter method. */ | |
87 #define PROPERTY_SETTER_NAME(DECL) \ | |
88 (PROPERTY_DECL_CHECK (DECL)->decl_non_common.result) | |
89 | |
90 /* PROPERTY_READONLY can be 0 or 1. */ | |
91 #define PROPERTY_READONLY(DECL) \ | |
92 DECL_LANG_FLAG_0 (PROPERTY_DECL_CHECK (DECL)) | |
93 | |
94 /* PROPERTY_NONATOMIC can be 0 or 1. */ | |
95 #define PROPERTY_NONATOMIC(DECL) \ | |
96 DECL_LANG_FLAG_1 (PROPERTY_DECL_CHECK (DECL)) | |
97 | |
98 enum objc_property_assign_semantics { | |
99 OBJC_PROPERTY_ASSIGN = 1, | |
100 OBJC_PROPERTY_RETAIN = 2, | |
101 OBJC_PROPERTY_COPY = 3 | |
102 }; | |
103 | |
104 /* PROPERTY_ASSIGN_SEMANTICS can be OBJC_PROPERTY_ASSIGN, | |
105 OBJC_PROPERTY_RETAIN or OBJC_PROPERTY_COPY. We need an integer to | |
106 store it, so we hijack the alignment, that properties don't | |
107 have. */ | |
108 #define PROPERTY_ASSIGN_SEMANTICS(DECL) \ | |
109 (PROPERTY_DECL_CHECK (DECL)->decl_common.align) | |
110 | |
111 /* PROPERTY_IVAR_NAME is the identifier of the instance variable. | |
112 This is set only if the PROPERTY_DECL represents a @synthesize; | |
113 otherwise, it is set to TREE_NULL. */ | |
114 #define PROPERTY_IVAR_NAME(DECL) \ | |
115 (PROPERTY_DECL_CHECK (DECL)->decl_common.initial) | |
116 | |
117 /* PROPERTY_DYNAMIC can be 0 or 1. This is 1 if the PROPERTY_DECL | |
118 represents a @dynamic; otherwise, it is set to 0. */ | |
119 #define PROPERTY_DYNAMIC(DECL) \ | |
120 DECL_LANG_FLAG_2 (PROPERTY_DECL_CHECK (DECL)) | |
121 | |
122 /* PROPERTY_HAS_NO_GETTER can be 0 or 1. Normally it is 0, but if | |
123 this is an artificial PROPERTY_DECL that we generate even without a | |
124 getter, it is set to 1. */ | |
125 #define PROPERTY_HAS_NO_GETTER(DECL) \ | |
126 DECL_LANG_FLAG_3 (PROPERTY_DECL_CHECK (DECL)) | |
127 | |
128 /* PROPERTY_HAS_NO_SETTER can be 0 or 1. Normally it is 0, but if | |
129 this is an artificial PROPERTY_DECL that we generate even without a | |
130 setter, it is set to 1. */ | |
131 #define PROPERTY_HAS_NO_SETTER(DECL) \ | |
132 DECL_LANG_FLAG_4 (PROPERTY_DECL_CHECK (DECL)) | |
133 | |
134 /* PROPERTY_OPTIONAL can be 0 or 1. Normally it is 0, but if this is | |
135 a property declared as @optional in a @protocol, then it is set to | |
136 1. */ | |
137 #define PROPERTY_OPTIONAL(DECL) \ | |
138 DECL_LANG_FLAG_5 (PROPERTY_DECL_CHECK (DECL)) | |
139 | |
140 /* PROPERTY_REF. A PROPERTY_REF represents an 'object.property' | |
141 expression. It is normally used for property access, but when | |
142 the Objective-C 2.0 "dot-syntax" (object.component) is used | |
143 with no matching property, a PROPERTY_REF is still created to | |
144 represent it, with an artificial PROPERTY_DECL. */ | |
145 | |
146 /* PROPERTY_REF_OBJECT is the object whose property we are | |
147 accessing. */ | |
148 #define PROPERTY_REF_OBJECT(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 0) | |
149 | |
150 /* PROPERTY_REF_PROPERTY_DECL is the PROPERTY_DECL for the property | |
151 used in the expression. From it, you can get the property type, | |
152 and the getter/setter names. This PROPERTY_DECL could be artificial | |
153 if we are processing an 'object.component' syntax with no matching | |
154 declared property. */ | |
155 #define PROPERTY_REF_PROPERTY_DECL(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 1) | |
156 | |
157 /* PROPERTY_REF_GETTER_CALL is the getter call expression, ready to | |
158 use at gimplify time if needed. Generating the getter call | |
159 requires modifying the selector table, and, in the case of | |
160 self/super, requires the context to be generated correctly. The | |
161 gimplify stage is too late to do these things, so we generate the | |
162 getter call earlier instead, and keep it here in case we need to | |
163 use it. */ | |
164 #define PROPERTY_REF_GETTER_CALL(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 2) | |
165 | |
166 /* PROPERTY_REF_DEPRECATED_GETTER is normally set to NULL_TREE. If | |
167 the property getter is deprecated, it is set to the method | |
168 prototype for it, which is used to generate the deprecation warning | |
169 when the getter is used. */ | |
170 #define PROPERTY_REF_DEPRECATED_GETTER(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 3) | |
171 | |
172 /* CLASS_INTERFACE_TYPE, CLASS_IMPLEMENTATION_TYPE, | |
173 CATEGORY_INTERFACE_TYPE, CATEGORY_IMPLEMENTATION_TYPE, | |
174 PROTOCOL_INTERFACE_TYPE */ | |
175 /* CLASS_NAME is the name of the class. */ | |
176 #define CLASS_NAME(CLASS) (TYPE_NAME (CLASS)) | |
177 /* CLASS_SUPER_NAME is the name of the superclass, or, in the case of | |
178 categories, it is the name of the category itself. */ | |
179 #define CLASS_SUPER_NAME(CLASS) (TYPE_CONTEXT (CLASS)) | |
180 #define CLASS_IVARS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 0) | |
181 #define CLASS_RAW_IVARS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 1) | |
182 #define CLASS_NST_METHODS(CLASS) (TYPE_MIN_VALUE_RAW (CLASS)) | |
183 #define CLASS_CLS_METHODS(CLASS) (TYPE_MAX_VALUE_RAW (CLASS)) | |
184 #define CLASS_STATIC_TEMPLATE(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 2) | |
185 #define CLASS_CATEGORY_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 3) | |
186 #define CLASS_PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 4) | |
187 #define TOTAL_CLASS_RAW_IVARS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 5) | |
188 #define CLASS_HAS_EXCEPTION_ATTR(CLASS) (TYPE_LANG_FLAG_0 (CLASS)) | |
189 | |
190 #define PROTOCOL_NAME(CLASS) (TYPE_NAME (CLASS)) | |
191 #define PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 0) | |
192 #define PROTOCOL_NST_METHODS(CLASS) (TYPE_MIN_VALUE_RAW (CLASS)) | |
193 #define PROTOCOL_CLS_METHODS(CLASS) (TYPE_MAX_VALUE_RAW (CLASS)) | |
194 #define PROTOCOL_FORWARD_DECL(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 1) | |
195 #define PROTOCOL_DEFINED(CLASS) TREE_USED (CLASS) | |
196 #define PROTOCOL_OPTIONAL_CLS_METHODS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 2) | |
197 #define PROTOCOL_OPTIONAL_NST_METHODS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 3) | |
198 | |
199 /* For CATEGORY_INTERFACE_TYPE, CLASS_INTERFACE_TYPE or PROTOCOL_INTERFACE_TYPE */ | |
200 #define CLASS_PROPERTY_DECL(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 6) | |
201 /* For CLASS_IMPLEMENTATION_TYPE or CATEGORY_IMPLEMENTATION_TYPE. */ | |
202 #define IMPL_PROPERTY_DECL(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 6) | |
203 | |
204 /* TREE_DEPRECATED is used for a CLASS_INTERFACE_TYPE or PROTOCOL_INTERFACE_TYPE. */ | |
205 | |
206 /* TYPE_ATTRIBUTES is used for a CLASS_INTERFACE_TYPE or PROTOCOL_INTERFACE_TYPE. */ | |
207 | |
208 /* ObjC-specific information pertaining to RECORD_TYPEs are stored in | |
209 the LANG_SPECIFIC structures, which may itself need allocating first. */ | |
210 | |
211 /* The following three macros must be overridden (in objcp/objcp-decl.h) | |
212 for Objective-C++. */ | |
213 #define TYPE_OBJC_INFO(TYPE) TYPE_LANG_SPECIFIC (TYPE)->objc_info | |
214 #define SIZEOF_OBJC_TYPE_LANG_SPECIFIC sizeof (struct lang_type) | |
215 #define ALLOC_OBJC_TYPE_LANG_SPECIFIC(NODE) \ | |
216 do { \ | |
217 TYPE_LANG_SPECIFIC (NODE) = ggc_cleared_alloc<struct lang_type> (); \ | |
218 } while (0) | |
219 | |
220 #define TYPE_HAS_OBJC_INFO(TYPE) \ | |
221 (TYPE_LANG_SPECIFIC (TYPE) && TYPE_OBJC_INFO (TYPE)) | |
222 #define TYPE_OBJC_INTERFACE(TYPE) TREE_VEC_ELT (TYPE_OBJC_INFO (TYPE), 0) | |
223 #define TYPE_OBJC_PROTOCOL_LIST(TYPE) TREE_VEC_ELT (TYPE_OBJC_INFO (TYPE), 1) | |
224 | |
225 | |
226 #define INIT_TYPE_OBJC_INFO(TYPE) \ | |
227 do \ | |
228 { \ | |
229 if (!TYPE_LANG_SPECIFIC (TYPE)) \ | |
230 ALLOC_OBJC_TYPE_LANG_SPECIFIC(TYPE); \ | |
231 if (!TYPE_OBJC_INFO (TYPE)) \ | |
232 TYPE_OBJC_INFO (TYPE) \ | |
233 = make_tree_vec (OBJC_INFO_SLOT_ELTS); \ | |
234 } \ | |
235 while (0) | |
236 | |
237 #define DUP_TYPE_OBJC_INFO(DST, SRC) \ | |
238 do \ | |
239 { \ | |
240 ALLOC_OBJC_TYPE_LANG_SPECIFIC(DST); \ | |
241 if (TYPE_LANG_SPECIFIC (SRC)) \ | |
242 memcpy (TYPE_LANG_SPECIFIC (DST), \ | |
243 TYPE_LANG_SPECIFIC (SRC), \ | |
244 SIZEOF_OBJC_TYPE_LANG_SPECIFIC); \ | |
245 TYPE_OBJC_INFO (DST) \ | |
246 = make_tree_vec (OBJC_INFO_SLOT_ELTS); \ | |
247 } \ | |
248 while (0) | |
249 | |
250 #define TYPED_OBJECT(TYPE) \ | |
251 (TREE_CODE (TYPE) == RECORD_TYPE \ | |
252 && TYPE_HAS_OBJC_INFO (TYPE) \ | |
253 && TYPE_OBJC_INTERFACE (TYPE)) | |
254 #define OBJC_TYPE_NAME(TYPE) TYPE_NAME(TYPE) | |
255 #define OBJC_SET_TYPE_NAME(TYPE, NAME) (TYPE_NAME (TYPE) = NAME) | |
256 | |
257 /* Hash tables to manage the global pool of method prototypes. */ | |
258 | |
259 typedef struct hashed_entry *hash; | |
260 typedef struct hashed_attribute *attr; | |
261 | |
262 struct GTY(()) hashed_attribute { | |
263 attr next; | |
264 tree value; | |
265 }; | |
266 | |
267 struct GTY(()) hashed_entry { | |
268 attr list; | |
269 hash next; | |
270 tree key; | |
271 }; | |
272 | |
273 #define SIZEHASHTABLE 257 | |
274 | |
275 /* An array of all the local variables in the current function that | |
276 need to be marked as volatile. */ | |
277 extern GTY(()) vec<tree, va_gc> *local_variables_to_volatilize; | |
278 | |
279 /* Objective-C/Objective-C++ @implementation list. */ | |
280 | |
281 struct GTY(()) imp_entry { | |
282 struct imp_entry *next; | |
283 tree imp_context; | |
284 tree imp_template; | |
285 tree class_decl; /* _OBJC[_v2]_CLASS/CATEGORY_<my_name>; */ | |
286 tree meta_decl; /* _OBJC[_v2]_METACLASS_<my_name>; */ | |
287 BOOL_BITFIELD has_cxx_cdtors : 1; | |
288 }; | |
289 | |
290 extern GTY(()) struct imp_entry *imp_list; | |
291 extern GTY(()) int imp_count; /* `@implementation' */ | |
292 extern GTY(()) int cat_count; /* `@category' */ | |
293 | |
294 extern GTY(()) enum objc_ivar_visibility_kind objc_ivar_visibility; | |
295 | |
296 /* Objective-C/Objective-C++ global tree enumeration. */ | |
297 | |
298 enum objc_tree_index | |
299 { | |
300 OCTI_STATIC_NST, | |
301 OCTI_STATIC_NST_DECL, | |
302 OCTI_SELF_ID, | |
303 OCTI_UCMD_ID, | |
304 | |
305 OCTI_SELF_DECL, | |
306 OCTI_UMSG_DECL, | |
307 OCTI_UMSG_FAST_DECL, | |
308 OCTI_UMSG_SUPER_DECL, | |
309 OCTI_UMSG_STRET_DECL, | |
310 OCTI_UMSG_SUPER_STRET_DECL, | |
311 OCTI_GET_CLASS_DECL, | |
312 OCTI_GET_MCLASS_DECL, | |
313 OCTI_SUPER_TYPE, | |
314 OCTI_SEL_TYPE, | |
315 OCTI_ID_TYPE, | |
316 OCTI_CLS_TYPE, | |
317 OCTI_NST_TYPE, | |
318 OCTI_PROTO_TYPE, | |
319 | |
320 OCTI_INTF_CHAIN, | |
321 OCTI_PROTO_CHAIN, | |
322 OCTI_IMPL_CHAIN, | |
323 OCTI_CLS_REF_CHAIN, | |
324 OCTI_SEL_REF_CHAIN, | |
325 OCTI_IVAR_CHAIN, | |
326 OCTI_CLS_NAMES_CHAIN, | |
327 OCTI_METH_VAR_NAMES_CHAIN, | |
328 OCTI_METH_VAR_TYPES_CHAIN, | |
329 | |
330 OCTI_SYMBOLS_DECL, | |
331 OCTI_NST_VAR_DECL, | |
332 OCTI_CLS_VAR_DECL, | |
333 OCTI_NST_METH_DECL, | |
334 OCTI_CLS_METH_DECL, | |
335 OCTI_CLS_DECL, | |
336 OCTI_MCLS_DECL, | |
337 OCTI_SEL_TABLE_DECL, | |
338 OCTI_MODULES_DECL, | |
339 OCTI_GNU_INIT_DECL, | |
340 | |
341 OCTI_INTF_CTX, | |
342 OCTI_IMPL_CTX, | |
343 OCTI_METH_CTX, | |
344 OCTI_IVAR_CTX, | |
345 | |
346 OCTI_IMPL_TEMPL, | |
347 OCTI_CLS_TEMPL, | |
348 OCTI_CAT_TEMPL, | |
349 OCTI_UPRIV_REC, | |
350 OCTI_PROTO_TEMPL, | |
351 OCTI_SEL_TEMPL, | |
352 OCTI_UCLS_SUPER_REF, | |
353 OCTI_UUCLS_SUPER_REF, | |
354 OCTI_METH_TEMPL, | |
355 OCTI_IVAR_TEMPL, | |
356 OCTI_METH_LIST_TEMPL, | |
357 OCTI_METH_PROTO_LIST_TEMPL, | |
358 OCTI_IVAR_LIST_TEMPL, | |
359 OCTI_SYMTAB_TEMPL, | |
360 OCTI_MODULE_TEMPL, | |
361 OCTI_SUPER_TEMPL, | |
362 OCTI_OBJ_REF, | |
363 OCTI_CLS_REF, | |
364 OCTI_METH_PROTO_TEMPL, | |
365 OCTI_FUNCTION1_TEMPL, | |
366 OCTI_FUNCTION2_TEMPL, | |
367 | |
368 OCTI_OBJ_ID, | |
369 OCTI_CLS_ID, | |
370 OCTI_ID_NAME, | |
371 OCTI_CLASS_NAME, | |
372 OCTI_CNST_STR_ID, | |
373 OCTI_CNST_STR_TYPE, | |
374 OCTI_CNST_STR_GLOB_ID, | |
375 OCTI_STRING_CLASS_DECL, | |
376 OCTI_INTERNAL_CNST_STR_TYPE, | |
377 OCTI_SUPER_DECL, | |
378 OCTI_SUPER_SUPERFIELD_ID, | |
379 OCTI_UMSG_NONNIL_DECL, | |
380 OCTI_UMSG_NONNIL_STRET_DECL, | |
381 OCTI_STORAGE_CLS, | |
382 OCTI_EXCEPTION_EXTRACT_DECL, | |
383 OCTI_EXCEPTION_TRY_ENTER_DECL, | |
384 OCTI_EXCEPTION_TRY_EXIT_DECL, | |
385 OCTI_EXCEPTION_MATCH_DECL, | |
386 OCTI_EXCEPTION_THROW_DECL, | |
387 OCTI_SYNC_ENTER_DECL, | |
388 OCTI_SYNC_EXIT_DECL, | |
389 OCTI_SETJMP_DECL, | |
390 OCTI_EXCDATA_TEMPL, | |
391 OCTI_STACK_EXCEPTION_DATA_DECL, | |
392 OCTI_LOCAL_EXCEPTION_DECL, | |
393 OCTI_RETHROW_EXCEPTION_DECL, | |
394 OCTI_EVAL_ONCE_DECL, | |
395 OCTI_CATCH_TYPE, | |
396 OCTI_EXECCLASS_DECL, | |
397 | |
398 OCTI_ASSIGN_IVAR_DECL, | |
399 OCTI_ASSIGN_IVAR_FAST_DECL, | |
400 OCTI_ASSIGN_GLOBAL_DECL, | |
401 OCTI_ASSIGN_STRONGCAST_DECL, | |
402 | |
403 OCTI_FAST_ENUM_STATE_TEMP, | |
404 OCTI_ENUM_MUTATION_DECL, | |
405 | |
406 OCTI_GET_PROPERTY_DECL, | |
407 OCTI_SET_PROPERTY_DECL, | |
408 OCTI_COPY_STRUCT_DECL, | |
409 OCTI_GET_PROPERTY_STRUCT_DECL, | |
410 OCTI_SET_PROPERTY_STRUCT_DECL, | |
411 | |
412 /* TODO: Add comment. */ | |
413 /* "V1" stuff. */ | |
414 OCTI_V1_PROP_LIST_TEMPL, | |
415 OCTI_V1_PROP_NAME_ATTR_CHAIN, | |
416 | |
417 OCTI_MAX | |
418 }; | |
419 | |
420 extern GTY(()) tree objc_global_trees[OCTI_MAX]; | |
421 | |
422 /* List of classes with list of their static instances. */ | |
423 #define objc_static_instances objc_global_trees[OCTI_STATIC_NST] | |
424 | |
425 /* The declaration of the array administrating the static instances. */ | |
426 #define static_instances_decl objc_global_trees[OCTI_STATIC_NST_DECL] | |
427 | |
428 /* Some commonly used instances of "identifier_node". */ | |
429 | |
430 #define self_id objc_global_trees[OCTI_SELF_ID] | |
431 #define ucmd_id objc_global_trees[OCTI_UCMD_ID] | |
432 | |
433 #define self_decl objc_global_trees[OCTI_SELF_DECL] | |
434 #define umsg_decl objc_global_trees[OCTI_UMSG_DECL] | |
435 #define umsg_fast_decl objc_global_trees[OCTI_UMSG_FAST_DECL] | |
436 #define umsg_super_decl objc_global_trees[OCTI_UMSG_SUPER_DECL] | |
437 #define umsg_stret_decl objc_global_trees[OCTI_UMSG_STRET_DECL] | |
438 #define umsg_super_stret_decl objc_global_trees[OCTI_UMSG_SUPER_STRET_DECL] | |
439 #define objc_get_class_decl objc_global_trees[OCTI_GET_CLASS_DECL] | |
440 #define objc_get_meta_class_decl \ | |
441 objc_global_trees[OCTI_GET_MCLASS_DECL] | |
442 | |
443 #define objc_super_type objc_global_trees[OCTI_SUPER_TYPE] | |
444 #define objc_selector_type objc_global_trees[OCTI_SEL_TYPE] | |
445 #define objc_object_type objc_global_trees[OCTI_ID_TYPE] | |
446 #define objc_class_type objc_global_trees[OCTI_CLS_TYPE] | |
447 #define objc_instance_type objc_global_trees[OCTI_NST_TYPE] | |
448 #define objc_protocol_type objc_global_trees[OCTI_PROTO_TYPE] | |
449 | |
450 /* Type checking macros. */ | |
451 | |
452 #define IS_ID(TYPE) \ | |
453 (TREE_CODE (TYPE) == POINTER_TYPE \ | |
454 && (TYPE_MAIN_VARIANT (TREE_TYPE (TYPE)) \ | |
455 == TREE_TYPE (objc_object_type))) | |
456 | |
457 #define IS_CLASS(TYPE) \ | |
458 (TREE_CODE (TYPE) == POINTER_TYPE \ | |
459 && (TYPE_MAIN_VARIANT (TREE_TYPE (TYPE)) \ | |
460 == TREE_TYPE (objc_class_type))) | |
461 | |
462 #define IS_PROTOCOL_QUALIFIED_UNTYPED(TYPE) \ | |
463 ((IS_ID (TYPE) || IS_CLASS (TYPE)) \ | |
464 && TYPE_HAS_OBJC_INFO (TREE_TYPE (TYPE)) \ | |
465 && TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (TYPE))) | |
466 | |
467 #define IS_SUPER(TYPE) \ | |
468 (TREE_CODE (TYPE) == POINTER_TYPE \ | |
469 && TREE_TYPE (TYPE) == objc_super_template) | |
470 | |
471 #define interface_chain objc_global_trees[OCTI_INTF_CHAIN] | |
472 #define protocol_chain objc_global_trees[OCTI_PROTO_CHAIN] | |
473 #define implemented_classes objc_global_trees[OCTI_IMPL_CHAIN] | |
474 | |
475 /* Chains to manage selectors that are referenced and defined in the | |
476 module. */ | |
477 | |
478 #define cls_ref_chain objc_global_trees[OCTI_CLS_REF_CHAIN] /* Classes referenced. */ | |
479 #define sel_ref_chain objc_global_trees[OCTI_SEL_REF_CHAIN] /* Selectors referenced. */ | |
480 #define objc_ivar_chain objc_global_trees[OCTI_IVAR_CHAIN] | |
481 | |
482 /* Chains to manage uniquing of strings. */ | |
483 | |
484 #define class_names_chain objc_global_trees[OCTI_CLS_NAMES_CHAIN] | |
485 #define meth_var_names_chain objc_global_trees[OCTI_METH_VAR_NAMES_CHAIN] | |
486 #define meth_var_types_chain objc_global_trees[OCTI_METH_VAR_TYPES_CHAIN] | |
487 | |
488 | |
489 /* Backend data declarations. */ | |
490 | |
491 #define UOBJC_SYMBOLS_decl objc_global_trees[OCTI_SYMBOLS_DECL] | |
492 #define UOBJC_INSTANCE_VARIABLES_decl objc_global_trees[OCTI_NST_VAR_DECL] | |
493 #define UOBJC_CLASS_VARIABLES_decl objc_global_trees[OCTI_CLS_VAR_DECL] | |
494 #define UOBJC_INSTANCE_METHODS_decl objc_global_trees[OCTI_NST_METH_DECL] | |
495 #define UOBJC_CLASS_METHODS_decl objc_global_trees[OCTI_CLS_METH_DECL] | |
496 #define UOBJC_CLASS_decl objc_global_trees[OCTI_CLS_DECL] | |
497 #define UOBJC_METACLASS_decl objc_global_trees[OCTI_MCLS_DECL] | |
498 #define UOBJC_SELECTOR_TABLE_decl objc_global_trees[OCTI_SEL_TABLE_DECL] | |
499 #define UOBJC_MODULES_decl objc_global_trees[OCTI_MODULES_DECL] | |
500 #define GNU_INIT_decl objc_global_trees[OCTI_GNU_INIT_DECL] | |
501 | |
502 /* The following are used when compiling a class implementation. | |
503 implementation_template will normally be an interface, however if | |
504 none exists this will be equal to objc_implementation_context...it is | |
505 set in start_class. */ | |
506 | |
507 #define objc_interface_context objc_global_trees[OCTI_INTF_CTX] | |
508 #define objc_implementation_context objc_global_trees[OCTI_IMPL_CTX] | |
509 #define objc_method_context objc_global_trees[OCTI_METH_CTX] | |
510 #define objc_ivar_context objc_global_trees[OCTI_IVAR_CTX] | |
511 | |
512 #define implementation_template objc_global_trees[OCTI_IMPL_TEMPL] | |
513 #define objc_class_template objc_global_trees[OCTI_CLS_TEMPL] | |
514 #define objc_category_template objc_global_trees[OCTI_CAT_TEMPL] | |
515 #define uprivate_record objc_global_trees[OCTI_UPRIV_REC] | |
516 #define objc_protocol_template objc_global_trees[OCTI_PROTO_TEMPL] | |
517 #define objc_selector_template objc_global_trees[OCTI_SEL_TEMPL] | |
518 #define ucls_super_ref objc_global_trees[OCTI_UCLS_SUPER_REF] | |
519 #define uucls_super_ref objc_global_trees[OCTI_UUCLS_SUPER_REF] | |
520 | |
521 #define umsg_nonnil_decl objc_global_trees[OCTI_UMSG_NONNIL_DECL] | |
522 #define umsg_nonnil_stret_decl objc_global_trees[OCTI_UMSG_NONNIL_STRET_DECL] | |
523 #define objc_storage_class objc_global_trees[OCTI_STORAGE_CLS] | |
524 #define objc_exception_extract_decl \ | |
525 objc_global_trees[OCTI_EXCEPTION_EXTRACT_DECL] | |
526 #define objc_exception_try_enter_decl \ | |
527 objc_global_trees[OCTI_EXCEPTION_TRY_ENTER_DECL] | |
528 #define objc_exception_try_exit_decl \ | |
529 objc_global_trees[OCTI_EXCEPTION_TRY_EXIT_DECL] | |
530 #define objc_exception_match_decl \ | |
531 objc_global_trees[OCTI_EXCEPTION_MATCH_DECL] | |
532 #define objc_exception_throw_decl \ | |
533 objc_global_trees[OCTI_EXCEPTION_THROW_DECL] | |
534 #define objc_sync_enter_decl objc_global_trees[OCTI_SYNC_ENTER_DECL] | |
535 #define objc_sync_exit_decl objc_global_trees[OCTI_SYNC_EXIT_DECL] | |
536 #define objc_exception_data_template \ | |
537 objc_global_trees[OCTI_EXCDATA_TEMPL] | |
538 #define objc_setjmp_decl objc_global_trees[OCTI_SETJMP_DECL] | |
539 #define objc_stack_exception_data \ | |
540 objc_global_trees[OCTI_STACK_EXCEPTION_DATA_DECL] | |
541 #define objc_caught_exception objc_global_trees[OCTI_LOCAL_EXCEPTION_DECL] | |
542 #define objc_rethrow_exception objc_global_trees[OCTI_RETHROW_EXCEPTION_DECL] | |
543 #define objc_eval_once objc_global_trees[OCTI_EVAL_ONCE_DECL] | |
544 #define objc_catch_type objc_global_trees[OCTI_CATCH_TYPE] | |
545 | |
546 #define execclass_decl objc_global_trees[OCTI_EXECCLASS_DECL] | |
547 | |
548 #define objc_assign_ivar_decl objc_global_trees[OCTI_ASSIGN_IVAR_DECL] | |
549 #define objc_assign_ivar_fast_decl \ | |
550 objc_global_trees[OCTI_ASSIGN_IVAR_FAST_DECL] | |
551 #define objc_assign_global_decl objc_global_trees[OCTI_ASSIGN_GLOBAL_DECL] | |
552 #define objc_assign_strong_cast_decl \ | |
553 objc_global_trees[OCTI_ASSIGN_STRONGCAST_DECL] | |
554 | |
555 #define objc_method_template objc_global_trees[OCTI_METH_TEMPL] | |
556 #define objc_ivar_template objc_global_trees[OCTI_IVAR_TEMPL] | |
557 #define objc_method_list_ptr objc_global_trees[OCTI_METH_LIST_TEMPL] | |
558 #define objc_method_proto_list_ptr \ | |
559 objc_global_trees[OCTI_METH_PROTO_LIST_TEMPL] | |
560 #define objc_ivar_list_ptr objc_global_trees[OCTI_IVAR_LIST_TEMPL] | |
561 #define objc_symtab_template objc_global_trees[OCTI_SYMTAB_TEMPL] | |
562 #define objc_module_template objc_global_trees[OCTI_MODULE_TEMPL] | |
563 #define objc_super_template objc_global_trees[OCTI_SUPER_TEMPL] | |
564 #define objc_object_reference objc_global_trees[OCTI_OBJ_REF] | |
565 #define objc_class_reference objc_global_trees[OCTI_CLS_REF] | |
566 #define objc_method_prototype_template \ | |
567 objc_global_trees[OCTI_METH_PROTO_TEMPL] | |
568 #define function1_template objc_global_trees[OCTI_FUNCTION1_TEMPL] | |
569 #define function2_template objc_global_trees[OCTI_FUNCTION2_TEMPL] | |
570 | |
571 #define objc_object_id objc_global_trees[OCTI_OBJ_ID] | |
572 #define objc_class_id objc_global_trees[OCTI_CLS_ID] | |
573 #define objc_object_name objc_global_trees[OCTI_ID_NAME] | |
574 #define objc_class_name objc_global_trees[OCTI_CLASS_NAME] | |
575 | |
576 /* Constant string classes. */ | |
577 #define constant_string_id objc_global_trees[OCTI_CNST_STR_ID] | |
578 #define constant_string_type objc_global_trees[OCTI_CNST_STR_TYPE] | |
579 #define constant_string_global_id \ | |
580 objc_global_trees[OCTI_CNST_STR_GLOB_ID] | |
581 #define string_class_decl objc_global_trees[OCTI_STRING_CLASS_DECL] | |
582 #define internal_const_str_type objc_global_trees[OCTI_INTERNAL_CNST_STR_TYPE] | |
583 | |
584 #define UOBJC_SUPER_decl objc_global_trees[OCTI_SUPER_DECL] | |
585 #define super_superclassfield_id \ | |
586 objc_global_trees[OCTI_SUPER_SUPERFIELD_ID] | |
587 | |
588 #define objc_fast_enumeration_state_template \ | |
589 objc_global_trees[OCTI_FAST_ENUM_STATE_TEMP] | |
590 #define objc_enumeration_mutation_decl \ | |
591 objc_global_trees[OCTI_ENUM_MUTATION_DECL] | |
592 | |
593 /* Declarations of functions used when synthesizing property | |
594 accessors. */ | |
595 #define objc_getProperty_decl objc_global_trees[OCTI_GET_PROPERTY_DECL] | |
596 #define objc_setProperty_decl objc_global_trees[OCTI_SET_PROPERTY_DECL] | |
597 #define objc_copyStruct_decl objc_global_trees[OCTI_COPY_STRUCT_DECL] | |
598 #define objc_getPropertyStruct_decl \ | |
599 objc_global_trees[OCTI_GET_PROPERTY_STRUCT_DECL] | |
600 #define objc_setPropertyStruct_decl \ | |
601 objc_global_trees[OCTI_SET_PROPERTY_STRUCT_DECL] | |
602 | |
603 /* TODO: Add comment. */ | |
604 /* V1 stuff. */ | |
605 #define objc_prop_list_ptr objc_global_trees[OCTI_V1_PROP_LIST_TEMPL] | |
606 #define prop_names_attr_chain objc_global_trees[OCTI_V1_PROP_NAME_ATTR_CHAIN] | |
607 | |
608 /* Reserved tag definitions. */ | |
609 | |
610 #define OBJECT_TYPEDEF_NAME "id" | |
611 #define CLASS_TYPEDEF_NAME "Class" | |
612 | |
613 #define TAG_OBJECT "objc_object" | |
614 #define TAG_CLASS "objc_class" | |
615 #define TAG_SUPER "objc_super" | |
616 #define TAG_SELECTOR "objc_selector" | |
617 | |
618 #define UTAG_CLASS "_objc_class" | |
619 #define UTAG_IVAR "_objc_ivar" | |
620 #define UTAG_IVAR_LIST "_objc_ivar_list" | |
621 #define UTAG_METHOD "_objc_method" | |
622 #define UTAG_METHOD_LIST "_objc_method_list" | |
623 #define UTAG_CATEGORY "_objc_category" | |
624 #define UTAG_MODULE "_objc_module" | |
625 #define UTAG_SYMTAB "_objc_symtab" | |
626 #define UTAG_SUPER "_objc_super" | |
627 #define UTAG_SELECTOR "_objc_selector" | |
628 | |
629 #define UTAG_PROTOCOL "_objc_protocol" | |
630 #define UTAG_METHOD_PROTOTYPE "_objc_method_prototype" | |
631 #define UTAG_METHOD_PROTOTYPE_LIST "_objc__method_prototype_list" | |
632 | |
633 #define PROTOCOL_OBJECT_CLASS_NAME "Protocol" | |
634 | |
635 #define TAG_EXCEPTIONTHROW "objc_exception_throw" | |
636 #define TAG_SYNCENTER "objc_sync_enter" | |
637 #define TAG_SYNCEXIT "objc_sync_exit" | |
638 | |
639 /* Really should be NeXT private. */ | |
640 #define UTAG_EXCDATA "_objc_exception_data" | |
641 | |
642 #define TAG_CXX_CONSTRUCT ".cxx_construct" | |
643 #define TAG_CXX_DESTRUCT ".cxx_destruct" | |
644 | |
645 #define TAG_ENUMERATION_MUTATION "objc_enumerationMutation" | |
646 #define TAG_FAST_ENUMERATION_STATE "__objcFastEnumerationState" | |
647 | |
648 enum string_section | |
649 { | |
650 class_names, /* class, category, protocol, module names */ | |
651 meth_var_names, /* method and variable names */ | |
652 meth_var_types, /* method and variable type descriptors */ | |
653 prop_names_attr /* property names and their attributes. */ | |
654 }; | |
655 | |
656 #define METHOD_DEF 0 | |
657 #define METHOD_REF 1 | |
658 | |
659 #define BUFSIZE 1024 | |
660 | |
661 #define CLS_FACTORY 0x0001L | |
662 #define CLS_META 0x0002L | |
663 | |
664 /* Runtime metadata flags - ??? apparently unused. */ | |
665 | |
666 #define OBJC_MODIFIER_STATIC 0x00000001 | |
667 #define OBJC_MODIFIER_FINAL 0x00000002 | |
668 #define OBJC_MODIFIER_PUBLIC 0x00000004 | |
669 #define OBJC_MODIFIER_PRIVATE 0x00000008 | |
670 #define OBJC_MODIFIER_PROTECTED 0x00000010 | |
671 #define OBJC_MODIFIER_NATIVE 0x00000020 | |
672 #define OBJC_MODIFIER_SYNCHRONIZED 0x00000040 | |
673 #define OBJC_MODIFIER_ABSTRACT 0x00000080 | |
674 #define OBJC_MODIFIER_VOLATILE 0x00000100 | |
675 #define OBJC_MODIFIER_TRANSIENT 0x00000200 | |
676 #define OBJC_MODIFIER_NONE_SPECIFIED 0x80000000 | |
677 | |
678 /* Exception handling constructs. We begin by having the parser do most | |
679 of the work and passing us blocks. | |
680 This allows us to handle different exceptions implementations. */ | |
681 | |
682 /* Stack of open try blocks. */ | |
683 | |
684 struct objc_try_context | |
685 { | |
686 struct objc_try_context *outer; | |
687 | |
688 /* Statements (or statement lists) as processed by the parser. */ | |
689 tree try_body; | |
690 tree finally_body; | |
691 | |
692 /* Some file position locations. */ | |
693 location_t try_locus; | |
694 location_t end_try_locus; | |
695 location_t end_catch_locus; | |
696 location_t finally_locus; | |
697 location_t end_finally_locus; | |
698 | |
699 /* A STATEMENT_LIST of CATCH_EXPRs, appropriate for sticking into op1 | |
700 of a TRY_CATCH_EXPR. Even when doing Darwin setjmp. */ | |
701 tree catch_list; | |
702 | |
703 /* The CATCH_EXPR of an open @catch clause. */ | |
704 tree current_catch; | |
705 | |
706 /* The VAR_DECL holding __builtin_eh_pointer (or equivalent). */ | |
707 tree caught_decl; | |
708 tree stack_decl; | |
709 tree rethrow_decl; | |
710 }; | |
711 | |
712 /* A small number of routines used by the FE parser and the runtime code | |
713 generators. Put here as inlines for efficiency in non-lto builds rather | |
714 than making them externs. */ | |
715 | |
716 extern tree objc_create_temporary_var (tree, const char *); | |
717 | |
718 size_t objc_common_tree_size (enum tree_code code); | |
719 | |
720 | |
721 #define objc_is_object_id(TYPE) (OBJC_TYPE_NAME (TYPE) == objc_object_id) | |
722 #define objc_is_class_id(TYPE) (OBJC_TYPE_NAME (TYPE) == objc_class_id) | |
723 | |
724 /* Retrieve category interface CAT_NAME (if any) associated with CLASS. */ | |
725 static inline tree | |
726 lookup_category (tree klass, tree cat_name) | |
727 { | |
728 tree category = CLASS_CATEGORY_LIST (klass); | |
729 | |
730 while (category && CLASS_SUPER_NAME (category) != cat_name) | |
731 category = CLASS_CATEGORY_LIST (category); | |
732 return category; | |
733 } | |
734 | |
735 /* Count only the fields occurring in T. */ | |
736 static inline int | |
737 ivar_list_length (tree t) | |
738 { | |
739 int count = 0; | |
740 | |
741 for (; t; t = DECL_CHAIN (t)) | |
742 if (TREE_CODE (t) == FIELD_DECL) | |
743 ++count; | |
744 | |
745 return count; | |
746 } | |
747 | |
748 static inline tree | |
749 is_ivar (tree decl_chain, tree ident) | |
750 { | |
751 for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain)) | |
752 if (DECL_NAME (decl_chain) == ident) | |
753 return decl_chain; | |
754 return NULL_TREE; | |
755 } | |
756 | |
757 #endif /* GCC_OBJC_ACT_H */ |