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