1 |
281 |
jeremybenn |
/****************************************************************************
|
2 |
|
|
* *
|
3 |
|
|
* GNAT COMPILER COMPONENTS *
|
4 |
|
|
* *
|
5 |
|
|
* G I G I *
|
6 |
|
|
* *
|
7 |
|
|
* C Header File *
|
8 |
|
|
* *
|
9 |
|
|
* Copyright (C) 1992-2009, Free Software Foundation, Inc. *
|
10 |
|
|
* *
|
11 |
|
|
* GNAT is free software; you can redistribute it and/or modify it under *
|
12 |
|
|
* terms of the GNU General Public License as published by the Free Soft- *
|
13 |
|
|
* ware Foundation; either version 3, or (at your option) any later ver- *
|
14 |
|
|
* sion. GNAT is distributed in the hope that it will be useful, but WITH- *
|
15 |
|
|
* OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
|
16 |
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
|
17 |
|
|
* for more details. You should have received a copy of the GNU General *
|
18 |
|
|
* Public License distributed with GNAT; see file COPYING3. If not see *
|
19 |
|
|
* <http://www.gnu.org/licenses/>. *
|
20 |
|
|
* *
|
21 |
|
|
* GNAT was originally developed by the GNAT team at New York University. *
|
22 |
|
|
* Extensive contributions were provided by Ada Core Technologies Inc. *
|
23 |
|
|
* *
|
24 |
|
|
****************************************************************************/
|
25 |
|
|
|
26 |
|
|
/* Declare all functions and types used by gigi. */
|
27 |
|
|
|
28 |
|
|
/* Given GNAT_ENTITY, a GNAT defining identifier node, which denotes some Ada
|
29 |
|
|
entity, this routine returns the equivalent GCC tree for that entity
|
30 |
|
|
(an ..._DECL node) and associates the ..._DECL node with the input GNAT
|
31 |
|
|
defining identifier.
|
32 |
|
|
|
33 |
|
|
If GNAT_ENTITY is a variable or a constant declaration, GNU_EXPR gives its
|
34 |
|
|
initial value (in GCC tree form). This is optional for variables.
|
35 |
|
|
For renamed entities, GNU_EXPR gives the object being renamed.
|
36 |
|
|
|
37 |
|
|
DEFINITION is nonzero if this call is intended for a definition. This is
|
38 |
|
|
used for separate compilation where it necessary to know whether an
|
39 |
|
|
external declaration or a definition should be created if the GCC equivalent
|
40 |
|
|
was not created previously. The value of 1 is normally used for a nonzero
|
41 |
|
|
DEFINITION, but a value of 2 is used in special circumstances, defined in
|
42 |
|
|
the code. */
|
43 |
|
|
extern tree gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr,
|
44 |
|
|
int definition);
|
45 |
|
|
|
46 |
|
|
/* Similar, but if the returned value is a COMPONENT_REF, return the
|
47 |
|
|
FIELD_DECL. */
|
48 |
|
|
extern tree gnat_to_gnu_field_decl (Entity_Id gnat_entity);
|
49 |
|
|
|
50 |
|
|
/* Similar, but GNAT_ENTITY is assumed to refer to a GNAT type. Return
|
51 |
|
|
the GCC type corresponding to that entity. */
|
52 |
|
|
extern tree gnat_to_gnu_type (Entity_Id gnat_entity);
|
53 |
|
|
|
54 |
|
|
/* Wrap up compilation of T, a TYPE_DECL, possibly deferring it. */
|
55 |
|
|
extern void rest_of_type_decl_compilation (tree t);
|
56 |
|
|
|
57 |
|
|
/* Start a new statement group chained to the previous group. */
|
58 |
|
|
extern void start_stmt_group (void);
|
59 |
|
|
|
60 |
|
|
/* Add GNU_STMT to the current BLOCK_STMT node. */
|
61 |
|
|
extern void add_stmt (tree gnu_stmt);
|
62 |
|
|
|
63 |
|
|
/* Similar, but set the location of GNU_STMT to that of GNAT_NODE. */
|
64 |
|
|
extern void add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node);
|
65 |
|
|
|
66 |
|
|
/* Return code corresponding to the current code group. It is normally
|
67 |
|
|
a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
|
68 |
|
|
BLOCK or cleanups were set. */
|
69 |
|
|
extern tree end_stmt_group (void);
|
70 |
|
|
|
71 |
|
|
/* Set the BLOCK node corresponding to the current code group to GNU_BLOCK. */
|
72 |
|
|
extern void set_block_for_group (tree);
|
73 |
|
|
|
74 |
|
|
/* Add a declaration statement for GNU_DECL to the current BLOCK_STMT node.
|
75 |
|
|
Get SLOC from GNAT_ENTITY. */
|
76 |
|
|
extern void add_decl_expr (tree gnu_decl, Entity_Id gnat_entity);
|
77 |
|
|
|
78 |
|
|
/* Mark nodes rooted at T with TREE_VISITED and types as having their
|
79 |
|
|
sized gimplified. We use this to indicate all variable sizes and
|
80 |
|
|
positions in global types may not be shared by any subprogram. */
|
81 |
|
|
extern void mark_visited (tree t);
|
82 |
|
|
|
83 |
|
|
/* This macro calls the above function but short-circuits the common
|
84 |
|
|
case of a constant to save time and also checks for NULL. */
|
85 |
|
|
|
86 |
|
|
#define MARK_VISITED(EXP) \
|
87 |
|
|
do { \
|
88 |
|
|
if((EXP) && !TREE_CONSTANT (EXP)) \
|
89 |
|
|
mark_visited (EXP); \
|
90 |
|
|
} while (0)
|
91 |
|
|
|
92 |
|
|
/* Finalize any From_With_Type incomplete types. We do this after processing
|
93 |
|
|
our compilation unit and after processing its spec, if this is a body. */
|
94 |
|
|
extern void finalize_from_with_types (void);
|
95 |
|
|
|
96 |
|
|
/* Return the equivalent type to be used for GNAT_ENTITY, if it's a
|
97 |
|
|
kind of type (such E_Task_Type) that has a different type which Gigi
|
98 |
|
|
uses for its representation. If the type does not have a special type
|
99 |
|
|
for its representation, return GNAT_ENTITY. If a type is supposed to
|
100 |
|
|
exist, but does not, abort unless annotating types, in which case
|
101 |
|
|
return Empty. If GNAT_ENTITY is Empty, return Empty. */
|
102 |
|
|
extern Entity_Id Gigi_Equivalent_Type (Entity_Id gnat_entity);
|
103 |
|
|
|
104 |
|
|
/* Given GNAT_ENTITY, elaborate all expressions that are required to
|
105 |
|
|
be elaborated at the point of its definition, but do nothing else. */
|
106 |
|
|
extern void elaborate_entity (Entity_Id gnat_entity);
|
107 |
|
|
|
108 |
|
|
/* Mark GNAT_ENTITY as going out of scope at this point. Recursively mark
|
109 |
|
|
any entities on its entity chain similarly. */
|
110 |
|
|
extern void mark_out_of_scope (Entity_Id gnat_entity);
|
111 |
|
|
|
112 |
|
|
/* Get the unpadded version of a GNAT type. */
|
113 |
|
|
extern tree get_unpadded_type (Entity_Id gnat_entity);
|
114 |
|
|
|
115 |
|
|
/* Called when we need to protect a variable object using a save_expr. */
|
116 |
|
|
extern tree maybe_variable (tree gnu_operand);
|
117 |
|
|
|
118 |
|
|
/* Create a record type that contains a SIZE bytes long field of TYPE with a
|
119 |
|
|
starting bit position so that it is aligned to ALIGN bits, and leaving at
|
120 |
|
|
least ROOM bytes free before the field. BASE_ALIGN is the alignment the
|
121 |
|
|
record is guaranteed to get. */
|
122 |
|
|
extern tree make_aligning_type (tree type, unsigned int align, tree size,
|
123 |
|
|
unsigned int base_align, int room);
|
124 |
|
|
|
125 |
|
|
/* Ensure that TYPE has SIZE and ALIGN. Make and return a new padded type
|
126 |
|
|
if needed. We have already verified that SIZE and TYPE are large enough.
|
127 |
|
|
GNAT_ENTITY is used to name the resulting record and to issue a warning.
|
128 |
|
|
IS_COMPONENT_TYPE is true if this is being done for the component type
|
129 |
|
|
of an array. IS_USER_TYPE is true if we must complete the original type.
|
130 |
|
|
DEFINITION is true if this type is being defined. SAME_RM_SIZE is true
|
131 |
|
|
if the RM size of the resulting type is to be set to SIZE too; otherwise,
|
132 |
|
|
it's set to the RM size of the original type. */
|
133 |
|
|
extern tree maybe_pad_type (tree type, tree size, unsigned int align,
|
134 |
|
|
Entity_Id gnat_entity, bool is_component_type,
|
135 |
|
|
bool is_user_type, bool definition,
|
136 |
|
|
bool same_rm_size);
|
137 |
|
|
|
138 |
|
|
/* Given a GNU tree and a GNAT list of choices, generate an expression to test
|
139 |
|
|
the value passed against the list of choices. */
|
140 |
|
|
extern tree choices_to_gnu (tree operand, Node_Id choices);
|
141 |
|
|
|
142 |
|
|
/* Given GNAT_ENTITY, an object (constant, variable, parameter, exception)
|
143 |
|
|
and GNU_TYPE, its corresponding GCC type, set Esize and Alignment to the
|
144 |
|
|
size and alignment used by Gigi. Prefer SIZE over TYPE_SIZE if non-null.
|
145 |
|
|
BY_REF is true if the object is used by reference. */
|
146 |
|
|
extern void annotate_object (Entity_Id gnat_entity, tree gnu_type, tree size,
|
147 |
|
|
bool by_ref);
|
148 |
|
|
|
149 |
|
|
/* Given a type T, a FIELD_DECL F, and a replacement value R, return a new
|
150 |
|
|
type with all size expressions that contain F updated by replacing F
|
151 |
|
|
with R. If F is NULL_TREE, always make a new RECORD_TYPE, even if
|
152 |
|
|
nothing has changed. */
|
153 |
|
|
extern tree substitute_in_type (tree t, tree f, tree r);
|
154 |
|
|
|
155 |
|
|
/* Return the RM size of GNU_TYPE. This is the actual number of bits
|
156 |
|
|
needed to represent the object. */
|
157 |
|
|
extern tree rm_size (tree gnu_type);
|
158 |
|
|
|
159 |
|
|
/* Return the name to be used for GNAT_ENTITY. If a type, create a
|
160 |
|
|
fully-qualified name, possibly with type information encoding.
|
161 |
|
|
Otherwise, return the name. */
|
162 |
|
|
extern tree get_entity_name (Entity_Id gnat_entity);
|
163 |
|
|
|
164 |
|
|
/* Return an identifier representing the external name to be used for
|
165 |
|
|
GNAT_ENTITY. If SUFFIX is specified, the name is followed by "___"
|
166 |
|
|
and the specified suffix. */
|
167 |
|
|
extern tree create_concat_name (Entity_Id gnat_entity, const char *suffix);
|
168 |
|
|
|
169 |
|
|
/* Given GNU_NAME, an IDENTIFIER_NODE containing a name and SUFFIX, a
|
170 |
|
|
string, return a new IDENTIFIER_NODE that is the concatenation of
|
171 |
|
|
the name followed by "___" and the specified suffix. */
|
172 |
|
|
extern tree concat_name (tree gnu_name, const char *suffix);
|
173 |
|
|
|
174 |
|
|
/* If true, then gigi is being called on an analyzed but unexpanded tree, and
|
175 |
|
|
the only purpose of the call is to properly annotate types with
|
176 |
|
|
representation information. */
|
177 |
|
|
extern bool type_annotate_only;
|
178 |
|
|
|
179 |
|
|
/* Current file name without path */
|
180 |
|
|
extern const char *ref_filename;
|
181 |
|
|
|
182 |
|
|
/* This structure must be kept synchronized with Call_Back_End. */
|
183 |
|
|
struct File_Info_Type
|
184 |
|
|
{
|
185 |
|
|
File_Name_Type File_Name;
|
186 |
|
|
Nat Num_Source_Lines;
|
187 |
|
|
};
|
188 |
|
|
|
189 |
|
|
/* This is the main program of the back-end. It sets up all the table
|
190 |
|
|
structures and then generates code.
|
191 |
|
|
|
192 |
|
|
??? Needs parameter descriptions */
|
193 |
|
|
|
194 |
|
|
extern void gigi (Node_Id gnat_root, int max_gnat_node, int number_name,
|
195 |
|
|
struct Node *nodes_ptr, Node_Id *next_node_ptr,
|
196 |
|
|
Node_Id *prev_node_ptr, struct Elist_Header *elists_ptr,
|
197 |
|
|
struct Elmt_Item *elmts_ptr,
|
198 |
|
|
struct String_Entry *strings_ptr,
|
199 |
|
|
Char_Code *strings_chars_ptr,
|
200 |
|
|
struct List_Header *list_headers_ptr,
|
201 |
|
|
Nat number_file,
|
202 |
|
|
struct File_Info_Type *file_info_ptr,
|
203 |
|
|
Entity_Id standard_boolean,
|
204 |
|
|
Entity_Id standard_integer,
|
205 |
|
|
Entity_Id standard_long_long_float,
|
206 |
|
|
Entity_Id standard_exception_type,
|
207 |
|
|
Int gigi_operating_mode);
|
208 |
|
|
|
209 |
|
|
/* GNAT_NODE is the root of some GNAT tree. Return the root of the
|
210 |
|
|
GCC tree corresponding to that GNAT tree. Normally, no code is generated;
|
211 |
|
|
we just return an equivalent tree which is used elsewhere to generate
|
212 |
|
|
code. */
|
213 |
|
|
extern tree gnat_to_gnu (Node_Id gnat_node);
|
214 |
|
|
|
215 |
|
|
/* GNU_STMT is a statement. We generate code for that statement. */
|
216 |
|
|
extern void gnat_expand_stmt (tree gnu_stmt);
|
217 |
|
|
|
218 |
|
|
/* Generate GIMPLE in place for the expression at *EXPR_P. */
|
219 |
|
|
extern int gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
|
220 |
|
|
gimple_seq *post_p ATTRIBUTE_UNUSED);
|
221 |
|
|
|
222 |
|
|
/* Do the processing for the declaration of a GNAT_ENTITY, a type. If
|
223 |
|
|
a separate Freeze node exists, delay the bulk of the processing. Otherwise
|
224 |
|
|
make a GCC type for GNAT_ENTITY and set up the correspondence. */
|
225 |
|
|
extern void process_type (Entity_Id gnat_entity);
|
226 |
|
|
|
227 |
|
|
/* Convert SLOC into LOCUS. Return true if SLOC corresponds to a source code
|
228 |
|
|
location and false if it doesn't. In the former case, set the Gigi global
|
229 |
|
|
variable REF_FILENAME to the simple debug file name as given by sinput. */
|
230 |
|
|
extern bool Sloc_to_locus (Source_Ptr Sloc, location_t *locus);
|
231 |
|
|
|
232 |
|
|
/* Post an error message. MSG is the error message, properly annotated.
|
233 |
|
|
NODE is the node at which to post the error and the node to use for the
|
234 |
|
|
"&" substitution. */
|
235 |
|
|
extern void post_error (const char *msg, Node_Id node);
|
236 |
|
|
|
237 |
|
|
/* Similar, but NODE is the node at which to post the error and ENT
|
238 |
|
|
is the node to use for the "&" substitution. */
|
239 |
|
|
extern void post_error_ne (const char *msg, Node_Id node, Entity_Id ent);
|
240 |
|
|
|
241 |
|
|
/* Similar, but NODE is the node at which to post the error, ENT is the node
|
242 |
|
|
to use for the "&" substitution, and N is the number to use for the ^. */
|
243 |
|
|
extern void post_error_ne_num (const char *msg, Node_Id node, Entity_Id ent,
|
244 |
|
|
int n);
|
245 |
|
|
|
246 |
|
|
/* Similar to post_error_ne_num, but T is a GCC tree representing the number
|
247 |
|
|
to write. If the tree represents a constant that fits within a
|
248 |
|
|
host integer, the text inside curly brackets in MSG will be output
|
249 |
|
|
(presumably including a '^'). Otherwise that text will not be output
|
250 |
|
|
and the text inside square brackets will be output instead. */
|
251 |
|
|
extern void post_error_ne_tree (const char *msg, Node_Id node, Entity_Id ent,
|
252 |
|
|
tree t);
|
253 |
|
|
|
254 |
|
|
/* Similar to post_error_ne_tree, except that NUM is a second
|
255 |
|
|
integer to write in the message. */
|
256 |
|
|
extern void post_error_ne_tree_2 (const char *msg, Node_Id node, Entity_Id ent,
|
257 |
|
|
tree t, int num);
|
258 |
|
|
|
259 |
|
|
/* Protect EXP from multiple evaluation. This may make a SAVE_EXPR. */
|
260 |
|
|
extern tree protect_multiple_eval (tree exp);
|
261 |
|
|
|
262 |
|
|
/* Return a label to branch to for the exception type in KIND or NULL_TREE
|
263 |
|
|
if none. */
|
264 |
|
|
extern tree get_exception_label (char kind);
|
265 |
|
|
|
266 |
|
|
/* Current node being treated, in case gigi_abort or Check_Elaboration_Code
|
267 |
|
|
called. */
|
268 |
|
|
extern Node_Id error_gnat_node;
|
269 |
|
|
|
270 |
|
|
/* This is equivalent to stabilize_reference in tree.c, but we know how to
|
271 |
|
|
handle our own nodes and we take extra arguments. FORCE says whether to
|
272 |
|
|
force evaluation of everything. We set SUCCESS to true unless we walk
|
273 |
|
|
through something we don't know how to stabilize. */
|
274 |
|
|
extern tree maybe_stabilize_reference (tree ref, bool force, bool *success);
|
275 |
|
|
|
276 |
|
|
/* Highest number in the front-end node table. */
|
277 |
|
|
extern int max_gnat_nodes;
|
278 |
|
|
|
279 |
|
|
/* If nonzero, pretend we are allocating at global level. */
|
280 |
|
|
extern int force_global;
|
281 |
|
|
|
282 |
|
|
/* The default alignment of "double" floating-point types, i.e. floating
|
283 |
|
|
point types whose size is equal to 64 bits, or 0 if this alignment is
|
284 |
|
|
not specifically capped. */
|
285 |
|
|
extern int double_float_alignment;
|
286 |
|
|
|
287 |
|
|
/* The default alignment of "double" or larger scalar types, i.e. scalar
|
288 |
|
|
types whose size is greater or equal to 64 bits, or 0 if this alignment
|
289 |
|
|
is not specifically capped. */
|
290 |
|
|
extern int double_scalar_alignment;
|
291 |
|
|
|
292 |
|
|
/* Standard data type sizes. Most of these are not used. */
|
293 |
|
|
|
294 |
|
|
#ifndef CHAR_TYPE_SIZE
|
295 |
|
|
#define CHAR_TYPE_SIZE BITS_PER_UNIT
|
296 |
|
|
#endif
|
297 |
|
|
|
298 |
|
|
#ifndef SHORT_TYPE_SIZE
|
299 |
|
|
#define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
|
300 |
|
|
#endif
|
301 |
|
|
|
302 |
|
|
#ifndef INT_TYPE_SIZE
|
303 |
|
|
#define INT_TYPE_SIZE BITS_PER_WORD
|
304 |
|
|
#endif
|
305 |
|
|
|
306 |
|
|
#ifndef LONG_TYPE_SIZE
|
307 |
|
|
#define LONG_TYPE_SIZE BITS_PER_WORD
|
308 |
|
|
#endif
|
309 |
|
|
|
310 |
|
|
#ifndef LONG_LONG_TYPE_SIZE
|
311 |
|
|
#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
|
312 |
|
|
#endif
|
313 |
|
|
|
314 |
|
|
#ifndef FLOAT_TYPE_SIZE
|
315 |
|
|
#define FLOAT_TYPE_SIZE BITS_PER_WORD
|
316 |
|
|
#endif
|
317 |
|
|
|
318 |
|
|
#ifndef DOUBLE_TYPE_SIZE
|
319 |
|
|
#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
|
320 |
|
|
#endif
|
321 |
|
|
|
322 |
|
|
#ifndef LONG_DOUBLE_TYPE_SIZE
|
323 |
|
|
#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
|
324 |
|
|
#endif
|
325 |
|
|
|
326 |
|
|
/* The choice of SIZE_TYPE here is very problematic. We need a signed
|
327 |
|
|
type whose bit width is Pmode. Assume "long" is such a type here. */
|
328 |
|
|
#undef SIZE_TYPE
|
329 |
|
|
#define SIZE_TYPE "long int"
|
330 |
|
|
|
331 |
|
|
/* Data structures used to represent attributes. */
|
332 |
|
|
|
333 |
|
|
enum attr_type
|
334 |
|
|
{
|
335 |
|
|
ATTR_MACHINE_ATTRIBUTE,
|
336 |
|
|
ATTR_LINK_ALIAS,
|
337 |
|
|
ATTR_LINK_SECTION,
|
338 |
|
|
ATTR_LINK_CONSTRUCTOR,
|
339 |
|
|
ATTR_LINK_DESTRUCTOR,
|
340 |
|
|
ATTR_THREAD_LOCAL_STORAGE,
|
341 |
|
|
ATTR_WEAK_EXTERNAL
|
342 |
|
|
};
|
343 |
|
|
|
344 |
|
|
struct attrib
|
345 |
|
|
{
|
346 |
|
|
struct attrib *next;
|
347 |
|
|
enum attr_type type;
|
348 |
|
|
tree name;
|
349 |
|
|
tree args;
|
350 |
|
|
Node_Id error_point;
|
351 |
|
|
};
|
352 |
|
|
|
353 |
|
|
/* Table of machine-independent internal attributes. */
|
354 |
|
|
extern const struct attribute_spec gnat_internal_attribute_table[];
|
355 |
|
|
|
356 |
|
|
/* Define the entries in the standard data array. */
|
357 |
|
|
enum standard_datatypes
|
358 |
|
|
{
|
359 |
|
|
/* The longest floating-point type. */
|
360 |
|
|
ADT_longest_float_type,
|
361 |
|
|
|
362 |
|
|
/* The type of an exception. */
|
363 |
|
|
ADT_except_type,
|
364 |
|
|
|
365 |
|
|
/* Type declaration node <==> typedef void *T */
|
366 |
|
|
ADT_ptr_void_type,
|
367 |
|
|
|
368 |
|
|
/* Function type declaration -- void T() */
|
369 |
|
|
ADT_void_ftype,
|
370 |
|
|
|
371 |
|
|
/* Type declaration node <==> typedef void *T() */
|
372 |
|
|
ADT_ptr_void_ftype,
|
373 |
|
|
|
374 |
|
|
/* Type declaration node <==> typedef virtual void *T() */
|
375 |
|
|
ADT_fdesc_type,
|
376 |
|
|
|
377 |
|
|
/* Null pointer for above type */
|
378 |
|
|
ADT_null_fdesc,
|
379 |
|
|
|
380 |
|
|
/* Function declaration nodes for run-time functions for allocating memory.
|
381 |
|
|
Ada allocators cause calls to these functions to be generated. Malloc32
|
382 |
|
|
is used only on 64bit systems needing to allocate 32bit memory. */
|
383 |
|
|
ADT_malloc_decl,
|
384 |
|
|
ADT_malloc32_decl,
|
385 |
|
|
|
386 |
|
|
/* Likewise for freeing memory. */
|
387 |
|
|
ADT_free_decl,
|
388 |
|
|
|
389 |
|
|
/* Function decl node for 64-bit multiplication with overflow checking */
|
390 |
|
|
ADT_mulv64_decl,
|
391 |
|
|
|
392 |
|
|
/* Types and decls used by our temporary exception mechanism. See
|
393 |
|
|
init_gigi_decls for details. */
|
394 |
|
|
ADT_jmpbuf_type,
|
395 |
|
|
ADT_jmpbuf_ptr_type,
|
396 |
|
|
ADT_get_jmpbuf_decl,
|
397 |
|
|
ADT_set_jmpbuf_decl,
|
398 |
|
|
ADT_get_excptr_decl,
|
399 |
|
|
ADT_setjmp_decl,
|
400 |
|
|
ADT_longjmp_decl,
|
401 |
|
|
ADT_update_setjmp_buf_decl,
|
402 |
|
|
ADT_raise_nodefer_decl,
|
403 |
|
|
ADT_begin_handler_decl,
|
404 |
|
|
ADT_end_handler_decl,
|
405 |
|
|
ADT_others_decl,
|
406 |
|
|
ADT_all_others_decl,
|
407 |
|
|
ADT_LAST};
|
408 |
|
|
|
409 |
|
|
extern GTY(()) tree gnat_std_decls[(int) ADT_LAST];
|
410 |
|
|
extern GTY(()) tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
|
411 |
|
|
|
412 |
|
|
#define longest_float_type_node gnat_std_decls[(int) ADT_longest_float_type]
|
413 |
|
|
#define except_type_node gnat_std_decls[(int) ADT_except_type]
|
414 |
|
|
#define ptr_void_type_node gnat_std_decls[(int) ADT_ptr_void_type]
|
415 |
|
|
#define void_ftype gnat_std_decls[(int) ADT_void_ftype]
|
416 |
|
|
#define ptr_void_ftype gnat_std_decls[(int) ADT_ptr_void_ftype]
|
417 |
|
|
#define fdesc_type_node gnat_std_decls[(int) ADT_fdesc_type]
|
418 |
|
|
#define null_fdesc_node gnat_std_decls[(int) ADT_null_fdesc]
|
419 |
|
|
#define malloc_decl gnat_std_decls[(int) ADT_malloc_decl]
|
420 |
|
|
#define malloc32_decl gnat_std_decls[(int) ADT_malloc32_decl]
|
421 |
|
|
#define free_decl gnat_std_decls[(int) ADT_free_decl]
|
422 |
|
|
#define mulv64_decl gnat_std_decls[(int) ADT_mulv64_decl]
|
423 |
|
|
#define jmpbuf_type gnat_std_decls[(int) ADT_jmpbuf_type]
|
424 |
|
|
#define jmpbuf_ptr_type gnat_std_decls[(int) ADT_jmpbuf_ptr_type]
|
425 |
|
|
#define get_jmpbuf_decl gnat_std_decls[(int) ADT_get_jmpbuf_decl]
|
426 |
|
|
#define set_jmpbuf_decl gnat_std_decls[(int) ADT_set_jmpbuf_decl]
|
427 |
|
|
#define get_excptr_decl gnat_std_decls[(int) ADT_get_excptr_decl]
|
428 |
|
|
#define setjmp_decl gnat_std_decls[(int) ADT_setjmp_decl]
|
429 |
|
|
#define longjmp_decl gnat_std_decls[(int) ADT_longjmp_decl]
|
430 |
|
|
#define update_setjmp_buf_decl gnat_std_decls[(int) ADT_update_setjmp_buf_decl]
|
431 |
|
|
#define raise_nodefer_decl gnat_std_decls[(int) ADT_raise_nodefer_decl]
|
432 |
|
|
#define begin_handler_decl gnat_std_decls[(int) ADT_begin_handler_decl]
|
433 |
|
|
#define others_decl gnat_std_decls[(int) ADT_others_decl]
|
434 |
|
|
#define all_others_decl gnat_std_decls[(int) ADT_all_others_decl]
|
435 |
|
|
#define end_handler_decl gnat_std_decls[(int) ADT_end_handler_decl]
|
436 |
|
|
|
437 |
|
|
/* Routines expected by the gcc back-end. They must have exactly the same
|
438 |
|
|
prototype and names as below. */
|
439 |
|
|
|
440 |
|
|
/* Returns nonzero if we are currently in the global binding level. */
|
441 |
|
|
extern int global_bindings_p (void);
|
442 |
|
|
|
443 |
|
|
/* Enter and exit a new binding level. */
|
444 |
|
|
extern void gnat_pushlevel (void);
|
445 |
|
|
extern void gnat_poplevel (void);
|
446 |
|
|
|
447 |
|
|
/* Set SUPERCONTEXT of the BLOCK for the current binding level to FNDECL
|
448 |
|
|
and point FNDECL to this BLOCK. */
|
449 |
|
|
extern void set_current_block_context (tree fndecl);
|
450 |
|
|
|
451 |
|
|
/* Set the jmpbuf_decl for the current binding level to DECL. */
|
452 |
|
|
extern void set_block_jmpbuf_decl (tree decl);
|
453 |
|
|
|
454 |
|
|
/* Get the setjmp_decl, if any, for the current binding level. */
|
455 |
|
|
extern tree get_block_jmpbuf_decl (void);
|
456 |
|
|
|
457 |
|
|
/* Records a ..._DECL node DECL as belonging to the current lexical scope
|
458 |
|
|
and uses GNAT_NODE for location information. */
|
459 |
|
|
extern void gnat_pushdecl (tree decl, Node_Id gnat_node);
|
460 |
|
|
|
461 |
|
|
extern void gnat_init_decl_processing (void);
|
462 |
|
|
extern void gnat_init_gcc_eh (void);
|
463 |
|
|
extern void gnat_install_builtins (void);
|
464 |
|
|
|
465 |
|
|
/* Return an integer type with the number of bits of precision given by
|
466 |
|
|
PRECISION. UNSIGNEDP is nonzero if the type is unsigned; otherwise
|
467 |
|
|
it is a signed type. */
|
468 |
|
|
extern tree gnat_type_for_size (unsigned precision, int unsignedp);
|
469 |
|
|
|
470 |
|
|
/* Return a data type that has machine mode MODE. UNSIGNEDP selects
|
471 |
|
|
an unsigned type; otherwise a signed type is returned. */
|
472 |
|
|
extern tree gnat_type_for_mode (enum machine_mode mode, int unsignedp);
|
473 |
|
|
|
474 |
|
|
/* Emit debug info for all global variable declarations. */
|
475 |
|
|
extern void gnat_write_global_declarations (void);
|
476 |
|
|
|
477 |
|
|
/* Return the unsigned version of a TYPE_NODE, a scalar type. */
|
478 |
|
|
extern tree gnat_unsigned_type (tree type_node);
|
479 |
|
|
|
480 |
|
|
/* Return the signed version of a TYPE_NODE, a scalar type. */
|
481 |
|
|
extern tree gnat_signed_type (tree type_node);
|
482 |
|
|
|
483 |
|
|
/* Return 1 if the types T1 and T2 are compatible, i.e. if they can be
|
484 |
|
|
transparently converted to each other. */
|
485 |
|
|
extern int gnat_types_compatible_p (tree t1, tree t2);
|
486 |
|
|
|
487 |
|
|
/* Create an expression whose value is that of EXPR,
|
488 |
|
|
converted to type TYPE. The TREE_TYPE of the value
|
489 |
|
|
is always TYPE. This function implements all reasonable
|
490 |
|
|
conversions; callers should filter out those that are
|
491 |
|
|
not permitted by the language being compiled. */
|
492 |
|
|
extern tree convert (tree type, tree expr);
|
493 |
|
|
|
494 |
|
|
/* Routines created solely for the tree translator's sake. Their prototypes
|
495 |
|
|
can be changed as desired. */
|
496 |
|
|
|
497 |
|
|
/* Initialize the association of GNAT nodes to GCC trees. */
|
498 |
|
|
extern void init_gnat_to_gnu (void);
|
499 |
|
|
|
500 |
|
|
/* GNAT_ENTITY is a GNAT tree node for a defining identifier.
|
501 |
|
|
GNU_DECL is the GCC tree which is to be associated with
|
502 |
|
|
GNAT_ENTITY. Such gnu tree node is always an ..._DECL node.
|
503 |
|
|
If NO_CHECK is nonzero, the latter check is suppressed.
|
504 |
|
|
If GNU_DECL is zero, a previous association is to be reset. */
|
505 |
|
|
extern void save_gnu_tree (Entity_Id gnat_entity, tree gnu_decl,
|
506 |
|
|
bool no_check);
|
507 |
|
|
|
508 |
|
|
/* GNAT_ENTITY is a GNAT tree node for a defining identifier.
|
509 |
|
|
Return the ..._DECL node that was associated with it. If there is no tree
|
510 |
|
|
node associated with GNAT_ENTITY, abort. */
|
511 |
|
|
extern tree get_gnu_tree (Entity_Id gnat_entity);
|
512 |
|
|
|
513 |
|
|
/* Return nonzero if a GCC tree has been associated with GNAT_ENTITY. */
|
514 |
|
|
extern bool present_gnu_tree (Entity_Id gnat_entity);
|
515 |
|
|
|
516 |
|
|
/* Initialize the association of GNAT nodes to GCC trees as dummies. */
|
517 |
|
|
extern void init_dummy_type (void);
|
518 |
|
|
|
519 |
|
|
/* Make a dummy type corresponding to GNAT_TYPE. */
|
520 |
|
|
extern tree make_dummy_type (Entity_Id gnat_type);
|
521 |
|
|
|
522 |
|
|
/* Record TYPE as a builtin type for Ada. NAME is the name of the type. */
|
523 |
|
|
extern void record_builtin_type (const char *name, tree type);
|
524 |
|
|
|
525 |
|
|
/* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
|
526 |
|
|
finish constructing the record or union type. If REP_LEVEL is zero, this
|
527 |
|
|
record has no representation clause and so will be entirely laid out here.
|
528 |
|
|
If REP_LEVEL is one, this record has a representation clause and has been
|
529 |
|
|
laid out already; only set the sizes and alignment. If REP_LEVEL is two,
|
530 |
|
|
this record is derived from a parent record and thus inherits its layout;
|
531 |
|
|
only make a pass on the fields to finalize them. DEBUG_INFO_P is true if
|
532 |
|
|
we need to write debug information about this type. */
|
533 |
|
|
extern void finish_record_type (tree record_type, tree field_list,
|
534 |
|
|
int rep_level, bool debug_info_p);
|
535 |
|
|
|
536 |
|
|
/* Wrap up compilation of RECORD_TYPE, i.e. output all the debug information
|
537 |
|
|
associated with it. It need not be invoked directly in most cases since
|
538 |
|
|
finish_record_type takes care of doing so, but this can be necessary if
|
539 |
|
|
a parallel type is to be attached to the record type. */
|
540 |
|
|
extern void rest_of_record_type_compilation (tree record_type);
|
541 |
|
|
|
542 |
|
|
/* Append PARALLEL_TYPE on the chain of parallel types for decl. */
|
543 |
|
|
extern void add_parallel_type (tree decl, tree parallel_type);
|
544 |
|
|
|
545 |
|
|
/* Return the parallel type associated to a type, if any. */
|
546 |
|
|
extern tree get_parallel_type (tree type);
|
547 |
|
|
|
548 |
|
|
/* Returns a FUNCTION_TYPE node. RETURN_TYPE is the type returned by the
|
549 |
|
|
subprogram. If it is void_type_node, then we are dealing with a procedure,
|
550 |
|
|
otherwise we are dealing with a function. PARAM_DECL_LIST is a list of
|
551 |
|
|
PARM_DECL nodes that are the subprogram arguments. CICO_LIST is the
|
552 |
|
|
copy-in/copy-out list to be stored into TYPE_CI_CO_LIST.
|
553 |
|
|
RETURNS_UNCONSTRAINED is true if the function returns an unconstrained
|
554 |
|
|
object. RETURNS_BY_REF is true if the function returns by reference.
|
555 |
|
|
RETURNS_BY_TARGET_PTR is true if the function is to be passed (as its
|
556 |
|
|
first parameter) the address of the place to copy its result. */
|
557 |
|
|
extern tree create_subprog_type (tree return_type, tree param_decl_list,
|
558 |
|
|
tree cico_list, bool returns_unconstrained,
|
559 |
|
|
bool returns_by_ref,
|
560 |
|
|
bool returns_by_target_ptr);
|
561 |
|
|
|
562 |
|
|
/* Return a copy of TYPE, but safe to modify in any way. */
|
563 |
|
|
extern tree copy_type (tree type);
|
564 |
|
|
|
565 |
|
|
/* Return a subtype of sizetype with range MIN to MAX and whose
|
566 |
|
|
TYPE_INDEX_TYPE is INDEX. GNAT_NODE is used for the position
|
567 |
|
|
of the associated TYPE_DECL. */
|
568 |
|
|
extern tree create_index_type (tree min, tree max, tree index,
|
569 |
|
|
Node_Id gnat_node);
|
570 |
|
|
|
571 |
|
|
/* Return a subtype of TYPE with range MIN to MAX. If TYPE is NULL,
|
572 |
|
|
sizetype is used. */
|
573 |
|
|
extern tree create_range_type (tree type, tree min, tree max);
|
574 |
|
|
|
575 |
|
|
/* Return a TYPE_DECL node suitable for the TYPE_STUB_DECL field of a type.
|
576 |
|
|
TYPE_NAME gives the name of the type and TYPE is a ..._TYPE node giving
|
577 |
|
|
its data type. */
|
578 |
|
|
extern tree create_type_stub_decl (tree type_name, tree type);
|
579 |
|
|
|
580 |
|
|
/* Return a TYPE_DECL node. TYPE_NAME gives the name of the type and TYPE
|
581 |
|
|
is a ..._TYPE node giving its data type. ARTIFICIAL_P is true if this
|
582 |
|
|
is a declaration that was generated by the compiler. DEBUG_INFO_P is
|
583 |
|
|
true if we need to write debug information about this type. GNAT_NODE
|
584 |
|
|
is used for the position of the decl. */
|
585 |
|
|
extern tree create_type_decl (tree type_name, tree type,
|
586 |
|
|
struct attrib *attr_list,
|
587 |
|
|
bool artificial_p, bool debug_info_p,
|
588 |
|
|
Node_Id gnat_node);
|
589 |
|
|
|
590 |
|
|
/* Return a VAR_DECL or CONST_DECL node.
|
591 |
|
|
|
592 |
|
|
VAR_NAME gives the name of the variable. ASM_NAME is its assembler name
|
593 |
|
|
(if provided). TYPE is its data type (a GCC ..._TYPE node). VAR_INIT is
|
594 |
|
|
the GCC tree for an optional initial expression; NULL_TREE if none.
|
595 |
|
|
|
596 |
|
|
CONST_FLAG is true if this variable is constant, in which case we might
|
597 |
|
|
return a CONST_DECL node unless CONST_DECL_ALLOWED_P is false.
|
598 |
|
|
|
599 |
|
|
PUBLIC_FLAG is true if this definition is to be made visible outside of
|
600 |
|
|
the current compilation unit. This flag should be set when processing the
|
601 |
|
|
variable definitions in a package specification.
|
602 |
|
|
|
603 |
|
|
EXTERN_FLAG is nonzero when processing an external variable declaration (as
|
604 |
|
|
opposed to a definition: no storage is to be allocated for the variable).
|
605 |
|
|
|
606 |
|
|
STATIC_FLAG is only relevant when not at top level. In that case
|
607 |
|
|
it indicates whether to always allocate storage to the variable.
|
608 |
|
|
|
609 |
|
|
GNAT_NODE is used for the position of the decl. */
|
610 |
|
|
extern tree
|
611 |
|
|
create_var_decl_1 (tree var_name, tree asm_name, tree type, tree var_init,
|
612 |
|
|
bool const_flag, bool public_flag, bool extern_flag,
|
613 |
|
|
bool static_flag, bool const_decl_allowed_p,
|
614 |
|
|
struct attrib *attr_list, Node_Id gnat_node);
|
615 |
|
|
|
616 |
|
|
/* Wrapper around create_var_decl_1 for cases where we don't care whether
|
617 |
|
|
a VAR or a CONST decl node is created. */
|
618 |
|
|
#define create_var_decl(var_name, asm_name, type, var_init, \
|
619 |
|
|
const_flag, public_flag, extern_flag, \
|
620 |
|
|
static_flag, attr_list, gnat_node) \
|
621 |
|
|
create_var_decl_1 (var_name, asm_name, type, var_init, \
|
622 |
|
|
const_flag, public_flag, extern_flag, \
|
623 |
|
|
static_flag, true, attr_list, gnat_node)
|
624 |
|
|
|
625 |
|
|
/* Wrapper around create_var_decl_1 for cases where a VAR_DECL node is
|
626 |
|
|
required. The primary intent is for DECL_CONST_CORRESPONDING_VARs, which
|
627 |
|
|
must be VAR_DECLs and on which we want TREE_READONLY set to have them
|
628 |
|
|
possibly assigned to a readonly data section. */
|
629 |
|
|
#define create_true_var_decl(var_name, asm_name, type, var_init, \
|
630 |
|
|
const_flag, public_flag, extern_flag, \
|
631 |
|
|
static_flag, attr_list, gnat_node) \
|
632 |
|
|
create_var_decl_1 (var_name, asm_name, type, var_init, \
|
633 |
|
|
const_flag, public_flag, extern_flag, \
|
634 |
|
|
static_flag, false, attr_list, gnat_node)
|
635 |
|
|
|
636 |
|
|
/* Given a DECL and ATTR_LIST, apply the listed attributes. */
|
637 |
|
|
extern void process_attributes (tree decl, struct attrib *attr_list);
|
638 |
|
|
|
639 |
|
|
/* Record DECL as a global renaming pointer. */
|
640 |
|
|
extern void record_global_renaming_pointer (tree decl);
|
641 |
|
|
|
642 |
|
|
/* Invalidate the global renaming pointers. */
|
643 |
|
|
extern void invalidate_global_renaming_pointers (void);
|
644 |
|
|
|
645 |
|
|
/* Return a FIELD_DECL node. FIELD_NAME is the field's name, FIELD_TYPE is
|
646 |
|
|
its type and RECORD_TYPE is the type of the enclosing record. PACKED is
|
647 |
|
|
1 if the enclosing record is packed, -1 if it has Component_Alignment of
|
648 |
|
|
Storage_Unit. If SIZE is nonzero, it is the specified size of the field.
|
649 |
|
|
If POS is nonzero, it is the bit position. If ADDRESSABLE is nonzero, it
|
650 |
|
|
means we are allowed to take the address of the field; if it is negative,
|
651 |
|
|
we should not make a bitfield, which is used by make_aligning_type. */
|
652 |
|
|
extern tree create_field_decl (tree field_name, tree field_type,
|
653 |
|
|
tree record_type, int packed, tree size,
|
654 |
|
|
tree pos, int addressable);
|
655 |
|
|
|
656 |
|
|
/* Returns a PARM_DECL node. PARAM_NAME is the name of the parameter,
|
657 |
|
|
PARAM_TYPE is its type. READONLY is true if the parameter is
|
658 |
|
|
readonly (either an In parameter or an address of a pass-by-ref
|
659 |
|
|
parameter). */
|
660 |
|
|
extern tree create_param_decl (tree param_name, tree param_type,
|
661 |
|
|
bool readonly);
|
662 |
|
|
|
663 |
|
|
/* Returns a FUNCTION_DECL node. SUBPROG_NAME is the name of the subprogram,
|
664 |
|
|
ASM_NAME is its assembler name, SUBPROG_TYPE is its type (a FUNCTION_TYPE
|
665 |
|
|
node), PARAM_DECL_LIST is the list of the subprogram arguments (a list of
|
666 |
|
|
PARM_DECL nodes chained through the TREE_CHAIN field).
|
667 |
|
|
|
668 |
|
|
INLINE_FLAG, PUBLIC_FLAG, EXTERN_FLAG, and ATTR_LIST are used to set the
|
669 |
|
|
appropriate fields in the FUNCTION_DECL. GNAT_NODE gives the location. */
|
670 |
|
|
extern tree create_subprog_decl (tree subprog_name, tree asm_name,
|
671 |
|
|
tree subprog_type, tree param_decl_list,
|
672 |
|
|
bool inlinee_flag, bool public_flag,
|
673 |
|
|
bool extern_flag,
|
674 |
|
|
struct attrib *attr_list, Node_Id gnat_node);
|
675 |
|
|
|
676 |
|
|
/* Returns a LABEL_DECL node for LABEL_NAME. */
|
677 |
|
|
extern tree create_label_decl (tree label_name);
|
678 |
|
|
|
679 |
|
|
/* Set up the framework for generating code for SUBPROG_DECL, a subprogram
|
680 |
|
|
body. This routine needs to be invoked before processing the declarations
|
681 |
|
|
appearing in the subprogram. */
|
682 |
|
|
extern void begin_subprog_body (tree subprog_decl);
|
683 |
|
|
|
684 |
|
|
/* Finish the definition of the current subprogram BODY and finalize it. */
|
685 |
|
|
extern void end_subprog_body (tree body);
|
686 |
|
|
|
687 |
|
|
/* Build a template of type TEMPLATE_TYPE from the array bounds of ARRAY_TYPE.
|
688 |
|
|
EXPR is an expression that we can use to locate any PLACEHOLDER_EXPRs.
|
689 |
|
|
Return a constructor for the template. */
|
690 |
|
|
extern tree build_template (tree template_type, tree array_type, tree expr);
|
691 |
|
|
|
692 |
|
|
/* Build a 64bit VMS descriptor from a Mechanism_Type, which must specify
|
693 |
|
|
a descriptor type, and the GCC type of an object. Each FIELD_DECL
|
694 |
|
|
in the type contains in its DECL_INITIAL the expression to use when
|
695 |
|
|
a constructor is made for the type. GNAT_ENTITY is a gnat node used
|
696 |
|
|
to print out an error message if the mechanism cannot be applied to
|
697 |
|
|
an object of that type and also for the name. */
|
698 |
|
|
extern tree build_vms_descriptor (tree type, Mechanism_Type mech,
|
699 |
|
|
Entity_Id gnat_entity);
|
700 |
|
|
|
701 |
|
|
/* Build a 32bit VMS descriptor from a Mechanism_Type. See above. */
|
702 |
|
|
extern tree build_vms_descriptor32 (tree type, Mechanism_Type mech,
|
703 |
|
|
Entity_Id gnat_entity);
|
704 |
|
|
|
705 |
|
|
/* Build a stub for the subprogram specified by the GCC tree GNU_SUBPROG
|
706 |
|
|
and the GNAT node GNAT_SUBPROG. */
|
707 |
|
|
extern void build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog);
|
708 |
|
|
|
709 |
|
|
/* Build a type to be used to represent an aliased object whose nominal
|
710 |
|
|
type is an unconstrained array. This consists of a RECORD_TYPE containing
|
711 |
|
|
a field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an
|
712 |
|
|
ARRAY_TYPE. If ARRAY_TYPE is that of the unconstrained array, this
|
713 |
|
|
is used to represent an arbitrary unconstrained object. Use NAME
|
714 |
|
|
as the name of the record. */
|
715 |
|
|
extern tree build_unc_object_type (tree template_type, tree object_type,
|
716 |
|
|
tree name);
|
717 |
|
|
|
718 |
|
|
/* Same as build_unc_object_type, but taking a thin or fat pointer type
|
719 |
|
|
instead of the template type. */
|
720 |
|
|
extern tree build_unc_object_type_from_ptr (tree thin_fat_ptr_type,
|
721 |
|
|
tree object_type, tree name);
|
722 |
|
|
|
723 |
|
|
/* Shift the component offsets within an unconstrained object TYPE to make it
|
724 |
|
|
suitable for use as a designated type for thin pointers. */
|
725 |
|
|
extern void shift_unc_components_for_thin_pointers (tree type);
|
726 |
|
|
|
727 |
|
|
/* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE. In
|
728 |
|
|
the normal case this is just two adjustments, but we have more to do
|
729 |
|
|
if NEW is an UNCONSTRAINED_ARRAY_TYPE. */
|
730 |
|
|
extern void update_pointer_to (tree old_type, tree new_type);
|
731 |
|
|
|
732 |
|
|
/* EXP is an expression for the size of an object. If this size contains
|
733 |
|
|
discriminant references, replace them with the maximum (if MAX_P) or
|
734 |
|
|
minimum (if !MAX_P) possible value of the discriminant. */
|
735 |
|
|
extern tree max_size (tree exp, bool max_p);
|
736 |
|
|
|
737 |
|
|
/* Remove all conversions that are done in EXP. This includes converting
|
738 |
|
|
from a padded type or to a left-justified modular type. If TRUE_ADDRESS
|
739 |
|
|
is true, always return the address of the containing object even if
|
740 |
|
|
the address is not bit-aligned. */
|
741 |
|
|
extern tree remove_conversions (tree exp, bool true_address);
|
742 |
|
|
|
743 |
|
|
/* If EXP's type is an UNCONSTRAINED_ARRAY_TYPE, return an expression that
|
744 |
|
|
refers to the underlying array. If its type has TYPE_CONTAINS_TEMPLATE_P,
|
745 |
|
|
likewise return an expression pointing to the underlying array. */
|
746 |
|
|
extern tree maybe_unconstrained_array (tree exp);
|
747 |
|
|
|
748 |
|
|
/* If EXP's type is a VECTOR_TYPE, return EXP converted to the associated
|
749 |
|
|
TYPE_REPRESENTATIVE_ARRAY. */
|
750 |
|
|
extern tree maybe_vector_array (tree exp);
|
751 |
|
|
|
752 |
|
|
/* Return an expression that does an unchecked conversion of EXPR to TYPE.
|
753 |
|
|
If NOTRUNC_P is true, truncation operations should be suppressed. */
|
754 |
|
|
extern tree unchecked_convert (tree type, tree expr, bool notrunc_p);
|
755 |
|
|
|
756 |
|
|
/* Return the appropriate GCC tree code for the specified GNAT_TYPE,
|
757 |
|
|
the latter being a record type as predicated by Is_Record_Type. */
|
758 |
|
|
extern enum tree_code tree_code_for_record_type (Entity_Id gnat_type);
|
759 |
|
|
|
760 |
|
|
/* Return true if GNAT_TYPE is a "double" floating-point type, i.e. whose
|
761 |
|
|
size is equal to 64 bits, or an array of such a type. Set ALIGN_CLAUSE
|
762 |
|
|
according to the presence of an alignment clause on the type or, if it
|
763 |
|
|
is an array, on the component type. */
|
764 |
|
|
extern bool is_double_float_or_array (Entity_Id gnat_type,
|
765 |
|
|
bool *align_clause);
|
766 |
|
|
|
767 |
|
|
/* Return true if GNAT_TYPE is a "double" or larger scalar type, i.e. whose
|
768 |
|
|
size is greater or equal to 64 bits, or an array of such a type. Set
|
769 |
|
|
ALIGN_CLAUSE according to the presence of an alignment clause on the
|
770 |
|
|
type or, if it is an array, on the component type. */
|
771 |
|
|
extern bool is_double_scalar_or_array (Entity_Id gnat_type,
|
772 |
|
|
bool *align_clause);
|
773 |
|
|
|
774 |
|
|
/* Return true if GNU_TYPE is suitable as the type of a non-aliased
|
775 |
|
|
component of an aggregate type. */
|
776 |
|
|
extern bool type_for_nonaliased_component_p (tree gnu_type);
|
777 |
|
|
|
778 |
|
|
/* Return the base type of TYPE. */
|
779 |
|
|
extern tree get_base_type (tree type);
|
780 |
|
|
|
781 |
|
|
/* EXP is a GCC tree representing an address. See if we can find how
|
782 |
|
|
strictly the object at that address is aligned. Return that alignment
|
783 |
|
|
strictly the object at that address is aligned. Return that alignment
|
784 |
|
|
in bits. If we don't know anything about the alignment, return 0. */
|
785 |
|
|
extern unsigned int known_alignment (tree exp);
|
786 |
|
|
|
787 |
|
|
/* Return true if VALUE is a multiple of FACTOR. FACTOR must be a power
|
788 |
|
|
of 2. */
|
789 |
|
|
extern bool value_factor_p (tree value, HOST_WIDE_INT factor);
|
790 |
|
|
|
791 |
|
|
/* Make a binary operation of kind OP_CODE. RESULT_TYPE is the type
|
792 |
|
|
desired for the result. Usually the operation is to be performed
|
793 |
|
|
in that type. For MODIFY_EXPR and ARRAY_REF, RESULT_TYPE may be 0
|
794 |
|
|
in which case the type to be used will be derived from the operands. */
|
795 |
|
|
extern tree build_binary_op (enum tree_code op_code, tree result_type,
|
796 |
|
|
tree left_operand, tree right_operand);
|
797 |
|
|
|
798 |
|
|
/* Similar, but make unary operation. */
|
799 |
|
|
extern tree build_unary_op (enum tree_code op_code, tree result_type,
|
800 |
|
|
tree operand);
|
801 |
|
|
|
802 |
|
|
/* Similar, but for COND_EXPR. */
|
803 |
|
|
extern tree build_cond_expr (tree result_type, tree condition_operand,
|
804 |
|
|
tree true_operand, tree false_operand);
|
805 |
|
|
|
806 |
|
|
/* Similar, but for RETURN_EXPR. */
|
807 |
|
|
extern tree build_return_expr (tree result_decl, tree ret_val);
|
808 |
|
|
|
809 |
|
|
/* Build a CALL_EXPR to call FUNDECL with one argument, ARG. Return
|
810 |
|
|
the CALL_EXPR. */
|
811 |
|
|
extern tree build_call_1_expr (tree fundecl, tree arg);
|
812 |
|
|
|
813 |
|
|
/* Build a CALL_EXPR to call FUNDECL with two argument, ARG1 & ARG2. Return
|
814 |
|
|
the CALL_EXPR. */
|
815 |
|
|
extern tree build_call_2_expr (tree fundecl, tree arg1, tree arg2);
|
816 |
|
|
|
817 |
|
|
/* Likewise to call FUNDECL with no arguments. */
|
818 |
|
|
extern tree build_call_0_expr (tree fundecl);
|
819 |
|
|
|
820 |
|
|
/* Call a function that raises an exception and pass the line number and file
|
821 |
|
|
name, if requested. MSG says which exception function to call.
|
822 |
|
|
|
823 |
|
|
GNAT_NODE is the gnat node conveying the source location for which the
|
824 |
|
|
error should be signaled, or Empty in which case the error is signaled on
|
825 |
|
|
the current ref_file_name/input_line.
|
826 |
|
|
|
827 |
|
|
KIND says which kind of exception this is for
|
828 |
|
|
(N_Raise_{Constraint,Storage,Program}_Error). */
|
829 |
|
|
extern tree build_call_raise (int msg, Node_Id gnat_node, char kind);
|
830 |
|
|
|
831 |
|
|
/* Return a CONSTRUCTOR of TYPE whose list is LIST. This is not the
|
832 |
|
|
same as build_constructor in the language-independent tree.c. */
|
833 |
|
|
extern tree gnat_build_constructor (tree type, tree list);
|
834 |
|
|
|
835 |
|
|
/* Return a COMPONENT_REF to access a field that is given by COMPONENT,
|
836 |
|
|
an IDENTIFIER_NODE giving the name of the field, FIELD, a FIELD_DECL,
|
837 |
|
|
for the field, or both. Don't fold the result if NO_FOLD_P. */
|
838 |
|
|
extern tree build_component_ref (tree record_variable, tree component,
|
839 |
|
|
tree field, bool no_fold_p);
|
840 |
|
|
|
841 |
|
|
/* Build a GCC tree to call an allocation or deallocation function.
|
842 |
|
|
If GNU_OBJ is nonzero, it is an object to deallocate. Otherwise,
|
843 |
|
|
generate an allocator.
|
844 |
|
|
|
845 |
|
|
GNU_SIZE is the number of bytes to allocate and GNU_TYPE is the contained
|
846 |
|
|
object type, used to determine the to-be-honored address alignment.
|
847 |
|
|
GNAT_PROC, if present, is a procedure to call and GNAT_POOL is the storage
|
848 |
|
|
pool to use. If not present, malloc and free are used. GNAT_NODE is used
|
849 |
|
|
to provide an error location for restriction violation messages. */
|
850 |
|
|
extern tree build_call_alloc_dealloc (tree gnu_obj, tree gnu_size,
|
851 |
|
|
tree gnu_type, Entity_Id gnat_proc,
|
852 |
|
|
Entity_Id gnat_pool, Node_Id gnat_node);
|
853 |
|
|
|
854 |
|
|
/* Build a GCC tree to correspond to allocating an object of TYPE whose
|
855 |
|
|
initial value if INIT, if INIT is nonzero. Convert the expression to
|
856 |
|
|
RESULT_TYPE, which must be some type of pointer. Return the tree.
|
857 |
|
|
|
858 |
|
|
GNAT_PROC and GNAT_POOL optionally give the procedure to call and
|
859 |
|
|
the storage pool to use. GNAT_NODE is used to provide an error
|
860 |
|
|
location for restriction violation messages. If IGNORE_INIT_TYPE is
|
861 |
|
|
true, ignore the type of INIT for the purpose of determining the size;
|
862 |
|
|
this will cause the maximum size to be allocated if TYPE is of
|
863 |
|
|
self-referential size. */
|
864 |
|
|
extern tree build_allocator (tree type, tree init, tree result_type,
|
865 |
|
|
Entity_Id gnat_proc, Entity_Id gnat_pool,
|
866 |
|
|
Node_Id gnat_node, bool);
|
867 |
|
|
|
868 |
|
|
/* Fill in a VMS descriptor for EXPR and return a constructor for it.
|
869 |
|
|
GNAT_FORMAL is how we find the descriptor record. GNAT_ACTUAL is how
|
870 |
|
|
we derive the source location on a C_E */
|
871 |
|
|
extern tree fill_vms_descriptor (tree expr, Entity_Id gnat_formal,
|
872 |
|
|
Node_Id gnat_actual);
|
873 |
|
|
|
874 |
|
|
/* Indicate that we need to make the address of EXPR_NODE and it therefore
|
875 |
|
|
should not be allocated in a register. Return true if successful. */
|
876 |
|
|
extern bool gnat_mark_addressable (tree expr_node);
|
877 |
|
|
|
878 |
|
|
/* Implementation of the builtin_function langhook. */
|
879 |
|
|
extern tree gnat_builtin_function (tree decl);
|
880 |
|
|
|
881 |
|
|
/* Search the chain of currently reachable declarations for a builtin
|
882 |
|
|
FUNCTION_DECL node corresponding to function NAME (an IDENTIFIER_NODE).
|
883 |
|
|
Return the first node found, if any, or NULL_TREE otherwise. */
|
884 |
|
|
extern tree builtin_decl_for (tree name);
|
885 |
|
|
|
886 |
|
|
/* GNU_TYPE is a type. Determine if it should be passed by reference by
|
887 |
|
|
default. */
|
888 |
|
|
extern bool default_pass_by_ref (tree gnu_type);
|
889 |
|
|
|
890 |
|
|
/* GNU_TYPE is the type of a subprogram parameter. Determine from the type
|
891 |
|
|
if it should be passed by reference. */
|
892 |
|
|
extern bool must_pass_by_ref (tree gnu_type);
|
893 |
|
|
|
894 |
|
|
/* This function is called by the front end to enumerate all the supported
|
895 |
|
|
modes for the machine. We pass a function which is called back with
|
896 |
|
|
the following integer parameters:
|
897 |
|
|
|
898 |
|
|
FLOAT_P nonzero if this represents a floating-point mode
|
899 |
|
|
COMPLEX_P nonzero is this represents a complex mode
|
900 |
|
|
COUNT count of number of items, nonzero for vector mode
|
901 |
|
|
PRECISION number of bits in data representation
|
902 |
|
|
MANTISSA number of bits in mantissa, if FP and known, else zero.
|
903 |
|
|
SIZE number of bits used to store data
|
904 |
|
|
ALIGN number of bits to which mode is aligned. */
|
905 |
|
|
extern void enumerate_modes (void (*f) (int, int, int, int, int, int,
|
906 |
|
|
unsigned int));
|
907 |
|
|
|
908 |
|
|
/* Return the size of the FP mode with precision PREC. */
|
909 |
|
|
extern int fp_prec_to_size (int prec);
|
910 |
|
|
|
911 |
|
|
/* Return the precision of the FP mode with size SIZE. */
|
912 |
|
|
extern int fp_size_to_prec (int size);
|
913 |
|
|
|
914 |
|
|
/* These functions return the basic data type sizes and related parameters
|
915 |
|
|
about the target machine. */
|
916 |
|
|
|
917 |
|
|
extern Pos get_target_bits_per_unit (void);
|
918 |
|
|
extern Pos get_target_bits_per_word (void);
|
919 |
|
|
extern Pos get_target_char_size (void);
|
920 |
|
|
extern Pos get_target_wchar_t_size (void);
|
921 |
|
|
extern Pos get_target_short_size (void);
|
922 |
|
|
extern Pos get_target_int_size (void);
|
923 |
|
|
extern Pos get_target_long_size (void);
|
924 |
|
|
extern Pos get_target_long_long_size (void);
|
925 |
|
|
extern Pos get_target_float_size (void);
|
926 |
|
|
extern Pos get_target_double_size (void);
|
927 |
|
|
extern Pos get_target_long_double_size (void);
|
928 |
|
|
extern Pos get_target_pointer_size (void);
|
929 |
|
|
extern Pos get_target_maximum_default_alignment (void);
|
930 |
|
|
extern Pos get_target_default_allocator_alignment (void);
|
931 |
|
|
extern Pos get_target_maximum_allowed_alignment (void);
|
932 |
|
|
extern Pos get_target_maximum_alignment (void);
|
933 |
|
|
extern Nat get_float_words_be (void);
|
934 |
|
|
extern Nat get_words_be (void);
|
935 |
|
|
extern Nat get_bytes_be (void);
|
936 |
|
|
extern Nat get_bits_be (void);
|
937 |
|
|
extern Nat get_target_strict_alignment (void);
|
938 |
|
|
extern Nat get_target_double_float_alignment (void);
|
939 |
|
|
extern Nat get_target_double_scalar_alignment (void);
|
940 |
|
|
|
941 |
|
|
/* Let code know whether we are targetting VMS without need of
|
942 |
|
|
intrusive preprocessor directives. */
|
943 |
|
|
#ifndef TARGET_ABI_OPEN_VMS
|
944 |
|
|
#define TARGET_ABI_OPEN_VMS 0
|
945 |
|
|
#endif
|
946 |
|
|
|
947 |
|
|
/* VMS macro set by default, when clear forces 32bit mallocs and 32bit
|
948 |
|
|
Descriptors. Always used in combination with TARGET_ABI_OPEN_VMS
|
949 |
|
|
so no effect on non-VMS systems. */
|
950 |
|
|
#ifndef TARGET_MALLOC64
|
951 |
|
|
#define TARGET_MALLOC64 0
|
952 |
|
|
#endif
|
953 |
|
|
|
954 |
|
|
/* Convenient shortcuts. */
|
955 |
|
|
#define VECTOR_TYPE_P(TYPE) (TREE_CODE (TYPE) == VECTOR_TYPE)
|