annotate gcc/objc/objc-act.h @ 158:494b0b89df80 default tip

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