annotate gcc/ada/gcc-interface/gigi.h @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /****************************************************************************
kono
parents:
diff changeset
2 * *
kono
parents:
diff changeset
3 * GNAT COMPILER COMPONENTS *
kono
parents:
diff changeset
4 * *
kono
parents:
diff changeset
5 * G I G I *
kono
parents:
diff changeset
6 * *
kono
parents:
diff changeset
7 * C Header File *
kono
parents:
diff changeset
8 * *
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 * Copyright (C) 1992-2018, Free Software Foundation, Inc. *
111
kono
parents:
diff changeset
10 * *
kono
parents:
diff changeset
11 * GNAT is free software; you can redistribute it and/or modify it under *
kono
parents:
diff changeset
12 * terms of the GNU General Public License as published by the Free Soft- *
kono
parents:
diff changeset
13 * ware Foundation; either version 3, or (at your option) any later ver- *
kono
parents:
diff changeset
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
kono
parents:
diff changeset
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
kono
parents:
diff changeset
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
kono
parents:
diff changeset
17 * for more details. You should have received a copy of the GNU General *
kono
parents:
diff changeset
18 * Public License distributed with GNAT; see file COPYING3. If not see *
kono
parents:
diff changeset
19 * <http://www.gnu.org/licenses/>. *
kono
parents:
diff changeset
20 * *
kono
parents:
diff changeset
21 * GNAT was originally developed by the GNAT team at New York University. *
kono
parents:
diff changeset
22 * Extensive contributions were provided by Ada Core Technologies Inc. *
kono
parents:
diff changeset
23 * *
kono
parents:
diff changeset
24 ****************************************************************************/
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 /* Declare all functions and types used by gigi. */
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 /* Given GNAT_ENTITY, a GNAT defining identifier node, which denotes some Ada
kono
parents:
diff changeset
29 entity, this routine returns the equivalent GCC tree for that entity
kono
parents:
diff changeset
30 (an ..._DECL node) and associates the ..._DECL node with the input GNAT
kono
parents:
diff changeset
31 defining identifier.
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 If GNAT_ENTITY is a variable or a constant declaration, GNU_EXPR gives its
kono
parents:
diff changeset
34 initial value (in GCC tree form). This is optional for variables.
kono
parents:
diff changeset
35 For renamed entities, GNU_EXPR gives the object being renamed.
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 DEFINITION is true if this call is intended for a definition. This is used
kono
parents:
diff changeset
38 for separate compilation where it is necessary to know whether an external
kono
parents:
diff changeset
39 declaration or a definition must be created if the GCC equivalent was not
kono
parents:
diff changeset
40 created previously. */
kono
parents:
diff changeset
41 extern tree gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr,
kono
parents:
diff changeset
42 bool definition);
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 /* Similar, but if the returned value is a COMPONENT_REF, return the
kono
parents:
diff changeset
45 FIELD_DECL. */
kono
parents:
diff changeset
46 extern tree gnat_to_gnu_field_decl (Entity_Id gnat_entity);
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 /* Similar, but GNAT_ENTITY is assumed to refer to a GNAT type. Return
kono
parents:
diff changeset
49 the GCC type corresponding to that entity. */
kono
parents:
diff changeset
50 extern tree gnat_to_gnu_type (Entity_Id gnat_entity);
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 /* Update the GCC tree previously built for the profiles involving GNU_TYPE,
kono
parents:
diff changeset
53 a dummy type which appears in profiles. */
kono
parents:
diff changeset
54 extern void update_profiles_with (tree gnu_type);
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 /* Start a new statement group chained to the previous group. */
kono
parents:
diff changeset
57 extern void start_stmt_group (void);
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 /* Add GNU_STMT to the current statement group. If it is an expression with
kono
parents:
diff changeset
60 no effects, it is ignored. */
kono
parents:
diff changeset
61 extern void add_stmt (tree gnu_stmt);
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* Similar, but the statement is always added, regardless of side-effects. */
kono
parents:
diff changeset
64 extern void add_stmt_force (tree gnu_stmt);
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 /* Like add_stmt, but set the location of GNU_STMT to that of GNAT_NODE. */
kono
parents:
diff changeset
67 extern void add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node);
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 /* Similar, but the statement is always added, regardless of side-effects. */
kono
parents:
diff changeset
70 extern void add_stmt_with_node_force (tree gnu_stmt, Node_Id gnat_node);
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 /* Return code corresponding to the current code group. It is normally
kono
parents:
diff changeset
73 a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
kono
parents:
diff changeset
74 BLOCK or cleanups were set. */
kono
parents:
diff changeset
75 extern tree end_stmt_group (void);
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 /* Set the BLOCK node corresponding to the current code group to GNU_BLOCK. */
kono
parents:
diff changeset
78 extern void set_block_for_group (tree);
kono
parents:
diff changeset
79
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 /* Add a declaration statement for GNU_DECL to the current statement group.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 Get the SLOC to be put onto the statement from GNAT_NODE. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 extern void add_decl_expr (tree gnu_decl, Node_Id gnat_node);
111
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 /* Mark nodes rooted at T with TREE_VISITED and types as having their
kono
parents:
diff changeset
85 sized gimplified. We use this to indicate all variable sizes and
kono
parents:
diff changeset
86 positions in global types may not be shared by any subprogram. */
kono
parents:
diff changeset
87 extern void mark_visited (tree t);
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 /* This macro calls the above function but short-circuits the common
kono
parents:
diff changeset
90 case of a constant to save time and also checks for NULL. */
kono
parents:
diff changeset
91 #define MARK_VISITED(EXP) \
kono
parents:
diff changeset
92 do { \
kono
parents:
diff changeset
93 if((EXP) && !CONSTANT_CLASS_P (EXP)) \
kono
parents:
diff changeset
94 mark_visited (EXP); \
kono
parents:
diff changeset
95 } while (0)
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 /* Finalize the processing of From_Limited_With incomplete types. */
kono
parents:
diff changeset
98 extern void finalize_from_limited_with (void);
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 /* Return the equivalent type to be used for GNAT_ENTITY, if it's a kind
kono
parents:
diff changeset
101 of type (such E_Task_Type) that has a different type which Gigi uses
kono
parents:
diff changeset
102 for its representation. If the type does not have a special type for
kono
parents:
diff changeset
103 its representation, return GNAT_ENTITY. */
kono
parents:
diff changeset
104 extern Entity_Id Gigi_Equivalent_Type (Entity_Id gnat_entity);
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 /* Given GNAT_ENTITY, elaborate all expressions that are required to
kono
parents:
diff changeset
107 be elaborated at the point of its definition, but do nothing else. */
kono
parents:
diff changeset
108 extern void elaborate_entity (Entity_Id gnat_entity);
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 /* Get the unpadded version of a GNAT type. */
kono
parents:
diff changeset
111 extern tree get_unpadded_type (Entity_Id gnat_entity);
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 /* Create a record type that contains a SIZE bytes long field of TYPE with a
kono
parents:
diff changeset
114 starting bit position so that it is aligned to ALIGN bits, and leaving at
kono
parents:
diff changeset
115 least ROOM bytes free before the field. BASE_ALIGN is the alignment the
kono
parents:
diff changeset
116 record is guaranteed to get. GNAT_NODE is used for the position of the
kono
parents:
diff changeset
117 associated TYPE_DECL. */
kono
parents:
diff changeset
118 extern tree make_aligning_type (tree type, unsigned int align, tree size,
kono
parents:
diff changeset
119 unsigned int base_align, int room, Node_Id);
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 /* TYPE is a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE that is being used
kono
parents:
diff changeset
122 as the field type of a packed record if IN_RECORD is true, or as the
kono
parents:
diff changeset
123 component type of a packed array if IN_RECORD is false. See if we can
kono
parents:
diff changeset
124 rewrite it either as a type that has a non-BLKmode, which we can pack
kono
parents:
diff changeset
125 tighter in the packed record case, or as a smaller type with at most
kono
parents:
diff changeset
126 MAX_ALIGN alignment if the value is non-zero. If so, return the new
kono
parents:
diff changeset
127 type; if not, return the original type. */
kono
parents:
diff changeset
128 extern tree make_packable_type (tree type, bool in_record,
kono
parents:
diff changeset
129 unsigned int max_align = 0);
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 /* Given a type TYPE, return a new type whose size is appropriate for SIZE.
kono
parents:
diff changeset
132 If TYPE is the best type, return it. Otherwise, make a new type. We
kono
parents:
diff changeset
133 only support new integral and pointer types. FOR_BIASED is true if
kono
parents:
diff changeset
134 we are making a biased type. */
kono
parents:
diff changeset
135 extern tree make_type_from_size (tree type, tree size_tree, bool for_biased);
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 /* Ensure that TYPE has SIZE and ALIGN. Make and return a new padded type
kono
parents:
diff changeset
138 if needed. We have already verified that SIZE and ALIGN are large enough.
kono
parents:
diff changeset
139 GNAT_ENTITY is used to name the resulting record and to issue a warning.
kono
parents:
diff changeset
140 IS_COMPONENT_TYPE is true if this is being done for the component type of
kono
parents:
diff changeset
141 an array. IS_USER_TYPE is true if the original type needs to be completed.
kono
parents:
diff changeset
142 DEFINITION is true if this type is being defined. SET_RM_SIZE is true if
kono
parents:
diff changeset
143 the RM size of the resulting type is to be set to SIZE too; in this case,
kono
parents:
diff changeset
144 the padded type is canonicalized before being returned. */
kono
parents:
diff changeset
145 extern tree maybe_pad_type (tree type, tree size, unsigned int align,
kono
parents:
diff changeset
146 Entity_Id gnat_entity, bool is_component_type,
kono
parents:
diff changeset
147 bool is_user_type, bool definition,
kono
parents:
diff changeset
148 bool set_rm_size);
kono
parents:
diff changeset
149
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 /* Return true if padded TYPE was built with an RM size. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
151 extern bool pad_type_has_rm_size (tree type);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152
111
kono
parents:
diff changeset
153 /* Return a copy of the padded TYPE but with reverse storage order. */
kono
parents:
diff changeset
154 extern tree set_reverse_storage_order_on_pad_type (tree type);
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 enum alias_set_op
kono
parents:
diff changeset
157 {
kono
parents:
diff changeset
158 ALIAS_SET_COPY,
kono
parents:
diff changeset
159 ALIAS_SET_SUBSET,
kono
parents:
diff changeset
160 ALIAS_SET_SUPERSET
kono
parents:
diff changeset
161 };
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 /* Relate the alias sets of GNU_NEW_TYPE and GNU_OLD_TYPE according to OP.
kono
parents:
diff changeset
164 If this is a multi-dimensional array type, do this recursively.
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 OP may be
kono
parents:
diff changeset
167 - ALIAS_SET_COPY: the new set is made a copy of the old one.
kono
parents:
diff changeset
168 - ALIAS_SET_SUPERSET: the new set is made a superset of the old one.
kono
parents:
diff changeset
169 - ALIAS_SET_SUBSET: the new set is made a subset of the old one. */
kono
parents:
diff changeset
170 extern void relate_alias_sets (tree gnu_new_type, tree gnu_old_type,
kono
parents:
diff changeset
171 enum alias_set_op op);
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 /* Given GNAT_ENTITY, an object (constant, variable, parameter, exception)
kono
parents:
diff changeset
174 and GNU_TYPE, its corresponding GCC type, set Esize and Alignment to the
kono
parents:
diff changeset
175 size and alignment used by Gigi. Prefer SIZE over TYPE_SIZE if non-null.
kono
parents:
diff changeset
176 BY_REF is true if the object is used by reference. */
kono
parents:
diff changeset
177 extern void annotate_object (Entity_Id gnat_entity, tree gnu_type, tree size,
kono
parents:
diff changeset
178 bool by_ref);
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 /* Return the variant part of RECORD_TYPE, if any. Otherwise return NULL. */
kono
parents:
diff changeset
181 extern tree get_variant_part (tree record_type);
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 /* Given a type T, a FIELD_DECL F, and a replacement value R, return a new
kono
parents:
diff changeset
184 type with all size expressions that contain F updated by replacing F
kono
parents:
diff changeset
185 with R. If F is NULL_TREE, always make a new RECORD_TYPE, even if
kono
parents:
diff changeset
186 nothing has changed. */
kono
parents:
diff changeset
187 extern tree substitute_in_type (tree t, tree f, tree r);
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 /* Return the RM size of GNU_TYPE. This is the actual number of bits
kono
parents:
diff changeset
190 needed to represent the object. */
kono
parents:
diff changeset
191 extern tree rm_size (tree gnu_type);
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 /* Return the name to be used for GNAT_ENTITY. If a type, create a
kono
parents:
diff changeset
194 fully-qualified name, possibly with type information encoding.
kono
parents:
diff changeset
195 Otherwise, return the name. */
kono
parents:
diff changeset
196 extern tree get_entity_name (Entity_Id gnat_entity);
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 /* Return an identifier representing the external name to be used for
kono
parents:
diff changeset
199 GNAT_ENTITY. If SUFFIX is specified, the name is followed by "___"
kono
parents:
diff changeset
200 and the specified suffix. */
kono
parents:
diff changeset
201 extern tree create_concat_name (Entity_Id gnat_entity, const char *suffix);
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 /* Given GNU_NAME, an IDENTIFIER_NODE containing a name and SUFFIX, a
kono
parents:
diff changeset
204 string, return a new IDENTIFIER_NODE that is the concatenation of
kono
parents:
diff changeset
205 the name followed by "___" and the specified suffix. */
kono
parents:
diff changeset
206 extern tree concat_name (tree gnu_name, const char *suffix);
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 /* Initialize data structures of the decl.c module. */
kono
parents:
diff changeset
209 extern void init_gnat_decl (void);
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 /* Destroy data structures of the decl.c module. */
kono
parents:
diff changeset
212 extern void destroy_gnat_decl (void);
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 /* Highest number in the front-end node table. */
kono
parents:
diff changeset
215 extern int max_gnat_nodes;
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 /* True when gigi is being called on an analyzed but unexpanded
kono
parents:
diff changeset
218 tree, and the only purpose of the call is to properly annotate
kono
parents:
diff changeset
219 types with representation information. */
kono
parents:
diff changeset
220 extern bool type_annotate_only;
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 /* This structure must be kept synchronized with Call_Back_End. */
kono
parents:
diff changeset
223 struct File_Info_Type
kono
parents:
diff changeset
224 {
kono
parents:
diff changeset
225 File_Name_Type File_Name;
kono
parents:
diff changeset
226 Instance_Id Instance;
kono
parents:
diff changeset
227 Nat Num_Source_Lines;
kono
parents:
diff changeset
228 };
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 #ifdef __cplusplus
kono
parents:
diff changeset
231 extern "C" {
kono
parents:
diff changeset
232 #endif
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 /* This is the main program of the back-end. It sets up all the table
kono
parents:
diff changeset
235 structures and then generates code. */
kono
parents:
diff changeset
236 extern void gigi (Node_Id gnat_root,
kono
parents:
diff changeset
237 int max_gnat_node,
kono
parents:
diff changeset
238 int number_name,
kono
parents:
diff changeset
239 struct Node *nodes_ptr,
kono
parents:
diff changeset
240 struct Flags *Flags_Ptr,
kono
parents:
diff changeset
241 Node_Id *next_node_ptr,
kono
parents:
diff changeset
242 Node_Id *prev_node_ptr,
kono
parents:
diff changeset
243 struct Elist_Header *elists_ptr,
kono
parents:
diff changeset
244 struct Elmt_Item *elmts_ptr,
kono
parents:
diff changeset
245 struct String_Entry *strings_ptr,
kono
parents:
diff changeset
246 Char_Code *strings_chars_ptr,
kono
parents:
diff changeset
247 struct List_Header *list_headers_ptr,
kono
parents:
diff changeset
248 Nat number_file,
kono
parents:
diff changeset
249 struct File_Info_Type *file_info_ptr,
kono
parents:
diff changeset
250 Entity_Id standard_boolean,
kono
parents:
diff changeset
251 Entity_Id standard_integer,
kono
parents:
diff changeset
252 Entity_Id standard_character,
kono
parents:
diff changeset
253 Entity_Id standard_long_long_float,
kono
parents:
diff changeset
254 Entity_Id standard_exception_type,
kono
parents:
diff changeset
255 Int gigi_operating_mode);
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 #ifdef __cplusplus
kono
parents:
diff changeset
258 }
kono
parents:
diff changeset
259 #endif
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 /* GNAT_NODE is the root of some GNAT tree. Return the root of the
kono
parents:
diff changeset
262 GCC tree corresponding to that GNAT tree. */
kono
parents:
diff changeset
263 extern tree gnat_to_gnu (Node_Id gnat_node);
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 /* Similar to gnat_to_gnu, but discard any object that might be created in
kono
parents:
diff changeset
266 the course of the translation of GNAT_NODE, which must be an "external"
kono
parents:
diff changeset
267 expression in the sense that it will be elaborated elsewhere. */
kono
parents:
diff changeset
268 extern tree gnat_to_gnu_external (Node_Id gnat_node);
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 /* GNU_STMT is a statement. We generate code for that statement. */
kono
parents:
diff changeset
271 extern void gnat_expand_stmt (tree gnu_stmt);
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 /* Generate GIMPLE in place for the expression at *EXPR_P. */
kono
parents:
diff changeset
274 extern int gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *);
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 /* Do the processing for the declaration of a GNAT_ENTITY, a type. If
kono
parents:
diff changeset
277 a separate Freeze node exists, delay the bulk of the processing. Otherwise
kono
parents:
diff changeset
278 make a GCC type for GNAT_ENTITY and set up the correspondence. */
kono
parents:
diff changeset
279 extern void process_type (Entity_Id gnat_entity);
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 /* Convert SLOC into LOCUS. Return true if SLOC corresponds to a source code
kono
parents:
diff changeset
282 location and false if it doesn't. If CLEAR_COLUMN is true, set the column
kono
parents:
diff changeset
283 information to 0. */
kono
parents:
diff changeset
284 extern bool Sloc_to_locus (Source_Ptr Sloc, location_t *locus,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
285 bool clear_column = false, const_tree decl = 0);
111
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 /* Post an error message. MSG is the error message, properly annotated.
kono
parents:
diff changeset
288 NODE is the node at which to post the error and the node to use for the
kono
parents:
diff changeset
289 '&' substitution. */
kono
parents:
diff changeset
290 extern void post_error (const char *msg, Node_Id node);
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 /* Similar to post_error, but NODE is the node at which to post the error and
kono
parents:
diff changeset
293 ENT is the node to use for the '&' substitution. */
kono
parents:
diff changeset
294 extern void post_error_ne (const char *msg, Node_Id node, Entity_Id ent);
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 /* Similar to post_error_ne, but NUM is the number to use for the '^'. */
kono
parents:
diff changeset
297 extern void post_error_ne_num (const char *msg, Node_Id node, Entity_Id ent,
kono
parents:
diff changeset
298 int num);
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 /* Similar to post_error_ne, but T is a GCC tree representing the number to
kono
parents:
diff changeset
301 write. If T represents a constant, the text inside curly brackets in
kono
parents:
diff changeset
302 MSG will be output (presumably including a '^'). Otherwise it will not
kono
parents:
diff changeset
303 be output and the text inside square brackets will be output instead. */
kono
parents:
diff changeset
304 extern void post_error_ne_tree (const char *msg, Node_Id node, Entity_Id ent,
kono
parents:
diff changeset
305 tree t);
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 /* Similar to post_error_ne_tree, but NUM is a second integer to write. */
kono
parents:
diff changeset
308 extern void post_error_ne_tree_2 (const char *msg, Node_Id node, Entity_Id ent,
kono
parents:
diff changeset
309 tree t, int num);
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 /* Return a label to branch to for the exception type in KIND or Empty
kono
parents:
diff changeset
312 if none. */
kono
parents:
diff changeset
313 extern Entity_Id get_exception_label (char kind);
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 /* If nonzero, pretend we are allocating at global level. */
kono
parents:
diff changeset
316 extern int force_global;
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 /* The default alignment of "double" floating-point types, i.e. floating
kono
parents:
diff changeset
319 point types whose size is equal to 64 bits, or 0 if this alignment is
kono
parents:
diff changeset
320 not specifically capped. */
kono
parents:
diff changeset
321 extern int double_float_alignment;
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 /* The default alignment of "double" or larger scalar types, i.e. scalar
kono
parents:
diff changeset
324 types whose size is greater or equal to 64 bits, or 0 if this alignment
kono
parents:
diff changeset
325 is not specifically capped. */
kono
parents:
diff changeset
326 extern int double_scalar_alignment;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 /* True if floating-point arithmetics may use wider intermediate results. */
kono
parents:
diff changeset
329 extern bool fp_arith_may_widen;
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 /* Data structures used to represent attributes. */
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 enum attrib_type
kono
parents:
diff changeset
334 {
kono
parents:
diff changeset
335 ATTR_MACHINE_ATTRIBUTE,
kono
parents:
diff changeset
336 ATTR_LINK_ALIAS,
kono
parents:
diff changeset
337 ATTR_LINK_SECTION,
kono
parents:
diff changeset
338 ATTR_LINK_CONSTRUCTOR,
kono
parents:
diff changeset
339 ATTR_LINK_DESTRUCTOR,
kono
parents:
diff changeset
340 ATTR_THREAD_LOCAL_STORAGE,
kono
parents:
diff changeset
341 ATTR_WEAK_EXTERNAL
kono
parents:
diff changeset
342 };
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 struct attrib
kono
parents:
diff changeset
345 {
kono
parents:
diff changeset
346 struct attrib *next;
kono
parents:
diff changeset
347 enum attrib_type type;
kono
parents:
diff changeset
348 tree name;
kono
parents:
diff changeset
349 tree args;
kono
parents:
diff changeset
350 Node_Id error_point;
kono
parents:
diff changeset
351 };
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 /* Table of machine-independent internal attributes. */
kono
parents:
diff changeset
354 extern const struct attribute_spec gnat_internal_attribute_table[];
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 /* Define the entries in the standard data array. */
kono
parents:
diff changeset
357 enum standard_datatypes
kono
parents:
diff changeset
358 {
kono
parents:
diff changeset
359 /* The longest floating-point type. */
kono
parents:
diff changeset
360 ADT_longest_float_type,
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 /* The type of an exception. */
kono
parents:
diff changeset
363 ADT_except_type,
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 /* Function type declaration -- void T() */
kono
parents:
diff changeset
366 ADT_void_ftype,
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 /* Type declaration node <==> typedef void *T() */
kono
parents:
diff changeset
369 ADT_ptr_void_ftype,
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 /* Type declaration node <==> typedef virtual void *T() */
kono
parents:
diff changeset
372 ADT_fdesc_type,
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 /* Null pointer for above type. */
kono
parents:
diff changeset
375 ADT_null_fdesc,
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 /* Value 1 in signed bitsizetype. */
kono
parents:
diff changeset
378 ADT_sbitsize_one_node,
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 /* Value BITS_PER_UNIT in signed bitsizetype. */
kono
parents:
diff changeset
381 ADT_sbitsize_unit_node,
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 /* Function declaration node for run-time allocation function. */
kono
parents:
diff changeset
384 ADT_malloc_decl,
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 /* Function declaration node for run-time freeing function. */
kono
parents:
diff changeset
387 ADT_free_decl,
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 /* Function declaration node for run-time reallocation function. */
kono
parents:
diff changeset
390 ADT_realloc_decl,
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 /* Function decl node for 64-bit multiplication with overflow checking. */
kono
parents:
diff changeset
393 ADT_mulv64_decl,
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 /* Identifier for the name of the _Parent field in tagged record types. */
kono
parents:
diff changeset
396 ADT_parent_name_id,
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 /* Identifier for the name of the Exception_Data type. */
kono
parents:
diff changeset
399 ADT_exception_data_name_id,
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 /* Types and decls used by the SJLJ exception mechanism. */
kono
parents:
diff changeset
402 ADT_jmpbuf_type,
kono
parents:
diff changeset
403 ADT_jmpbuf_ptr_type,
kono
parents:
diff changeset
404 ADT_get_jmpbuf_decl,
kono
parents:
diff changeset
405 ADT_set_jmpbuf_decl,
kono
parents:
diff changeset
406 ADT_get_excptr_decl,
kono
parents:
diff changeset
407 ADT_not_handled_by_others_decl,
kono
parents:
diff changeset
408 ADT_setjmp_decl,
kono
parents:
diff changeset
409 ADT_update_setjmp_buf_decl,
kono
parents:
diff changeset
410 ADT_raise_nodefer_decl,
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 /* Types and decls used by the ZCX exception mechanism. */
kono
parents:
diff changeset
413 ADT_reraise_zcx_decl,
kono
parents:
diff changeset
414 ADT_set_exception_parameter_decl,
kono
parents:
diff changeset
415 ADT_begin_handler_decl,
kono
parents:
diff changeset
416 ADT_end_handler_decl,
kono
parents:
diff changeset
417 ADT_unhandled_except_decl,
kono
parents:
diff changeset
418 ADT_others_decl,
kono
parents:
diff changeset
419 ADT_all_others_decl,
kono
parents:
diff changeset
420 ADT_unhandled_others_decl,
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 ADT_LAST
kono
parents:
diff changeset
423 };
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 /* Define kind of exception information associated with raise statements. */
kono
parents:
diff changeset
426 enum exception_info_kind
kono
parents:
diff changeset
427 {
kono
parents:
diff changeset
428 /* Simple exception information: file:line. */
kono
parents:
diff changeset
429 exception_simple,
kono
parents:
diff changeset
430 /* Range exception information: file:line + index, first, last. */
kono
parents:
diff changeset
431 exception_range,
kono
parents:
diff changeset
432 /* Column exception information: file:line:column. */
kono
parents:
diff changeset
433 exception_column
kono
parents:
diff changeset
434 };
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 /* Define the inline status of a subprogram. */
kono
parents:
diff changeset
437 enum inline_status_t
kono
parents:
diff changeset
438 {
kono
parents:
diff changeset
439 /* Inlining is suppressed for the subprogram. */
kono
parents:
diff changeset
440 is_suppressed,
kono
parents:
diff changeset
441 /* No inlining is requested for the subprogram. */
kono
parents:
diff changeset
442 is_disabled,
kono
parents:
diff changeset
443 /* Inlining is requested for the subprogram. */
kono
parents:
diff changeset
444 is_enabled,
kono
parents:
diff changeset
445 /* Inlining is required for the subprogram. */
kono
parents:
diff changeset
446 is_required
kono
parents:
diff changeset
447 };
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 extern GTY(()) tree gnat_std_decls[(int) ADT_LAST];
kono
parents:
diff changeset
450 extern GTY(()) tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
kono
parents:
diff changeset
451 extern GTY(()) tree gnat_raise_decls_ext[(int) LAST_REASON_CODE + 1];
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 #define longest_float_type_node gnat_std_decls[(int) ADT_longest_float_type]
kono
parents:
diff changeset
454 #define except_type_node gnat_std_decls[(int) ADT_except_type]
kono
parents:
diff changeset
455 #define void_ftype gnat_std_decls[(int) ADT_void_ftype]
kono
parents:
diff changeset
456 #define ptr_void_ftype gnat_std_decls[(int) ADT_ptr_void_ftype]
kono
parents:
diff changeset
457 #define fdesc_type_node gnat_std_decls[(int) ADT_fdesc_type]
kono
parents:
diff changeset
458 #define null_fdesc_node gnat_std_decls[(int) ADT_null_fdesc]
kono
parents:
diff changeset
459 #define sbitsize_one_node gnat_std_decls[(int) ADT_sbitsize_one_node]
kono
parents:
diff changeset
460 #define sbitsize_unit_node gnat_std_decls[(int) ADT_sbitsize_unit_node]
kono
parents:
diff changeset
461 #define malloc_decl gnat_std_decls[(int) ADT_malloc_decl]
kono
parents:
diff changeset
462 #define free_decl gnat_std_decls[(int) ADT_free_decl]
kono
parents:
diff changeset
463 #define realloc_decl gnat_std_decls[(int) ADT_realloc_decl]
kono
parents:
diff changeset
464 #define mulv64_decl gnat_std_decls[(int) ADT_mulv64_decl]
kono
parents:
diff changeset
465 #define parent_name_id gnat_std_decls[(int) ADT_parent_name_id]
kono
parents:
diff changeset
466 #define exception_data_name_id gnat_std_decls[(int) ADT_exception_data_name_id]
kono
parents:
diff changeset
467 #define jmpbuf_type gnat_std_decls[(int) ADT_jmpbuf_type]
kono
parents:
diff changeset
468 #define jmpbuf_ptr_type gnat_std_decls[(int) ADT_jmpbuf_ptr_type]
kono
parents:
diff changeset
469 #define get_jmpbuf_decl gnat_std_decls[(int) ADT_get_jmpbuf_decl]
kono
parents:
diff changeset
470 #define set_jmpbuf_decl gnat_std_decls[(int) ADT_set_jmpbuf_decl]
kono
parents:
diff changeset
471 #define get_excptr_decl gnat_std_decls[(int) ADT_get_excptr_decl]
kono
parents:
diff changeset
472 #define not_handled_by_others_decl \
kono
parents:
diff changeset
473 gnat_std_decls[(int) ADT_not_handled_by_others_decl]
kono
parents:
diff changeset
474 #define setjmp_decl gnat_std_decls[(int) ADT_setjmp_decl]
kono
parents:
diff changeset
475 #define update_setjmp_buf_decl gnat_std_decls[(int) ADT_update_setjmp_buf_decl]
kono
parents:
diff changeset
476 #define raise_nodefer_decl gnat_std_decls[(int) ADT_raise_nodefer_decl]
kono
parents:
diff changeset
477 #define reraise_zcx_decl gnat_std_decls[(int) ADT_reraise_zcx_decl]
kono
parents:
diff changeset
478 #define set_exception_parameter_decl \
kono
parents:
diff changeset
479 gnat_std_decls[(int) ADT_set_exception_parameter_decl]
kono
parents:
diff changeset
480 #define begin_handler_decl gnat_std_decls[(int) ADT_begin_handler_decl]
kono
parents:
diff changeset
481 #define others_decl gnat_std_decls[(int) ADT_others_decl]
kono
parents:
diff changeset
482 #define all_others_decl gnat_std_decls[(int) ADT_all_others_decl]
kono
parents:
diff changeset
483 #define unhandled_others_decl gnat_std_decls[(int) ADT_unhandled_others_decl]
kono
parents:
diff changeset
484 #define end_handler_decl gnat_std_decls[(int) ADT_end_handler_decl]
kono
parents:
diff changeset
485 #define unhandled_except_decl gnat_std_decls[(int) ADT_unhandled_except_decl]
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 /* Routines expected by the gcc back-end. They must have exactly the same
kono
parents:
diff changeset
488 prototype and names as below. */
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 /* Return true if we are in the global binding level. */
kono
parents:
diff changeset
491 extern bool global_bindings_p (void);
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 /* Enter and exit a new binding level. */
kono
parents:
diff changeset
494 extern void gnat_pushlevel (void);
kono
parents:
diff changeset
495 extern void gnat_poplevel (void);
kono
parents:
diff changeset
496 extern void gnat_zaplevel (void);
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 /* Set SUPERCONTEXT of the BLOCK for the current binding level to FNDECL
kono
parents:
diff changeset
499 and point FNDECL to this BLOCK. */
kono
parents:
diff changeset
500 extern void set_current_block_context (tree fndecl);
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 /* Set the jmpbuf_decl for the current binding level to DECL. */
kono
parents:
diff changeset
503 extern void set_block_jmpbuf_decl (tree decl);
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 /* Get the setjmp_decl, if any, for the current binding level. */
kono
parents:
diff changeset
506 extern tree get_block_jmpbuf_decl (void);
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 /* Record DECL as belonging to the current lexical scope and use GNAT_NODE
kono
parents:
diff changeset
509 for location information and flag propagation. */
kono
parents:
diff changeset
510 extern void gnat_pushdecl (tree decl, Node_Id gnat_node);
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 /* Initialize the GCC support for exception handling. */
kono
parents:
diff changeset
513 extern void gnat_init_gcc_eh (void);
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 /* Initialize the GCC support for floating-point operations. */
kono
parents:
diff changeset
516 extern void gnat_init_gcc_fp (void);
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 /* Install the builtin functions we might need. */
kono
parents:
diff changeset
519 extern void gnat_install_builtins (void);
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 /* Return an integer type with the number of bits of precision given by
kono
parents:
diff changeset
522 PRECISION. UNSIGNEDP is nonzero if the type is unsigned; otherwise
kono
parents:
diff changeset
523 it is a signed type. */
kono
parents:
diff changeset
524 extern tree gnat_type_for_size (unsigned precision, int unsignedp);
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 /* Return a data type that has machine mode MODE. UNSIGNEDP selects
kono
parents:
diff changeset
527 an unsigned type; otherwise a signed type is returned. */
kono
parents:
diff changeset
528 extern tree gnat_type_for_mode (machine_mode mode, int unsignedp);
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 /* Perform final processing on global declarations. */
kono
parents:
diff changeset
531 extern void gnat_write_global_declarations (void);
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 /* Return the signed or unsigned version of TYPE_NODE, a scalar type, the
kono
parents:
diff changeset
534 signedness being specified by UNSIGNEDP. */
kono
parents:
diff changeset
535 extern tree gnat_signed_or_unsigned_type_for (int unsignedp, tree type_node);
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 /* Return 1 if the types T1 and T2 are compatible, i.e. if they can be
kono
parents:
diff changeset
538 transparently converted to each other. */
kono
parents:
diff changeset
539 extern int gnat_types_compatible_p (tree t1, tree t2);
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 /* Return true if EXPR is a useless type conversion. */
kono
parents:
diff changeset
542 extern bool gnat_useless_type_conversion (tree expr);
kono
parents:
diff changeset
543
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
544 /* Return true if T, a {FUNCTION,METHOD}_TYPE, has the specified flags. */
111
kono
parents:
diff changeset
545 extern bool fntype_same_flags_p (const_tree, tree, bool, bool, bool);
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 /* Create an expression whose value is that of EXPR,
kono
parents:
diff changeset
548 converted to type TYPE. The TREE_TYPE of the value
kono
parents:
diff changeset
549 is always TYPE. This function implements all reasonable
kono
parents:
diff changeset
550 conversions; callers should filter out those that are
kono
parents:
diff changeset
551 not permitted by the language being compiled. */
kono
parents:
diff changeset
552 extern tree convert (tree type, tree expr);
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 /* Create an expression whose value is that of EXPR converted to the common
kono
parents:
diff changeset
555 index type, which is sizetype. */
kono
parents:
diff changeset
556 extern tree convert_to_index_type (tree expr);
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 /* Routines created solely for the tree translator's sake. Their prototypes
kono
parents:
diff changeset
559 can be changed as desired. */
kono
parents:
diff changeset
560
kono
parents:
diff changeset
561 /* Initialize data structures of the utils.c module. */
kono
parents:
diff changeset
562 extern void init_gnat_utils (void);
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 /* Destroy data structures of the utils.c module. */
kono
parents:
diff changeset
565 extern void destroy_gnat_utils (void);
kono
parents:
diff changeset
566
kono
parents:
diff changeset
567 /* GNAT_ENTITY is a GNAT tree node for a defining identifier.
kono
parents:
diff changeset
568 GNU_DECL is the GCC tree which is to be associated with
kono
parents:
diff changeset
569 GNAT_ENTITY. Such gnu tree node is always an ..._DECL node.
kono
parents:
diff changeset
570 If NO_CHECK is nonzero, the latter check is suppressed.
kono
parents:
diff changeset
571 If GNU_DECL is zero, a previous association is to be reset. */
kono
parents:
diff changeset
572 extern void save_gnu_tree (Entity_Id gnat_entity, tree gnu_decl,
kono
parents:
diff changeset
573 bool no_check);
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 /* GNAT_ENTITY is a GNAT tree node for a defining identifier.
kono
parents:
diff changeset
576 Return the ..._DECL node that was associated with it. If there is no tree
kono
parents:
diff changeset
577 node associated with GNAT_ENTITY, abort. */
kono
parents:
diff changeset
578 extern tree get_gnu_tree (Entity_Id gnat_entity);
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 /* Return nonzero if a GCC tree has been associated with GNAT_ENTITY. */
kono
parents:
diff changeset
581 extern bool present_gnu_tree (Entity_Id gnat_entity);
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 /* Make a dummy type corresponding to GNAT_TYPE. */
kono
parents:
diff changeset
584 extern tree make_dummy_type (Entity_Id gnat_type);
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 /* Return the dummy type that was made for GNAT_TYPE, if any. */
kono
parents:
diff changeset
587 extern tree get_dummy_type (Entity_Id gnat_type);
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 /* Build dummy fat and thin pointer types whose designated type is specified
kono
parents:
diff changeset
590 by GNAT_DESIG_TYPE/GNU_DESIG_TYPE and attach them to the latter. */
kono
parents:
diff changeset
591 extern void build_dummy_unc_pointer_types (Entity_Id gnat_desig_type,
kono
parents:
diff changeset
592 tree gnu_desig_type);
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 /* Record TYPE as a builtin type for Ada. NAME is the name of the type.
kono
parents:
diff changeset
595 ARTIFICIAL_P is true if the type was generated by the compiler. */
kono
parents:
diff changeset
596 extern void record_builtin_type (const char *name, tree type,
kono
parents:
diff changeset
597 bool artificial_p);
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 /* Finish constructing the character type CHAR_TYPE. */
kono
parents:
diff changeset
600 extern void finish_character_type (tree char_type);
kono
parents:
diff changeset
601
kono
parents:
diff changeset
602 /* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
kono
parents:
diff changeset
603 finish constructing the record type as a fat pointer type. */
kono
parents:
diff changeset
604 extern void finish_fat_pointer_type (tree record_type, tree field_list);
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 /* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
kono
parents:
diff changeset
607 finish constructing the record or union type. If REP_LEVEL is zero, this
kono
parents:
diff changeset
608 record has no representation clause and so will be entirely laid out here.
kono
parents:
diff changeset
609 If REP_LEVEL is one, this record has a representation clause and has been
kono
parents:
diff changeset
610 laid out already; only set the sizes and alignment. If REP_LEVEL is two,
kono
parents:
diff changeset
611 this record is derived from a parent record and thus inherits its layout;
kono
parents:
diff changeset
612 only make a pass on the fields to finalize them. DEBUG_INFO_P is true if
kono
parents:
diff changeset
613 additional debug info needs to be output for this type. */
kono
parents:
diff changeset
614 extern void finish_record_type (tree record_type, tree field_list,
kono
parents:
diff changeset
615 int rep_level, bool debug_info_p);
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 /* Wrap up compilation of RECORD_TYPE, i.e. output additional debug info
kono
parents:
diff changeset
618 associated with it. It need not be invoked directly in most cases as
kono
parents:
diff changeset
619 finish_record_type takes care of doing so. */
kono
parents:
diff changeset
620 extern void rest_of_record_type_compilation (tree record_type);
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 /* Append PARALLEL_TYPE on the chain of parallel types for TYPE. */
kono
parents:
diff changeset
623 extern void add_parallel_type (tree type, tree parallel_type);
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 /* Return a copy of TYPE, but safe to modify in any way. */
kono
parents:
diff changeset
626 extern tree copy_type (tree type);
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 /* Return a subtype of sizetype with range MIN to MAX and whose
kono
parents:
diff changeset
629 TYPE_INDEX_TYPE is INDEX. GNAT_NODE is used for the position
kono
parents:
diff changeset
630 of the associated TYPE_DECL. */
kono
parents:
diff changeset
631 extern tree create_index_type (tree min, tree max, tree index,
kono
parents:
diff changeset
632 Node_Id gnat_node);
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 /* Return a subtype of TYPE with range MIN to MAX. If TYPE is NULL,
kono
parents:
diff changeset
635 sizetype is used. */
kono
parents:
diff changeset
636 extern tree create_range_type (tree type, tree min, tree max);
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 /* Return a TYPE_DECL node suitable for the TYPE_STUB_DECL field of TYPE.
kono
parents:
diff changeset
639 NAME gives the name of the type to be used in the declaration. */
kono
parents:
diff changeset
640 extern tree create_type_stub_decl (tree name, tree type);
kono
parents:
diff changeset
641
kono
parents:
diff changeset
642 /* Return a TYPE_DECL node for TYPE. NAME gives the name of the type to be
kono
parents:
diff changeset
643 used in the declaration. ARTIFICIAL_P is true if the declaration was
kono
parents:
diff changeset
644 generated by the compiler. DEBUG_INFO_P is true if we need to write
kono
parents:
diff changeset
645 debug information about this type. GNAT_NODE is used for the position
kono
parents:
diff changeset
646 of the decl. */
kono
parents:
diff changeset
647 extern tree create_type_decl (tree name, tree type, bool artificial_p,
kono
parents:
diff changeset
648 bool debug_info_p, Node_Id gnat_node);
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 /* Return a VAR_DECL or CONST_DECL node.
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 NAME gives the name of the variable. ASM_NAME is its assembler name
kono
parents:
diff changeset
653 (if provided). TYPE is its data type (a GCC ..._TYPE node). INIT is
kono
parents:
diff changeset
654 the GCC tree for an optional initial expression; NULL_TREE if none.
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 CONST_FLAG is true if this variable is constant, in which case we might
kono
parents:
diff changeset
657 return a CONST_DECL node unless CONST_DECL_ALLOWED_P is false.
kono
parents:
diff changeset
658
kono
parents:
diff changeset
659 PUBLIC_FLAG is true if this is for a reference to a public entity or for a
kono
parents:
diff changeset
660 definition to be made visible outside of the current compilation unit, for
kono
parents:
diff changeset
661 instance variable definitions in a package specification.
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 EXTERN_FLAG is true when processing an external variable declaration (as
kono
parents:
diff changeset
664 opposed to a definition: no storage is to be allocated for the variable).
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 STATIC_FLAG is only relevant when not at top level and indicates whether
kono
parents:
diff changeset
667 to always allocate storage to the variable.
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 VOLATILE_FLAG is true if this variable is declared as volatile.
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 ARTIFICIAL_P is true if the variable was generated by the compiler.
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 DEBUG_INFO_P is true if we need to write debug information for it.
kono
parents:
diff changeset
674
kono
parents:
diff changeset
675 ATTR_LIST is the list of attributes to be attached to the variable.
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 GNAT_NODE is used for the position of the decl. */
kono
parents:
diff changeset
678 extern tree create_var_decl (tree name, tree asm_name, tree type, tree init,
kono
parents:
diff changeset
679 bool const_flag, bool public_flag,
kono
parents:
diff changeset
680 bool extern_flag, bool static_flag,
kono
parents:
diff changeset
681 bool volatile_flag,
kono
parents:
diff changeset
682 bool artificial_p, bool debug_info_p,
kono
parents:
diff changeset
683 struct attrib *attr_list, Node_Id gnat_node,
kono
parents:
diff changeset
684 bool const_decl_allowed_p = true);
kono
parents:
diff changeset
685
kono
parents:
diff changeset
686 /* Return a FIELD_DECL node. NAME is the field's name, TYPE is its type and
kono
parents:
diff changeset
687 RECORD_TYPE is the type of the enclosing record. If SIZE is nonzero, it
kono
parents:
diff changeset
688 is the specified size of the field. If POS is nonzero, it is the bit
kono
parents:
diff changeset
689 position. PACKED is 1 if the enclosing record is packed, -1 if it has
kono
parents:
diff changeset
690 Component_Alignment of Storage_Unit. If ADDRESSABLE is nonzero, it
kono
parents:
diff changeset
691 means we are allowed to take the address of the field; if it is negative,
kono
parents:
diff changeset
692 we should not make a bitfield, which is used by make_aligning_type. */
kono
parents:
diff changeset
693 extern tree create_field_decl (tree name, tree type, tree record_type,
kono
parents:
diff changeset
694 tree size, tree pos, int packed,
kono
parents:
diff changeset
695 int addressable);
kono
parents:
diff changeset
696
kono
parents:
diff changeset
697 /* Return a PARM_DECL node with NAME and TYPE. */
kono
parents:
diff changeset
698 extern tree create_param_decl (tree name, tree type);
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 /* Return a LABEL_DECL with NAME. GNAT_NODE is used for the position of
kono
parents:
diff changeset
701 the decl. */
kono
parents:
diff changeset
702 extern tree create_label_decl (tree name, Node_Id gnat_node);
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 /* Return a FUNCTION_DECL node. NAME is the name of the subprogram, ASM_NAME
kono
parents:
diff changeset
705 its assembler name, TYPE its type (a FUNCTION_TYPE node), PARAM_DECL_LIST
kono
parents:
diff changeset
706 the list of its parameters (a list of PARM_DECL nodes chained through the
kono
parents:
diff changeset
707 DECL_CHAIN field).
kono
parents:
diff changeset
708
kono
parents:
diff changeset
709 INLINE_STATUS describes the inline flags to be set on the FUNCTION_DECL.
kono
parents:
diff changeset
710
kono
parents:
diff changeset
711 PUBLIC_FLAG is true if this is for a reference to a public entity or for a
kono
parents:
diff changeset
712 definition to be made visible outside of the current compilation unit.
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 EXTERN_FLAG is true when processing an external subprogram declaration.
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 ARTIFICIAL_P is true if the subprogram was generated by the compiler.
kono
parents:
diff changeset
717
kono
parents:
diff changeset
718 DEBUG_INFO_P is true if we need to write debug information for it.
kono
parents:
diff changeset
719
kono
parents:
diff changeset
720 DEFINITION is true if the subprogram is to be considered as a definition.
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 ATTR_LIST is the list of attributes to be attached to the subprogram.
kono
parents:
diff changeset
723
kono
parents:
diff changeset
724 GNAT_NODE is used for the position of the decl. */
kono
parents:
diff changeset
725 extern tree create_subprog_decl (tree name, tree asm_name, tree type,
kono
parents:
diff changeset
726 tree param_decl_list,
kono
parents:
diff changeset
727 enum inline_status_t inline_status,
kono
parents:
diff changeset
728 bool public_flag, bool extern_flag,
kono
parents:
diff changeset
729 bool artificial_p, bool debug_info_p,
kono
parents:
diff changeset
730 bool definition, struct attrib *attr_list,
kono
parents:
diff changeset
731 Node_Id gnat_node);
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733 /* Given a subprogram declaration DECL, its assembler name and its type,
kono
parents:
diff changeset
734 finish constructing the subprogram declaration from ASM_NAME and TYPE. */
kono
parents:
diff changeset
735 extern void finish_subprog_decl (tree decl, tree asm_name, tree type);
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 /* Process the attributes in ATTR_LIST for NODE, which is either a DECL or
kono
parents:
diff changeset
738 a TYPE. If IN_PLACE is true, the tree pointed to by NODE should not be
kono
parents:
diff changeset
739 changed. GNAT_NODE is used for the position of error messages. */
kono
parents:
diff changeset
740 extern void process_attributes (tree *node, struct attrib **attr_list,
kono
parents:
diff changeset
741 bool in_place, Node_Id gnat_node);
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 /* Set up the framework for generating code for SUBPROG_DECL, a subprogram
kono
parents:
diff changeset
744 body. This routine needs to be invoked before processing the declarations
kono
parents:
diff changeset
745 appearing in the subprogram. */
kono
parents:
diff changeset
746 extern void begin_subprog_body (tree subprog_decl);
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 /* Finish translating the current subprogram and set its BODY. */
kono
parents:
diff changeset
749 extern void end_subprog_body (tree body);
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 /* Wrap up compilation of SUBPROG_DECL, a subprogram body. */
kono
parents:
diff changeset
752 extern void rest_of_subprog_body_compilation (tree subprog_decl);
kono
parents:
diff changeset
753
kono
parents:
diff changeset
754 /* Build a template of type TEMPLATE_TYPE from the array bounds of ARRAY_TYPE.
kono
parents:
diff changeset
755 EXPR is an expression that we can use to locate any PLACEHOLDER_EXPRs.
kono
parents:
diff changeset
756 Return a constructor for the template. */
kono
parents:
diff changeset
757 extern tree build_template (tree template_type, tree array_type, tree expr);
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 /* Build a type to be used to represent an aliased object whose nominal type
kono
parents:
diff changeset
760 is an unconstrained array. This consists of a RECORD_TYPE containing a
kono
parents:
diff changeset
761 field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an ARRAY_TYPE.
kono
parents:
diff changeset
762 If ARRAY_TYPE is that of an unconstrained array, this is used to represent
kono
parents:
diff changeset
763 an arbitrary unconstrained object. Use NAME as the name of the record.
kono
parents:
diff changeset
764 DEBUG_INFO_P is true if we need to write debug information for the type. */
kono
parents:
diff changeset
765 extern tree build_unc_object_type (tree template_type, tree object_type,
kono
parents:
diff changeset
766 tree name, bool debug_info_p);
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 /* Same as build_unc_object_type, but taking a thin or fat pointer type
kono
parents:
diff changeset
769 instead of the template type. */
kono
parents:
diff changeset
770 extern tree build_unc_object_type_from_ptr (tree thin_fat_ptr_type,
kono
parents:
diff changeset
771 tree object_type, tree name,
kono
parents:
diff changeset
772 bool debug_info_p);
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 /* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE. In
kono
parents:
diff changeset
775 the normal case this is just two adjustments, but we have more to do
kono
parents:
diff changeset
776 if NEW is an UNCONSTRAINED_ARRAY_TYPE. */
kono
parents:
diff changeset
777 extern void update_pointer_to (tree old_type, tree new_type);
kono
parents:
diff changeset
778
kono
parents:
diff changeset
779 /* EXP is an expression for the size of an object. If this size contains
kono
parents:
diff changeset
780 discriminant references, replace them with the maximum (if MAX_P) or
kono
parents:
diff changeset
781 minimum (if !MAX_P) possible value of the discriminant. */
kono
parents:
diff changeset
782 extern tree max_size (tree exp, bool max_p);
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 /* Remove all conversions that are done in EXP. This includes converting
kono
parents:
diff changeset
785 from a padded type or to a left-justified modular type. If TRUE_ADDRESS
kono
parents:
diff changeset
786 is true, always return the address of the containing object even if
kono
parents:
diff changeset
787 the address is not bit-aligned. */
kono
parents:
diff changeset
788 extern tree remove_conversions (tree exp, bool true_address);
kono
parents:
diff changeset
789
kono
parents:
diff changeset
790 /* If EXP's type is an UNCONSTRAINED_ARRAY_TYPE, return an expression that
kono
parents:
diff changeset
791 refers to the underlying array. If its type has TYPE_CONTAINS_TEMPLATE_P,
kono
parents:
diff changeset
792 likewise return an expression pointing to the underlying array. */
kono
parents:
diff changeset
793 extern tree maybe_unconstrained_array (tree exp);
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 /* Return an expression that does an unchecked conversion of EXPR to TYPE.
kono
parents:
diff changeset
796 If NOTRUNC_P is true, truncation operations should be suppressed. */
kono
parents:
diff changeset
797 extern tree unchecked_convert (tree type, tree expr, bool notrunc_p);
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 /* Return the appropriate GCC tree code for the specified GNAT_TYPE,
kono
parents:
diff changeset
800 the latter being a record type as predicated by Is_Record_Type. */
kono
parents:
diff changeset
801 extern enum tree_code tree_code_for_record_type (Entity_Id gnat_type);
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 /* Return true if GNAT_TYPE is a "double" floating-point type, i.e. whose
kono
parents:
diff changeset
804 size is equal to 64 bits, or an array of such a type. Set ALIGN_CLAUSE
kono
parents:
diff changeset
805 according to the presence of an alignment clause on the type or, if it
kono
parents:
diff changeset
806 is an array, on the component type. */
kono
parents:
diff changeset
807 extern bool is_double_float_or_array (Entity_Id gnat_type,
kono
parents:
diff changeset
808 bool *align_clause);
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 /* Return true if GNAT_TYPE is a "double" or larger scalar type, i.e. whose
kono
parents:
diff changeset
811 size is greater or equal to 64 bits, or an array of such a type. Set
kono
parents:
diff changeset
812 ALIGN_CLAUSE according to the presence of an alignment clause on the
kono
parents:
diff changeset
813 type or, if it is an array, on the component type. */
kono
parents:
diff changeset
814 extern bool is_double_scalar_or_array (Entity_Id gnat_type,
kono
parents:
diff changeset
815 bool *align_clause);
kono
parents:
diff changeset
816
kono
parents:
diff changeset
817 /* Return true if GNU_TYPE is suitable as the type of a non-aliased
kono
parents:
diff changeset
818 component of an aggregate type. */
kono
parents:
diff changeset
819 extern bool type_for_nonaliased_component_p (tree gnu_type);
kono
parents:
diff changeset
820
kono
parents:
diff changeset
821 /* Return true if TYPE is a smaller form of ORIG_TYPE. */
kono
parents:
diff changeset
822 extern bool smaller_form_type_p (tree type, tree orig_type);
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 /* Return the base type of TYPE. */
kono
parents:
diff changeset
825 extern tree get_base_type (tree type);
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 /* EXP is a GCC tree representing an address. See if we can find how
kono
parents:
diff changeset
828 strictly the object at that address is aligned. Return that alignment
kono
parents:
diff changeset
829 strictly the object at that address is aligned. Return that alignment
kono
parents:
diff changeset
830 in bits. If we don't know anything about the alignment, return 0. */
kono
parents:
diff changeset
831 extern unsigned int known_alignment (tree exp);
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 /* Return true if VALUE is a multiple of FACTOR. FACTOR must be a power
kono
parents:
diff changeset
834 of 2. */
kono
parents:
diff changeset
835 extern bool value_factor_p (tree value, HOST_WIDE_INT factor);
kono
parents:
diff changeset
836
kono
parents:
diff changeset
837 /* Build an atomic load for the underlying atomic object in SRC. SYNC is
kono
parents:
diff changeset
838 true if the load requires synchronization. */
kono
parents:
diff changeset
839 extern tree build_atomic_load (tree src, bool sync);
kono
parents:
diff changeset
840
kono
parents:
diff changeset
841 /* Build an atomic store from SRC to the underlying atomic object in DEST.
kono
parents:
diff changeset
842 SYNC is true if the store requires synchronization. */
kono
parents:
diff changeset
843 extern tree build_atomic_store (tree dest, tree src, bool sync);
kono
parents:
diff changeset
844
kono
parents:
diff changeset
845 /* Build a load-modify-store sequence from SRC to DEST. GNAT_NODE is used for
kono
parents:
diff changeset
846 the location of the sequence. Note that, even if the load and the store are
kono
parents:
diff changeset
847 both atomic, the sequence itself is not atomic. */
kono
parents:
diff changeset
848 extern tree build_load_modify_store (tree dest, tree src, Node_Id gnat_node);
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 /* Make a binary operation of kind OP_CODE. RESULT_TYPE is the type
kono
parents:
diff changeset
851 desired for the result. Usually the operation is to be performed
kono
parents:
diff changeset
852 in that type. For MODIFY_EXPR and ARRAY_REF, RESULT_TYPE may be 0
kono
parents:
diff changeset
853 in which case the type to be used will be derived from the operands.
kono
parents:
diff changeset
854 Don't fold the result if NO_FOLD is true. */
kono
parents:
diff changeset
855 extern tree build_binary_op (enum tree_code op_code, tree result_type,
kono
parents:
diff changeset
856 tree left_operand, tree right_operand,
kono
parents:
diff changeset
857 bool no_fold=false);
kono
parents:
diff changeset
858
kono
parents:
diff changeset
859 /* Similar, but make unary operation. */
kono
parents:
diff changeset
860 extern tree build_unary_op (enum tree_code op_code, tree result_type,
kono
parents:
diff changeset
861 tree operand);
kono
parents:
diff changeset
862
kono
parents:
diff changeset
863 /* Similar, but for COND_EXPR. */
kono
parents:
diff changeset
864 extern tree build_cond_expr (tree result_type, tree condition_operand,
kono
parents:
diff changeset
865 tree true_operand, tree false_operand);
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 /* Similar, but for COMPOUND_EXPR. */
kono
parents:
diff changeset
868 extern tree build_compound_expr (tree result_type, tree stmt_operand,
kono
parents:
diff changeset
869 tree expr_operand);
kono
parents:
diff changeset
870
kono
parents:
diff changeset
871 /* Conveniently construct a function call expression. FNDECL names the
kono
parents:
diff changeset
872 function to be called, N is the number of arguments, and the "..."
kono
parents:
diff changeset
873 parameters are the argument expressions. Unlike build_call_expr
kono
parents:
diff changeset
874 this doesn't fold the call, hence it will always return a CALL_EXPR. */
kono
parents:
diff changeset
875 extern tree build_call_n_expr (tree fndecl, int n, ...);
kono
parents:
diff changeset
876
kono
parents:
diff changeset
877 /* Build a call to a function that raises an exception and passes file name
kono
parents:
diff changeset
878 and line number, if requested. MSG says which exception function to call.
kono
parents:
diff changeset
879 GNAT_NODE is the node conveying the source location for which the error
kono
parents:
diff changeset
880 should be signaled, or Empty in which case the error is signaled for the
kono
parents:
diff changeset
881 current location. KIND says which kind of exception node this is for,
kono
parents:
diff changeset
882 among N_Raise_{Constraint,Storage,Program}_Error. */
kono
parents:
diff changeset
883 extern tree build_call_raise (int msg, Node_Id gnat_node, char kind);
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 /* Similar to build_call_raise, with extra information about the column
kono
parents:
diff changeset
886 where the check failed. */
kono
parents:
diff changeset
887 extern tree build_call_raise_column (int msg, Node_Id gnat_node, char kind);
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 /* Similar to build_call_raise_column, for an index or range check exception ,
kono
parents:
diff changeset
890 with extra information of the form "INDEX out of range FIRST..LAST". */
kono
parents:
diff changeset
891 extern tree build_call_raise_range (int msg, Node_Id gnat_node, char kind,
kono
parents:
diff changeset
892 tree index, tree first, tree last);
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 /* Return a CONSTRUCTOR of TYPE whose elements are V. This is not the
kono
parents:
diff changeset
895 same as build_constructor in the language-independent tree.c. */
kono
parents:
diff changeset
896 extern tree gnat_build_constructor (tree type, vec<constructor_elt, va_gc> *v);
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 /* Return a COMPONENT_REF to access FIELD in RECORD, or NULL_EXPR and generate
kono
parents:
diff changeset
899 a Constraint_Error if the field is not found in the record. Don't fold the
kono
parents:
diff changeset
900 result if NO_FOLD is true. */
kono
parents:
diff changeset
901 extern tree build_component_ref (tree record, tree field, bool no_fold);
kono
parents:
diff changeset
902
kono
parents:
diff changeset
903 /* Build a GCC tree to call an allocation or deallocation function.
kono
parents:
diff changeset
904 If GNU_OBJ is nonzero, it is an object to deallocate. Otherwise,
kono
parents:
diff changeset
905 generate an allocator.
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 GNU_SIZE is the number of bytes to allocate and GNU_TYPE is the contained
kono
parents:
diff changeset
908 object type, used to determine the to-be-honored address alignment.
kono
parents:
diff changeset
909 GNAT_PROC, if present, is a procedure to call and GNAT_POOL is the storage
kono
parents:
diff changeset
910 pool to use. If not present, malloc and free are used. GNAT_NODE is used
kono
parents:
diff changeset
911 to provide an error location for restriction violation messages. */
kono
parents:
diff changeset
912 extern tree build_call_alloc_dealloc (tree gnu_obj, tree gnu_size,
kono
parents:
diff changeset
913 tree gnu_type, Entity_Id gnat_proc,
kono
parents:
diff changeset
914 Entity_Id gnat_pool, Node_Id gnat_node);
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 /* Build a GCC tree to correspond to allocating an object of TYPE whose
kono
parents:
diff changeset
917 initial value if INIT, if INIT is nonzero. Convert the expression to
kono
parents:
diff changeset
918 RESULT_TYPE, which must be some type of pointer. Return the tree.
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 GNAT_PROC and GNAT_POOL optionally give the procedure to call and
kono
parents:
diff changeset
921 the storage pool to use. GNAT_NODE is used to provide an error
kono
parents:
diff changeset
922 location for restriction violation messages. If IGNORE_INIT_TYPE is
kono
parents:
diff changeset
923 true, ignore the type of INIT for the purpose of determining the size;
kono
parents:
diff changeset
924 this will cause the maximum size to be allocated if TYPE is of
kono
parents:
diff changeset
925 self-referential size. */
kono
parents:
diff changeset
926 extern tree build_allocator (tree type, tree init, tree result_type,
kono
parents:
diff changeset
927 Entity_Id gnat_proc, Entity_Id gnat_pool,
kono
parents:
diff changeset
928 Node_Id gnat_node, bool);
kono
parents:
diff changeset
929
kono
parents:
diff changeset
930 /* Indicate that we need to take the address of T and that it therefore
kono
parents:
diff changeset
931 should not be allocated in a register. Returns true if successful. */
kono
parents:
diff changeset
932 extern bool gnat_mark_addressable (tree t);
kono
parents:
diff changeset
933
kono
parents:
diff changeset
934 /* Save EXP for later use or reuse. This is equivalent to save_expr in tree.c
kono
parents:
diff changeset
935 but we know how to handle our own nodes. */
kono
parents:
diff changeset
936 extern tree gnat_save_expr (tree exp);
kono
parents:
diff changeset
937
kono
parents:
diff changeset
938 /* Protect EXP for immediate reuse. This is a variant of gnat_save_expr that
kono
parents:
diff changeset
939 is optimized under the assumption that EXP's value doesn't change before
kono
parents:
diff changeset
940 its subsequent reuse(s) except through its potential reevaluation. */
kono
parents:
diff changeset
941 extern tree gnat_protect_expr (tree exp);
kono
parents:
diff changeset
942
kono
parents:
diff changeset
943 /* This is equivalent to stabilize_reference in tree.c but we know how to
kono
parents:
diff changeset
944 handle our own nodes and we take extra arguments. FORCE says whether to
kono
parents:
diff changeset
945 force evaluation of everything in REF. INIT is set to the first arm of
kono
parents:
diff changeset
946 a COMPOUND_EXPR present in REF, if any. */
kono
parents:
diff changeset
947 extern tree gnat_stabilize_reference (tree ref, bool force, tree *init);
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 /* Rewrite reference REF and call FUNC on each expression within REF in the
kono
parents:
diff changeset
950 process. DATA is passed unmodified to FUNC. INIT is set to the first
kono
parents:
diff changeset
951 arm of a COMPOUND_EXPR present in REF, if any. */
kono
parents:
diff changeset
952 typedef tree (*rewrite_fn) (tree, void *);
kono
parents:
diff changeset
953 extern tree gnat_rewrite_reference (tree ref, rewrite_fn func, void *data,
kono
parents:
diff changeset
954 tree *init);
kono
parents:
diff changeset
955
kono
parents:
diff changeset
956 /* This is equivalent to get_inner_reference in expr.c but it returns the
kono
parents:
diff changeset
957 ultimate containing object only if the reference (lvalue) is constant,
kono
parents:
diff changeset
958 i.e. if it doesn't depend on the context in which it is evaluated. */
kono
parents:
diff changeset
959 extern tree get_inner_constant_reference (tree exp);
kono
parents:
diff changeset
960
kono
parents:
diff changeset
961 /* Return true if EXPR is the addition or the subtraction of a constant and,
kono
parents:
diff changeset
962 if so, set *ADD to the addend, *CST to the constant and *MINUS_P to true
kono
parents:
diff changeset
963 if this is a subtraction. */
kono
parents:
diff changeset
964 extern bool is_simple_additive_expression (tree expr, tree *add, tree *cst,
kono
parents:
diff changeset
965 bool *minus_p);
kono
parents:
diff changeset
966
kono
parents:
diff changeset
967 /* If EXPR is an expression that is invariant in the current function, in the
kono
parents:
diff changeset
968 sense that it can be evaluated anywhere in the function and any number of
kono
parents:
diff changeset
969 times, return EXPR or an equivalent expression. Otherwise return NULL. */
kono
parents:
diff changeset
970 extern tree gnat_invariant_expr (tree expr);
kono
parents:
diff changeset
971
kono
parents:
diff changeset
972 /* Implementation of the builtin_function langhook. */
kono
parents:
diff changeset
973 extern tree gnat_builtin_function (tree decl);
kono
parents:
diff changeset
974
kono
parents:
diff changeset
975 /* Search the chain of currently reachable declarations for a builtin
kono
parents:
diff changeset
976 FUNCTION_DECL node corresponding to function NAME (an IDENTIFIER_NODE).
kono
parents:
diff changeset
977 Return the first node found, if any, or NULL_TREE otherwise. */
kono
parents:
diff changeset
978 extern tree builtin_decl_for (tree name);
kono
parents:
diff changeset
979
kono
parents:
diff changeset
980 /* GNU_TYPE is a type. Determine if it should be passed by reference by
kono
parents:
diff changeset
981 default. */
kono
parents:
diff changeset
982 extern bool default_pass_by_ref (tree gnu_type);
kono
parents:
diff changeset
983
kono
parents:
diff changeset
984 /* GNU_TYPE is the type of a subprogram parameter. Determine from the type
kono
parents:
diff changeset
985 if it should be passed by reference. */
kono
parents:
diff changeset
986 extern bool must_pass_by_ref (tree gnu_type);
kono
parents:
diff changeset
987
kono
parents:
diff changeset
988 /* Return the size of the FP mode with precision PREC. */
kono
parents:
diff changeset
989 extern int fp_prec_to_size (int prec);
kono
parents:
diff changeset
990
kono
parents:
diff changeset
991 /* Return the precision of the FP mode with size SIZE. */
kono
parents:
diff changeset
992 extern int fp_size_to_prec (int size);
kono
parents:
diff changeset
993
kono
parents:
diff changeset
994 /* Return whether GNAT_NODE is a defining identifier for a renaming that comes
kono
parents:
diff changeset
995 from the parameter association for the instantiation of a generic. We do
kono
parents:
diff changeset
996 not want to emit source location for them: the code generated for their
kono
parents:
diff changeset
997 initialization is likely to disturb debugging. */
kono
parents:
diff changeset
998 extern bool renaming_from_instantiation_p (Node_Id gnat_node);
kono
parents:
diff changeset
999
kono
parents:
diff changeset
1000 /* Try to process all nodes in the deferred context queue. Keep in the queue
kono
parents:
diff changeset
1001 the ones that cannot be processed yet, remove the other ones. If FORCE is
kono
parents:
diff changeset
1002 true, force the processing for all nodes, use the global context when nodes
kono
parents:
diff changeset
1003 don't have a GNU translation. */
kono
parents:
diff changeset
1004 extern void process_deferred_decl_context (bool force);
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 /* Return the innermost scope, starting at GNAT_NODE, we are be interested in
kono
parents:
diff changeset
1007 the debug info, or Empty if there is no such scope. If not NULL, set
kono
parents:
diff changeset
1008 IS_SUBPROGRAM to whether the returned entity is a subprogram. */
kono
parents:
diff changeset
1009 extern Entity_Id get_debug_scope (Node_Id gnat_node, bool *is_subprogram);
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 /* Return whether EXPR, which is the renamed object in an object renaming
kono
parents:
diff changeset
1012 declaration, can be materialized as a reference (REFERENCE_TYPE). This
kono
parents:
diff changeset
1013 should be synchronized with Exp_Dbug.Debug_Renaming_Declaration. */
kono
parents:
diff changeset
1014 extern bool can_materialize_object_renaming_p (Node_Id expr);
kono
parents:
diff changeset
1015
kono
parents:
diff changeset
1016 #ifdef __cplusplus
kono
parents:
diff changeset
1017 extern "C" {
kono
parents:
diff changeset
1018 #endif
kono
parents:
diff changeset
1019
kono
parents:
diff changeset
1020 /* These functions return the basic data type sizes and related parameters
kono
parents:
diff changeset
1021 about the target machine. */
kono
parents:
diff changeset
1022 extern Pos get_target_bits_per_unit (void);
kono
parents:
diff changeset
1023 extern Pos get_target_bits_per_word (void);
kono
parents:
diff changeset
1024 extern Pos get_target_char_size (void);
kono
parents:
diff changeset
1025 extern Pos get_target_wchar_t_size (void);
kono
parents:
diff changeset
1026 extern Pos get_target_short_size (void);
kono
parents:
diff changeset
1027 extern Pos get_target_int_size (void);
kono
parents:
diff changeset
1028 extern Pos get_target_long_size (void);
kono
parents:
diff changeset
1029 extern Pos get_target_long_long_size (void);
kono
parents:
diff changeset
1030 extern Pos get_target_pointer_size (void);
kono
parents:
diff changeset
1031 extern Pos get_target_maximum_default_alignment (void);
kono
parents:
diff changeset
1032 extern Pos get_target_system_allocator_alignment (void);
kono
parents:
diff changeset
1033 extern Pos get_target_maximum_allowed_alignment (void);
kono
parents:
diff changeset
1034 extern Pos get_target_maximum_alignment (void);
kono
parents:
diff changeset
1035 extern Nat get_target_float_words_be (void);
kono
parents:
diff changeset
1036 extern Nat get_target_words_be (void);
kono
parents:
diff changeset
1037 extern Nat get_target_bytes_be (void);
kono
parents:
diff changeset
1038 extern Nat get_target_bits_be (void);
kono
parents:
diff changeset
1039 extern Nat get_target_strict_alignment (void);
kono
parents:
diff changeset
1040 extern Nat get_target_double_float_alignment (void);
kono
parents:
diff changeset
1041 extern Nat get_target_double_scalar_alignment (void);
kono
parents:
diff changeset
1042
kono
parents:
diff changeset
1043 /* This function is called by the front-end to enumerate all the supported
kono
parents:
diff changeset
1044 modes for the machine, as well as some predefined C types. */
kono
parents:
diff changeset
1045 extern void enumerate_modes (void (*f) (const char *, int, int, int, int, int,
kono
parents:
diff changeset
1046 int, int));
kono
parents:
diff changeset
1047
kono
parents:
diff changeset
1048 #ifdef __cplusplus
kono
parents:
diff changeset
1049 }
kono
parents:
diff changeset
1050 #endif
kono
parents:
diff changeset
1051
kono
parents:
diff changeset
1052 /* If EXP's type is a VECTOR_TYPE, return EXP converted to the associated
kono
parents:
diff changeset
1053 TYPE_REPRESENTATIVE_ARRAY. */
kono
parents:
diff changeset
1054
kono
parents:
diff changeset
1055 static inline tree
kono
parents:
diff changeset
1056 maybe_vector_array (tree exp)
kono
parents:
diff changeset
1057 {
kono
parents:
diff changeset
1058 tree etype = TREE_TYPE (exp);
kono
parents:
diff changeset
1059
kono
parents:
diff changeset
1060 if (VECTOR_TYPE_P (etype))
kono
parents:
diff changeset
1061 exp = convert (TYPE_REPRESENTATIVE_ARRAY (etype), exp);
kono
parents:
diff changeset
1062
kono
parents:
diff changeset
1063 return exp;
kono
parents:
diff changeset
1064 }
kono
parents:
diff changeset
1065
kono
parents:
diff changeset
1066 /* Return the smallest power of 2 larger than X. */
kono
parents:
diff changeset
1067
kono
parents:
diff changeset
1068 static inline unsigned HOST_WIDE_INT
kono
parents:
diff changeset
1069 ceil_pow2 (unsigned HOST_WIDE_INT x)
kono
parents:
diff changeset
1070 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1071 return (unsigned HOST_WIDE_INT) 1 << ceil_log2 (x);
111
kono
parents:
diff changeset
1072 }
kono
parents:
diff changeset
1073
kono
parents:
diff changeset
1074 /* Return true if EXP, a CALL_EXPR, is an atomic load. */
kono
parents:
diff changeset
1075
kono
parents:
diff changeset
1076 static inline bool
kono
parents:
diff changeset
1077 call_is_atomic_load (tree exp)
kono
parents:
diff changeset
1078 {
kono
parents:
diff changeset
1079 tree fndecl = get_callee_fndecl (exp);
kono
parents:
diff changeset
1080
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1081 if (!(fndecl && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)))
111
kono
parents:
diff changeset
1082 return false;
kono
parents:
diff changeset
1083
kono
parents:
diff changeset
1084 enum built_in_function code = DECL_FUNCTION_CODE (fndecl);
kono
parents:
diff changeset
1085 return BUILT_IN_ATOMIC_LOAD_N <= code && code <= BUILT_IN_ATOMIC_LOAD_16;
kono
parents:
diff changeset
1086 }
kono
parents:
diff changeset
1087
kono
parents:
diff changeset
1088 /* Return true if TYPE is padding a self-referential type. */
kono
parents:
diff changeset
1089
kono
parents:
diff changeset
1090 static inline bool
kono
parents:
diff changeset
1091 type_is_padding_self_referential (tree type)
kono
parents:
diff changeset
1092 {
kono
parents:
diff changeset
1093 if (!TYPE_IS_PADDING_P (type))
kono
parents:
diff changeset
1094 return false;
kono
parents:
diff changeset
1095
kono
parents:
diff changeset
1096 return CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type)));
kono
parents:
diff changeset
1097 }
kono
parents:
diff changeset
1098
kono
parents:
diff changeset
1099 /* Return true if a function returning TYPE doesn't return a fixed size. */
kono
parents:
diff changeset
1100
kono
parents:
diff changeset
1101 static inline bool
kono
parents:
diff changeset
1102 return_type_with_variable_size_p (tree type)
kono
parents:
diff changeset
1103 {
kono
parents:
diff changeset
1104 if (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
kono
parents:
diff changeset
1105 return true;
kono
parents:
diff changeset
1106
kono
parents:
diff changeset
1107 /* Return true for an unconstrained type with default discriminant, see
kono
parents:
diff changeset
1108 the E_Subprogram_Type case of gnat_to_gnu_entity. */
kono
parents:
diff changeset
1109 if (type_is_padding_self_referential (type))
kono
parents:
diff changeset
1110 return true;
kono
parents:
diff changeset
1111
kono
parents:
diff changeset
1112 return false;
kono
parents:
diff changeset
1113 }
kono
parents:
diff changeset
1114
kono
parents:
diff changeset
1115 /* Return the unsigned version of TYPE_NODE, a scalar type. */
kono
parents:
diff changeset
1116
kono
parents:
diff changeset
1117 static inline tree
kono
parents:
diff changeset
1118 gnat_unsigned_type_for (tree type_node)
kono
parents:
diff changeset
1119 {
kono
parents:
diff changeset
1120 return gnat_signed_or_unsigned_type_for (1, type_node);
kono
parents:
diff changeset
1121 }
kono
parents:
diff changeset
1122
kono
parents:
diff changeset
1123 /* Return the signed version of TYPE_NODE, a scalar type. */
kono
parents:
diff changeset
1124
kono
parents:
diff changeset
1125 static inline tree
kono
parents:
diff changeset
1126 gnat_signed_type_for (tree type_node)
kono
parents:
diff changeset
1127 {
kono
parents:
diff changeset
1128 return gnat_signed_or_unsigned_type_for (0, type_node);
kono
parents:
diff changeset
1129 }
kono
parents:
diff changeset
1130
kono
parents:
diff changeset
1131 /* Adjust the character type TYPE if need be. */
kono
parents:
diff changeset
1132
kono
parents:
diff changeset
1133 static inline tree
kono
parents:
diff changeset
1134 maybe_character_type (tree type)
kono
parents:
diff changeset
1135 {
kono
parents:
diff changeset
1136 if (TYPE_STRING_FLAG (type) && !TYPE_UNSIGNED (type))
kono
parents:
diff changeset
1137 type = gnat_unsigned_type_for (type);
kono
parents:
diff changeset
1138
kono
parents:
diff changeset
1139 return type;
kono
parents:
diff changeset
1140 }
kono
parents:
diff changeset
1141
kono
parents:
diff changeset
1142 /* Adjust the character value EXPR if need be. */
kono
parents:
diff changeset
1143
kono
parents:
diff changeset
1144 static inline tree
kono
parents:
diff changeset
1145 maybe_character_value (tree expr)
kono
parents:
diff changeset
1146 {
kono
parents:
diff changeset
1147 tree type = TREE_TYPE (expr);
kono
parents:
diff changeset
1148
kono
parents:
diff changeset
1149 if (TYPE_STRING_FLAG (type) && !TYPE_UNSIGNED (type))
kono
parents:
diff changeset
1150 {
kono
parents:
diff changeset
1151 type = gnat_unsigned_type_for (type);
kono
parents:
diff changeset
1152 expr = convert (type, expr);
kono
parents:
diff changeset
1153 }
kono
parents:
diff changeset
1154
kono
parents:
diff changeset
1155 return expr;
kono
parents:
diff changeset
1156 }
kono
parents:
diff changeset
1157
kono
parents:
diff changeset
1158 /* Return the debug type of TYPE if it exists, otherwise TYPE itself. */
kono
parents:
diff changeset
1159
kono
parents:
diff changeset
1160 static inline tree
kono
parents:
diff changeset
1161 maybe_debug_type (tree type)
kono
parents:
diff changeset
1162 {
kono
parents:
diff changeset
1163 if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type) && TYPE_DEBUG_TYPE (type))
kono
parents:
diff changeset
1164 type = TYPE_DEBUG_TYPE (type);
kono
parents:
diff changeset
1165
kono
parents:
diff changeset
1166 return type;
kono
parents:
diff changeset
1167 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1168
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1169 /* Like build_qualified_type, but TYPE_QUALS is added to the existing
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1170 qualifiers on TYPE. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1171
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1172 static inline tree
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1173 change_qualified_type (tree type, int type_quals)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1174 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1175 /* Qualifiers must be put on the associated array type. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1176 if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1177 return type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1178
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1179 return build_qualified_type (type, TYPE_QUALS (type) | type_quals);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1180 }