dd1669b7977e9795b61d0c537ea49cb9f1151aba
[gcc.git] / gcc / ada / gcc-interface / trans.c
1 /****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * T R A N S *
6 * *
7 * C Implementation File *
8 * *
9 * Copyright (C) 1992-2012, 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 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "tree.h"
31 #include "flags.h"
32 #include "ggc.h"
33 #include "output.h"
34 #include "libfuncs.h" /* For set_stack_check_libfunc. */
35 #include "tree-iterator.h"
36 #include "gimple.h"
37 #include "bitmap.h"
38 #include "cgraph.h"
39
40 #include "ada.h"
41 #include "adadecode.h"
42 #include "types.h"
43 #include "atree.h"
44 #include "elists.h"
45 #include "namet.h"
46 #include "nlists.h"
47 #include "snames.h"
48 #include "stringt.h"
49 #include "uintp.h"
50 #include "urealp.h"
51 #include "fe.h"
52 #include "sinfo.h"
53 #include "einfo.h"
54 #include "gadaint.h"
55 #include "ada-tree.h"
56 #include "gigi.h"
57
58 /* We should avoid allocating more than ALLOCA_THRESHOLD bytes via alloca,
59 for fear of running out of stack space. If we need more, we use xmalloc
60 instead. */
61 #define ALLOCA_THRESHOLD 1000
62
63 /* Let code below know whether we are targetting VMS without need of
64 intrusive preprocessor directives. */
65 #ifndef TARGET_ABI_OPEN_VMS
66 #define TARGET_ABI_OPEN_VMS 0
67 #endif
68
69 /* In configurations where blocks have no end_locus attached, just
70 sink assignments into a dummy global. */
71 #ifndef BLOCK_SOURCE_END_LOCATION
72 static location_t block_end_locus_sink;
73 #define BLOCK_SOURCE_END_LOCATION(BLOCK) block_end_locus_sink
74 #endif
75
76 /* For efficient float-to-int rounding, it is necessary to know whether
77 floating-point arithmetic may use wider intermediate results. When
78 FP_ARITH_MAY_WIDEN is not defined, be conservative and only assume
79 that arithmetic does not widen if double precision is emulated. */
80 #ifndef FP_ARITH_MAY_WIDEN
81 #if defined(HAVE_extendsfdf2)
82 #define FP_ARITH_MAY_WIDEN HAVE_extendsfdf2
83 #else
84 #define FP_ARITH_MAY_WIDEN 0
85 #endif
86 #endif
87
88 /* Pointers to front-end tables accessed through macros. */
89 struct Node *Nodes_Ptr;
90 Node_Id *Next_Node_Ptr;
91 Node_Id *Prev_Node_Ptr;
92 struct Elist_Header *Elists_Ptr;
93 struct Elmt_Item *Elmts_Ptr;
94 struct String_Entry *Strings_Ptr;
95 Char_Code *String_Chars_Ptr;
96 struct List_Header *List_Headers_Ptr;
97
98 /* Highest number in the front-end node table. */
99 int max_gnat_nodes;
100
101 /* Current node being treated, in case abort called. */
102 Node_Id error_gnat_node;
103
104 /* True when gigi is being called on an analyzed but unexpanded
105 tree, and the only purpose of the call is to properly annotate
106 types with representation information. */
107 bool type_annotate_only;
108
109 /* Current filename without path. */
110 const char *ref_filename;
111
112 DEF_VEC_I(Node_Id);
113 DEF_VEC_ALLOC_I(Node_Id,heap);
114
115 /* List of N_Validate_Unchecked_Conversion nodes in the unit. */
116 static VEC(Node_Id,heap) *gnat_validate_uc_list;
117
118 /* When not optimizing, we cache the 'First, 'Last and 'Length attributes
119 of unconstrained array IN parameters to avoid emitting a great deal of
120 redundant instructions to recompute them each time. */
121 struct GTY (()) parm_attr_d {
122 int id; /* GTY doesn't like Entity_Id. */
123 int dim;
124 tree first;
125 tree last;
126 tree length;
127 };
128
129 typedef struct parm_attr_d *parm_attr;
130
131 DEF_VEC_P(parm_attr);
132 DEF_VEC_ALLOC_P(parm_attr,gc);
133
134 struct GTY(()) language_function {
135 VEC(parm_attr,gc) *parm_attr_cache;
136 bitmap named_ret_val;
137 VEC(tree,gc) *other_ret_val;
138 int gnat_ret;
139 };
140
141 #define f_parm_attr_cache \
142 DECL_STRUCT_FUNCTION (current_function_decl)->language->parm_attr_cache
143
144 #define f_named_ret_val \
145 DECL_STRUCT_FUNCTION (current_function_decl)->language->named_ret_val
146
147 #define f_other_ret_val \
148 DECL_STRUCT_FUNCTION (current_function_decl)->language->other_ret_val
149
150 #define f_gnat_ret \
151 DECL_STRUCT_FUNCTION (current_function_decl)->language->gnat_ret
152
153 /* A structure used to gather together information about a statement group.
154 We use this to gather related statements, for example the "then" part
155 of a IF. In the case where it represents a lexical scope, we may also
156 have a BLOCK node corresponding to it and/or cleanups. */
157
158 struct GTY((chain_next ("%h.previous"))) stmt_group {
159 struct stmt_group *previous; /* Previous code group. */
160 tree stmt_list; /* List of statements for this code group. */
161 tree block; /* BLOCK for this code group, if any. */
162 tree cleanups; /* Cleanups for this code group, if any. */
163 };
164
165 static GTY(()) struct stmt_group *current_stmt_group;
166
167 /* List of unused struct stmt_group nodes. */
168 static GTY((deletable)) struct stmt_group *stmt_group_free_list;
169
170 /* A structure used to record information on elaboration procedures
171 we've made and need to process.
172
173 ??? gnat_node should be Node_Id, but gengtype gets confused. */
174
175 struct GTY((chain_next ("%h.next"))) elab_info {
176 struct elab_info *next; /* Pointer to next in chain. */
177 tree elab_proc; /* Elaboration procedure. */
178 int gnat_node; /* The N_Compilation_Unit. */
179 };
180
181 static GTY(()) struct elab_info *elab_info_list;
182
183 /* Stack of exception pointer variables. Each entry is the VAR_DECL
184 that stores the address of the raised exception. Nonzero means we
185 are in an exception handler. Not used in the zero-cost case. */
186 static GTY(()) VEC(tree,gc) *gnu_except_ptr_stack;
187
188 /* In ZCX case, current exception pointer. Used to re-raise it. */
189 static GTY(()) tree gnu_incoming_exc_ptr;
190
191 /* Stack for storing the current elaboration procedure decl. */
192 static GTY(()) VEC(tree,gc) *gnu_elab_proc_stack;
193
194 /* Stack of labels to be used as a goto target instead of a return in
195 some functions. See processing for N_Subprogram_Body. */
196 static GTY(()) VEC(tree,gc) *gnu_return_label_stack;
197
198 /* Stack of variable for the return value of a function with copy-in/copy-out
199 parameters. See processing for N_Subprogram_Body. */
200 static GTY(()) VEC(tree,gc) *gnu_return_var_stack;
201
202 /* Structure used to record information for a range check. */
203 struct GTY(()) range_check_info_d {
204 tree low_bound;
205 tree high_bound;
206 tree type;
207 tree invariant_cond;
208 };
209
210 typedef struct range_check_info_d *range_check_info;
211
212 DEF_VEC_P(range_check_info);
213 DEF_VEC_ALLOC_P(range_check_info,gc);
214
215 /* Structure used to record information for a loop. */
216 struct GTY(()) loop_info_d {
217 tree label;
218 tree loop_var;
219 VEC(range_check_info,gc) *checks;
220 };
221
222 typedef struct loop_info_d *loop_info;
223
224 DEF_VEC_P(loop_info);
225 DEF_VEC_ALLOC_P(loop_info,gc);
226
227 /* Stack of loop_info structures associated with LOOP_STMT nodes. */
228 static GTY(()) VEC(loop_info,gc) *gnu_loop_stack;
229
230 /* The stacks for N_{Push,Pop}_*_Label. */
231 static GTY(()) VEC(tree,gc) *gnu_constraint_error_label_stack;
232 static GTY(()) VEC(tree,gc) *gnu_storage_error_label_stack;
233 static GTY(()) VEC(tree,gc) *gnu_program_error_label_stack;
234
235 /* Map GNAT tree codes to GCC tree codes for simple expressions. */
236 static enum tree_code gnu_codes[Number_Node_Kinds];
237
238 static void init_code_table (void);
239 static void Compilation_Unit_to_gnu (Node_Id);
240 static void record_code_position (Node_Id);
241 static void insert_code_for (Node_Id);
242 static void add_cleanup (tree, Node_Id);
243 static void add_stmt_list (List_Id);
244 static void push_exception_label_stack (VEC(tree,gc) **, Entity_Id);
245 static tree build_stmt_group (List_Id, bool);
246 static enum gimplify_status gnat_gimplify_stmt (tree *);
247 static void elaborate_all_entities (Node_Id);
248 static void process_freeze_entity (Node_Id);
249 static void process_decls (List_Id, List_Id, Node_Id, bool, bool);
250 static tree emit_range_check (tree, Node_Id, Node_Id);
251 static tree emit_index_check (tree, tree, tree, tree, Node_Id);
252 static tree emit_check (tree, tree, int, Node_Id);
253 static tree build_unary_op_trapv (enum tree_code, tree, tree, Node_Id);
254 static tree build_binary_op_trapv (enum tree_code, tree, tree, tree, Node_Id);
255 static tree convert_with_check (Entity_Id, tree, bool, bool, bool, Node_Id);
256 static bool addressable_p (tree, tree);
257 static tree assoc_to_constructor (Entity_Id, Node_Id, tree);
258 static tree extract_values (tree, tree);
259 static tree pos_to_constructor (Node_Id, tree, Entity_Id);
260 static void validate_unchecked_conversion (Node_Id);
261 static tree maybe_implicit_deref (tree);
262 static void set_expr_location_from_node (tree, Node_Id);
263 static bool set_end_locus_from_node (tree, Node_Id);
264 static void set_gnu_expr_location_from_node (tree, Node_Id);
265 static int lvalue_required_p (Node_Id, tree, bool, bool, bool);
266 static tree build_raise_check (int, enum exception_info_kind);
267 static tree create_init_temporary (const char *, tree, tree *, Node_Id);
268
269 /* Hooks for debug info back-ends, only supported and used in a restricted set
270 of configurations. */
271 static const char *extract_encoding (const char *) ATTRIBUTE_UNUSED;
272 static const char *decode_name (const char *) ATTRIBUTE_UNUSED;
273 \f
274 /* This is the main program of the back-end. It sets up all the table
275 structures and then generates code. */
276
277 void
278 gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
279 struct Node *nodes_ptr, Node_Id *next_node_ptr, Node_Id *prev_node_ptr,
280 struct Elist_Header *elists_ptr, struct Elmt_Item *elmts_ptr,
281 struct String_Entry *strings_ptr, Char_Code *string_chars_ptr,
282 struct List_Header *list_headers_ptr, Nat number_file,
283 struct File_Info_Type *file_info_ptr,
284 Entity_Id standard_boolean, Entity_Id standard_integer,
285 Entity_Id standard_character, Entity_Id standard_long_long_float,
286 Entity_Id standard_exception_type, Int gigi_operating_mode)
287 {
288 Node_Id gnat_iter;
289 Entity_Id gnat_literal;
290 tree long_long_float_type, exception_type, t, ftype;
291 tree int64_type = gnat_type_for_size (64, 0);
292 struct elab_info *info;
293 int i;
294
295 max_gnat_nodes = max_gnat_node;
296
297 Nodes_Ptr = nodes_ptr;
298 Next_Node_Ptr = next_node_ptr;
299 Prev_Node_Ptr = prev_node_ptr;
300 Elists_Ptr = elists_ptr;
301 Elmts_Ptr = elmts_ptr;
302 Strings_Ptr = strings_ptr;
303 String_Chars_Ptr = string_chars_ptr;
304 List_Headers_Ptr = list_headers_ptr;
305
306 type_annotate_only = (gigi_operating_mode == 1);
307
308 for (i = 0; i < number_file; i++)
309 {
310 /* Use the identifier table to make a permanent copy of the filename as
311 the name table gets reallocated after Gigi returns but before all the
312 debugging information is output. The __gnat_to_canonical_file_spec
313 call translates filenames from pragmas Source_Reference that contain
314 host style syntax not understood by gdb. */
315 const char *filename
316 = IDENTIFIER_POINTER
317 (get_identifier
318 (__gnat_to_canonical_file_spec
319 (Get_Name_String (file_info_ptr[i].File_Name))));
320
321 /* We rely on the order isomorphism between files and line maps. */
322 gcc_assert ((int) LINEMAPS_ORDINARY_USED (line_table) == i);
323
324 /* We create the line map for a source file at once, with a fixed number
325 of columns chosen to avoid jumping over the next power of 2. */
326 linemap_add (line_table, LC_ENTER, 0, filename, 1);
327 linemap_line_start (line_table, file_info_ptr[i].Num_Source_Lines, 252);
328 linemap_position_for_column (line_table, 252 - 1);
329 linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
330 }
331
332 gcc_assert (Nkind (gnat_root) == N_Compilation_Unit);
333
334 /* Declare the name of the compilation unit as the first global
335 name in order to make the middle-end fully deterministic. */
336 t = create_concat_name (Defining_Entity (Unit (gnat_root)), NULL);
337 first_global_object_name = ggc_strdup (IDENTIFIER_POINTER (t));
338
339 /* Initialize ourselves. */
340 init_code_table ();
341 init_gnat_utils ();
342
343 /* If we are just annotating types, give VOID_TYPE zero sizes to avoid
344 errors. */
345 if (type_annotate_only)
346 {
347 TYPE_SIZE (void_type_node) = bitsize_zero_node;
348 TYPE_SIZE_UNIT (void_type_node) = size_zero_node;
349 }
350
351 /* Enable GNAT stack checking method if needed */
352 if (!Stack_Check_Probes_On_Target)
353 set_stack_check_libfunc ("_gnat_stack_check");
354
355 /* Retrieve alignment settings. */
356 double_float_alignment = get_target_double_float_alignment ();
357 double_scalar_alignment = get_target_double_scalar_alignment ();
358
359 /* Record the builtin types. Define `integer' and `character' first so that
360 dbx will output them first. */
361 record_builtin_type ("integer", integer_type_node, false);
362 record_builtin_type ("character", unsigned_char_type_node, false);
363 record_builtin_type ("boolean", boolean_type_node, false);
364 record_builtin_type ("void", void_type_node, false);
365
366 /* Save the type we made for integer as the type for Standard.Integer. */
367 save_gnu_tree (Base_Type (standard_integer),
368 TYPE_NAME (integer_type_node),
369 false);
370
371 /* Likewise for character as the type for Standard.Character. */
372 save_gnu_tree (Base_Type (standard_character),
373 TYPE_NAME (unsigned_char_type_node),
374 false);
375
376 /* Likewise for boolean as the type for Standard.Boolean. */
377 save_gnu_tree (Base_Type (standard_boolean),
378 TYPE_NAME (boolean_type_node),
379 false);
380 gnat_literal = First_Literal (Base_Type (standard_boolean));
381 t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
382 gcc_assert (t == boolean_false_node);
383 t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
384 boolean_type_node, t, true, false, false, false,
385 NULL, gnat_literal);
386 DECL_IGNORED_P (t) = 1;
387 save_gnu_tree (gnat_literal, t, false);
388 gnat_literal = Next_Literal (gnat_literal);
389 t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
390 gcc_assert (t == boolean_true_node);
391 t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
392 boolean_type_node, t, true, false, false, false,
393 NULL, gnat_literal);
394 DECL_IGNORED_P (t) = 1;
395 save_gnu_tree (gnat_literal, t, false);
396
397 void_ftype = build_function_type_list (void_type_node, NULL_TREE);
398 ptr_void_ftype = build_pointer_type (void_ftype);
399
400 /* Now declare run-time functions. */
401 ftype = build_function_type_list (ptr_void_type_node, sizetype, NULL_TREE);
402
403 /* malloc is a function declaration tree for a function to allocate
404 memory. */
405 malloc_decl
406 = create_subprog_decl (get_identifier ("__gnat_malloc"), NULL_TREE,
407 ftype, NULL_TREE, false, true, true, true, NULL,
408 Empty);
409 DECL_IS_MALLOC (malloc_decl) = 1;
410
411 /* malloc32 is a function declaration tree for a function to allocate
412 32-bit memory on a 64-bit system. Needed only on 64-bit VMS. */
413 malloc32_decl
414 = create_subprog_decl (get_identifier ("__gnat_malloc32"), NULL_TREE,
415 ftype, NULL_TREE, false, true, true, true, NULL,
416 Empty);
417 DECL_IS_MALLOC (malloc32_decl) = 1;
418
419 /* free is a function declaration tree for a function to free memory. */
420 free_decl
421 = create_subprog_decl (get_identifier ("__gnat_free"), NULL_TREE,
422 build_function_type_list (void_type_node,
423 ptr_void_type_node,
424 NULL_TREE),
425 NULL_TREE, false, true, true, true, NULL, Empty);
426
427 /* This is used for 64-bit multiplication with overflow checking. */
428 mulv64_decl
429 = create_subprog_decl (get_identifier ("__gnat_mulv64"), NULL_TREE,
430 build_function_type_list (int64_type, int64_type,
431 int64_type, NULL_TREE),
432 NULL_TREE, false, true, true, true, NULL, Empty);
433
434 /* Name of the _Parent field in tagged record types. */
435 parent_name_id = get_identifier (Get_Name_String (Name_uParent));
436
437 /* Name of the Exception_Data type defined in System.Standard_Library. */
438 exception_data_name_id
439 = get_identifier ("system__standard_library__exception_data");
440
441 /* Make the types and functions used for exception processing. */
442 jmpbuf_type
443 = build_array_type (gnat_type_for_mode (Pmode, 0),
444 build_index_type (size_int (5)));
445 record_builtin_type ("JMPBUF_T", jmpbuf_type, true);
446 jmpbuf_ptr_type = build_pointer_type (jmpbuf_type);
447
448 /* Functions to get and set the jumpbuf pointer for the current thread. */
449 get_jmpbuf_decl
450 = create_subprog_decl
451 (get_identifier ("system__soft_links__get_jmpbuf_address_soft"),
452 NULL_TREE, build_function_type_list (jmpbuf_ptr_type, NULL_TREE),
453 NULL_TREE, false, true, true, true, NULL, Empty);
454 DECL_IGNORED_P (get_jmpbuf_decl) = 1;
455
456 set_jmpbuf_decl
457 = create_subprog_decl
458 (get_identifier ("system__soft_links__set_jmpbuf_address_soft"),
459 NULL_TREE, build_function_type_list (void_type_node, jmpbuf_ptr_type,
460 NULL_TREE),
461 NULL_TREE, false, true, true, true, NULL, Empty);
462 DECL_IGNORED_P (set_jmpbuf_decl) = 1;
463
464 /* setjmp returns an integer and has one operand, which is a pointer to
465 a jmpbuf. */
466 setjmp_decl
467 = create_subprog_decl
468 (get_identifier ("__builtin_setjmp"), NULL_TREE,
469 build_function_type_list (integer_type_node, jmpbuf_ptr_type,
470 NULL_TREE),
471 NULL_TREE, false, true, true, true, NULL, Empty);
472 DECL_BUILT_IN_CLASS (setjmp_decl) = BUILT_IN_NORMAL;
473 DECL_FUNCTION_CODE (setjmp_decl) = BUILT_IN_SETJMP;
474
475 /* update_setjmp_buf updates a setjmp buffer from the current stack pointer
476 address. */
477 update_setjmp_buf_decl
478 = create_subprog_decl
479 (get_identifier ("__builtin_update_setjmp_buf"), NULL_TREE,
480 build_function_type_list (void_type_node, jmpbuf_ptr_type, NULL_TREE),
481 NULL_TREE, false, true, true, true, NULL, Empty);
482 DECL_BUILT_IN_CLASS (update_setjmp_buf_decl) = BUILT_IN_NORMAL;
483 DECL_FUNCTION_CODE (update_setjmp_buf_decl) = BUILT_IN_UPDATE_SETJMP_BUF;
484
485 /* Hooks to call when entering/leaving an exception handler. */
486 ftype
487 = build_function_type_list (void_type_node, ptr_void_type_node, NULL_TREE);
488
489 begin_handler_decl
490 = create_subprog_decl (get_identifier ("__gnat_begin_handler"), NULL_TREE,
491 ftype, NULL_TREE, false, true, true, true, NULL,
492 Empty);
493 DECL_IGNORED_P (begin_handler_decl) = 1;
494
495 end_handler_decl
496 = create_subprog_decl (get_identifier ("__gnat_end_handler"), NULL_TREE,
497 ftype, NULL_TREE, false, true, true, true, NULL,
498 Empty);
499 DECL_IGNORED_P (end_handler_decl) = 1;
500
501 reraise_zcx_decl
502 = create_subprog_decl (get_identifier ("__gnat_reraise_zcx"), NULL_TREE,
503 ftype, NULL_TREE, false, true, true, true, NULL,
504 Empty);
505 /* Indicate that these never return. */
506 DECL_IGNORED_P (reraise_zcx_decl) = 1;
507 TREE_THIS_VOLATILE (reraise_zcx_decl) = 1;
508 TREE_SIDE_EFFECTS (reraise_zcx_decl) = 1;
509 TREE_TYPE (reraise_zcx_decl)
510 = build_qualified_type (TREE_TYPE (reraise_zcx_decl), TYPE_QUAL_VOLATILE);
511
512 /* If in no exception handlers mode, all raise statements are redirected to
513 __gnat_last_chance_handler. No need to redefine raise_nodefer_decl since
514 this procedure will never be called in this mode. */
515 if (No_Exception_Handlers_Set ())
516 {
517 tree decl
518 = create_subprog_decl
519 (get_identifier ("__gnat_last_chance_handler"), NULL_TREE,
520 build_function_type_list (void_type_node,
521 build_pointer_type
522 (unsigned_char_type_node),
523 integer_type_node, NULL_TREE),
524 NULL_TREE, false, true, true, true, NULL, Empty);
525 TREE_THIS_VOLATILE (decl) = 1;
526 TREE_SIDE_EFFECTS (decl) = 1;
527 TREE_TYPE (decl)
528 = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
529 for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
530 gnat_raise_decls[i] = decl;
531 }
532 else
533 {
534 /* Otherwise, make one decl for each exception reason. */
535 for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
536 gnat_raise_decls[i] = build_raise_check (i, exception_simple);
537 for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls_ext); i++)
538 gnat_raise_decls_ext[i]
539 = build_raise_check (i,
540 i == CE_Index_Check_Failed
541 || i == CE_Range_Check_Failed
542 || i == CE_Invalid_Data
543 ? exception_range : exception_column);
544 }
545
546 /* Set the types that GCC and Gigi use from the front end. */
547 exception_type
548 = gnat_to_gnu_entity (Base_Type (standard_exception_type), NULL_TREE, 0);
549 except_type_node = TREE_TYPE (exception_type);
550
551 /* Make other functions used for exception processing. */
552 get_excptr_decl
553 = create_subprog_decl
554 (get_identifier ("system__soft_links__get_gnat_exception"), NULL_TREE,
555 build_function_type_list (build_pointer_type (except_type_node),
556 NULL_TREE),
557 NULL_TREE, false, true, true, true, NULL, Empty);
558 DECL_IGNORED_P (get_excptr_decl) = 1;
559
560 raise_nodefer_decl
561 = create_subprog_decl
562 (get_identifier ("__gnat_raise_nodefer_with_msg"), NULL_TREE,
563 build_function_type_list (void_type_node,
564 build_pointer_type (except_type_node),
565 NULL_TREE),
566 NULL_TREE, false, true, true, true, NULL, Empty);
567
568 /* Indicate that it never returns. */
569 TREE_THIS_VOLATILE (raise_nodefer_decl) = 1;
570 TREE_SIDE_EFFECTS (raise_nodefer_decl) = 1;
571 TREE_TYPE (raise_nodefer_decl)
572 = build_qualified_type (TREE_TYPE (raise_nodefer_decl),
573 TYPE_QUAL_VOLATILE);
574
575 /* Build the special descriptor type and its null node if needed. */
576 if (TARGET_VTABLE_USES_DESCRIPTORS)
577 {
578 tree null_node = fold_convert (ptr_void_ftype, null_pointer_node);
579 tree field_list = NULL_TREE;
580 int j;
581 VEC(constructor_elt,gc) *null_vec = NULL;
582 constructor_elt *elt;
583
584 fdesc_type_node = make_node (RECORD_TYPE);
585 VEC_safe_grow (constructor_elt, gc, null_vec,
586 TARGET_VTABLE_USES_DESCRIPTORS);
587 elt = (VEC_address (constructor_elt,null_vec)
588 + TARGET_VTABLE_USES_DESCRIPTORS - 1);
589
590 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; j++)
591 {
592 tree field
593 = create_field_decl (NULL_TREE, ptr_void_ftype, fdesc_type_node,
594 NULL_TREE, NULL_TREE, 0, 1);
595 DECL_CHAIN (field) = field_list;
596 field_list = field;
597 elt->index = field;
598 elt->value = null_node;
599 elt--;
600 }
601
602 finish_record_type (fdesc_type_node, nreverse (field_list), 0, false);
603 record_builtin_type ("descriptor", fdesc_type_node, true);
604 null_fdesc_node = gnat_build_constructor (fdesc_type_node, null_vec);
605 }
606
607 long_long_float_type
608 = gnat_to_gnu_entity (Base_Type (standard_long_long_float), NULL_TREE, 0);
609
610 if (TREE_CODE (TREE_TYPE (long_long_float_type)) == INTEGER_TYPE)
611 {
612 /* In this case, the builtin floating point types are VAX float,
613 so make up a type for use. */
614 longest_float_type_node = make_node (REAL_TYPE);
615 TYPE_PRECISION (longest_float_type_node) = LONG_DOUBLE_TYPE_SIZE;
616 layout_type (longest_float_type_node);
617 record_builtin_type ("longest float type", longest_float_type_node,
618 false);
619 }
620 else
621 longest_float_type_node = TREE_TYPE (long_long_float_type);
622
623 /* Dummy objects to materialize "others" and "all others" in the exception
624 tables. These are exported by a-exexpr-gcc.adb, so see this unit for
625 the types to use. */
626 others_decl
627 = create_var_decl (get_identifier ("OTHERS"),
628 get_identifier ("__gnat_others_value"),
629 integer_type_node, NULL_TREE, true, false, true, false,
630 NULL, Empty);
631
632 all_others_decl
633 = create_var_decl (get_identifier ("ALL_OTHERS"),
634 get_identifier ("__gnat_all_others_value"),
635 integer_type_node, NULL_TREE, true, false, true, false,
636 NULL, Empty);
637
638 main_identifier_node = get_identifier ("main");
639
640 /* Install the builtins we might need, either internally or as
641 user available facilities for Intrinsic imports. */
642 gnat_install_builtins ();
643
644 VEC_safe_push (tree, gc, gnu_except_ptr_stack, NULL_TREE);
645 VEC_safe_push (tree, gc, gnu_constraint_error_label_stack, NULL_TREE);
646 VEC_safe_push (tree, gc, gnu_storage_error_label_stack, NULL_TREE);
647 VEC_safe_push (tree, gc, gnu_program_error_label_stack, NULL_TREE);
648
649 /* Process any Pragma Ident for the main unit. */
650 #ifdef ASM_OUTPUT_IDENT
651 if (Present (Ident_String (Main_Unit)))
652 ASM_OUTPUT_IDENT
653 (asm_out_file,
654 TREE_STRING_POINTER (gnat_to_gnu (Ident_String (Main_Unit))));
655 #endif
656
657 /* If we are using the GCC exception mechanism, let GCC know. */
658 if (Exception_Mechanism == Back_End_Exceptions)
659 gnat_init_gcc_eh ();
660
661 /* Now translate the compilation unit proper. */
662 Compilation_Unit_to_gnu (gnat_root);
663
664 /* Then process the N_Validate_Unchecked_Conversion nodes. We do this at
665 the very end to avoid having to second-guess the front-end when we run
666 into dummy nodes during the regular processing. */
667 for (i = 0; VEC_iterate (Node_Id, gnat_validate_uc_list, i, gnat_iter); i++)
668 validate_unchecked_conversion (gnat_iter);
669 VEC_free (Node_Id, heap, gnat_validate_uc_list);
670
671 /* Finally see if we have any elaboration procedures to deal with. */
672 for (info = elab_info_list; info; info = info->next)
673 {
674 tree gnu_body = DECL_SAVED_TREE (info->elab_proc), gnu_stmts;
675
676 /* We should have a BIND_EXPR but it may not have any statements in it.
677 If it doesn't have any, we have nothing to do except for setting the
678 flag on the GNAT node. Otherwise, process the function as others. */
679 gnu_stmts = gnu_body;
680 if (TREE_CODE (gnu_stmts) == BIND_EXPR)
681 gnu_stmts = BIND_EXPR_BODY (gnu_stmts);
682 if (!gnu_stmts || !STATEMENT_LIST_HEAD (gnu_stmts))
683 Set_Has_No_Elaboration_Code (info->gnat_node, 1);
684 else
685 {
686 begin_subprog_body (info->elab_proc);
687 end_subprog_body (gnu_body);
688 rest_of_subprog_body_compilation (info->elab_proc);
689 }
690 }
691
692 /* Destroy ourselves. */
693 destroy_gnat_utils ();
694
695 /* We cannot track the location of errors past this point. */
696 error_gnat_node = Empty;
697 }
698 \f
699 /* Return a subprogram decl corresponding to __gnat_rcheck_xx for the given
700 CHECK if KIND is EXCEPTION_SIMPLE, or else to __gnat_rcheck_xx_ext. */
701
702 static tree
703 build_raise_check (int check, enum exception_info_kind kind)
704 {
705 char name[21];
706 tree result, ftype;
707
708 if (kind == exception_simple)
709 {
710 sprintf (name, "__gnat_rcheck_%.2d", check);
711 ftype
712 = build_function_type_list (void_type_node,
713 build_pointer_type
714 (unsigned_char_type_node),
715 integer_type_node, NULL_TREE);
716 }
717 else
718 {
719 tree t = (kind == exception_column ? NULL_TREE : integer_type_node);
720 sprintf (name, "__gnat_rcheck_%.2d_ext", check);
721 ftype
722 = build_function_type_list (void_type_node,
723 build_pointer_type
724 (unsigned_char_type_node),
725 integer_type_node, integer_type_node,
726 t, t, NULL_TREE);
727 }
728
729 result
730 = create_subprog_decl (get_identifier (name), NULL_TREE, ftype, NULL_TREE,
731 false, true, true, true, NULL, Empty);
732
733 /* Indicate that it never returns. */
734 TREE_THIS_VOLATILE (result) = 1;
735 TREE_SIDE_EFFECTS (result) = 1;
736 TREE_TYPE (result)
737 = build_qualified_type (TREE_TYPE (result), TYPE_QUAL_VOLATILE);
738
739 return result;
740 }
741 \f
742 /* Return a positive value if an lvalue is required for GNAT_NODE, which is
743 an N_Attribute_Reference. */
744
745 static int
746 lvalue_required_for_attribute_p (Node_Id gnat_node)
747 {
748 switch (Get_Attribute_Id (Attribute_Name (gnat_node)))
749 {
750 case Attr_Pos:
751 case Attr_Val:
752 case Attr_Pred:
753 case Attr_Succ:
754 case Attr_First:
755 case Attr_Last:
756 case Attr_Range_Length:
757 case Attr_Length:
758 case Attr_Object_Size:
759 case Attr_Value_Size:
760 case Attr_Component_Size:
761 case Attr_Max_Size_In_Storage_Elements:
762 case Attr_Min:
763 case Attr_Max:
764 case Attr_Null_Parameter:
765 case Attr_Passed_By_Reference:
766 case Attr_Mechanism_Code:
767 return 0;
768
769 case Attr_Address:
770 case Attr_Access:
771 case Attr_Unchecked_Access:
772 case Attr_Unrestricted_Access:
773 case Attr_Code_Address:
774 case Attr_Pool_Address:
775 case Attr_Size:
776 case Attr_Alignment:
777 case Attr_Bit_Position:
778 case Attr_Position:
779 case Attr_First_Bit:
780 case Attr_Last_Bit:
781 case Attr_Bit:
782 case Attr_Asm_Input:
783 case Attr_Asm_Output:
784 default:
785 return 1;
786 }
787 }
788
789 /* Return a positive value if an lvalue is required for GNAT_NODE. GNU_TYPE
790 is the type that will be used for GNAT_NODE in the translated GNU tree.
791 CONSTANT indicates whether the underlying object represented by GNAT_NODE
792 is constant in the Ada sense. If it is, ADDRESS_OF_CONSTANT indicates
793 whether its value is the address of a constant and ALIASED whether it is
794 aliased. If it isn't, ADDRESS_OF_CONSTANT and ALIASED are ignored.
795
796 The function climbs up the GNAT tree starting from the node and returns 1
797 upon encountering a node that effectively requires an lvalue downstream.
798 It returns int instead of bool to facilitate usage in non-purely binary
799 logic contexts. */
800
801 static int
802 lvalue_required_p (Node_Id gnat_node, tree gnu_type, bool constant,
803 bool address_of_constant, bool aliased)
804 {
805 Node_Id gnat_parent = Parent (gnat_node), gnat_temp;
806
807 switch (Nkind (gnat_parent))
808 {
809 case N_Reference:
810 return 1;
811
812 case N_Attribute_Reference:
813 return lvalue_required_for_attribute_p (gnat_parent);
814
815 case N_Parameter_Association:
816 case N_Function_Call:
817 case N_Procedure_Call_Statement:
818 /* If the parameter is by reference, an lvalue is required. */
819 return (!constant
820 || must_pass_by_ref (gnu_type)
821 || default_pass_by_ref (gnu_type));
822
823 case N_Indexed_Component:
824 /* Only the array expression can require an lvalue. */
825 if (Prefix (gnat_parent) != gnat_node)
826 return 0;
827
828 /* ??? Consider that referencing an indexed component with a
829 non-constant index forces the whole aggregate to memory.
830 Note that N_Integer_Literal is conservative, any static
831 expression in the RM sense could probably be accepted. */
832 for (gnat_temp = First (Expressions (gnat_parent));
833 Present (gnat_temp);
834 gnat_temp = Next (gnat_temp))
835 if (Nkind (gnat_temp) != N_Integer_Literal)
836 return 1;
837
838 /* ... fall through ... */
839
840 case N_Slice:
841 /* Only the array expression can require an lvalue. */
842 if (Prefix (gnat_parent) != gnat_node)
843 return 0;
844
845 aliased |= Has_Aliased_Components (Etype (gnat_node));
846 return lvalue_required_p (gnat_parent, gnu_type, constant,
847 address_of_constant, aliased);
848
849 case N_Selected_Component:
850 aliased |= Is_Aliased (Entity (Selector_Name (gnat_parent)));
851 return lvalue_required_p (gnat_parent, gnu_type, constant,
852 address_of_constant, aliased);
853
854 case N_Object_Renaming_Declaration:
855 /* We need to make a real renaming only if the constant object is
856 aliased or if we may use a renaming pointer; otherwise we can
857 optimize and return the rvalue. We make an exception if the object
858 is an identifier since in this case the rvalue can be propagated
859 attached to the CONST_DECL. */
860 return (!constant
861 || aliased
862 /* This should match the constant case of the renaming code. */
863 || Is_Composite_Type
864 (Underlying_Type (Etype (Name (gnat_parent))))
865 || Nkind (Name (gnat_parent)) == N_Identifier);
866
867 case N_Object_Declaration:
868 /* We cannot use a constructor if this is an atomic object because
869 the actual assignment might end up being done component-wise. */
870 return (!constant
871 ||(Is_Composite_Type (Underlying_Type (Etype (gnat_node)))
872 && Is_Atomic (Defining_Entity (gnat_parent)))
873 /* We don't use a constructor if this is a class-wide object
874 because the effective type of the object is the equivalent
875 type of the class-wide subtype and it smashes most of the
876 data into an array of bytes to which we cannot convert. */
877 || Ekind ((Etype (Defining_Entity (gnat_parent))))
878 == E_Class_Wide_Subtype);
879
880 case N_Assignment_Statement:
881 /* We cannot use a constructor if the LHS is an atomic object because
882 the actual assignment might end up being done component-wise. */
883 return (!constant
884 || Name (gnat_parent) == gnat_node
885 || (Is_Composite_Type (Underlying_Type (Etype (gnat_node)))
886 && Is_Atomic (Entity (Name (gnat_parent)))));
887
888 case N_Unchecked_Type_Conversion:
889 if (!constant)
890 return 1;
891
892 /* ... fall through ... */
893
894 case N_Type_Conversion:
895 case N_Qualified_Expression:
896 /* We must look through all conversions because we may need to bypass
897 an intermediate conversion that is meant to be purely formal. */
898 return lvalue_required_p (gnat_parent,
899 get_unpadded_type (Etype (gnat_parent)),
900 constant, address_of_constant, aliased);
901
902 case N_Allocator:
903 /* We should only reach here through the N_Qualified_Expression case.
904 Force an lvalue for composite types since a block-copy to the newly
905 allocated area of memory is made. */
906 return Is_Composite_Type (Underlying_Type (Etype (gnat_node)));
907
908 case N_Explicit_Dereference:
909 /* We look through dereferences for address of constant because we need
910 to handle the special cases listed above. */
911 if (constant && address_of_constant)
912 return lvalue_required_p (gnat_parent,
913 get_unpadded_type (Etype (gnat_parent)),
914 true, false, true);
915
916 /* ... fall through ... */
917
918 default:
919 return 0;
920 }
921
922 gcc_unreachable ();
923 }
924
925 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Identifier,
926 to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer
927 to where we should place the result type. */
928
929 static tree
930 Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
931 {
932 Node_Id gnat_temp, gnat_temp_type;
933 tree gnu_result, gnu_result_type;
934
935 /* Whether we should require an lvalue for GNAT_NODE. Needed in
936 specific circumstances only, so evaluated lazily. < 0 means
937 unknown, > 0 means known true, 0 means known false. */
938 int require_lvalue = -1;
939
940 /* If GNAT_NODE is a constant, whether we should use the initialization
941 value instead of the constant entity, typically for scalars with an
942 address clause when the parent doesn't require an lvalue. */
943 bool use_constant_initializer = false;
944
945 /* If the Etype of this node does not equal the Etype of the Entity,
946 something is wrong with the entity map, probably in generic
947 instantiation. However, this does not apply to types. Since we sometime
948 have strange Ekind's, just do this test for objects. Also, if the Etype of
949 the Entity is private, the Etype of the N_Identifier is allowed to be the
950 full type and also we consider a packed array type to be the same as the
951 original type. Similarly, a class-wide type is equivalent to a subtype of
952 itself. Finally, if the types are Itypes, one may be a copy of the other,
953 which is also legal. */
954 gnat_temp = (Nkind (gnat_node) == N_Defining_Identifier
955 ? gnat_node : Entity (gnat_node));
956 gnat_temp_type = Etype (gnat_temp);
957
958 gcc_assert (Etype (gnat_node) == gnat_temp_type
959 || (Is_Packed (gnat_temp_type)
960 && Etype (gnat_node) == Packed_Array_Type (gnat_temp_type))
961 || (Is_Class_Wide_Type (Etype (gnat_node)))
962 || (IN (Ekind (gnat_temp_type), Private_Kind)
963 && Present (Full_View (gnat_temp_type))
964 && ((Etype (gnat_node) == Full_View (gnat_temp_type))
965 || (Is_Packed (Full_View (gnat_temp_type))
966 && (Etype (gnat_node)
967 == Packed_Array_Type (Full_View
968 (gnat_temp_type))))))
969 || (Is_Itype (Etype (gnat_node)) && Is_Itype (gnat_temp_type))
970 || !(Ekind (gnat_temp) == E_Variable
971 || Ekind (gnat_temp) == E_Component
972 || Ekind (gnat_temp) == E_Constant
973 || Ekind (gnat_temp) == E_Loop_Parameter
974 || IN (Ekind (gnat_temp), Formal_Kind)));
975
976 /* If this is a reference to a deferred constant whose partial view is an
977 unconstrained private type, the proper type is on the full view of the
978 constant, not on the full view of the type, which may be unconstrained.
979
980 This may be a reference to a type, for example in the prefix of the
981 attribute Position, generated for dispatching code (see Make_DT in
982 exp_disp,adb). In that case we need the type itself, not is parent,
983 in particular if it is a derived type */
984 if (Ekind (gnat_temp) == E_Constant
985 && Is_Private_Type (gnat_temp_type)
986 && (Has_Unknown_Discriminants (gnat_temp_type)
987 || (Present (Full_View (gnat_temp_type))
988 && Has_Discriminants (Full_View (gnat_temp_type))))
989 && Present (Full_View (gnat_temp)))
990 {
991 gnat_temp = Full_View (gnat_temp);
992 gnat_temp_type = Etype (gnat_temp);
993 }
994 else
995 {
996 /* We want to use the Actual_Subtype if it has already been elaborated,
997 otherwise the Etype. Avoid using Actual_Subtype for packed arrays to
998 simplify things. */
999 if ((Ekind (gnat_temp) == E_Constant
1000 || Ekind (gnat_temp) == E_Variable || Is_Formal (gnat_temp))
1001 && !(Is_Array_Type (Etype (gnat_temp))
1002 && Present (Packed_Array_Type (Etype (gnat_temp))))
1003 && Present (Actual_Subtype (gnat_temp))
1004 && present_gnu_tree (Actual_Subtype (gnat_temp)))
1005 gnat_temp_type = Actual_Subtype (gnat_temp);
1006 else
1007 gnat_temp_type = Etype (gnat_node);
1008 }
1009
1010 /* Expand the type of this identifier first, in case it is an enumeral
1011 literal, which only get made when the type is expanded. There is no
1012 order-of-elaboration issue here. */
1013 gnu_result_type = get_unpadded_type (gnat_temp_type);
1014
1015 /* If this is a non-imported scalar constant with an address clause,
1016 retrieve the value instead of a pointer to be dereferenced unless
1017 an lvalue is required. This is generally more efficient and actually
1018 required if this is a static expression because it might be used
1019 in a context where a dereference is inappropriate, such as a case
1020 statement alternative or a record discriminant. There is no possible
1021 volatile-ness short-circuit here since Volatile constants must be
1022 imported per C.6. */
1023 if (Ekind (gnat_temp) == E_Constant
1024 && Is_Scalar_Type (gnat_temp_type)
1025 && !Is_Imported (gnat_temp)
1026 && Present (Address_Clause (gnat_temp)))
1027 {
1028 require_lvalue = lvalue_required_p (gnat_node, gnu_result_type, true,
1029 false, Is_Aliased (gnat_temp));
1030 use_constant_initializer = !require_lvalue;
1031 }
1032
1033 if (use_constant_initializer)
1034 {
1035 /* If this is a deferred constant, the initializer is attached to
1036 the full view. */
1037 if (Present (Full_View (gnat_temp)))
1038 gnat_temp = Full_View (gnat_temp);
1039
1040 gnu_result = gnat_to_gnu (Expression (Declaration_Node (gnat_temp)));
1041 }
1042 else
1043 gnu_result = gnat_to_gnu_entity (gnat_temp, NULL_TREE, 0);
1044
1045 /* Some objects (such as parameters passed by reference, globals of
1046 variable size, and renamed objects) actually represent the address
1047 of the object. In that case, we must do the dereference. Likewise,
1048 deal with parameters to foreign convention subprograms. */
1049 if (DECL_P (gnu_result)
1050 && (DECL_BY_REF_P (gnu_result)
1051 || (TREE_CODE (gnu_result) == PARM_DECL
1052 && DECL_BY_COMPONENT_PTR_P (gnu_result))))
1053 {
1054 const bool read_only = DECL_POINTS_TO_READONLY_P (gnu_result);
1055
1056 /* First do the first dereference if needed. */
1057 if (TREE_CODE (gnu_result) == PARM_DECL
1058 && DECL_BY_DOUBLE_REF_P (gnu_result))
1059 {
1060 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
1061 if (TREE_CODE (gnu_result) == INDIRECT_REF)
1062 TREE_THIS_NOTRAP (gnu_result) = 1;
1063
1064 /* The first reference, in case of a double reference, always points
1065 to read-only, see gnat_to_gnu_param for the rationale. */
1066 TREE_READONLY (gnu_result) = 1;
1067 }
1068
1069 /* If it's a PARM_DECL to foreign convention subprogram, convert it. */
1070 if (TREE_CODE (gnu_result) == PARM_DECL
1071 && DECL_BY_COMPONENT_PTR_P (gnu_result))
1072 gnu_result
1073 = convert (build_pointer_type (gnu_result_type), gnu_result);
1074
1075 /* If it's a CONST_DECL, return the underlying constant like below. */
1076 else if (TREE_CODE (gnu_result) == CONST_DECL)
1077 gnu_result = DECL_INITIAL (gnu_result);
1078
1079 /* If it's a renaming pointer and we are at the right binding level,
1080 we can reference the renamed object directly, since the renamed
1081 expression has been protected against multiple evaluations. */
1082 if (TREE_CODE (gnu_result) == VAR_DECL
1083 && !DECL_LOOP_PARM_P (gnu_result)
1084 && DECL_RENAMED_OBJECT (gnu_result)
1085 && (!DECL_RENAMING_GLOBAL_P (gnu_result) || global_bindings_p ()))
1086 gnu_result = DECL_RENAMED_OBJECT (gnu_result);
1087
1088 /* Otherwise, do the final dereference. */
1089 else
1090 {
1091 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
1092
1093 if ((TREE_CODE (gnu_result) == INDIRECT_REF
1094 || TREE_CODE (gnu_result) == UNCONSTRAINED_ARRAY_REF)
1095 && No (Address_Clause (gnat_temp)))
1096 TREE_THIS_NOTRAP (gnu_result) = 1;
1097
1098 if (read_only)
1099 TREE_READONLY (gnu_result) = 1;
1100 }
1101 }
1102
1103 /* If we have a constant declaration and its initializer, try to return the
1104 latter to avoid the need to call fold in lots of places and the need for
1105 elaboration code if this identifier is used as an initializer itself.
1106 Don't do it for aggregate types that contain a placeholder since their
1107 initializers cannot be manipulated easily. */
1108 if (TREE_CONSTANT (gnu_result)
1109 && DECL_P (gnu_result)
1110 && DECL_INITIAL (gnu_result)
1111 && !(AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))
1112 && !TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_result))
1113 && type_contains_placeholder_p (TREE_TYPE (gnu_result))))
1114 {
1115 bool constant_only = (TREE_CODE (gnu_result) == CONST_DECL
1116 && !DECL_CONST_CORRESPONDING_VAR (gnu_result));
1117 bool address_of_constant = (TREE_CODE (gnu_result) == CONST_DECL
1118 && DECL_CONST_ADDRESS_P (gnu_result));
1119
1120 /* If there is a (corresponding) variable or this is the address of a
1121 constant, we only want to return the initializer if an lvalue isn't
1122 required. Evaluate this now if we have not already done so. */
1123 if ((!constant_only || address_of_constant) && require_lvalue < 0)
1124 require_lvalue
1125 = lvalue_required_p (gnat_node, gnu_result_type, true,
1126 address_of_constant, Is_Aliased (gnat_temp));
1127
1128 /* Finally retrieve the initializer if this is deemed valid. */
1129 if ((constant_only && !address_of_constant) || !require_lvalue)
1130 gnu_result = DECL_INITIAL (gnu_result);
1131 }
1132
1133 /* The GNAT tree has the type of a function set to its result type, so we
1134 adjust here. Also use the type of the result if the Etype is a subtype
1135 that is nominally unconstrained. Likewise if this is a deferred constant
1136 of a discriminated type whose full view can be elaborated statically, to
1137 avoid problematic conversions to the nominal subtype. But remove any
1138 padding from the resulting type. */
1139 if (TREE_CODE (TREE_TYPE (gnu_result)) == FUNCTION_TYPE
1140 || Is_Constr_Subt_For_UN_Aliased (gnat_temp_type)
1141 || (Ekind (gnat_temp) == E_Constant
1142 && Present (Full_View (gnat_temp))
1143 && Has_Discriminants (gnat_temp_type)
1144 && TREE_CODE (gnu_result) == CONSTRUCTOR))
1145 {
1146 gnu_result_type = TREE_TYPE (gnu_result);
1147 if (TYPE_IS_PADDING_P (gnu_result_type))
1148 gnu_result_type = TREE_TYPE (TYPE_FIELDS (gnu_result_type));
1149 }
1150
1151 *gnu_result_type_p = gnu_result_type;
1152
1153 return gnu_result;
1154 }
1155 \f
1156 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Pragma. Return
1157 any statements we generate. */
1158
1159 static tree
1160 Pragma_to_gnu (Node_Id gnat_node)
1161 {
1162 Node_Id gnat_temp;
1163 tree gnu_result = alloc_stmt_list ();
1164
1165 /* Check for (and ignore) unrecognized pragma and do nothing if we are just
1166 annotating types. */
1167 if (type_annotate_only
1168 || !Is_Pragma_Name (Chars (Pragma_Identifier (gnat_node))))
1169 return gnu_result;
1170
1171 switch (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_node))))
1172 {
1173 case Pragma_Inspection_Point:
1174 /* Do nothing at top level: all such variables are already viewable. */
1175 if (global_bindings_p ())
1176 break;
1177
1178 for (gnat_temp = First (Pragma_Argument_Associations (gnat_node));
1179 Present (gnat_temp);
1180 gnat_temp = Next (gnat_temp))
1181 {
1182 Node_Id gnat_expr = Expression (gnat_temp);
1183 tree gnu_expr = gnat_to_gnu (gnat_expr);
1184 int use_address;
1185 enum machine_mode mode;
1186 tree asm_constraint = NULL_TREE;
1187 #ifdef ASM_COMMENT_START
1188 char *comment;
1189 #endif
1190
1191 if (TREE_CODE (gnu_expr) == UNCONSTRAINED_ARRAY_REF)
1192 gnu_expr = TREE_OPERAND (gnu_expr, 0);
1193
1194 /* Use the value only if it fits into a normal register,
1195 otherwise use the address. */
1196 mode = TYPE_MODE (TREE_TYPE (gnu_expr));
1197 use_address = ((GET_MODE_CLASS (mode) != MODE_INT
1198 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1199 || GET_MODE_SIZE (mode) > UNITS_PER_WORD);
1200
1201 if (use_address)
1202 gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
1203
1204 #ifdef ASM_COMMENT_START
1205 comment = concat (ASM_COMMENT_START,
1206 " inspection point: ",
1207 Get_Name_String (Chars (gnat_expr)),
1208 use_address ? " address" : "",
1209 " is in %0",
1210 NULL);
1211 asm_constraint = build_string (strlen (comment), comment);
1212 free (comment);
1213 #endif
1214 gnu_expr = build5 (ASM_EXPR, void_type_node,
1215 asm_constraint,
1216 NULL_TREE,
1217 tree_cons
1218 (build_tree_list (NULL_TREE,
1219 build_string (1, "g")),
1220 gnu_expr, NULL_TREE),
1221 NULL_TREE, NULL_TREE);
1222 ASM_VOLATILE_P (gnu_expr) = 1;
1223 set_expr_location_from_node (gnu_expr, gnat_node);
1224 append_to_statement_list (gnu_expr, &gnu_result);
1225 }
1226 break;
1227
1228 case Pragma_Optimize:
1229 switch (Chars (Expression
1230 (First (Pragma_Argument_Associations (gnat_node)))))
1231 {
1232 case Name_Time: case Name_Space:
1233 if (!optimize)
1234 post_error ("insufficient -O value?", gnat_node);
1235 break;
1236
1237 case Name_Off:
1238 if (optimize)
1239 post_error ("must specify -O0?", gnat_node);
1240 break;
1241
1242 default:
1243 gcc_unreachable ();
1244 }
1245 break;
1246
1247 case Pragma_Reviewable:
1248 if (write_symbols == NO_DEBUG)
1249 post_error ("must specify -g?", gnat_node);
1250 break;
1251 }
1252
1253 return gnu_result;
1254 }
1255 \f
1256 /* Subroutine of gnat_to_gnu to translate GNAT_NODE, an N_Attribute node,
1257 to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer to
1258 where we should place the result type. ATTRIBUTE is the attribute ID. */
1259
1260 static tree
1261 Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
1262 {
1263 tree gnu_prefix, gnu_type, gnu_expr;
1264 tree gnu_result_type, gnu_result = error_mark_node;
1265 bool prefix_unused = false;
1266
1267 /* ??? If this is an access attribute for a public subprogram to be used in
1268 a dispatch table, do not translate its type as it's useless there and the
1269 parameter types might be incomplete types coming from a limited with. */
1270 if (Ekind (Etype (gnat_node)) == E_Access_Subprogram_Type
1271 && Is_Dispatch_Table_Entity (Etype (gnat_node))
1272 && Nkind (Prefix (gnat_node)) == N_Identifier
1273 && Is_Subprogram (Entity (Prefix (gnat_node)))
1274 && Is_Public (Entity (Prefix (gnat_node)))
1275 && !present_gnu_tree (Entity (Prefix (gnat_node))))
1276 gnu_prefix = get_minimal_subprog_decl (Entity (Prefix (gnat_node)));
1277 else
1278 gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
1279 gnu_type = TREE_TYPE (gnu_prefix);
1280
1281 /* If the input is a NULL_EXPR, make a new one. */
1282 if (TREE_CODE (gnu_prefix) == NULL_EXPR)
1283 {
1284 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1285 *gnu_result_type_p = gnu_result_type;
1286 return build1 (NULL_EXPR, gnu_result_type, TREE_OPERAND (gnu_prefix, 0));
1287 }
1288
1289 switch (attribute)
1290 {
1291 case Attr_Pos:
1292 case Attr_Val:
1293 /* These are just conversions since representation clauses for
1294 enumeration types are handled in the front-end. */
1295 {
1296 bool checkp = Do_Range_Check (First (Expressions (gnat_node)));
1297 gnu_result = gnat_to_gnu (First (Expressions (gnat_node)));
1298 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1299 gnu_result = convert_with_check (Etype (gnat_node), gnu_result,
1300 checkp, checkp, true, gnat_node);
1301 }
1302 break;
1303
1304 case Attr_Pred:
1305 case Attr_Succ:
1306 /* These just add or subtract the constant 1 since representation
1307 clauses for enumeration types are handled in the front-end. */
1308 gnu_expr = gnat_to_gnu (First (Expressions (gnat_node)));
1309 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1310
1311 if (Do_Range_Check (First (Expressions (gnat_node))))
1312 {
1313 gnu_expr = gnat_protect_expr (gnu_expr);
1314 gnu_expr
1315 = emit_check
1316 (build_binary_op (EQ_EXPR, boolean_type_node,
1317 gnu_expr,
1318 attribute == Attr_Pred
1319 ? TYPE_MIN_VALUE (gnu_result_type)
1320 : TYPE_MAX_VALUE (gnu_result_type)),
1321 gnu_expr, CE_Range_Check_Failed, gnat_node);
1322 }
1323
1324 gnu_result
1325 = build_binary_op (attribute == Attr_Pred ? MINUS_EXPR : PLUS_EXPR,
1326 gnu_result_type, gnu_expr,
1327 convert (gnu_result_type, integer_one_node));
1328 break;
1329
1330 case Attr_Address:
1331 case Attr_Unrestricted_Access:
1332 /* Conversions don't change addresses but can cause us to miss the
1333 COMPONENT_REF case below, so strip them off. */
1334 gnu_prefix = remove_conversions (gnu_prefix,
1335 !Must_Be_Byte_Aligned (gnat_node));
1336
1337 /* If we are taking 'Address of an unconstrained object, this is the
1338 pointer to the underlying array. */
1339 if (attribute == Attr_Address)
1340 gnu_prefix = maybe_unconstrained_array (gnu_prefix);
1341
1342 /* If we are building a static dispatch table, we have to honor
1343 TARGET_VTABLE_USES_DESCRIPTORS if we want to be compatible
1344 with the C++ ABI. We do it in the non-static case as well,
1345 see gnat_to_gnu_entity, case E_Access_Subprogram_Type. */
1346 else if (TARGET_VTABLE_USES_DESCRIPTORS
1347 && Is_Dispatch_Table_Entity (Etype (gnat_node)))
1348 {
1349 tree gnu_field, t;
1350 /* Descriptors can only be built here for top-level functions. */
1351 bool build_descriptor = (global_bindings_p () != 0);
1352 int i;
1353 VEC(constructor_elt,gc) *gnu_vec = NULL;
1354 constructor_elt *elt;
1355
1356 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1357
1358 /* If we're not going to build the descriptor, we have to retrieve
1359 the one which will be built by the linker (or by the compiler
1360 later if a static chain is requested). */
1361 if (!build_descriptor)
1362 {
1363 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_prefix);
1364 gnu_result = fold_convert (build_pointer_type (gnu_result_type),
1365 gnu_result);
1366 gnu_result = build1 (INDIRECT_REF, gnu_result_type, gnu_result);
1367 }
1368
1369 VEC_safe_grow (constructor_elt, gc, gnu_vec,
1370 TARGET_VTABLE_USES_DESCRIPTORS);
1371 elt = (VEC_address (constructor_elt, gnu_vec)
1372 + TARGET_VTABLE_USES_DESCRIPTORS - 1);
1373 for (gnu_field = TYPE_FIELDS (gnu_result_type), i = 0;
1374 i < TARGET_VTABLE_USES_DESCRIPTORS;
1375 gnu_field = DECL_CHAIN (gnu_field), i++)
1376 {
1377 if (build_descriptor)
1378 {
1379 t = build2 (FDESC_EXPR, TREE_TYPE (gnu_field), gnu_prefix,
1380 build_int_cst (NULL_TREE, i));
1381 TREE_CONSTANT (t) = 1;
1382 }
1383 else
1384 t = build3 (COMPONENT_REF, ptr_void_ftype, gnu_result,
1385 gnu_field, NULL_TREE);
1386
1387 elt->index = gnu_field;
1388 elt->value = t;
1389 elt--;
1390 }
1391
1392 gnu_result = gnat_build_constructor (gnu_result_type, gnu_vec);
1393 break;
1394 }
1395
1396 /* ... fall through ... */
1397
1398 case Attr_Access:
1399 case Attr_Unchecked_Access:
1400 case Attr_Code_Address:
1401 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1402 gnu_result
1403 = build_unary_op (((attribute == Attr_Address
1404 || attribute == Attr_Unrestricted_Access)
1405 && !Must_Be_Byte_Aligned (gnat_node))
1406 ? ATTR_ADDR_EXPR : ADDR_EXPR,
1407 gnu_result_type, gnu_prefix);
1408
1409 /* For 'Code_Address, find an inner ADDR_EXPR and mark it so that we
1410 don't try to build a trampoline. */
1411 if (attribute == Attr_Code_Address)
1412 {
1413 gnu_expr = remove_conversions (gnu_result, false);
1414
1415 if (TREE_CODE (gnu_expr) == ADDR_EXPR)
1416 TREE_NO_TRAMPOLINE (gnu_expr) = TREE_CONSTANT (gnu_expr) = 1;
1417 }
1418
1419 /* For other address attributes applied to a nested function,
1420 find an inner ADDR_EXPR and annotate it so that we can issue
1421 a useful warning with -Wtrampolines. */
1422 else if (TREE_CODE (TREE_TYPE (gnu_prefix)) == FUNCTION_TYPE)
1423 {
1424 gnu_expr = remove_conversions (gnu_result, false);
1425
1426 if (TREE_CODE (gnu_expr) == ADDR_EXPR
1427 && decl_function_context (TREE_OPERAND (gnu_expr, 0)))
1428 {
1429 set_expr_location_from_node (gnu_expr, gnat_node);
1430
1431 /* Check that we're not violating the No_Implicit_Dynamic_Code
1432 restriction. Be conservative if we don't know anything
1433 about the trampoline strategy for the target. */
1434 Check_Implicit_Dynamic_Code_Allowed (gnat_node);
1435 }
1436 }
1437 break;
1438
1439 case Attr_Pool_Address:
1440 {
1441 tree gnu_ptr = gnu_prefix;
1442 tree gnu_obj_type;
1443
1444 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1445
1446 /* If this is fat pointer, the object must have been allocated with the
1447 template in front of the array. So compute the template address; do
1448 it by converting to a thin pointer. */
1449 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
1450 gnu_ptr
1451 = convert (build_pointer_type
1452 (TYPE_OBJECT_RECORD_TYPE
1453 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
1454 gnu_ptr);
1455
1456 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
1457
1458 /* If this is a thin pointer, the object must have been allocated with
1459 the template in front of the array. So compute the template address
1460 and return it. */
1461 if (TYPE_IS_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
1462 gnu_ptr
1463 = build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (gnu_ptr),
1464 gnu_ptr,
1465 fold_build1 (NEGATE_EXPR, sizetype,
1466 byte_position
1467 (DECL_CHAIN
1468 TYPE_FIELDS ((gnu_obj_type)))));
1469
1470 gnu_result = convert (gnu_result_type, gnu_ptr);
1471 }
1472 break;
1473
1474 case Attr_Size:
1475 case Attr_Object_Size:
1476 case Attr_Value_Size:
1477 case Attr_Max_Size_In_Storage_Elements:
1478 gnu_expr = gnu_prefix;
1479
1480 /* Remove NOPs and conversions between original and packable version
1481 from GNU_EXPR, and conversions from GNU_PREFIX. We use GNU_EXPR
1482 to see if a COMPONENT_REF was involved. */
1483 while (TREE_CODE (gnu_expr) == NOP_EXPR
1484 || (TREE_CODE (gnu_expr) == VIEW_CONVERT_EXPR
1485 && TREE_CODE (TREE_TYPE (gnu_expr)) == RECORD_TYPE
1486 && TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))
1487 == RECORD_TYPE
1488 && TYPE_NAME (TREE_TYPE (gnu_expr))
1489 == TYPE_NAME (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))))
1490 gnu_expr = TREE_OPERAND (gnu_expr, 0);
1491
1492 gnu_prefix = remove_conversions (gnu_prefix, true);
1493 prefix_unused = true;
1494 gnu_type = TREE_TYPE (gnu_prefix);
1495
1496 /* Replace an unconstrained array type with the type of the underlying
1497 array. We can't do this with a call to maybe_unconstrained_array
1498 since we may have a TYPE_DECL. For 'Max_Size_In_Storage_Elements,
1499 use the record type that will be used to allocate the object and its
1500 template. */
1501 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1502 {
1503 gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type);
1504 if (attribute != Attr_Max_Size_In_Storage_Elements)
1505 gnu_type = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (gnu_type)));
1506 }
1507
1508 /* If we're looking for the size of a field, return the field size. */
1509 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1510 gnu_result = DECL_SIZE (TREE_OPERAND (gnu_prefix, 1));
1511
1512 /* Otherwise, if the prefix is an object, or if we are looking for
1513 'Object_Size or 'Max_Size_In_Storage_Elements, the result is the
1514 GCC size of the type. We make an exception for padded objects,
1515 as we do not take into account alignment promotions for the size.
1516 This is in keeping with the object case of gnat_to_gnu_entity. */
1517 else if ((TREE_CODE (gnu_prefix) != TYPE_DECL
1518 && !(TYPE_IS_PADDING_P (gnu_type)
1519 && TREE_CODE (gnu_expr) == COMPONENT_REF))
1520 || attribute == Attr_Object_Size
1521 || attribute == Attr_Max_Size_In_Storage_Elements)
1522 {
1523 /* If this is a dereference and we have a special dynamic constrained
1524 subtype on the prefix, use it to compute the size; otherwise, use
1525 the designated subtype. */
1526 if (Nkind (Prefix (gnat_node)) == N_Explicit_Dereference)
1527 {
1528 Node_Id gnat_deref = Prefix (gnat_node);
1529 Node_Id gnat_actual_subtype
1530 = Actual_Designated_Subtype (gnat_deref);
1531 tree gnu_ptr_type
1532 = TREE_TYPE (gnat_to_gnu (Prefix (gnat_deref)));
1533
1534 if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type)
1535 && Present (gnat_actual_subtype))
1536 {
1537 tree gnu_actual_obj_type
1538 = gnat_to_gnu_type (gnat_actual_subtype);
1539 gnu_type
1540 = build_unc_object_type_from_ptr (gnu_ptr_type,
1541 gnu_actual_obj_type,
1542 get_identifier ("SIZE"),
1543 false);
1544 }
1545 }
1546
1547 gnu_result = TYPE_SIZE (gnu_type);
1548 }
1549
1550 /* Otherwise, the result is the RM size of the type. */
1551 else
1552 gnu_result = rm_size (gnu_type);
1553
1554 /* Deal with a self-referential size by returning the maximum size for
1555 a type and by qualifying the size with the object otherwise. */
1556 if (CONTAINS_PLACEHOLDER_P (gnu_result))
1557 {
1558 if (TREE_CODE (gnu_prefix) == TYPE_DECL)
1559 gnu_result = max_size (gnu_result, true);
1560 else
1561 gnu_result = substitute_placeholder_in_expr (gnu_result, gnu_expr);
1562 }
1563
1564 /* If the type contains a template, subtract its size. */
1565 if (TREE_CODE (gnu_type) == RECORD_TYPE
1566 && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
1567 gnu_result = size_binop (MINUS_EXPR, gnu_result,
1568 DECL_SIZE (TYPE_FIELDS (gnu_type)));
1569
1570 /* For 'Max_Size_In_Storage_Elements, adjust the unit. */
1571 if (attribute == Attr_Max_Size_In_Storage_Elements)
1572 gnu_result = size_binop (CEIL_DIV_EXPR, gnu_result, bitsize_unit_node);
1573
1574 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1575 break;
1576
1577 case Attr_Alignment:
1578 {
1579 unsigned int align;
1580
1581 if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1582 && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0))))
1583 gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1584
1585 gnu_type = TREE_TYPE (gnu_prefix);
1586 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1587 prefix_unused = true;
1588
1589 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1590 align = DECL_ALIGN (TREE_OPERAND (gnu_prefix, 1)) / BITS_PER_UNIT;
1591 else
1592 {
1593 Node_Id gnat_prefix = Prefix (gnat_node);
1594 Entity_Id gnat_type = Etype (gnat_prefix);
1595 unsigned int double_align;
1596 bool is_capped_double, align_clause;
1597
1598 /* If the default alignment of "double" or larger scalar types is
1599 specifically capped and there is an alignment clause neither
1600 on the type nor on the prefix itself, return the cap. */
1601 if ((double_align = double_float_alignment) > 0)
1602 is_capped_double
1603 = is_double_float_or_array (gnat_type, &align_clause);
1604 else if ((double_align = double_scalar_alignment) > 0)
1605 is_capped_double
1606 = is_double_scalar_or_array (gnat_type, &align_clause);
1607 else
1608 is_capped_double = align_clause = false;
1609
1610 if (is_capped_double
1611 && Nkind (gnat_prefix) == N_Identifier
1612 && Present (Alignment_Clause (Entity (gnat_prefix))))
1613 align_clause = true;
1614
1615 if (is_capped_double && !align_clause)
1616 align = double_align;
1617 else
1618 align = TYPE_ALIGN (gnu_type) / BITS_PER_UNIT;
1619 }
1620
1621 gnu_result = size_int (align);
1622 }
1623 break;
1624
1625 case Attr_First:
1626 case Attr_Last:
1627 case Attr_Range_Length:
1628 prefix_unused = true;
1629
1630 if (INTEGRAL_TYPE_P (gnu_type) || TREE_CODE (gnu_type) == REAL_TYPE)
1631 {
1632 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1633
1634 if (attribute == Attr_First)
1635 gnu_result = TYPE_MIN_VALUE (gnu_type);
1636 else if (attribute == Attr_Last)
1637 gnu_result = TYPE_MAX_VALUE (gnu_type);
1638 else
1639 gnu_result
1640 = build_binary_op
1641 (MAX_EXPR, get_base_type (gnu_result_type),
1642 build_binary_op
1643 (PLUS_EXPR, get_base_type (gnu_result_type),
1644 build_binary_op (MINUS_EXPR,
1645 get_base_type (gnu_result_type),
1646 convert (gnu_result_type,
1647 TYPE_MAX_VALUE (gnu_type)),
1648 convert (gnu_result_type,
1649 TYPE_MIN_VALUE (gnu_type))),
1650 convert (gnu_result_type, integer_one_node)),
1651 convert (gnu_result_type, integer_zero_node));
1652
1653 break;
1654 }
1655
1656 /* ... fall through ... */
1657
1658 case Attr_Length:
1659 {
1660 int Dimension = (Present (Expressions (gnat_node))
1661 ? UI_To_Int (Intval (First (Expressions (gnat_node))))
1662 : 1), i;
1663 struct parm_attr_d *pa = NULL;
1664 Entity_Id gnat_param = Empty;
1665
1666 /* Make sure any implicit dereference gets done. */
1667 gnu_prefix = maybe_implicit_deref (gnu_prefix);
1668 gnu_prefix = maybe_unconstrained_array (gnu_prefix);
1669
1670 /* We treat unconstrained array In parameters specially. */
1671 if (!Is_Constrained (Etype (Prefix (gnat_node))))
1672 {
1673 Node_Id gnat_prefix = Prefix (gnat_node);
1674
1675 /* This is the direct case. */
1676 if (Nkind (gnat_prefix) == N_Identifier
1677 && Ekind (Entity (gnat_prefix)) == E_In_Parameter)
1678 gnat_param = Entity (gnat_prefix);
1679
1680 /* This is the indirect case. Note that we need to be sure that
1681 the access value cannot be null as we'll hoist the load. */
1682 if (Nkind (gnat_prefix) == N_Explicit_Dereference
1683 && Nkind (Prefix (gnat_prefix)) == N_Identifier
1684 && Ekind (Entity (Prefix (gnat_prefix))) == E_In_Parameter
1685 && Can_Never_Be_Null (Entity (Prefix (gnat_prefix))))
1686 gnat_param = Entity (Prefix (gnat_prefix));
1687 }
1688
1689 gnu_type = TREE_TYPE (gnu_prefix);
1690 prefix_unused = true;
1691 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1692
1693 if (TYPE_CONVENTION_FORTRAN_P (gnu_type))
1694 {
1695 int ndim;
1696 tree gnu_type_temp;
1697
1698 for (ndim = 1, gnu_type_temp = gnu_type;
1699 TREE_CODE (TREE_TYPE (gnu_type_temp)) == ARRAY_TYPE
1700 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type_temp));
1701 ndim++, gnu_type_temp = TREE_TYPE (gnu_type_temp))
1702 ;
1703
1704 Dimension = ndim + 1 - Dimension;
1705 }
1706
1707 for (i = 1; i < Dimension; i++)
1708 gnu_type = TREE_TYPE (gnu_type);
1709
1710 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1711
1712 /* When not optimizing, look up the slot associated with the parameter
1713 and the dimension in the cache and create a new one on failure. */
1714 if (!optimize && Present (gnat_param))
1715 {
1716 FOR_EACH_VEC_ELT (parm_attr, f_parm_attr_cache, i, pa)
1717 if (pa->id == gnat_param && pa->dim == Dimension)
1718 break;
1719
1720 if (!pa)
1721 {
1722 pa = ggc_alloc_cleared_parm_attr_d ();
1723 pa->id = gnat_param;
1724 pa->dim = Dimension;
1725 VEC_safe_push (parm_attr, gc, f_parm_attr_cache, pa);
1726 }
1727 }
1728
1729 /* Return the cached expression or build a new one. */
1730 if (attribute == Attr_First)
1731 {
1732 if (pa && pa->first)
1733 {
1734 gnu_result = pa->first;
1735 break;
1736 }
1737
1738 gnu_result
1739 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1740 }
1741
1742 else if (attribute == Attr_Last)
1743 {
1744 if (pa && pa->last)
1745 {
1746 gnu_result = pa->last;
1747 break;
1748 }
1749
1750 gnu_result
1751 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1752 }
1753
1754 else /* attribute == Attr_Range_Length || attribute == Attr_Length */
1755 {
1756 if (pa && pa->length)
1757 {
1758 gnu_result = pa->length;
1759 break;
1760 }
1761 else
1762 {
1763 /* We used to compute the length as max (hb - lb + 1, 0),
1764 which could overflow for some cases of empty arrays, e.g.
1765 when lb == index_type'first. We now compute the length as
1766 (hb >= lb) ? hb - lb + 1 : 0, which would only overflow in
1767 much rarer cases, for extremely large arrays we expect
1768 never to encounter in practice. In addition, the former
1769 computation required the use of potentially constraining
1770 signed arithmetic while the latter doesn't. Note that
1771 the comparison must be done in the original index type,
1772 to avoid any overflow during the conversion. */
1773 tree comp_type = get_base_type (gnu_result_type);
1774 tree index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type));
1775 tree lb = TYPE_MIN_VALUE (index_type);
1776 tree hb = TYPE_MAX_VALUE (index_type);
1777 gnu_result
1778 = build_binary_op (PLUS_EXPR, comp_type,
1779 build_binary_op (MINUS_EXPR,
1780 comp_type,
1781 convert (comp_type, hb),
1782 convert (comp_type, lb)),
1783 convert (comp_type, integer_one_node));
1784 gnu_result
1785 = build_cond_expr (comp_type,
1786 build_binary_op (GE_EXPR,
1787 boolean_type_node,
1788 hb, lb),
1789 gnu_result,
1790 convert (comp_type, integer_zero_node));
1791 }
1792 }
1793
1794 /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1795 handling. Note that these attributes could not have been used on
1796 an unconstrained array type. */
1797 gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1798
1799 /* Cache the expression we have just computed. Since we want to do it
1800 at run time, we force the use of a SAVE_EXPR and let the gimplifier
1801 create the temporary in the outermost binding level. We will make
1802 sure in Subprogram_Body_to_gnu that it is evaluated on all possible
1803 paths by forcing its evaluation on entry of the function. */
1804 if (pa)
1805 {
1806 gnu_result
1807 = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
1808 if (attribute == Attr_First)
1809 pa->first = gnu_result;
1810 else if (attribute == Attr_Last)
1811 pa->last = gnu_result;
1812 else
1813 pa->length = gnu_result;
1814 }
1815
1816 /* Set the source location onto the predicate of the condition in the
1817 'Length case but do not do it if the expression is cached to avoid
1818 messing up the debug info. */
1819 else if ((attribute == Attr_Range_Length || attribute == Attr_Length)
1820 && TREE_CODE (gnu_result) == COND_EXPR
1821 && EXPR_P (TREE_OPERAND (gnu_result, 0)))
1822 set_expr_location_from_node (TREE_OPERAND (gnu_result, 0),
1823 gnat_node);
1824
1825 break;
1826 }
1827
1828 case Attr_Bit_Position:
1829 case Attr_Position:
1830 case Attr_First_Bit:
1831 case Attr_Last_Bit:
1832 case Attr_Bit:
1833 {
1834 HOST_WIDE_INT bitsize;
1835 HOST_WIDE_INT bitpos;
1836 tree gnu_offset;
1837 tree gnu_field_bitpos;
1838 tree gnu_field_offset;
1839 tree gnu_inner;
1840 enum machine_mode mode;
1841 int unsignedp, volatilep;
1842
1843 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1844 gnu_prefix = remove_conversions (gnu_prefix, true);
1845 prefix_unused = true;
1846
1847 /* We can have 'Bit on any object, but if it isn't a COMPONENT_REF,
1848 the result is 0. Don't allow 'Bit on a bare component, though. */
1849 if (attribute == Attr_Bit
1850 && TREE_CODE (gnu_prefix) != COMPONENT_REF
1851 && TREE_CODE (gnu_prefix) != FIELD_DECL)
1852 {
1853 gnu_result = integer_zero_node;
1854 break;
1855 }
1856
1857 else
1858 gcc_assert (TREE_CODE (gnu_prefix) == COMPONENT_REF
1859 || (attribute == Attr_Bit_Position
1860 && TREE_CODE (gnu_prefix) == FIELD_DECL));
1861
1862 get_inner_reference (gnu_prefix, &bitsize, &bitpos, &gnu_offset,
1863 &mode, &unsignedp, &volatilep, false);
1864
1865 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1866 {
1867 gnu_field_bitpos = bit_position (TREE_OPERAND (gnu_prefix, 1));
1868 gnu_field_offset = byte_position (TREE_OPERAND (gnu_prefix, 1));
1869
1870 for (gnu_inner = TREE_OPERAND (gnu_prefix, 0);
1871 TREE_CODE (gnu_inner) == COMPONENT_REF
1872 && DECL_INTERNAL_P (TREE_OPERAND (gnu_inner, 1));
1873 gnu_inner = TREE_OPERAND (gnu_inner, 0))
1874 {
1875 gnu_field_bitpos
1876 = size_binop (PLUS_EXPR, gnu_field_bitpos,
1877 bit_position (TREE_OPERAND (gnu_inner, 1)));
1878 gnu_field_offset
1879 = size_binop (PLUS_EXPR, gnu_field_offset,
1880 byte_position (TREE_OPERAND (gnu_inner, 1)));
1881 }
1882 }
1883 else if (TREE_CODE (gnu_prefix) == FIELD_DECL)
1884 {
1885 gnu_field_bitpos = bit_position (gnu_prefix);
1886 gnu_field_offset = byte_position (gnu_prefix);
1887 }
1888 else
1889 {
1890 gnu_field_bitpos = bitsize_zero_node;
1891 gnu_field_offset = size_zero_node;
1892 }
1893
1894 switch (attribute)
1895 {
1896 case Attr_Position:
1897 gnu_result = gnu_field_offset;
1898 break;
1899
1900 case Attr_First_Bit:
1901 case Attr_Bit:
1902 gnu_result = size_int (bitpos % BITS_PER_UNIT);
1903 break;
1904
1905 case Attr_Last_Bit:
1906 gnu_result = bitsize_int (bitpos % BITS_PER_UNIT);
1907 gnu_result = size_binop (PLUS_EXPR, gnu_result,
1908 TYPE_SIZE (TREE_TYPE (gnu_prefix)));
1909 gnu_result = size_binop (MINUS_EXPR, gnu_result,
1910 bitsize_one_node);
1911 break;
1912
1913 case Attr_Bit_Position:
1914 gnu_result = gnu_field_bitpos;
1915 break;
1916 }
1917
1918 /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1919 handling. */
1920 gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1921 break;
1922 }
1923
1924 case Attr_Min:
1925 case Attr_Max:
1926 {
1927 tree gnu_lhs = gnat_to_gnu (First (Expressions (gnat_node)));
1928 tree gnu_rhs = gnat_to_gnu (Next (First (Expressions (gnat_node))));
1929
1930 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1931 gnu_result = build_binary_op (attribute == Attr_Min
1932 ? MIN_EXPR : MAX_EXPR,
1933 gnu_result_type, gnu_lhs, gnu_rhs);
1934 }
1935 break;
1936
1937 case Attr_Passed_By_Reference:
1938 gnu_result = size_int (default_pass_by_ref (gnu_type)
1939 || must_pass_by_ref (gnu_type));
1940 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1941 break;
1942
1943 case Attr_Component_Size:
1944 if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1945 && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0))))
1946 gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1947
1948 gnu_prefix = maybe_implicit_deref (gnu_prefix);
1949 gnu_type = TREE_TYPE (gnu_prefix);
1950
1951 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1952 gnu_type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_type))));
1953
1954 while (TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
1955 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type)))
1956 gnu_type = TREE_TYPE (gnu_type);
1957
1958 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1959
1960 /* Note this size cannot be self-referential. */
1961 gnu_result = TYPE_SIZE (TREE_TYPE (gnu_type));
1962 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1963 prefix_unused = true;
1964 break;
1965
1966 case Attr_Descriptor_Size:
1967 gnu_type = TREE_TYPE (gnu_prefix);
1968 gcc_assert (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE);
1969
1970 /* What we want is the offset of the ARRAY field in the record
1971 that the thin pointer designates. */
1972 gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type);
1973 gnu_result = bit_position (DECL_CHAIN (TYPE_FIELDS (gnu_type)));
1974 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1975 prefix_unused = true;
1976 break;
1977
1978 case Attr_Null_Parameter:
1979 /* This is just a zero cast to the pointer type for our prefix and
1980 dereferenced. */
1981 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1982 gnu_result
1983 = build_unary_op (INDIRECT_REF, NULL_TREE,
1984 convert (build_pointer_type (gnu_result_type),
1985 integer_zero_node));
1986 TREE_PRIVATE (gnu_result) = 1;
1987 break;
1988
1989 case Attr_Mechanism_Code:
1990 {
1991 int code;
1992 Entity_Id gnat_obj = Entity (Prefix (gnat_node));
1993
1994 prefix_unused = true;
1995 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1996 if (Present (Expressions (gnat_node)))
1997 {
1998 int i = UI_To_Int (Intval (First (Expressions (gnat_node))));
1999
2000 for (gnat_obj = First_Formal (gnat_obj); i > 1;
2001 i--, gnat_obj = Next_Formal (gnat_obj))
2002 ;
2003 }
2004
2005 code = Mechanism (gnat_obj);
2006 if (code == Default)
2007 code = ((present_gnu_tree (gnat_obj)
2008 && (DECL_BY_REF_P (get_gnu_tree (gnat_obj))
2009 || ((TREE_CODE (get_gnu_tree (gnat_obj))
2010 == PARM_DECL)
2011 && (DECL_BY_COMPONENT_PTR_P
2012 (get_gnu_tree (gnat_obj))))))
2013 ? By_Reference : By_Copy);
2014 gnu_result = convert (gnu_result_type, size_int (- code));
2015 }
2016 break;
2017
2018 default:
2019 /* Say we have an unimplemented attribute. Then set the value to be
2020 returned to be a zero and hope that's something we can convert to
2021 the type of this attribute. */
2022 post_error ("unimplemented attribute", gnat_node);
2023 gnu_result_type = get_unpadded_type (Etype (gnat_node));
2024 gnu_result = integer_zero_node;
2025 break;
2026 }
2027
2028 /* If this is an attribute where the prefix was unused, force a use of it if
2029 it has a side-effect. But don't do it if the prefix is just an entity
2030 name. However, if an access check is needed, we must do it. See second
2031 example in AARM 11.6(5.e). */
2032 if (prefix_unused && TREE_SIDE_EFFECTS (gnu_prefix)
2033 && !Is_Entity_Name (Prefix (gnat_node)))
2034 gnu_result = build_compound_expr (TREE_TYPE (gnu_result), gnu_prefix,
2035 gnu_result);
2036
2037 *gnu_result_type_p = gnu_result_type;
2038 return gnu_result;
2039 }
2040 \f
2041 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Case_Statement,
2042 to a GCC tree, which is returned. */
2043
2044 static tree
2045 Case_Statement_to_gnu (Node_Id gnat_node)
2046 {
2047 tree gnu_result, gnu_expr, gnu_label;
2048 Node_Id gnat_when;
2049 location_t end_locus;
2050 bool may_fallthru = false;
2051
2052 gnu_expr = gnat_to_gnu (Expression (gnat_node));
2053 gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
2054
2055 /* The range of values in a case statement is determined by the rules in
2056 RM 5.4(7-9). In almost all cases, this range is represented by the Etype
2057 of the expression. One exception arises in the case of a simple name that
2058 is parenthesized. This still has the Etype of the name, but since it is
2059 not a name, para 7 does not apply, and we need to go to the base type.
2060 This is the only case where parenthesization affects the dynamic
2061 semantics (i.e. the range of possible values at run time that is covered
2062 by the others alternative).
2063
2064 Another exception is if the subtype of the expression is non-static. In
2065 that case, we also have to use the base type. */
2066 if (Paren_Count (Expression (gnat_node)) != 0
2067 || !Is_OK_Static_Subtype (Underlying_Type
2068 (Etype (Expression (gnat_node)))))
2069 gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
2070
2071 /* We build a SWITCH_EXPR that contains the code with interspersed
2072 CASE_LABEL_EXPRs for each label. */
2073 if (!Sloc_to_locus (Sloc (gnat_node) + UI_To_Int (End_Span (gnat_node)),
2074 &end_locus))
2075 end_locus = input_location;
2076 gnu_label = create_artificial_label (end_locus);
2077 start_stmt_group ();
2078
2079 for (gnat_when = First_Non_Pragma (Alternatives (gnat_node));
2080 Present (gnat_when);
2081 gnat_when = Next_Non_Pragma (gnat_when))
2082 {
2083 bool choices_added_p = false;
2084 Node_Id gnat_choice;
2085
2086 /* First compile all the different case choices for the current WHEN
2087 alternative. */
2088 for (gnat_choice = First (Discrete_Choices (gnat_when));
2089 Present (gnat_choice); gnat_choice = Next (gnat_choice))
2090 {
2091 tree gnu_low = NULL_TREE, gnu_high = NULL_TREE;
2092
2093 switch (Nkind (gnat_choice))
2094 {
2095 case N_Range:
2096 gnu_low = gnat_to_gnu (Low_Bound (gnat_choice));
2097 gnu_high = gnat_to_gnu (High_Bound (gnat_choice));
2098 break;
2099
2100 case N_Subtype_Indication:
2101 gnu_low = gnat_to_gnu (Low_Bound (Range_Expression
2102 (Constraint (gnat_choice))));
2103 gnu_high = gnat_to_gnu (High_Bound (Range_Expression
2104 (Constraint (gnat_choice))));
2105 break;
2106
2107 case N_Identifier:
2108 case N_Expanded_Name:
2109 /* This represents either a subtype range or a static value of
2110 some kind; Ekind says which. */
2111 if (IN (Ekind (Entity (gnat_choice)), Type_Kind))
2112 {
2113 tree gnu_type = get_unpadded_type (Entity (gnat_choice));
2114
2115 gnu_low = fold (TYPE_MIN_VALUE (gnu_type));
2116 gnu_high = fold (TYPE_MAX_VALUE (gnu_type));
2117 break;
2118 }
2119
2120 /* ... fall through ... */
2121
2122 case N_Character_Literal:
2123 case N_Integer_Literal:
2124 gnu_low = gnat_to_gnu (gnat_choice);
2125 break;
2126
2127 case N_Others_Choice:
2128 break;
2129
2130 default:
2131 gcc_unreachable ();
2132 }
2133
2134 /* If the case value is a subtype that raises Constraint_Error at
2135 run time because of a wrong bound, then gnu_low or gnu_high is
2136 not translated into an INTEGER_CST. In such a case, we need
2137 to ensure that the when statement is not added in the tree,
2138 otherwise it will crash the gimplifier. */
2139 if ((!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST)
2140 && (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST))
2141 {
2142 add_stmt_with_node (build_case_label
2143 (gnu_low, gnu_high,
2144 create_artificial_label (input_location)),
2145 gnat_choice);
2146 choices_added_p = true;
2147 }
2148 }
2149
2150 /* Push a binding level here in case variables are declared as we want
2151 them to be local to this set of statements instead of to the block
2152 containing the Case statement. */
2153 if (choices_added_p)
2154 {
2155 tree group = build_stmt_group (Statements (gnat_when), true);
2156 bool group_may_fallthru = block_may_fallthru (group);
2157 add_stmt (group);
2158 if (group_may_fallthru)
2159 {
2160 tree stmt = build1 (GOTO_EXPR, void_type_node, gnu_label);
2161 SET_EXPR_LOCATION (stmt, end_locus);
2162 add_stmt (stmt);
2163 may_fallthru = true;
2164 }
2165 }
2166 }
2167
2168 /* Now emit a definition of the label the cases branch to, if any. */
2169 if (may_fallthru)
2170 add_stmt (build1 (LABEL_EXPR, void_type_node, gnu_label));
2171 gnu_result = build3 (SWITCH_EXPR, TREE_TYPE (gnu_expr), gnu_expr,
2172 end_stmt_group (), NULL_TREE);
2173
2174 return gnu_result;
2175 }
2176 \f
2177 /* Find out whether VAR is an iteration variable of an enclosing loop in the
2178 current function. If so, push a range_check_info structure onto the stack
2179 of this enclosing loop and return it. Otherwise, return NULL. */
2180
2181 static struct range_check_info_d *
2182 push_range_check_info (tree var)
2183 {
2184 struct loop_info_d *iter = NULL;
2185 unsigned int i;
2186
2187 if (VEC_empty (loop_info, gnu_loop_stack))
2188 return NULL;
2189
2190 var = remove_conversions (var, false);
2191
2192 if (TREE_CODE (var) != VAR_DECL)
2193 return NULL;
2194
2195 if (decl_function_context (var) != current_function_decl)
2196 return NULL;
2197
2198 for (i = VEC_length (loop_info, gnu_loop_stack) - 1;
2199 VEC_iterate (loop_info, gnu_loop_stack, i, iter);
2200 i--)
2201 if (var == iter->loop_var)
2202 break;
2203
2204 if (iter)
2205 {
2206 struct range_check_info_d *rci = ggc_alloc_range_check_info_d ();
2207 VEC_safe_push (range_check_info, gc, iter->checks, rci);
2208 return rci;
2209 }
2210
2211 return NULL;
2212 }
2213
2214 /* Return true if VAL (of type TYPE) can equal the minimum value if MAX is
2215 false, or the maximum value if MAX is true, of TYPE. */
2216
2217 static bool
2218 can_equal_min_or_max_val_p (tree val, tree type, bool max)
2219 {
2220 tree min_or_max_val = (max ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type));
2221
2222 if (TREE_CODE (min_or_max_val) != INTEGER_CST)
2223 return true;
2224
2225 if (TREE_CODE (val) == NOP_EXPR)
2226 val = (max
2227 ? TYPE_MAX_VALUE (TREE_TYPE (TREE_OPERAND (val, 0)))
2228 : TYPE_MIN_VALUE (TREE_TYPE (TREE_OPERAND (val, 0))));
2229
2230 if (TREE_CODE (val) != INTEGER_CST)
2231 return true;
2232
2233 return tree_int_cst_equal (val, min_or_max_val) == 1;
2234 }
2235
2236 /* Return true if VAL (of type TYPE) can equal the minimum value of TYPE.
2237 If REVERSE is true, minimum value is taken as maximum value. */
2238
2239 static inline bool
2240 can_equal_min_val_p (tree val, tree type, bool reverse)
2241 {
2242 return can_equal_min_or_max_val_p (val, type, reverse);
2243 }
2244
2245 /* Return true if VAL (of type TYPE) can equal the maximum value of TYPE.
2246 If REVERSE is true, maximum value is taken as minimum value. */
2247
2248 static inline bool
2249 can_equal_max_val_p (tree val, tree type, bool reverse)
2250 {
2251 return can_equal_min_or_max_val_p (val, type, !reverse);
2252 }
2253
2254 /* Return true if VAL1 can be lower than VAL2. */
2255
2256 static bool
2257 can_be_lower_p (tree val1, tree val2)
2258 {
2259 if (TREE_CODE (val1) == NOP_EXPR)
2260 val1 = TYPE_MIN_VALUE (TREE_TYPE (TREE_OPERAND (val1, 0)));
2261
2262 if (TREE_CODE (val1) != INTEGER_CST)
2263 return true;
2264
2265 if (TREE_CODE (val2) == NOP_EXPR)
2266 val2 = TYPE_MAX_VALUE (TREE_TYPE (TREE_OPERAND (val2, 0)));
2267
2268 if (TREE_CODE (val2) != INTEGER_CST)
2269 return true;
2270
2271 return tree_int_cst_lt (val1, val2);
2272 }
2273
2274 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement,
2275 to a GCC tree, which is returned. */
2276
2277 static tree
2278 Loop_Statement_to_gnu (Node_Id gnat_node)
2279 {
2280 const Node_Id gnat_iter_scheme = Iteration_Scheme (gnat_node);
2281 struct loop_info_d *gnu_loop_info = ggc_alloc_cleared_loop_info_d ();
2282 tree gnu_loop_stmt = build4 (LOOP_STMT, void_type_node, NULL_TREE,
2283 NULL_TREE, NULL_TREE, NULL_TREE);
2284 tree gnu_loop_label = create_artificial_label (input_location);
2285 tree gnu_cond_expr = NULL_TREE, gnu_low = NULL_TREE, gnu_high = NULL_TREE;
2286 tree gnu_result;
2287
2288 /* Push the loop_info structure associated with the LOOP_STMT. */
2289 VEC_safe_push (loop_info, gc, gnu_loop_stack, gnu_loop_info);
2290
2291 /* Set location information for statement and end label. */
2292 set_expr_location_from_node (gnu_loop_stmt, gnat_node);
2293 Sloc_to_locus (Sloc (End_Label (gnat_node)),
2294 &DECL_SOURCE_LOCATION (gnu_loop_label));
2295 LOOP_STMT_LABEL (gnu_loop_stmt) = gnu_loop_label;
2296
2297 /* Save the label so that a corresponding N_Exit_Statement can find it. */
2298 gnu_loop_info->label = gnu_loop_label;
2299
2300 /* Set the condition under which the loop must keep going.
2301 For the case "LOOP .... END LOOP;" the condition is always true. */
2302 if (No (gnat_iter_scheme))
2303 ;
2304
2305 /* For the case "WHILE condition LOOP ..... END LOOP;" it's immediate. */
2306 else if (Present (Condition (gnat_iter_scheme)))
2307 LOOP_STMT_COND (gnu_loop_stmt)
2308 = gnat_to_gnu (Condition (gnat_iter_scheme));
2309
2310 /* Otherwise we have an iteration scheme and the condition is given by the
2311 bounds of the subtype of the iteration variable. */
2312 else
2313 {
2314 Node_Id gnat_loop_spec = Loop_Parameter_Specification (gnat_iter_scheme);
2315 Entity_Id gnat_loop_var = Defining_Entity (gnat_loop_spec);
2316 Entity_Id gnat_type = Etype (gnat_loop_var);
2317 tree gnu_type = get_unpadded_type (gnat_type);
2318 tree gnu_base_type = get_base_type (gnu_type);
2319 tree gnu_one_node = convert (gnu_base_type, integer_one_node);
2320 tree gnu_loop_var, gnu_loop_iv, gnu_first, gnu_last, gnu_stmt;
2321 enum tree_code update_code, test_code, shift_code;
2322 bool reverse = Reverse_Present (gnat_loop_spec), use_iv = false;
2323
2324 gnu_low = TYPE_MIN_VALUE (gnu_type);
2325 gnu_high = TYPE_MAX_VALUE (gnu_type);
2326
2327 /* We must disable modulo reduction for the iteration variable, if any,
2328 in order for the loop comparison to be effective. */
2329 if (reverse)
2330 {
2331 gnu_first = gnu_high;
2332 gnu_last = gnu_low;
2333 update_code = MINUS_NOMOD_EXPR;
2334 test_code = GE_EXPR;
2335 shift_code = PLUS_NOMOD_EXPR;
2336 }
2337 else
2338 {
2339 gnu_first = gnu_low;
2340 gnu_last = gnu_high;
2341 update_code = PLUS_NOMOD_EXPR;
2342 test_code = LE_EXPR;
2343 shift_code = MINUS_NOMOD_EXPR;
2344 }
2345
2346 /* We use two different strategies to translate the loop, depending on
2347 whether optimization is enabled.
2348
2349 If it is, we generate the canonical loop form expected by the loop
2350 optimizer and the loop vectorizer, which is the do-while form:
2351
2352 ENTRY_COND
2353 loop:
2354 TOP_UPDATE
2355 BODY
2356 BOTTOM_COND
2357 GOTO loop
2358
2359 This avoids an implicit dependency on loop header copying and makes
2360 it possible to turn BOTTOM_COND into an inequality test.
2361
2362 If optimization is disabled, loop header copying doesn't come into
2363 play and we try to generate the loop form with the fewer conditional
2364 branches. First, the default form, which is:
2365
2366 loop:
2367 TOP_COND
2368 BODY
2369 BOTTOM_UPDATE
2370 GOTO loop
2371
2372 It should catch most loops with constant ending point. Then, if we
2373 cannot, we try to generate the shifted form:
2374
2375 loop:
2376 TOP_COND
2377 TOP_UPDATE
2378 BODY
2379 GOTO loop
2380
2381 which should catch loops with constant starting point. Otherwise, if
2382 we cannot, we generate the fallback form:
2383
2384 ENTRY_COND
2385 loop:
2386 BODY
2387 BOTTOM_COND
2388 BOTTOM_UPDATE
2389 GOTO loop
2390
2391 which works in all cases. */
2392
2393 if (optimize)
2394 {
2395 /* We can use the do-while form directly if GNU_FIRST-1 doesn't
2396 overflow. */
2397 if (!can_equal_min_val_p (gnu_first, gnu_base_type, reverse))
2398 ;
2399
2400 /* Otherwise, use the do-while form with the help of a special
2401 induction variable in the unsigned version of the base type
2402 or the unsigned version of sizetype, whichever is the
2403 largest, in order to have wrap-around arithmetics for it. */
2404 else
2405 {
2406 if (TYPE_PRECISION (gnu_base_type) > TYPE_PRECISION (sizetype))
2407 gnu_base_type = gnat_unsigned_type (gnu_base_type);
2408 else
2409 gnu_base_type = sizetype;
2410
2411 gnu_first = convert (gnu_base_type, gnu_first);
2412 gnu_last = convert (gnu_base_type, gnu_last);
2413 gnu_one_node = convert (gnu_base_type, integer_one_node);
2414 use_iv = true;
2415 }
2416
2417 gnu_first
2418 = build_binary_op (shift_code, gnu_base_type, gnu_first,
2419 gnu_one_node);
2420 LOOP_STMT_TOP_UPDATE_P (gnu_loop_stmt) = 1;
2421 LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt) = 1;
2422 }
2423 else
2424 {
2425 /* We can use the default form if GNU_LAST+1 doesn't overflow. */
2426 if (!can_equal_max_val_p (gnu_last, gnu_base_type, reverse))
2427 ;
2428
2429 /* Otherwise, we can use the shifted form if neither GNU_FIRST-1 nor
2430 GNU_LAST-1 does. */
2431 else if (!can_equal_min_val_p (gnu_first, gnu_base_type, reverse)
2432 && !can_equal_min_val_p (gnu_last, gnu_base_type, reverse))
2433 {
2434 gnu_first
2435 = build_binary_op (shift_code, gnu_base_type, gnu_first,
2436 gnu_one_node);
2437 gnu_last
2438 = build_binary_op (shift_code, gnu_base_type, gnu_last,
2439 gnu_one_node);
2440 LOOP_STMT_TOP_UPDATE_P (gnu_loop_stmt) = 1;
2441 }
2442
2443 /* Otherwise, use the fallback form. */
2444 else
2445 LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt) = 1;
2446 }
2447
2448 /* If we use the BOTTOM_COND, we can turn the test into an inequality
2449 test but we may have to add ENTRY_COND to protect the empty loop. */
2450 if (LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt))
2451 {
2452 test_code = NE_EXPR;
2453 if (can_be_lower_p (gnu_high, gnu_low))
2454 {
2455 gnu_cond_expr
2456 = build3 (COND_EXPR, void_type_node,
2457 build_binary_op (LE_EXPR, boolean_type_node,
2458 gnu_low, gnu_high),
2459 NULL_TREE, alloc_stmt_list ());
2460 set_expr_location_from_node (gnu_cond_expr, gnat_loop_spec);
2461 }
2462 }
2463
2464 /* Open a new nesting level that will surround the loop to declare the
2465 iteration variable. */
2466 start_stmt_group ();
2467 gnat_pushlevel ();
2468
2469 /* If we use the special induction variable, create it and set it to
2470 its initial value. Morever, the regular iteration variable cannot
2471 itself be initialized, lest the initial value wrapped around. */
2472 if (use_iv)
2473 {
2474 gnu_loop_iv
2475 = create_init_temporary ("I", gnu_first, &gnu_stmt, gnat_loop_var);
2476 add_stmt (gnu_stmt);
2477 gnu_first = NULL_TREE;
2478 }
2479 else
2480 gnu_loop_iv = NULL_TREE;
2481
2482 /* Declare the iteration variable and set it to its initial value. */
2483 gnu_loop_var = gnat_to_gnu_entity (gnat_loop_var, gnu_first, 1);
2484 if (DECL_BY_REF_P (gnu_loop_var))
2485 gnu_loop_var = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_loop_var);
2486 else if (use_iv)
2487 {
2488 gcc_assert (DECL_LOOP_PARM_P (gnu_loop_var));
2489 SET_DECL_INDUCTION_VAR (gnu_loop_var, gnu_loop_iv);
2490 }
2491 gnu_loop_info->loop_var = gnu_loop_var;
2492
2493 /* Do all the arithmetics in the base type. */
2494 gnu_loop_var = convert (gnu_base_type, gnu_loop_var);
2495
2496 /* Set either the top or bottom exit condition. */
2497 if (use_iv)
2498 LOOP_STMT_COND (gnu_loop_stmt)
2499 = build_binary_op (test_code, boolean_type_node, gnu_loop_iv,
2500 gnu_last);
2501 else
2502 LOOP_STMT_COND (gnu_loop_stmt)
2503 = build_binary_op (test_code, boolean_type_node, gnu_loop_var,
2504 gnu_last);
2505
2506 /* Set either the top or bottom update statement and give it the source
2507 location of the iteration for better coverage info. */
2508 if (use_iv)
2509 {
2510 gnu_stmt
2511 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_loop_iv,
2512 build_binary_op (update_code, gnu_base_type,
2513 gnu_loop_iv, gnu_one_node));
2514 set_expr_location_from_node (gnu_stmt, gnat_iter_scheme);
2515 append_to_statement_list (gnu_stmt,
2516 &LOOP_STMT_UPDATE (gnu_loop_stmt));
2517 gnu_stmt
2518 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_loop_var,
2519 gnu_loop_iv);
2520 set_expr_location_from_node (gnu_stmt, gnat_iter_scheme);
2521 append_to_statement_list (gnu_stmt,
2522 &LOOP_STMT_UPDATE (gnu_loop_stmt));
2523 }
2524 else
2525 {
2526 gnu_stmt
2527 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_loop_var,
2528 build_binary_op (update_code, gnu_base_type,
2529 gnu_loop_var, gnu_one_node));
2530 set_expr_location_from_node (gnu_stmt, gnat_iter_scheme);
2531 LOOP_STMT_UPDATE (gnu_loop_stmt) = gnu_stmt;
2532 }
2533 }
2534
2535 /* If the loop was named, have the name point to this loop. In this case,
2536 the association is not a DECL node, but the end label of the loop. */
2537 if (Present (Identifier (gnat_node)))
2538 save_gnu_tree (Entity (Identifier (gnat_node)), gnu_loop_label, true);
2539
2540 /* Make the loop body into its own block, so any allocated storage will be
2541 released every iteration. This is needed for stack allocation. */
2542 LOOP_STMT_BODY (gnu_loop_stmt)
2543 = build_stmt_group (Statements (gnat_node), true);
2544 TREE_SIDE_EFFECTS (gnu_loop_stmt) = 1;
2545
2546 /* If we have an iteration scheme, then we are in a statement group. Add
2547 the LOOP_STMT to it, finish it and make it the "loop". */
2548 if (Present (gnat_iter_scheme) && No (Condition (gnat_iter_scheme)))
2549 {
2550 struct range_check_info_d *rci;
2551 unsigned n_checks = VEC_length (range_check_info, gnu_loop_info->checks);
2552 unsigned int i;
2553
2554 /* First, if we have computed a small number of invariant conditions for
2555 range checks applied to the iteration variable, then initialize these
2556 conditions in front of the loop. Otherwise, leave them set to True.
2557
2558 ??? The heuristics need to be improved, by taking into account the
2559 following datapoints:
2560 - loop unswitching is disabled for big loops. The cap is the
2561 parameter PARAM_MAX_UNSWITCH_INSNS (50).
2562 - loop unswitching can only be applied a small number of times
2563 to a given loop. The cap is PARAM_MAX_UNSWITCH_LEVEL (3).
2564 - the front-end quickly generates useless or redundant checks
2565 that can be entirely optimized away in the end. */
2566 if (1 <= n_checks && n_checks <= 4)
2567 for (i = 0;
2568 VEC_iterate (range_check_info, gnu_loop_info->checks, i, rci);
2569 i++)
2570 {
2571 tree low_ok
2572 = rci->low_bound
2573 ? build_binary_op (GE_EXPR, boolean_type_node,
2574 convert (rci->type, gnu_low),
2575 rci->low_bound)
2576 : boolean_true_node;
2577
2578 tree high_ok
2579 = rci->high_bound
2580 ? build_binary_op (LE_EXPR, boolean_type_node,
2581 convert (rci->type, gnu_high),
2582 rci->high_bound)
2583 : boolean_true_node;
2584
2585 tree range_ok
2586 = build_binary_op (TRUTH_ANDIF_EXPR, boolean_type_node,
2587 low_ok, high_ok);
2588
2589 TREE_OPERAND (rci->invariant_cond, 0)
2590 = build_unary_op (TRUTH_NOT_EXPR, boolean_type_node, range_ok);
2591
2592 add_stmt_with_node_force (rci->invariant_cond, gnat_node);
2593 }
2594
2595 add_stmt (gnu_loop_stmt);
2596 gnat_poplevel ();
2597 gnu_loop_stmt = end_stmt_group ();
2598 }
2599
2600 /* If we have an outer COND_EXPR, that's our result and this loop is its
2601 "true" statement. Otherwise, the result is the LOOP_STMT. */
2602 if (gnu_cond_expr)
2603 {
2604 COND_EXPR_THEN (gnu_cond_expr) = gnu_loop_stmt;
2605 gnu_result = gnu_cond_expr;
2606 recalculate_side_effects (gnu_cond_expr);
2607 }
2608 else
2609 gnu_result = gnu_loop_stmt;
2610
2611 VEC_pop (loop_info, gnu_loop_stack);
2612
2613 return gnu_result;
2614 }
2615 \f
2616 /* Emit statements to establish __gnat_handle_vms_condition as a VMS condition
2617 handler for the current function. */
2618
2619 /* This is implemented by issuing a call to the appropriate VMS specific
2620 builtin. To avoid having VMS specific sections in the global gigi decls
2621 array, we maintain the decls of interest here. We can't declare them
2622 inside the function because we must mark them never to be GC'd, which we
2623 can only do at the global level. */
2624
2625 static GTY(()) tree vms_builtin_establish_handler_decl = NULL_TREE;
2626 static GTY(()) tree gnat_vms_condition_handler_decl = NULL_TREE;
2627
2628 static void
2629 establish_gnat_vms_condition_handler (void)
2630 {
2631 tree establish_stmt;
2632
2633 /* Elaborate the required decls on the first call. Check on the decl for
2634 the gnat condition handler to decide, as this is one we create so we are
2635 sure that it will be non null on subsequent calls. The builtin decl is
2636 looked up so remains null on targets where it is not implemented yet. */
2637 if (gnat_vms_condition_handler_decl == NULL_TREE)
2638 {
2639 vms_builtin_establish_handler_decl
2640 = builtin_decl_for
2641 (get_identifier ("__builtin_establish_vms_condition_handler"));
2642
2643 gnat_vms_condition_handler_decl
2644 = create_subprog_decl (get_identifier ("__gnat_handle_vms_condition"),
2645 NULL_TREE,
2646 build_function_type_list (boolean_type_node,
2647 ptr_void_type_node,
2648 ptr_void_type_node,
2649 NULL_TREE),
2650 NULL_TREE, false, true, true, true, NULL,
2651 Empty);
2652
2653 /* ??? DECL_CONTEXT shouldn't have been set because of DECL_EXTERNAL. */
2654 DECL_CONTEXT (gnat_vms_condition_handler_decl) = NULL_TREE;
2655 }
2656
2657 /* Do nothing if the establish builtin is not available, which might happen
2658 on targets where the facility is not implemented. */
2659 if (vms_builtin_establish_handler_decl == NULL_TREE)
2660 return;
2661
2662 establish_stmt
2663 = build_call_n_expr (vms_builtin_establish_handler_decl, 1,
2664 build_unary_op
2665 (ADDR_EXPR, NULL_TREE,
2666 gnat_vms_condition_handler_decl));
2667
2668 add_stmt (establish_stmt);
2669 }
2670
2671 /* This page implements a form of Named Return Value optimization modelled
2672 on the C++ optimization of the same name. The main difference is that
2673 we disregard any semantical considerations when applying it here, the
2674 counterpart being that we don't try to apply it to semantically loaded
2675 return types, i.e. types with the TYPE_BY_REFERENCE_P flag set.
2676
2677 We consider a function body of the following GENERIC form:
2678
2679 return_type R1;
2680 [...]
2681 RETURN_EXPR [<retval> = ...]
2682 [...]
2683 RETURN_EXPR [<retval> = R1]
2684 [...]
2685 return_type Ri;
2686 [...]
2687 RETURN_EXPR [<retval> = ...]
2688 [...]
2689 RETURN_EXPR [<retval> = Ri]
2690 [...]
2691
2692 and we try to fulfill a simple criterion that would make it possible to
2693 replace one or several Ri variables with the RESULT_DECL of the function.
2694
2695 The first observation is that RETURN_EXPRs that don't directly reference
2696 any of the Ri variables on the RHS of their assignment are transparent wrt
2697 the optimization. This is because the Ri variables aren't addressable so
2698 any transformation applied to them doesn't affect the RHS; moreover, the
2699 assignment writes the full <retval> object so existing values are entirely
2700 discarded.
2701
2702 This property can be extended to some forms of RETURN_EXPRs that reference
2703 the Ri variables, for example CONSTRUCTORs, but isn't true in the general
2704 case, in particular when function calls are involved.
2705
2706 Therefore the algorithm is as follows:
2707
2708 1. Collect the list of candidates for a Named Return Value (Ri variables
2709 on the RHS of assignments of RETURN_EXPRs) as well as the list of the
2710 other expressions on the RHS of such assignments.
2711
2712 2. Prune the members of the first list (candidates) that are referenced
2713 by a member of the second list (expressions).
2714
2715 3. Extract a set of candidates with non-overlapping live ranges from the
2716 first list. These are the Named Return Values.
2717
2718 4. Adjust the relevant RETURN_EXPRs and replace the occurrences of the
2719 Named Return Values in the function with the RESULT_DECL.
2720
2721 If the function returns an unconstrained type, things are a bit different
2722 because the anonymous return object is allocated on the secondary stack
2723 and RESULT_DECL is only a pointer to it. Each return object can be of a
2724 different size and is allocated separately so we need not care about the
2725 aforementioned overlapping issues. Therefore, we don't collect the other
2726 expressions and skip step #2 in the algorithm. */
2727
2728 struct nrv_data
2729 {
2730 bitmap nrv;
2731 tree result;
2732 Node_Id gnat_ret;
2733 struct pointer_set_t *visited;
2734 };
2735
2736 /* Return true if T is a Named Return Value. */
2737
2738 static inline bool
2739 is_nrv_p (bitmap nrv, tree t)
2740 {
2741 return TREE_CODE (t) == VAR_DECL && bitmap_bit_p (nrv, DECL_UID (t));
2742 }
2743
2744 /* Helper function for walk_tree, used by finalize_nrv below. */
2745
2746 static tree
2747 prune_nrv_r (tree *tp, int *walk_subtrees, void *data)
2748 {
2749 struct nrv_data *dp = (struct nrv_data *)data;
2750 tree t = *tp;
2751
2752 /* No need to walk into types or decls. */
2753 if (IS_TYPE_OR_DECL_P (t))
2754 *walk_subtrees = 0;
2755
2756 if (is_nrv_p (dp->nrv, t))
2757 bitmap_clear_bit (dp->nrv, DECL_UID (t));
2758
2759 return NULL_TREE;
2760 }
2761
2762 /* Prune Named Return Values in BLOCK and return true if there is still a
2763 Named Return Value in BLOCK or one of its sub-blocks. */
2764
2765 static bool
2766 prune_nrv_in_block (bitmap nrv, tree block)
2767 {
2768 bool has_nrv = false;
2769 tree t;
2770
2771 /* First recurse on the sub-blocks. */
2772 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
2773 has_nrv |= prune_nrv_in_block (nrv, t);
2774
2775 /* Then make sure to keep at most one NRV per block. */
2776 for (t = BLOCK_VARS (block); t; t = DECL_CHAIN (t))
2777 if (is_nrv_p (nrv, t))
2778 {
2779 if (has_nrv)
2780 bitmap_clear_bit (nrv, DECL_UID (t));
2781 else
2782 has_nrv = true;
2783 }
2784
2785 return has_nrv;
2786 }
2787
2788 /* Helper function for walk_tree, used by finalize_nrv below. */
2789
2790 static tree
2791 finalize_nrv_r (tree *tp, int *walk_subtrees, void *data)
2792 {
2793 struct nrv_data *dp = (struct nrv_data *)data;
2794 tree t = *tp;
2795
2796 /* No need to walk into types. */
2797 if (TYPE_P (t))
2798 *walk_subtrees = 0;
2799
2800 /* Change RETURN_EXPRs of NRVs to just refer to the RESULT_DECL; this is a
2801 nop, but differs from using NULL_TREE in that it indicates that we care
2802 about the value of the RESULT_DECL. */
2803 else if (TREE_CODE (t) == RETURN_EXPR
2804 && TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR)
2805 {
2806 tree ret_val = TREE_OPERAND (TREE_OPERAND (t, 0), 1), init_expr;
2807
2808 /* If this is the temporary created for a return value with variable
2809 size in Call_to_gnu, we replace the RHS with the init expression. */
2810 if (TREE_CODE (ret_val) == COMPOUND_EXPR
2811 && TREE_CODE (TREE_OPERAND (ret_val, 0)) == INIT_EXPR
2812 && TREE_OPERAND (TREE_OPERAND (ret_val, 0), 0)
2813 == TREE_OPERAND (ret_val, 1))
2814 {
2815 init_expr = TREE_OPERAND (TREE_OPERAND (ret_val, 0), 1);
2816 ret_val = TREE_OPERAND (ret_val, 1);
2817 }
2818 else
2819 init_expr = NULL_TREE;
2820
2821 /* Strip useless conversions around the return value. */
2822 if (gnat_useless_type_conversion (ret_val))
2823 ret_val = TREE_OPERAND (ret_val, 0);
2824
2825 if (is_nrv_p (dp->nrv, ret_val))
2826 {
2827 if (init_expr)
2828 TREE_OPERAND (TREE_OPERAND (t, 0), 1) = init_expr;
2829 else
2830 TREE_OPERAND (t, 0) = dp->result;
2831 }
2832 }
2833
2834 /* Replace the DECL_EXPR of NRVs with an initialization of the RESULT_DECL,
2835 if needed. */
2836 else if (TREE_CODE (t) == DECL_EXPR
2837 && is_nrv_p (dp->nrv, DECL_EXPR_DECL (t)))
2838 {
2839 tree var = DECL_EXPR_DECL (t), init;
2840
2841 if (DECL_INITIAL (var))
2842 {
2843 init = build_binary_op (INIT_EXPR, NULL_TREE, dp->result,
2844 DECL_INITIAL (var));
2845 SET_EXPR_LOCATION (init, EXPR_LOCATION (t));
2846 DECL_INITIAL (var) = NULL_TREE;
2847 }
2848 else
2849 init = build_empty_stmt (EXPR_LOCATION (t));
2850 *tp = init;
2851
2852 /* Identify the NRV to the RESULT_DECL for debugging purposes. */
2853 SET_DECL_VALUE_EXPR (var, dp->result);
2854 DECL_HAS_VALUE_EXPR_P (var) = 1;
2855 /* ??? Kludge to avoid an assertion failure during inlining. */
2856 DECL_SIZE (var) = bitsize_unit_node;
2857 DECL_SIZE_UNIT (var) = size_one_node;
2858 }
2859
2860 /* And replace all uses of NRVs with the RESULT_DECL. */
2861 else if (is_nrv_p (dp->nrv, t))
2862 *tp = convert (TREE_TYPE (t), dp->result);
2863
2864 /* Avoid walking into the same tree more than once. Unfortunately, we
2865 can't just use walk_tree_without_duplicates because it would only
2866 call us for the first occurrence of NRVs in the function body. */
2867 if (pointer_set_insert (dp->visited, *tp))
2868 *walk_subtrees = 0;
2869
2870 return NULL_TREE;
2871 }
2872
2873 /* Likewise, but used when the function returns an unconstrained type. */
2874
2875 static tree
2876 finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data)
2877 {
2878 struct nrv_data *dp = (struct nrv_data *)data;
2879 tree t = *tp;
2880
2881 /* No need to walk into types. */
2882 if (TYPE_P (t))
2883 *walk_subtrees = 0;
2884
2885 /* We need to see the DECL_EXPR of NRVs before any other references so we
2886 walk the body of BIND_EXPR before walking its variables. */
2887 else if (TREE_CODE (t) == BIND_EXPR)
2888 walk_tree (&BIND_EXPR_BODY (t), finalize_nrv_unc_r, data, NULL);
2889
2890 /* Change RETURN_EXPRs of NRVs to assign to the RESULT_DECL only the final
2891 return value built by the allocator instead of the whole construct. */
2892 else if (TREE_CODE (t) == RETURN_EXPR
2893 && TREE_CODE (TREE_OPERAND (t, 0)) == MODIFY_EXPR)
2894 {
2895 tree ret_val = TREE_OPERAND (TREE_OPERAND (t, 0), 1);
2896
2897 /* This is the construct returned by the allocator. */
2898 if (TREE_CODE (ret_val) == COMPOUND_EXPR
2899 && TREE_CODE (TREE_OPERAND (ret_val, 0)) == INIT_EXPR)
2900 {
2901 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (ret_val)))
2902 ret_val
2903 = VEC_index (constructor_elt,
2904 CONSTRUCTOR_ELTS
2905 (TREE_OPERAND (TREE_OPERAND (ret_val, 0), 1)),
2906 1)->value;
2907 else
2908 ret_val = TREE_OPERAND (TREE_OPERAND (ret_val, 0), 1);
2909 }
2910
2911 /* Strip useless conversions around the return value. */
2912 if (gnat_useless_type_conversion (ret_val)
2913 || TREE_CODE (ret_val) == VIEW_CONVERT_EXPR)
2914 ret_val = TREE_OPERAND (ret_val, 0);
2915
2916 /* Strip unpadding around the return value. */
2917 if (TREE_CODE (ret_val) == COMPONENT_REF
2918 && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (ret_val, 0))))
2919 ret_val = TREE_OPERAND (ret_val, 0);
2920
2921 /* Assign the new return value to the RESULT_DECL. */
2922 if (is_nrv_p (dp->nrv, ret_val))
2923 TREE_OPERAND (TREE_OPERAND (t, 0), 1)
2924 = TREE_OPERAND (DECL_INITIAL (ret_val), 0);
2925 }
2926
2927 /* Adjust the DECL_EXPR of NRVs to call the allocator and save the result
2928 into a new variable. */
2929 else if (TREE_CODE (t) == DECL_EXPR
2930 && is_nrv_p (dp->nrv, DECL_EXPR_DECL (t)))
2931 {
2932 tree saved_current_function_decl = current_function_decl;
2933 tree var = DECL_EXPR_DECL (t);
2934 tree alloc, p_array, new_var, new_ret;
2935 VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 2);
2936
2937 /* Create an artificial context to build the allocation. */
2938 current_function_decl = decl_function_context (var);
2939 start_stmt_group ();
2940 gnat_pushlevel ();
2941
2942 /* This will return a COMPOUND_EXPR with the allocation in the first
2943 arm and the final return value in the second arm. */
2944 alloc = build_allocator (TREE_TYPE (var), DECL_INITIAL (var),
2945 TREE_TYPE (dp->result),
2946 Procedure_To_Call (dp->gnat_ret),
2947 Storage_Pool (dp->gnat_ret),
2948 Empty, false);
2949
2950 /* The new variable is built as a reference to the allocated space. */
2951 new_var
2952 = build_decl (DECL_SOURCE_LOCATION (var), VAR_DECL, DECL_NAME (var),
2953 build_reference_type (TREE_TYPE (var)));
2954 DECL_BY_REFERENCE (new_var) = 1;
2955
2956 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (alloc)))
2957 {
2958 /* The new initial value is a COMPOUND_EXPR with the allocation in
2959 the first arm and the value of P_ARRAY in the second arm. */
2960 DECL_INITIAL (new_var)
2961 = build2 (COMPOUND_EXPR, TREE_TYPE (new_var),
2962 TREE_OPERAND (alloc, 0),
2963 VEC_index (constructor_elt,
2964 CONSTRUCTOR_ELTS (TREE_OPERAND (alloc, 1)),
2965 0)->value);
2966
2967 /* Build a modified CONSTRUCTOR that references NEW_VAR. */
2968 p_array = TYPE_FIELDS (TREE_TYPE (alloc));
2969 CONSTRUCTOR_APPEND_ELT (v, p_array,
2970 fold_convert (TREE_TYPE (p_array), new_var));
2971 CONSTRUCTOR_APPEND_ELT (v, DECL_CHAIN (p_array),
2972 VEC_index (constructor_elt,
2973 CONSTRUCTOR_ELTS
2974 (TREE_OPERAND (alloc, 1)),
2975 1)->value);
2976 new_ret = build_constructor (TREE_TYPE (alloc), v);
2977 }
2978 else
2979 {
2980 /* The new initial value is just the allocation. */
2981 DECL_INITIAL (new_var) = alloc;
2982 new_ret = fold_convert (TREE_TYPE (alloc), new_var);
2983 }
2984
2985 gnat_pushdecl (new_var, Empty);
2986
2987 /* Destroy the artificial context and insert the new statements. */
2988 gnat_zaplevel ();
2989 *tp = end_stmt_group ();
2990 current_function_decl = saved_current_function_decl;
2991
2992 /* Chain NEW_VAR immediately after VAR and ignore the latter. */
2993 DECL_CHAIN (new_var) = DECL_CHAIN (var);
2994 DECL_CHAIN (var) = new_var;
2995 DECL_IGNORED_P (var) = 1;
2996
2997 /* Save the new return value and the dereference of NEW_VAR. */
2998 DECL_INITIAL (var)
2999 = build2 (COMPOUND_EXPR, TREE_TYPE (var), new_ret,
3000 build1 (INDIRECT_REF, TREE_TYPE (var), new_var));
3001 /* ??? Kludge to avoid messing up during inlining. */
3002 DECL_CONTEXT (var) = NULL_TREE;
3003 }
3004
3005 /* And replace all uses of NRVs with the dereference of NEW_VAR. */
3006 else if (is_nrv_p (dp->nrv, t))
3007 *tp = TREE_OPERAND (DECL_INITIAL (t), 1);
3008
3009 /* Avoid walking into the same tree more than once. Unfortunately, we
3010 can't just use walk_tree_without_duplicates because it would only
3011 call us for the first occurrence of NRVs in the function body. */
3012 if (pointer_set_insert (dp->visited, *tp))
3013 *walk_subtrees = 0;
3014
3015 return NULL_TREE;
3016 }
3017
3018 /* Finalize the Named Return Value optimization for FNDECL. The NRV bitmap
3019 contains the candidates for Named Return Value and OTHER is a list of
3020 the other return values. GNAT_RET is a representative return node. */
3021
3022 static void
3023 finalize_nrv (tree fndecl, bitmap nrv, VEC(tree,gc) *other, Node_Id gnat_ret)
3024 {
3025 struct cgraph_node *node;
3026 struct nrv_data data;
3027 walk_tree_fn func;
3028 unsigned int i;
3029 tree iter;
3030
3031 /* We shouldn't be applying the optimization to return types that we aren't
3032 allowed to manipulate freely. */
3033 gcc_assert (!TYPE_IS_BY_REFERENCE_P (TREE_TYPE (TREE_TYPE (fndecl))));
3034
3035 /* Prune the candidates that are referenced by other return values. */
3036 data.nrv = nrv;
3037 data.result = NULL_TREE;
3038 data.visited = NULL;
3039 for (i = 0; VEC_iterate(tree, other, i, iter); i++)
3040 walk_tree_without_duplicates (&iter, prune_nrv_r, &data);
3041 if (bitmap_empty_p (nrv))
3042 return;
3043
3044 /* Prune also the candidates that are referenced by nested functions. */
3045 node = cgraph_get_create_node (fndecl);
3046 for (node = node->nested; node; node = node->next_nested)
3047 walk_tree_without_duplicates (&DECL_SAVED_TREE (node->symbol.decl), prune_nrv_r,
3048 &data);
3049 if (bitmap_empty_p (nrv))
3050 return;
3051
3052 /* Extract a set of NRVs with non-overlapping live ranges. */
3053 if (!prune_nrv_in_block (nrv, DECL_INITIAL (fndecl)))
3054 return;
3055
3056 /* Adjust the relevant RETURN_EXPRs and replace the occurrences of NRVs. */
3057 data.nrv = nrv;
3058 data.result = DECL_RESULT (fndecl);
3059 data.gnat_ret = gnat_ret;
3060 data.visited = pointer_set_create ();
3061 if (TYPE_RETURN_UNCONSTRAINED_P (TREE_TYPE (fndecl)))
3062 func = finalize_nrv_unc_r;
3063 else
3064 func = finalize_nrv_r;
3065 walk_tree (&DECL_SAVED_TREE (fndecl), func, &data, NULL);
3066 pointer_set_destroy (data.visited);
3067 }
3068
3069 /* Return true if RET_VAL can be used as a Named Return Value for the
3070 anonymous return object RET_OBJ. */
3071
3072 static bool
3073 return_value_ok_for_nrv_p (tree ret_obj, tree ret_val)
3074 {
3075 if (TREE_CODE (ret_val) != VAR_DECL)
3076 return false;
3077
3078 if (TREE_THIS_VOLATILE (ret_val))
3079 return false;
3080
3081 if (DECL_CONTEXT (ret_val) != current_function_decl)
3082 return false;
3083
3084 if (TREE_STATIC (ret_val))
3085 return false;
3086
3087 if (TREE_ADDRESSABLE (ret_val))
3088 return false;
3089
3090 if (ret_obj && DECL_ALIGN (ret_val) > DECL_ALIGN (ret_obj))
3091 return false;
3092
3093 return true;
3094 }
3095
3096 /* Build a RETURN_EXPR. If RET_VAL is non-null, build a RETURN_EXPR around
3097 the assignment of RET_VAL to RET_OBJ. Otherwise build a bare RETURN_EXPR
3098 around RESULT_OBJ, which may be null in this case. */
3099
3100 static tree
3101 build_return_expr (tree ret_obj, tree ret_val)
3102 {
3103 tree result_expr;
3104
3105 if (ret_val)
3106 {
3107 /* The gimplifier explicitly enforces the following invariant:
3108
3109 RETURN_EXPR
3110 |
3111 MODIFY_EXPR
3112 / \
3113 / \
3114 RET_OBJ ...
3115
3116 As a consequence, type consistency dictates that we use the type
3117 of the RET_OBJ as the operation type. */
3118 tree operation_type = TREE_TYPE (ret_obj);
3119
3120 /* Convert the right operand to the operation type. Note that it's the
3121 same transformation as in the MODIFY_EXPR case of build_binary_op,
3122 with the assumption that the type cannot involve a placeholder. */
3123 if (operation_type != TREE_TYPE (ret_val))
3124 ret_val = convert (operation_type, ret_val);
3125
3126 result_expr = build2 (MODIFY_EXPR, void_type_node, ret_obj, ret_val);
3127
3128 /* If the function returns an aggregate type, find out whether this is
3129 a candidate for Named Return Value. If so, record it. Otherwise,
3130 if this is an expression of some kind, record it elsewhere. */
3131 if (optimize
3132 && AGGREGATE_TYPE_P (operation_type)
3133 && !TYPE_IS_FAT_POINTER_P (operation_type)
3134 && aggregate_value_p (operation_type, current_function_decl))
3135 {
3136 /* Recognize the temporary created for a return value with variable
3137 size in Call_to_gnu. We want to eliminate it if possible. */
3138 if (TREE_CODE (ret_val) == COMPOUND_EXPR
3139 && TREE_CODE (TREE_OPERAND (ret_val, 0)) == INIT_EXPR
3140 && TREE_OPERAND (TREE_OPERAND (ret_val, 0), 0)
3141 == TREE_OPERAND (ret_val, 1))
3142 ret_val = TREE_OPERAND (ret_val, 1);
3143
3144 /* Strip useless conversions around the return value. */
3145 if (gnat_useless_type_conversion (ret_val))
3146 ret_val = TREE_OPERAND (ret_val, 0);
3147
3148 /* Now apply the test to the return value. */
3149 if (return_value_ok_for_nrv_p (ret_obj, ret_val))
3150 {
3151 if (!f_named_ret_val)
3152 f_named_ret_val = BITMAP_GGC_ALLOC ();
3153 bitmap_set_bit (f_named_ret_val, DECL_UID (ret_val));
3154 }
3155
3156 /* Note that we need not care about CONSTRUCTORs here, as they are
3157 totally transparent given the read-compose-write semantics of
3158 assignments from CONSTRUCTORs. */
3159 else if (EXPR_P (ret_val))
3160 VEC_safe_push (tree, gc, f_other_ret_val, ret_val);
3161 }
3162 }
3163 else
3164 result_expr = ret_obj;
3165
3166 return build1 (RETURN_EXPR, void_type_node, result_expr);
3167 }
3168
3169 /* Build a stub for the subprogram specified by the GCC tree GNU_SUBPROG
3170 and the GNAT node GNAT_SUBPROG. */
3171
3172 static void
3173 build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog)
3174 {
3175 tree gnu_subprog_type, gnu_subprog_addr, gnu_subprog_call;
3176 tree gnu_subprog_param, gnu_stub_param, gnu_param;
3177 tree gnu_stub_decl = DECL_FUNCTION_STUB (gnu_subprog);
3178 VEC(tree,gc) *gnu_param_vec = NULL;
3179
3180 gnu_subprog_type = TREE_TYPE (gnu_subprog);
3181
3182 /* Initialize the information structure for the function. */
3183 allocate_struct_function (gnu_stub_decl, false);
3184 set_cfun (NULL);
3185
3186 begin_subprog_body (gnu_stub_decl);
3187
3188 start_stmt_group ();
3189 gnat_pushlevel ();
3190
3191 /* Loop over the parameters of the stub and translate any of them
3192 passed by descriptor into a by reference one. */
3193 for (gnu_stub_param = DECL_ARGUMENTS (gnu_stub_decl),
3194 gnu_subprog_param = DECL_ARGUMENTS (gnu_subprog);
3195 gnu_stub_param;
3196 gnu_stub_param = DECL_CHAIN (gnu_stub_param),
3197 gnu_subprog_param = DECL_CHAIN (gnu_subprog_param))
3198 {
3199 if (DECL_BY_DESCRIPTOR_P (gnu_stub_param))
3200 {
3201 gcc_assert (DECL_BY_REF_P (gnu_subprog_param));
3202 gnu_param
3203 = convert_vms_descriptor (TREE_TYPE (gnu_subprog_param),
3204 gnu_stub_param,
3205 DECL_PARM_ALT_TYPE (gnu_stub_param),
3206 DECL_BY_DOUBLE_REF_P (gnu_subprog_param),
3207 gnat_subprog);
3208 }
3209 else
3210 gnu_param = gnu_stub_param;
3211
3212 VEC_safe_push (tree, gc, gnu_param_vec, gnu_param);
3213 }
3214
3215 /* Invoke the internal subprogram. */
3216 gnu_subprog_addr = build1 (ADDR_EXPR, build_pointer_type (gnu_subprog_type),
3217 gnu_subprog);
3218 gnu_subprog_call = build_call_vec (TREE_TYPE (gnu_subprog_type),
3219 gnu_subprog_addr, gnu_param_vec);
3220
3221 /* Propagate the return value, if any. */
3222 if (VOID_TYPE_P (TREE_TYPE (gnu_subprog_type)))
3223 add_stmt (gnu_subprog_call);
3224 else
3225 add_stmt (build_return_expr (DECL_RESULT (gnu_stub_decl),
3226 gnu_subprog_call));
3227
3228 gnat_poplevel ();
3229 end_subprog_body (end_stmt_group ());
3230 rest_of_subprog_body_compilation (gnu_stub_decl);
3231 }
3232 \f
3233 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Subprogram_Body. We
3234 don't return anything. */
3235
3236 static void
3237 Subprogram_Body_to_gnu (Node_Id gnat_node)
3238 {
3239 /* Defining identifier of a parameter to the subprogram. */
3240 Entity_Id gnat_param;
3241 /* The defining identifier for the subprogram body. Note that if a
3242 specification has appeared before for this body, then the identifier
3243 occurring in that specification will also be a defining identifier and all
3244 the calls to this subprogram will point to that specification. */
3245 Entity_Id gnat_subprog_id
3246 = (Present (Corresponding_Spec (gnat_node))
3247 ? Corresponding_Spec (gnat_node) : Defining_Entity (gnat_node));
3248 /* The FUNCTION_DECL node corresponding to the subprogram spec. */
3249 tree gnu_subprog_decl;
3250 /* Its RESULT_DECL node. */
3251 tree gnu_result_decl;
3252 /* Its FUNCTION_TYPE node. */
3253 tree gnu_subprog_type;
3254 /* The TYPE_CI_CO_LIST of its FUNCTION_TYPE node, if any. */
3255 tree gnu_cico_list;
3256 /* The entry in the CI_CO_LIST that represents a function return, if any. */
3257 tree gnu_return_var_elmt = NULL_TREE;
3258 tree gnu_result;
3259 struct language_function *gnu_subprog_language;
3260 VEC(parm_attr,gc) *cache;
3261
3262 /* If this is a generic object or if it has been eliminated,
3263 ignore it. */
3264 if (Ekind (gnat_subprog_id) == E_Generic_Procedure
3265 || Ekind (gnat_subprog_id) == E_Generic_Function
3266 || Is_Eliminated (gnat_subprog_id))
3267 return;
3268
3269 /* If this subprogram acts as its own spec, define it. Otherwise, just get
3270 the already-elaborated tree node. However, if this subprogram had its
3271 elaboration deferred, we will already have made a tree node for it. So
3272 treat it as not being defined in that case. Such a subprogram cannot
3273 have an address clause or a freeze node, so this test is safe, though it
3274 does disable some otherwise-useful error checking. */
3275 gnu_subprog_decl
3276 = gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE,
3277 Acts_As_Spec (gnat_node)
3278 && !present_gnu_tree (gnat_subprog_id));
3279 gnu_result_decl = DECL_RESULT (gnu_subprog_decl);
3280 gnu_subprog_type = TREE_TYPE (gnu_subprog_decl);
3281 gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
3282 if (gnu_cico_list)
3283 gnu_return_var_elmt = value_member (void_type_node, gnu_cico_list);
3284
3285 /* If the function returns by invisible reference, make it explicit in the
3286 function body. See gnat_to_gnu_entity, E_Subprogram_Type case.
3287 Handle the explicit case here and the copy-in/copy-out case below. */
3288 if (TREE_ADDRESSABLE (gnu_subprog_type) && !gnu_return_var_elmt)
3289 {
3290 TREE_TYPE (gnu_result_decl)
3291 = build_reference_type (TREE_TYPE (gnu_result_decl));
3292 relayout_decl (gnu_result_decl);
3293 }
3294
3295 /* Set the line number in the decl to correspond to that of the body so that
3296 the line number notes are written correctly. */
3297 Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (gnu_subprog_decl));
3298
3299 /* Initialize the information structure for the function. */
3300 allocate_struct_function (gnu_subprog_decl, false);
3301 gnu_subprog_language = ggc_alloc_cleared_language_function ();
3302 DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language = gnu_subprog_language;
3303 set_cfun (NULL);
3304
3305 begin_subprog_body (gnu_subprog_decl);
3306
3307 /* If there are In Out or Out parameters, we need to ensure that the return
3308 statement properly copies them out. We do this by making a new block and
3309 converting any return into a goto to a label at the end of the block. */
3310 if (gnu_cico_list)
3311 {
3312 tree gnu_return_var = NULL_TREE;
3313
3314 VEC_safe_push (tree, gc, gnu_return_label_stack,
3315 create_artificial_label (input_location));
3316
3317 start_stmt_group ();
3318 gnat_pushlevel ();
3319
3320 /* If this is a function with In Out or Out parameters, we also need a
3321 variable for the return value to be placed. */
3322 if (gnu_return_var_elmt)
3323 {
3324 tree gnu_return_type
3325 = TREE_TYPE (TREE_PURPOSE (gnu_return_var_elmt));
3326
3327 /* If the function returns by invisible reference, make it
3328 explicit in the function body. See gnat_to_gnu_entity,
3329 E_Subprogram_Type case. */
3330 if (TREE_ADDRESSABLE (gnu_subprog_type))
3331 gnu_return_type = build_reference_type (gnu_return_type);
3332
3333 gnu_return_var
3334 = create_var_decl (get_identifier ("RETVAL"), NULL_TREE,
3335 gnu_return_type, NULL_TREE, false, false,
3336 false, false, NULL, gnat_subprog_id);
3337 TREE_VALUE (gnu_return_var_elmt) = gnu_return_var;
3338 }
3339
3340 VEC_safe_push (tree, gc, gnu_return_var_stack, gnu_return_var);
3341
3342 /* See whether there are parameters for which we don't have a GCC tree
3343 yet. These must be Out parameters. Make a VAR_DECL for them and
3344 put it into TYPE_CI_CO_LIST, which must contain an empty entry too.
3345 We can match up the entries because TYPE_CI_CO_LIST is in the order
3346 of the parameters. */
3347 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
3348 Present (gnat_param);
3349 gnat_param = Next_Formal_With_Extras (gnat_param))
3350 if (!present_gnu_tree (gnat_param))
3351 {
3352 tree gnu_cico_entry = gnu_cico_list;
3353
3354 /* Skip any entries that have been already filled in; they must
3355 correspond to In Out parameters. */
3356 while (gnu_cico_entry && TREE_VALUE (gnu_cico_entry))
3357 gnu_cico_entry = TREE_CHAIN (gnu_cico_entry);
3358
3359 /* Do any needed references for padded types. */
3360 TREE_VALUE (gnu_cico_entry)
3361 = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_entry)),
3362 gnat_to_gnu_entity (gnat_param, NULL_TREE, 1));
3363 }
3364 }
3365 else
3366 VEC_safe_push (tree, gc, gnu_return_label_stack, NULL_TREE);
3367
3368 /* Get a tree corresponding to the code for the subprogram. */
3369 start_stmt_group ();
3370 gnat_pushlevel ();
3371
3372 /* On VMS, establish our condition handler to possibly turn a condition into
3373 the corresponding exception if the subprogram has a foreign convention or
3374 is exported.
3375
3376 To ensure proper execution of local finalizations on condition instances,
3377 we must turn a condition into the corresponding exception even if there
3378 is no applicable Ada handler, and need at least one condition handler per
3379 possible call chain involving GNAT code. OTOH, establishing the handler
3380 has a cost so we want to minimize the number of subprograms into which
3381 this happens. The foreign or exported condition is expected to satisfy
3382 all the constraints. */
3383 if (TARGET_ABI_OPEN_VMS
3384 && (Has_Foreign_Convention (gnat_subprog_id)
3385 || Is_Exported (gnat_subprog_id)))
3386 establish_gnat_vms_condition_handler ();
3387
3388 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
3389
3390 /* Generate the code of the subprogram itself. A return statement will be
3391 present and any Out parameters will be handled there. */
3392 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
3393 gnat_poplevel ();
3394 gnu_result = end_stmt_group ();
3395
3396 /* If we populated the parameter attributes cache, we need to make sure that
3397 the cached expressions are evaluated on all the possible paths leading to
3398 their uses. So we force their evaluation on entry of the function. */
3399 cache = gnu_subprog_language->parm_attr_cache;
3400 if (cache)
3401 {
3402 struct parm_attr_d *pa;
3403 int i;
3404
3405 start_stmt_group ();
3406
3407 FOR_EACH_VEC_ELT (parm_attr, cache, i, pa)
3408 {
3409 if (pa->first)
3410 add_stmt_with_node_force (pa->first, gnat_node);
3411 if (pa->last)
3412 add_stmt_with_node_force (pa->last, gnat_node);
3413 if (pa->length)
3414 add_stmt_with_node_force (pa->length, gnat_node);
3415 }
3416
3417 add_stmt (gnu_result);
3418 gnu_result = end_stmt_group ();
3419
3420 gnu_subprog_language->parm_attr_cache = NULL;
3421 }
3422
3423 /* If we are dealing with a return from an Ada procedure with parameters
3424 passed by copy-in/copy-out, we need to return a record containing the
3425 final values of these parameters. If the list contains only one entry,
3426 return just that entry though.
3427
3428 For a full description of the copy-in/copy-out parameter mechanism, see
3429 the part of the gnat_to_gnu_entity routine dealing with the translation
3430 of subprograms.
3431
3432 We need to make a block that contains the definition of that label and
3433 the copying of the return value. It first contains the function, then
3434 the label and copy statement. */
3435 if (gnu_cico_list)
3436 {
3437 tree gnu_retval;
3438
3439 add_stmt (gnu_result);
3440 add_stmt (build1 (LABEL_EXPR, void_type_node,
3441 VEC_last (tree, gnu_return_label_stack)));
3442
3443 if (list_length (gnu_cico_list) == 1)
3444 gnu_retval = TREE_VALUE (gnu_cico_list);
3445 else
3446 gnu_retval = build_constructor_from_list (TREE_TYPE (gnu_subprog_type),
3447 gnu_cico_list);
3448
3449 add_stmt_with_node (build_return_expr (gnu_result_decl, gnu_retval),
3450 End_Label (Handled_Statement_Sequence (gnat_node)));
3451 gnat_poplevel ();
3452 gnu_result = end_stmt_group ();
3453 }
3454
3455 VEC_pop (tree, gnu_return_label_stack);
3456
3457 /* Attempt setting the end_locus of our GCC body tree, typically a
3458 BIND_EXPR or STATEMENT_LIST, then the end_locus of our GCC subprogram
3459 declaration tree. */
3460 set_end_locus_from_node (gnu_result, gnat_node);
3461 set_end_locus_from_node (gnu_subprog_decl, gnat_node);
3462
3463 end_subprog_body (gnu_result);
3464
3465 /* Finally annotate the parameters and disconnect the trees for parameters
3466 that we have turned into variables since they are now unusable. */
3467 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
3468 Present (gnat_param);
3469 gnat_param = Next_Formal_With_Extras (gnat_param))
3470 {
3471 tree gnu_param = get_gnu_tree (gnat_param);
3472 bool is_var_decl = (TREE_CODE (gnu_param) == VAR_DECL);
3473
3474 annotate_object (gnat_param, TREE_TYPE (gnu_param), NULL_TREE,
3475 DECL_BY_REF_P (gnu_param),
3476 !is_var_decl && DECL_BY_DOUBLE_REF_P (gnu_param));
3477
3478 if (is_var_decl)
3479 save_gnu_tree (gnat_param, NULL_TREE, false);
3480 }
3481
3482 /* Disconnect the variable created for the return value. */
3483 if (gnu_return_var_elmt)
3484 TREE_VALUE (gnu_return_var_elmt) = void_type_node;
3485
3486 /* If the function returns an aggregate type and we have candidates for
3487 a Named Return Value, finalize the optimization. */
3488 if (optimize && gnu_subprog_language->named_ret_val)
3489 {
3490 finalize_nrv (gnu_subprog_decl,
3491 gnu_subprog_language->named_ret_val,
3492 gnu_subprog_language->other_ret_val,
3493 gnu_subprog_language->gnat_ret);
3494 gnu_subprog_language->named_ret_val = NULL;
3495 gnu_subprog_language->other_ret_val = NULL;
3496 }
3497
3498 rest_of_subprog_body_compilation (gnu_subprog_decl);
3499
3500 /* If there is a stub associated with the function, build it now. */
3501 if (DECL_FUNCTION_STUB (gnu_subprog_decl))
3502 build_function_stub (gnu_subprog_decl, gnat_subprog_id);
3503 }
3504 \f
3505 /* Return true if GNAT_NODE requires atomic synchronization. */
3506
3507 static bool
3508 atomic_sync_required_p (Node_Id gnat_node)
3509 {
3510 const Node_Id gnat_parent = Parent (gnat_node);
3511 Node_Kind kind;
3512 unsigned char attr_id;
3513
3514 /* First, scan the node to find the Atomic_Sync_Required flag. */
3515 kind = Nkind (gnat_node);
3516 if (kind == N_Type_Conversion || kind == N_Unchecked_Type_Conversion)
3517 {
3518 gnat_node = Expression (gnat_node);
3519 kind = Nkind (gnat_node);
3520 }
3521
3522 switch (kind)
3523 {
3524 case N_Expanded_Name:
3525 case N_Explicit_Dereference:
3526 case N_Identifier:
3527 case N_Indexed_Component:
3528 case N_Selected_Component:
3529 if (!Atomic_Sync_Required (gnat_node))
3530 return false;
3531 break;
3532
3533 default:
3534 return false;
3535 }
3536
3537 /* Then, scan the parent to find out cases where the flag is irrelevant. */
3538 kind = Nkind (gnat_parent);
3539 switch (kind)
3540 {
3541 case N_Attribute_Reference:
3542 attr_id = Get_Attribute_Id (Attribute_Name (gnat_parent));
3543 /* Do not mess up machine code insertions. */
3544 if (attr_id == Attr_Asm_Input || attr_id == Attr_Asm_Output)
3545 return false;
3546 break;
3547
3548 case N_Object_Renaming_Declaration:
3549 /* Do not generate a function call as a renamed object. */
3550 return false;
3551
3552 default:
3553 break;
3554 }
3555
3556 return true;
3557 }
3558 \f
3559 /* Create a temporary variable with PREFIX and TYPE, and return it. */
3560
3561 static tree
3562 create_temporary (const char *prefix, tree type)
3563 {
3564 tree gnu_temp = create_var_decl (create_tmp_var_name (prefix), NULL_TREE,
3565 type, NULL_TREE, false, false, false, false,
3566 NULL, Empty);
3567 DECL_ARTIFICIAL (gnu_temp) = 1;
3568 DECL_IGNORED_P (gnu_temp) = 1;
3569
3570 return gnu_temp;
3571 }
3572
3573 /* Create a temporary variable with PREFIX and initialize it with GNU_INIT.
3574 Put the initialization statement into GNU_INIT_STMT and annotate it with
3575 the SLOC of GNAT_NODE. Return the temporary variable. */
3576
3577 static tree
3578 create_init_temporary (const char *prefix, tree gnu_init, tree *gnu_init_stmt,
3579 Node_Id gnat_node)
3580 {
3581 tree gnu_temp = create_temporary (prefix, TREE_TYPE (gnu_init));
3582
3583 *gnu_init_stmt = build_binary_op (INIT_EXPR, NULL_TREE, gnu_temp, gnu_init);
3584 set_expr_location_from_node (*gnu_init_stmt, gnat_node);
3585
3586 return gnu_temp;
3587 }
3588
3589 /* Subroutine of gnat_to_gnu to translate gnat_node, either an N_Function_Call
3590 or an N_Procedure_Call_Statement, to a GCC tree, which is returned.
3591 GNU_RESULT_TYPE_P is a pointer to where we should place the result type.
3592 If GNU_TARGET is non-null, this must be a function call on the RHS of a
3593 N_Assignment_Statement and the result is to be placed into that object.
3594 If, in addition, ATOMIC_SYNC is true, then the assignment to GNU_TARGET
3595 requires atomic synchronization. */
3596
3597 static tree
3598 Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
3599 bool atomic_sync)
3600 {
3601 const bool function_call = (Nkind (gnat_node) == N_Function_Call);
3602 const bool returning_value = (function_call && !gnu_target);
3603 /* The GCC node corresponding to the GNAT subprogram name. This can either
3604 be a FUNCTION_DECL node if we are dealing with a standard subprogram call,
3605 or an indirect reference expression (an INDIRECT_REF node) pointing to a
3606 subprogram. */
3607 tree gnu_subprog = gnat_to_gnu (Name (gnat_node));
3608 /* The FUNCTION_TYPE node giving the GCC type of the subprogram. */
3609 tree gnu_subprog_type = TREE_TYPE (gnu_subprog);
3610 /* The return type of the FUNCTION_TYPE. */
3611 tree gnu_result_type = TREE_TYPE (gnu_subprog_type);
3612 tree gnu_subprog_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_subprog);
3613 VEC(tree,gc) *gnu_actual_vec = NULL;
3614 tree gnu_name_list = NULL_TREE;
3615 tree gnu_stmt_list = NULL_TREE;
3616 tree gnu_after_list = NULL_TREE;
3617 tree gnu_retval = NULL_TREE;
3618 tree gnu_call, gnu_result;
3619 bool went_into_elab_proc = false;
3620 bool pushed_binding_level = false;
3621 Entity_Id gnat_formal;
3622 Node_Id gnat_actual;
3623
3624 gcc_assert (TREE_CODE (gnu_subprog_type) == FUNCTION_TYPE);
3625
3626 /* If we are calling a stubbed function, raise Program_Error, but Elaborate
3627 all our args first. */
3628 if (TREE_CODE (gnu_subprog) == FUNCTION_DECL && DECL_STUBBED_P (gnu_subprog))
3629 {
3630 tree call_expr = build_call_raise (PE_Stubbed_Subprogram_Called,
3631 gnat_node, N_Raise_Program_Error);
3632
3633 for (gnat_actual = First_Actual (gnat_node);
3634 Present (gnat_actual);
3635 gnat_actual = Next_Actual (gnat_actual))
3636 add_stmt (gnat_to_gnu (gnat_actual));
3637
3638 if (returning_value)
3639 {
3640 *gnu_result_type_p = gnu_result_type;
3641 return build1 (NULL_EXPR, gnu_result_type, call_expr);
3642 }
3643
3644 return call_expr;
3645 }
3646
3647 /* The only way we can be making a call via an access type is if Name is an
3648 explicit dereference. In that case, get the list of formal args from the
3649 type the access type is pointing to. Otherwise, get the formals from the
3650 entity being called. */
3651 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
3652 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
3653 else if (Nkind (Name (gnat_node)) == N_Attribute_Reference)
3654 /* Assume here that this must be 'Elab_Body or 'Elab_Spec. */
3655 gnat_formal = Empty;
3656 else
3657 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
3658
3659 /* The lifetime of the temporaries created for the call ends right after the
3660 return value is copied, so we can give them the scope of the elaboration
3661 routine at top level. */
3662 if (!current_function_decl)
3663 {
3664 current_function_decl = get_elaboration_procedure ();
3665 went_into_elab_proc = true;
3666 }
3667
3668 /* First, create the temporary for the return value when:
3669
3670 1. There is no target and the function has copy-in/copy-out parameters,
3671 because we need to preserve the return value before copying back the
3672 parameters.
3673
3674 2. There is no target and this is not an object declaration, and the
3675 return type has variable size, because in these cases the gimplifier
3676 cannot create the temporary.
3677
3678 3. There is a target and it is a slice or an array with fixed size,
3679 and the return type has variable size, because the gimplifier
3680 doesn't handle these cases.
3681
3682 This must be done before we push a binding level around the call, since
3683 we will pop it before copying the return value. */
3684 if (function_call
3685 && ((!gnu_target && TYPE_CI_CO_LIST (gnu_subprog_type))
3686 || (!gnu_target
3687 && Nkind (Parent (gnat_node)) != N_Object_Declaration
3688 && TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST)
3689 || (gnu_target
3690 && (TREE_CODE (gnu_target) == ARRAY_RANGE_REF
3691 || (TREE_CODE (TREE_TYPE (gnu_target)) == ARRAY_TYPE
3692 && TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_target)))
3693 == INTEGER_CST))
3694 && TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST)))
3695 gnu_retval = create_temporary ("R", gnu_result_type);
3696
3697 /* Create the list of the actual parameters as GCC expects it, namely a
3698 chain of TREE_LIST nodes in which the TREE_VALUE field of each node
3699 is an expression and the TREE_PURPOSE field is null. But skip Out
3700 parameters not passed by reference and that need not be copied in. */
3701 for (gnat_actual = First_Actual (gnat_node);
3702 Present (gnat_actual);
3703 gnat_formal = Next_Formal_With_Extras (gnat_formal),
3704 gnat_actual = Next_Actual (gnat_actual))
3705 {
3706 tree gnu_formal = present_gnu_tree (gnat_formal)
3707 ? get_gnu_tree (gnat_formal) : NULL_TREE;
3708 tree gnu_formal_type = gnat_to_gnu_type (Etype (gnat_formal));
3709 const bool is_true_formal_parm
3710 = gnu_formal && TREE_CODE (gnu_formal) == PARM_DECL;
3711 const bool is_by_ref_formal_parm
3712 = is_true_formal_parm
3713 && (DECL_BY_REF_P (gnu_formal)
3714 || DECL_BY_COMPONENT_PTR_P (gnu_formal)
3715 || DECL_BY_DESCRIPTOR_P (gnu_formal));
3716 /* In the Out or In Out case, we must suppress conversions that yield
3717 an lvalue but can nevertheless cause the creation of a temporary,
3718 because we need the real object in this case, either to pass its
3719 address if it's passed by reference or as target of the back copy
3720 done after the call if it uses the copy-in/copy-out mechanism.
3721 We do it in the In case too, except for an unchecked conversion
3722 because it alone can cause the actual to be misaligned and the
3723 addressability test is applied to the real object. */
3724 const bool suppress_type_conversion
3725 = ((Nkind (gnat_actual) == N_Unchecked_Type_Conversion
3726 && Ekind (gnat_formal) != E_In_Parameter)
3727 || (Nkind (gnat_actual) == N_Type_Conversion
3728 && Is_Composite_Type (Underlying_Type (Etype (gnat_formal)))));
3729 Node_Id gnat_name = suppress_type_conversion
3730 ? Expression (gnat_actual) : gnat_actual;
3731 tree gnu_name = gnat_to_gnu (gnat_name), gnu_name_type;
3732 tree gnu_actual;
3733
3734 /* If it's possible we may need to use this expression twice, make sure
3735 that any side-effects are handled via SAVE_EXPRs; likewise if we need
3736 to force side-effects before the call.
3737 ??? This is more conservative than we need since we don't need to do
3738 this for pass-by-ref with no conversion. */
3739 if (Ekind (gnat_formal) != E_In_Parameter)
3740 gnu_name = gnat_stabilize_reference (gnu_name, true, NULL);
3741
3742 /* If we are passing a non-addressable parameter by reference, pass the
3743 address of a copy. In the Out or In Out case, set up to copy back
3744 out after the call. */
3745 if (is_by_ref_formal_parm
3746 && (gnu_name_type = gnat_to_gnu_type (Etype (gnat_name)))
3747 && !addressable_p (gnu_name, gnu_name_type))
3748 {
3749 bool in_param = (Ekind (gnat_formal) == E_In_Parameter);
3750 tree gnu_orig = gnu_name, gnu_temp, gnu_stmt;
3751
3752 /* Do not issue warnings for CONSTRUCTORs since this is not a copy
3753 but sort of an instantiation for them. */
3754 if (TREE_CODE (gnu_name) == CONSTRUCTOR)
3755 ;
3756
3757 /* If the type is passed by reference, a copy is not allowed. */
3758 else if (TYPE_IS_BY_REFERENCE_P (gnu_formal_type))
3759 post_error ("misaligned actual cannot be passed by reference",
3760 gnat_actual);
3761
3762 /* For users of Starlet we issue a warning because the interface
3763 apparently assumes that by-ref parameters outlive the procedure
3764 invocation. The code still will not work as intended, but we
3765 cannot do much better since low-level parts of the back-end
3766 would allocate temporaries at will because of the misalignment
3767 if we did not do so here. */
3768 else if (Is_Valued_Procedure (Entity (Name (gnat_node))))
3769 {
3770 post_error
3771 ("?possible violation of implicit assumption", gnat_actual);
3772 post_error_ne
3773 ("?made by pragma Import_Valued_Procedure on &", gnat_actual,
3774 Entity (Name (gnat_node)));
3775 post_error_ne ("?because of misalignment of &", gnat_actual,
3776 gnat_formal);
3777 }
3778
3779 /* If the actual type of the object is already the nominal type,
3780 we have nothing to do, except if the size is self-referential
3781 in which case we'll remove the unpadding below. */
3782 if (TREE_TYPE (gnu_name) == gnu_name_type
3783 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_name_type)))
3784 ;
3785
3786 /* Otherwise remove the unpadding from all the objects. */
3787 else if (TREE_CODE (gnu_name) == COMPONENT_REF
3788 && TYPE_IS_PADDING_P
3789 (TREE_TYPE (TREE_OPERAND (gnu_name, 0))))
3790 gnu_orig = gnu_name = TREE_OPERAND (gnu_name, 0);
3791
3792 /* Otherwise convert to the nominal type of the object if needed.
3793 There are several cases in which we need to make the temporary
3794 using this type instead of the actual type of the object when
3795 they are distinct, because the expectations of the callee would
3796 otherwise not be met:
3797 - if it's a justified modular type,
3798 - if the actual type is a smaller form of it,
3799 - if it's a smaller form of the actual type. */
3800 else if ((TREE_CODE (gnu_name_type) == RECORD_TYPE
3801 && (TYPE_JUSTIFIED_MODULAR_P (gnu_name_type)
3802 || smaller_form_type_p (TREE_TYPE (gnu_name),
3803 gnu_name_type)))
3804 || (INTEGRAL_TYPE_P (gnu_name_type)
3805 && smaller_form_type_p (gnu_name_type,
3806 TREE_TYPE (gnu_name))))
3807 gnu_name = convert (gnu_name_type, gnu_name);
3808
3809 /* If this is an In Out or Out parameter and we're returning a value,
3810 we need to create a temporary for the return value because we must
3811 preserve it before copying back at the very end. */
3812 if (!in_param && returning_value && !gnu_retval)
3813 gnu_retval = create_temporary ("R", gnu_result_type);
3814
3815 /* If we haven't pushed a binding level, push a new one. This will
3816 narrow the lifetime of the temporary we are about to make as much
3817 as possible. The drawback is that we'd need to create a temporary
3818 for the return value, if any (see comment before the loop). So do
3819 it only when this temporary was already created just above. */
3820 if (!pushed_binding_level && !(in_param && returning_value))
3821 {
3822 start_stmt_group ();
3823 gnat_pushlevel ();
3824 pushed_binding_level = true;
3825 }
3826
3827 /* Create an explicit temporary holding the copy. */
3828 gnu_temp
3829 = create_init_temporary ("A", gnu_name, &gnu_stmt, gnat_actual);
3830
3831 /* But initialize it on the fly like for an implicit temporary as
3832 we aren't necessarily having a statement list. */
3833 gnu_name = build_compound_expr (TREE_TYPE (gnu_name), gnu_stmt,
3834 gnu_temp);
3835
3836 /* Set up to move the copy back to the original if needed. */
3837 if (!in_param)
3838 {
3839 gnu_stmt = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_orig,
3840 gnu_temp);
3841 set_expr_location_from_node (gnu_stmt, gnat_node);
3842 append_to_statement_list (gnu_stmt, &gnu_after_list);
3843 }
3844 }
3845
3846 /* Start from the real object and build the actual. */
3847 gnu_actual = gnu_name;
3848
3849 /* If this is an atomic access of an In or In Out parameter for which
3850 synchronization is required, build the atomic load. */
3851 if (is_true_formal_parm
3852 && !is_by_ref_formal_parm
3853 && Ekind (gnat_formal) != E_Out_Parameter
3854 && atomic_sync_required_p (gnat_actual))
3855 gnu_actual = build_atomic_load (gnu_actual);
3856
3857 /* If this was a procedure call, we may not have removed any padding.
3858 So do it here for the part we will use as an input, if any. */
3859 if (Ekind (gnat_formal) != E_Out_Parameter
3860 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
3861 gnu_actual
3862 = convert (get_unpadded_type (Etype (gnat_actual)), gnu_actual);
3863
3864 /* Put back the conversion we suppressed above in the computation of the
3865 real object. And even if we didn't suppress any conversion there, we
3866 may have suppressed a conversion to the Etype of the actual earlier,
3867 since the parent is a procedure call, so put it back here. */
3868 if (suppress_type_conversion
3869 && Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
3870 gnu_actual
3871 = unchecked_convert (gnat_to_gnu_type (Etype (gnat_actual)),
3872 gnu_actual, No_Truncation (gnat_actual));
3873 else
3874 gnu_actual
3875 = convert (gnat_to_gnu_type (Etype (gnat_actual)), gnu_actual);
3876
3877 /* Make sure that the actual is in range of the formal's type. */
3878 if (Ekind (gnat_formal) != E_Out_Parameter
3879 && Do_Range_Check (gnat_actual))
3880 gnu_actual
3881 = emit_range_check (gnu_actual, Etype (gnat_formal), gnat_actual);
3882
3883 /* Unless this is an In parameter, we must remove any justified modular
3884 building from GNU_NAME to get an lvalue. */
3885 if (Ekind (gnat_formal) != E_In_Parameter
3886 && TREE_CODE (gnu_name) == CONSTRUCTOR
3887 && TREE_CODE (TREE_TYPE (gnu_name)) == RECORD_TYPE
3888 && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (gnu_name)))
3889 gnu_name
3890 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_name))), gnu_name);
3891
3892 /* If we have not saved a GCC object for the formal, it means it is an
3893 Out parameter not passed by reference and that need not be copied in.
3894 Otherwise, first see if the parameter is passed by reference. */
3895 if (is_true_formal_parm && DECL_BY_REF_P (gnu_formal))
3896 {
3897 if (Ekind (gnat_formal) != E_In_Parameter)
3898 {
3899 /* In Out or Out parameters passed by reference don't use the
3900 copy-in/copy-out mechanism so the address of the real object
3901 must be passed to the function. */
3902 gnu_actual = gnu_name;
3903
3904 /* If we have a padded type, be sure we've removed padding. */
3905 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
3906 gnu_actual = convert (get_unpadded_type (Etype (gnat_actual)),
3907 gnu_actual);
3908
3909 /* If we have the constructed subtype of an aliased object
3910 with an unconstrained nominal subtype, the type of the
3911 actual includes the template, although it is formally
3912 constrained. So we need to convert it back to the real
3913 constructed subtype to retrieve the constrained part
3914 and takes its address. */
3915 if (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
3916 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_actual))
3917 && Is_Constr_Subt_For_UN_Aliased (Etype (gnat_actual))
3918 && Is_Array_Type (Etype (gnat_actual)))
3919 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
3920 gnu_actual);
3921 }
3922
3923 /* There is no need to convert the actual to the formal's type before
3924 taking its address. The only exception is for unconstrained array
3925 types because of the way we build fat pointers. */
3926 if (TREE_CODE (gnu_formal_type) == UNCONSTRAINED_ARRAY_TYPE)
3927 {
3928 /* Put back a view conversion for In Out or Out parameters. */
3929 if (Ekind (gnat_formal) != E_In_Parameter)
3930 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
3931 gnu_actual);
3932 gnu_actual = convert (gnu_formal_type, gnu_actual);
3933 }
3934
3935 /* The symmetry of the paths to the type of an entity is broken here
3936 since arguments don't know that they will be passed by ref. */
3937 gnu_formal_type = TREE_TYPE (gnu_formal);
3938
3939 if (DECL_BY_DOUBLE_REF_P (gnu_formal))
3940 gnu_actual
3941 = build_unary_op (ADDR_EXPR, TREE_TYPE (gnu_formal_type),
3942 gnu_actual);
3943
3944 gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
3945 }
3946 else if (is_true_formal_parm && DECL_BY_COMPONENT_PTR_P (gnu_formal))
3947 {
3948 gnu_formal_type = TREE_TYPE (gnu_formal);
3949 gnu_actual = maybe_implicit_deref (gnu_actual);
3950 gnu_actual = maybe_unconstrained_array (gnu_actual);
3951
3952 if (TYPE_IS_PADDING_P (gnu_formal_type))
3953 {
3954 gnu_formal_type = TREE_TYPE (TYPE_FIELDS (gnu_formal_type));
3955 gnu_actual = convert (gnu_formal_type, gnu_actual);
3956 }
3957
3958 /* Take the address of the object and convert to the proper pointer
3959 type. We'd like to actually compute the address of the beginning
3960 of the array using an ADDR_EXPR of an ARRAY_REF, but there's a
3961 possibility that the ARRAY_REF might return a constant and we'd be
3962 getting the wrong address. Neither approach is exactly correct,
3963 but this is the most likely to work in all cases. */
3964 gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
3965 }
3966 else if (is_true_formal_parm && DECL_BY_DESCRIPTOR_P (gnu_formal))
3967 {
3968 gnu_actual = convert (gnu_formal_type, gnu_actual);
3969
3970 /* If this is 'Null_Parameter, pass a zero descriptor. */
3971 if ((TREE_CODE (gnu_actual) == INDIRECT_REF
3972 || TREE_CODE (gnu_actual) == UNCONSTRAINED_ARRAY_REF)
3973 && TREE_PRIVATE (gnu_actual))
3974 gnu_actual
3975 = convert (DECL_ARG_TYPE (gnu_formal), integer_zero_node);
3976 else
3977 gnu_actual = build_unary_op (ADDR_EXPR, NULL_TREE,
3978 fill_vms_descriptor
3979 (TREE_TYPE (TREE_TYPE (gnu_formal)),
3980 gnu_actual, gnat_actual));
3981 }
3982 else
3983 {
3984 tree gnu_size;
3985
3986 if (Ekind (gnat_formal) != E_In_Parameter)
3987 gnu_name_list = tree_cons (NULL_TREE, gnu_name, gnu_name_list);
3988
3989 if (!is_true_formal_parm)
3990 {
3991 /* Make sure side-effects are evaluated before the call. */
3992 if (TREE_SIDE_EFFECTS (gnu_name))
3993 append_to_statement_list (gnu_name, &gnu_stmt_list);
3994 continue;
3995 }
3996
3997 gnu_actual = convert (gnu_formal_type, gnu_actual);
3998
3999 /* If this is 'Null_Parameter, pass a zero even though we are
4000 dereferencing it. */
4001 if (TREE_CODE (gnu_actual) == INDIRECT_REF
4002 && TREE_PRIVATE (gnu_actual)
4003 && (gnu_size = TYPE_SIZE (TREE_TYPE (gnu_actual)))
4004 && TREE_CODE (gnu_size) == INTEGER_CST
4005 && compare_tree_int (gnu_size, BITS_PER_WORD) <= 0)
4006 gnu_actual
4007 = unchecked_convert (DECL_ARG_TYPE (gnu_formal),
4008 convert (gnat_type_for_size
4009 (TREE_INT_CST_LOW (gnu_size), 1),
4010 integer_zero_node),
4011 false);
4012 else
4013 gnu_actual = convert (DECL_ARG_TYPE (gnu_formal), gnu_actual);
4014 }
4015
4016 VEC_safe_push (tree, gc, gnu_actual_vec, gnu_actual);
4017 }
4018
4019 gnu_call
4020 = build_call_vec (gnu_result_type, gnu_subprog_addr, gnu_actual_vec);
4021 set_expr_location_from_node (gnu_call, gnat_node);
4022
4023 /* If we have created a temporary for the return value, initialize it. */
4024 if (gnu_retval)
4025 {
4026 tree gnu_stmt
4027 = build_binary_op (INIT_EXPR, NULL_TREE, gnu_retval, gnu_call);
4028 set_expr_location_from_node (gnu_stmt, gnat_node);
4029 append_to_statement_list (gnu_stmt, &gnu_stmt_list);
4030 gnu_call = gnu_retval;
4031 }
4032
4033 /* If this is a subprogram with copy-in/copy-out parameters, we need to
4034 unpack the valued returned from the function into the In Out or Out
4035 parameters. We deal with the function return (if this is an Ada
4036 function) below. */
4037 if (TYPE_CI_CO_LIST (gnu_subprog_type))
4038 {
4039 /* List of FIELD_DECLs associated with the PARM_DECLs of the copy-in/
4040 copy-out parameters. */
4041 tree gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
4042 const int length = list_length (gnu_cico_list);
4043
4044 /* The call sequence must contain one and only one call, even though the
4045 function is pure. Save the result into a temporary if needed. */
4046 if (length > 1)
4047 {
4048 if (!gnu_retval)
4049 {
4050 tree gnu_stmt;
4051 /* If we haven't pushed a binding level, push a new one. This
4052 will narrow the lifetime of the temporary we are about to
4053 make as much as possible. */
4054 if (!pushed_binding_level)
4055 {
4056 start_stmt_group ();
4057 gnat_pushlevel ();
4058 pushed_binding_level = true;
4059 }
4060 gnu_call
4061 = create_init_temporary ("P", gnu_call, &gnu_stmt, gnat_node);
4062 append_to_statement_list (gnu_stmt, &gnu_stmt_list);
4063 }
4064
4065 gnu_name_list = nreverse (gnu_name_list);
4066 }
4067
4068 /* The first entry is for the actual return value if this is a
4069 function, so skip it. */
4070 if (TREE_VALUE (gnu_cico_list) == void_type_node)
4071 gnu_cico_list = TREE_CHAIN (gnu_cico_list);
4072
4073 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
4074 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
4075 else
4076 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
4077
4078 for (gnat_actual = First_Actual (gnat_node);
4079 Present (gnat_actual);
4080 gnat_formal = Next_Formal_With_Extras (gnat_formal),
4081 gnat_actual = Next_Actual (gnat_actual))
4082 /* If we are dealing with a copy-in/copy-out parameter, we must
4083 retrieve its value from the record returned in the call. */
4084 if (!(present_gnu_tree (gnat_formal)
4085 && TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
4086 && (DECL_BY_REF_P (get_gnu_tree (gnat_formal))
4087 || (TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
4088 && ((DECL_BY_COMPONENT_PTR_P (get_gnu_tree (gnat_formal))
4089 || (DECL_BY_DESCRIPTOR_P
4090 (get_gnu_tree (gnat_formal))))))))
4091 && Ekind (gnat_formal) != E_In_Parameter)
4092 {
4093 /* Get the value to assign to this Out or In Out parameter. It is
4094 either the result of the function if there is only a single such
4095 parameter or the appropriate field from the record returned. */
4096 tree gnu_result
4097 = length == 1
4098 ? gnu_call
4099 : build_component_ref (gnu_call, NULL_TREE,
4100 TREE_PURPOSE (gnu_cico_list), false);
4101
4102 /* If the actual is a conversion, get the inner expression, which
4103 will be the real destination, and convert the result to the
4104 type of the actual parameter. */
4105 tree gnu_actual
4106 = maybe_unconstrained_array (TREE_VALUE (gnu_name_list));
4107
4108 /* If the result is a padded type, remove the padding. */
4109 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
4110 gnu_result
4111 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
4112 gnu_result);
4113
4114 /* If the actual is a type conversion, the real target object is
4115 denoted by the inner Expression and we need to convert the
4116 result to the associated type.
4117 We also need to convert our gnu assignment target to this type
4118 if the corresponding GNU_NAME was constructed from the GNAT
4119 conversion node and not from the inner Expression. */
4120 if (Nkind (gnat_actual) == N_Type_Conversion)
4121 {
4122 gnu_result
4123 = convert_with_check
4124 (Etype (Expression (gnat_actual)), gnu_result,
4125 Do_Overflow_Check (gnat_actual),
4126 Do_Range_Check (Expression (gnat_actual)),
4127 Float_Truncate (gnat_actual), gnat_actual);
4128
4129 if (!Is_Composite_Type (Underlying_Type (Etype (gnat_formal))))
4130 gnu_actual = convert (TREE_TYPE (gnu_result), gnu_actual);
4131 }
4132
4133 /* Unchecked conversions as actuals for Out parameters are not
4134 allowed in user code because they are not variables, but do
4135 occur in front-end expansions. The associated GNU_NAME is
4136 always obtained from the inner expression in such cases. */
4137 else if (Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
4138 gnu_result = unchecked_convert (TREE_TYPE (gnu_actual),
4139 gnu_result,
4140 No_Truncation (gnat_actual));
4141 else
4142 {
4143 if (Do_Range_Check (gnat_actual))
4144 gnu_result
4145 = emit_range_check (gnu_result, Etype (gnat_actual),
4146 gnat_actual);
4147
4148 if (!(!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_actual)))
4149 && TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_result)))))
4150 gnu_result = convert (TREE_TYPE (gnu_actual), gnu_result);
4151 }
4152
4153 if (atomic_sync_required_p (gnat_actual))
4154 gnu_result = build_atomic_store (gnu_actual, gnu_result);
4155 else
4156 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
4157 gnu_actual, gnu_result);
4158 set_expr_location_from_node (gnu_result, gnat_node);
4159 append_to_statement_list (gnu_result, &gnu_stmt_list);
4160 gnu_cico_list = TREE_CHAIN (gnu_cico_list);
4161 gnu_name_list = TREE_CHAIN (gnu_name_list);
4162 }
4163 }
4164
4165 /* If this is a function call, the result is the call expression unless a
4166 target is specified, in which case we copy the result into the target
4167 and return the assignment statement. */
4168 if (function_call)
4169 {
4170 /* If this is a function with copy-in/copy-out parameters, extract the
4171 return value from it and update the return type. */
4172 if (TYPE_CI_CO_LIST (gnu_subprog_type))
4173 {
4174 tree gnu_elmt = value_member (void_type_node,
4175 TYPE_CI_CO_LIST (gnu_subprog_type));
4176 gnu_call = build_component_ref (gnu_call, NULL_TREE,
4177 TREE_PURPOSE (gnu_elmt), false);
4178 gnu_result_type = TREE_TYPE (gnu_call);
4179 }
4180
4181 /* If the function returns an unconstrained array or by direct reference,
4182 we have to dereference the pointer. */
4183 if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type)
4184 || TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type))
4185 gnu_call = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_call);
4186
4187 if (gnu_target)
4188 {
4189 Node_Id gnat_parent = Parent (gnat_node);
4190 enum tree_code op_code;
4191
4192 /* If range check is needed, emit code to generate it. */
4193 if (Do_Range_Check (gnat_node))
4194 gnu_call
4195 = emit_range_check (gnu_call, Etype (Name (gnat_parent)),
4196 gnat_parent);
4197
4198 /* ??? If the return type has variable size, then force the return
4199 slot optimization as we would not be able to create a temporary.
4200 Likewise if it was unconstrained as we would copy too much data.
4201 That's what has been done historically. */
4202 if (TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
4203 || (TYPE_IS_PADDING_P (gnu_result_type)
4204 && CONTAINS_PLACEHOLDER_P
4205 (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_result_type))))))
4206 op_code = INIT_EXPR;
4207 else
4208 op_code = MODIFY_EXPR;
4209
4210 if (atomic_sync)
4211 gnu_call = build_atomic_store (gnu_target, gnu_call);
4212 else
4213 gnu_call
4214 = build_binary_op (op_code, NULL_TREE, gnu_target, gnu_call);
4215 set_expr_location_from_node (gnu_call, gnat_parent);
4216 append_to_statement_list (gnu_call, &gnu_stmt_list);
4217 }
4218 else
4219 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
4220 }
4221
4222 /* Otherwise, if this is a procedure call statement without copy-in/copy-out
4223 parameters, the result is just the call statement. */
4224 else if (!TYPE_CI_CO_LIST (gnu_subprog_type))
4225 append_to_statement_list (gnu_call, &gnu_stmt_list);
4226
4227 /* Finally, add the copy back statements, if any. */
4228 append_to_statement_list (gnu_after_list, &gnu_stmt_list);
4229
4230 if (went_into_elab_proc)
4231 current_function_decl = NULL_TREE;
4232
4233 /* If we have pushed a binding level, pop it and finish up the enclosing
4234 statement group. */
4235 if (pushed_binding_level)
4236 {
4237 add_stmt (gnu_stmt_list);
4238 gnat_poplevel ();
4239 gnu_result = end_stmt_group ();
4240 }
4241
4242 /* Otherwise, retrieve the statement list, if any. */
4243 else if (gnu_stmt_list)
4244 gnu_result = gnu_stmt_list;
4245
4246 /* Otherwise, just return the call expression. */
4247 else
4248 return gnu_call;
4249
4250 /* If we nevertheless need a value, make a COMPOUND_EXPR to return it.
4251 But first simplify if we have only one statement in the list. */
4252 if (returning_value)
4253 {
4254 tree first = expr_first (gnu_result), last = expr_last (gnu_result);
4255 if (first == last)
4256 gnu_result = first;
4257 gnu_result
4258 = build_compound_expr (TREE_TYPE (gnu_call), gnu_result, gnu_call);
4259 }
4260
4261 return gnu_result;
4262 }
4263 \f
4264 /* Subroutine of gnat_to_gnu to translate gnat_node, an
4265 N_Handled_Sequence_Of_Statements, to a GCC tree, which is returned. */
4266
4267 static tree
4268 Handled_Sequence_Of_Statements_to_gnu (Node_Id gnat_node)
4269 {
4270 tree gnu_jmpsave_decl = NULL_TREE;
4271 tree gnu_jmpbuf_decl = NULL_TREE;
4272 /* If just annotating, ignore all EH and cleanups. */
4273 bool gcc_zcx = (!type_annotate_only
4274 && Present (Exception_Handlers (gnat_node))
4275 && Exception_Mechanism == Back_End_Exceptions);
4276 bool setjmp_longjmp
4277 = (!type_annotate_only && Present (Exception_Handlers (gnat_node))
4278 && Exception_Mechanism == Setjmp_Longjmp);
4279 bool at_end = !type_annotate_only && Present (At_End_Proc (gnat_node));
4280 bool binding_for_block = (at_end || gcc_zcx || setjmp_longjmp);
4281 tree gnu_inner_block; /* The statement(s) for the block itself. */
4282 tree gnu_result;
4283 tree gnu_expr;
4284 Node_Id gnat_temp;
4285
4286 /* The GCC exception handling mechanism can handle both ZCX and SJLJ schemes
4287 and we have our own SJLJ mechanism. To call the GCC mechanism, we call
4288 add_cleanup, and when we leave the binding, end_stmt_group will create
4289 the TRY_FINALLY_EXPR.
4290
4291 ??? The region level calls down there have been specifically put in place
4292 for a ZCX context and currently the order in which things are emitted
4293 (region/handlers) is different from the SJLJ case. Instead of putting
4294 other calls with different conditions at other places for the SJLJ case,
4295 it seems cleaner to reorder things for the SJLJ case and generalize the
4296 condition to make it not ZCX specific.
4297
4298 If there are any exceptions or cleanup processing involved, we need an
4299 outer statement group (for Setjmp_Longjmp) and binding level. */
4300 if (binding_for_block)
4301 {
4302 start_stmt_group ();
4303 gnat_pushlevel ();
4304 }
4305
4306 /* If using setjmp_longjmp, make the variables for the setjmp buffer and save
4307 area for address of previous buffer. Do this first since we need to have
4308 the setjmp buf known for any decls in this block. */
4309 if (setjmp_longjmp)
4310 {
4311 gnu_jmpsave_decl
4312 = create_var_decl (get_identifier ("JMPBUF_SAVE"), NULL_TREE,
4313 jmpbuf_ptr_type,
4314 build_call_n_expr (get_jmpbuf_decl, 0),
4315 false, false, false, false, NULL, gnat_node);
4316 DECL_ARTIFICIAL (gnu_jmpsave_decl) = 1;
4317
4318 /* The __builtin_setjmp receivers will immediately reinstall it. Now
4319 because of the unstructured form of EH used by setjmp_longjmp, there
4320 might be forward edges going to __builtin_setjmp receivers on which
4321 it is uninitialized, although they will never be actually taken. */
4322 TREE_NO_WARNING (gnu_jmpsave_decl) = 1;
4323 gnu_jmpbuf_decl
4324 = create_var_decl (get_identifier ("JMP_BUF"), NULL_TREE,
4325 jmpbuf_type,
4326 NULL_TREE,
4327 false, false, false, false, NULL, gnat_node);
4328 DECL_ARTIFICIAL (gnu_jmpbuf_decl) = 1;
4329
4330 set_block_jmpbuf_decl (gnu_jmpbuf_decl);
4331
4332 /* When we exit this block, restore the saved value. */
4333 add_cleanup (build_call_n_expr (set_jmpbuf_decl, 1, gnu_jmpsave_decl),
4334 End_Label (gnat_node));
4335 }
4336
4337 /* If we are to call a function when exiting this block, add a cleanup
4338 to the binding level we made above. Note that add_cleanup is FIFO
4339 so we must register this cleanup after the EH cleanup just above. */
4340 if (at_end)
4341 add_cleanup (build_call_n_expr (gnat_to_gnu (At_End_Proc (gnat_node)), 0),
4342 End_Label (gnat_node));
4343
4344 /* Now build the tree for the declarations and statements inside this block.
4345 If this is SJLJ, set our jmp_buf as the current buffer. */
4346 start_stmt_group ();
4347
4348 if (setjmp_longjmp)
4349 add_stmt (build_call_n_expr (set_jmpbuf_decl, 1,
4350 build_unary_op (ADDR_EXPR, NULL_TREE,
4351 gnu_jmpbuf_decl)));
4352
4353 if (Present (First_Real_Statement (gnat_node)))
4354 process_decls (Statements (gnat_node), Empty,
4355 First_Real_Statement (gnat_node), true, true);
4356
4357 /* Generate code for each statement in the block. */
4358 for (gnat_temp = (Present (First_Real_Statement (gnat_node))
4359 ? First_Real_Statement (gnat_node)
4360 : First (Statements (gnat_node)));
4361 Present (gnat_temp); gnat_temp = Next (gnat_temp))
4362 add_stmt (gnat_to_gnu (gnat_temp));
4363 gnu_inner_block = end_stmt_group ();
4364
4365 /* Now generate code for the two exception models, if either is relevant for
4366 this block. */
4367 if (setjmp_longjmp)
4368 {
4369 tree *gnu_else_ptr = 0;
4370 tree gnu_handler;
4371
4372 /* Make a binding level for the exception handling declarations and code
4373 and set up gnu_except_ptr_stack for the handlers to use. */
4374 start_stmt_group ();
4375 gnat_pushlevel ();
4376
4377 VEC_safe_push (tree, gc, gnu_except_ptr_stack,
4378 create_var_decl (get_identifier ("EXCEPT_PTR"), NULL_TREE,
4379 build_pointer_type (except_type_node),
4380 build_call_n_expr (get_excptr_decl, 0),
4381 false, false, false, false,
4382 NULL, gnat_node));
4383
4384 /* Generate code for each handler. The N_Exception_Handler case does the
4385 real work and returns a COND_EXPR for each handler, which we chain
4386 together here. */
4387 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
4388 Present (gnat_temp); gnat_temp = Next_Non_Pragma (gnat_temp))
4389 {
4390 gnu_expr = gnat_to_gnu (gnat_temp);
4391
4392 /* If this is the first one, set it as the outer one. Otherwise,
4393 point the "else" part of the previous handler to us. Then point
4394 to our "else" part. */
4395 if (!gnu_else_ptr)
4396 add_stmt (gnu_expr);
4397 else
4398 *gnu_else_ptr = gnu_expr;
4399
4400 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
4401 }
4402
4403 /* If none of the exception handlers did anything, re-raise but do not
4404 defer abortion. */
4405 gnu_expr = build_call_n_expr (raise_nodefer_decl, 1,
4406 VEC_last (tree, gnu_except_ptr_stack));
4407 set_expr_location_from_node
4408 (gnu_expr,
4409 Present (End_Label (gnat_node)) ? End_Label (gnat_node) : gnat_node);
4410
4411 if (gnu_else_ptr)
4412 *gnu_else_ptr = gnu_expr;
4413 else
4414 add_stmt (gnu_expr);
4415
4416 /* End the binding level dedicated to the exception handlers and get the
4417 whole statement group. */
4418 VEC_pop (tree, gnu_except_ptr_stack);
4419 gnat_poplevel ();
4420 gnu_handler = end_stmt_group ();
4421
4422 /* If the setjmp returns 1, we restore our incoming longjmp value and
4423 then check the handlers. */
4424 start_stmt_group ();
4425 add_stmt_with_node (build_call_n_expr (set_jmpbuf_decl, 1,
4426 gnu_jmpsave_decl),
4427 gnat_node);
4428 add_stmt (gnu_handler);
4429 gnu_handler = end_stmt_group ();
4430
4431 /* This block is now "if (setjmp) ... <handlers> else <block>". */
4432 gnu_result = build3 (COND_EXPR, void_type_node,
4433 (build_call_n_expr
4434 (setjmp_decl, 1,
4435 build_unary_op (ADDR_EXPR, NULL_TREE,
4436 gnu_jmpbuf_decl))),
4437 gnu_handler, gnu_inner_block);
4438 }
4439 else if (gcc_zcx)
4440 {
4441 tree gnu_handlers;
4442
4443 /* First make a block containing the handlers. */
4444 start_stmt_group ();
4445 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
4446 Present (gnat_temp);
4447 gnat_temp = Next_Non_Pragma (gnat_temp))
4448 add_stmt (gnat_to_gnu (gnat_temp));
4449 gnu_handlers = end_stmt_group ();
4450
4451 /* Now make the TRY_CATCH_EXPR for the block. */
4452 gnu_result = build2 (TRY_CATCH_EXPR, void_type_node,
4453 gnu_inner_block, gnu_handlers);
4454 }
4455 else
4456 gnu_result = gnu_inner_block;
4457
4458 /* Now close our outer block, if we had to make one. */
4459 if (binding_for_block)
4460 {
4461 add_stmt (gnu_result);
4462 gnat_poplevel ();
4463 gnu_result = end_stmt_group ();
4464 }
4465
4466 return gnu_result;
4467 }
4468 \f
4469 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
4470 to a GCC tree, which is returned. This is the variant for Setjmp_Longjmp
4471 exception handling. */
4472
4473 static tree
4474 Exception_Handler_to_gnu_sjlj (Node_Id gnat_node)
4475 {
4476 /* Unless this is "Others" or the special "Non-Ada" exception for Ada, make
4477 an "if" statement to select the proper exceptions. For "Others", exclude
4478 exceptions where Handled_By_Others is nonzero unless the All_Others flag
4479 is set. For "Non-ada", accept an exception if "Lang" is 'V'. */
4480 tree gnu_choice = boolean_false_node;
4481 tree gnu_body = build_stmt_group (Statements (gnat_node), false);
4482 Node_Id gnat_temp;
4483
4484 for (gnat_temp = First (Exception_Choices (gnat_node));
4485 gnat_temp; gnat_temp = Next (gnat_temp))
4486 {
4487 tree this_choice;
4488
4489 if (Nkind (gnat_temp) == N_Others_Choice)
4490 {
4491 if (All_Others (gnat_temp))
4492 this_choice = boolean_true_node;
4493 else
4494 this_choice
4495 = build_binary_op
4496 (EQ_EXPR, boolean_type_node,
4497 convert
4498 (integer_type_node,
4499 build_component_ref
4500 (build_unary_op
4501 (INDIRECT_REF, NULL_TREE,
4502 VEC_last (tree, gnu_except_ptr_stack)),
4503 get_identifier ("not_handled_by_others"), NULL_TREE,
4504 false)),
4505 integer_zero_node);
4506 }
4507
4508 else if (Nkind (gnat_temp) == N_Identifier
4509 || Nkind (gnat_temp) == N_Expanded_Name)
4510 {
4511 Entity_Id gnat_ex_id = Entity (gnat_temp);
4512 tree gnu_expr;
4513
4514 /* Exception may be a renaming. Recover original exception which is
4515 the one elaborated and registered. */
4516 if (Present (Renamed_Object (gnat_ex_id)))
4517 gnat_ex_id = Renamed_Object (gnat_ex_id);
4518
4519 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, 0);
4520
4521 this_choice
4522 = build_binary_op
4523 (EQ_EXPR, boolean_type_node,
4524 VEC_last (tree, gnu_except_ptr_stack),
4525 convert (TREE_TYPE (VEC_last (tree, gnu_except_ptr_stack)),
4526 build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr)));
4527
4528 /* If this is the distinguished exception "Non_Ada_Error" (and we are
4529 in VMS mode), also allow a non-Ada exception (a VMS condition) t
4530 match. */
4531 if (Is_Non_Ada_Error (Entity (gnat_temp)))
4532 {
4533 tree gnu_comp
4534 = build_component_ref
4535 (build_unary_op (INDIRECT_REF, NULL_TREE,
4536 VEC_last (tree, gnu_except_ptr_stack)),
4537 get_identifier ("lang"), NULL_TREE, false);
4538
4539 this_choice
4540 = build_binary_op
4541 (TRUTH_ORIF_EXPR, boolean_type_node,
4542 build_binary_op (EQ_EXPR, boolean_type_node, gnu_comp,
4543 build_int_cst (TREE_TYPE (gnu_comp), 'V')),
4544 this_choice);
4545 }
4546 }
4547 else
4548 gcc_unreachable ();
4549
4550 gnu_choice = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
4551 gnu_choice, this_choice);
4552 }
4553
4554 return build3 (COND_EXPR, void_type_node, gnu_choice, gnu_body, NULL_TREE);
4555 }
4556 \f
4557 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
4558 to a GCC tree, which is returned. This is the variant for ZCX. */
4559
4560 static tree
4561 Exception_Handler_to_gnu_zcx (Node_Id gnat_node)
4562 {
4563 tree gnu_etypes_list = NULL_TREE;
4564 tree gnu_expr;
4565 tree gnu_etype;
4566 tree gnu_current_exc_ptr;
4567 tree prev_gnu_incoming_exc_ptr;
4568 Node_Id gnat_temp;
4569
4570 /* We build a TREE_LIST of nodes representing what exception types this
4571 handler can catch, with special cases for others and all others cases.
4572
4573 Each exception type is actually identified by a pointer to the exception
4574 id, or to a dummy object for "others" and "all others". */
4575 for (gnat_temp = First (Exception_Choices (gnat_node));
4576 gnat_temp; gnat_temp = Next (gnat_temp))
4577 {
4578 if (Nkind (gnat_temp) == N_Others_Choice)
4579 {
4580 tree gnu_expr
4581 = All_Others (gnat_temp) ? all_others_decl : others_decl;
4582
4583 gnu_etype
4584 = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
4585 }
4586 else if (Nkind (gnat_temp) == N_Identifier
4587 || Nkind (gnat_temp) == N_Expanded_Name)
4588 {
4589 Entity_Id gnat_ex_id = Entity (gnat_temp);
4590
4591 /* Exception may be a renaming. Recover original exception which is
4592 the one elaborated and registered. */
4593 if (Present (Renamed_Object (gnat_ex_id)))
4594 gnat_ex_id = Renamed_Object (gnat_ex_id);
4595
4596 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, 0);
4597 gnu_etype = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
4598
4599 /* The Non_Ada_Error case for VMS exceptions is handled
4600 by the personality routine. */
4601 }
4602 else
4603 gcc_unreachable ();
4604
4605 /* The GCC interface expects NULL to be passed for catch all handlers, so
4606 it would be quite tempting to set gnu_etypes_list to NULL if gnu_etype
4607 is integer_zero_node. It would not work, however, because GCC's
4608 notion of "catch all" is stronger than our notion of "others". Until
4609 we correctly use the cleanup interface as well, doing that would
4610 prevent the "all others" handlers from being seen, because nothing
4611 can be caught beyond a catch all from GCC's point of view. */
4612 gnu_etypes_list = tree_cons (NULL_TREE, gnu_etype, gnu_etypes_list);
4613 }
4614
4615 start_stmt_group ();
4616 gnat_pushlevel ();
4617
4618 /* Expand a call to the begin_handler hook at the beginning of the handler,
4619 and arrange for a call to the end_handler hook to occur on every possible
4620 exit path.
4621
4622 The hooks expect a pointer to the low level occurrence. This is required
4623 for our stack management scheme because a raise inside the handler pushes
4624 a new occurrence on top of the stack, which means that this top does not
4625 necessarily match the occurrence this handler was dealing with.
4626
4627 __builtin_eh_pointer references the exception occurrence being
4628 propagated. Upon handler entry, this is the exception for which the
4629 handler is triggered. This might not be the case upon handler exit,
4630 however, as we might have a new occurrence propagated by the handler's
4631 body, and the end_handler hook called as a cleanup in this context.
4632
4633 We use a local variable to retrieve the incoming value at handler entry
4634 time, and reuse it to feed the end_handler hook's argument at exit. */
4635
4636 gnu_current_exc_ptr
4637 = build_call_expr (builtin_decl_explicit (BUILT_IN_EH_POINTER),
4638 1, integer_zero_node);
4639 prev_gnu_incoming_exc_ptr = gnu_incoming_exc_ptr;
4640 gnu_incoming_exc_ptr = create_var_decl (get_identifier ("EXPTR"), NULL_TREE,
4641 ptr_type_node, gnu_current_exc_ptr,
4642 false, false, false, false,
4643 NULL, gnat_node);
4644
4645 add_stmt_with_node (build_call_n_expr (begin_handler_decl, 1,
4646 gnu_incoming_exc_ptr),
4647 gnat_node);
4648 /* ??? We don't seem to have an End_Label at hand to set the location. */
4649 add_cleanup (build_call_n_expr (end_handler_decl, 1, gnu_incoming_exc_ptr),
4650 Empty);
4651 add_stmt_list (Statements (gnat_node));
4652 gnat_poplevel ();
4653
4654 gnu_incoming_exc_ptr = prev_gnu_incoming_exc_ptr;
4655
4656 return build2 (CATCH_EXPR, void_type_node, gnu_etypes_list,
4657 end_stmt_group ());
4658 }
4659 \f
4660 /* Subroutine of gnat_to_gnu to generate code for an N_Compilation unit. */
4661
4662 static void
4663 Compilation_Unit_to_gnu (Node_Id gnat_node)
4664 {
4665 const Node_Id gnat_unit = Unit (gnat_node);
4666 const bool body_p = (Nkind (gnat_unit) == N_Package_Body
4667 || Nkind (gnat_unit) == N_Subprogram_Body);
4668 const Entity_Id gnat_unit_entity = Defining_Entity (gnat_unit);
4669 /* Make the decl for the elaboration procedure. */
4670 tree gnu_elab_proc_decl
4671 = create_subprog_decl
4672 (create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
4673 NULL_TREE, void_ftype, NULL_TREE, false, true, false, true, NULL,
4674 gnat_unit);
4675 struct elab_info *info;
4676
4677 VEC_safe_push (tree, gc, gnu_elab_proc_stack, gnu_elab_proc_decl);
4678 DECL_ELABORATION_PROC_P (gnu_elab_proc_decl) = 1;
4679
4680 /* Initialize the information structure for the function. */
4681 allocate_struct_function (gnu_elab_proc_decl, false);
4682 set_cfun (NULL);
4683
4684 current_function_decl = NULL_TREE;
4685
4686 start_stmt_group ();
4687 gnat_pushlevel ();
4688
4689 /* For a body, first process the spec if there is one. */
4690 if (Nkind (gnat_unit) == N_Package_Body
4691 || (Nkind (gnat_unit) == N_Subprogram_Body && !Acts_As_Spec (gnat_node)))
4692 add_stmt (gnat_to_gnu (Library_Unit (gnat_node)));
4693
4694 if (type_annotate_only && gnat_node == Cunit (Main_Unit))
4695 {
4696 elaborate_all_entities (gnat_node);
4697
4698 if (Nkind (gnat_unit) == N_Subprogram_Declaration
4699 || Nkind (gnat_unit) == N_Generic_Package_Declaration
4700 || Nkind (gnat_unit) == N_Generic_Subprogram_Declaration)
4701 return;
4702 }
4703
4704 process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty,
4705 true, true);
4706 add_stmt (gnat_to_gnu (gnat_unit));
4707
4708 /* If we can inline, generate code for all the inlined subprograms. */
4709 if (optimize)
4710 {
4711 Entity_Id gnat_entity;
4712
4713 for (gnat_entity = First_Inlined_Subprogram (gnat_node);
4714 Present (gnat_entity);
4715 gnat_entity = Next_Inlined_Subprogram (gnat_entity))
4716 {
4717 Node_Id gnat_body = Parent (Declaration_Node (gnat_entity));
4718
4719 if (Nkind (gnat_body) != N_Subprogram_Body)
4720 {
4721 /* ??? This really should always be present. */
4722 if (No (Corresponding_Body (gnat_body)))
4723 continue;
4724 gnat_body
4725 = Parent (Declaration_Node (Corresponding_Body (gnat_body)));
4726 }
4727
4728 if (Present (gnat_body))
4729 {
4730 /* Define the entity first so we set DECL_EXTERNAL. */
4731 gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
4732 add_stmt (gnat_to_gnu (gnat_body));
4733 }
4734 }
4735 }
4736
4737 /* Process any pragmas and actions following the unit. */
4738 add_stmt_list (Pragmas_After (Aux_Decls_Node (gnat_node)));
4739 add_stmt_list (Actions (Aux_Decls_Node (gnat_node)));
4740 finalize_from_with_types ();
4741
4742 /* Save away what we've made so far and record this potential elaboration
4743 procedure. */
4744 info = ggc_alloc_elab_info ();
4745 set_current_block_context (gnu_elab_proc_decl);
4746 gnat_poplevel ();
4747 DECL_SAVED_TREE (gnu_elab_proc_decl) = end_stmt_group ();
4748
4749 set_end_locus_from_node (gnu_elab_proc_decl, gnat_unit);
4750
4751 info->next = elab_info_list;
4752 info->elab_proc = gnu_elab_proc_decl;
4753 info->gnat_node = gnat_node;
4754 elab_info_list = info;
4755
4756 /* Generate elaboration code for this unit, if necessary, and say whether
4757 we did or not. */
4758 VEC_pop (tree, gnu_elab_proc_stack);
4759
4760 /* Invalidate the global renaming pointers. This is necessary because
4761 stabilization of the renamed entities may create SAVE_EXPRs which
4762 have been tied to a specific elaboration routine just above. */
4763 invalidate_global_renaming_pointers ();
4764 }
4765 \f
4766 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Raise_xxx_Error,
4767 to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer to where
4768 we should place the result type. LABEL_P is true if there is a label to
4769 branch to for the exception. */
4770
4771 static tree
4772 Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
4773 {
4774 const Node_Kind kind = Nkind (gnat_node);
4775 const int reason = UI_To_Int (Reason (gnat_node));
4776 const Node_Id gnat_cond = Condition (gnat_node);
4777 const bool with_extra_info
4778 = Exception_Extra_Info
4779 && !No_Exception_Handlers_Set ()
4780 && !get_exception_label (kind);
4781 tree gnu_result = NULL_TREE, gnu_cond = NULL_TREE;
4782
4783 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
4784
4785 switch (reason)
4786 {
4787 case CE_Access_Check_Failed:
4788 if (with_extra_info)
4789 gnu_result = build_call_raise_column (reason, gnat_node);
4790 break;
4791
4792 case CE_Index_Check_Failed:
4793 case CE_Range_Check_Failed:
4794 case CE_Invalid_Data:
4795 if (Present (gnat_cond) && Nkind (gnat_cond) == N_Op_Not)
4796 {
4797 Node_Id gnat_range, gnat_index, gnat_type;
4798 tree gnu_index, gnu_low_bound, gnu_high_bound;
4799 struct range_check_info_d *rci;
4800
4801 switch (Nkind (Right_Opnd (gnat_cond)))
4802 {
4803 case N_In:
4804 gnat_range = Right_Opnd (Right_Opnd (gnat_cond));
4805 gcc_assert (Nkind (gnat_range) == N_Range);
4806 gnu_low_bound = gnat_to_gnu (Low_Bound (gnat_range));
4807 gnu_high_bound = gnat_to_gnu (High_Bound (gnat_range));
4808 break;
4809
4810 case N_Op_Ge:
4811 gnu_low_bound = gnat_to_gnu (Right_Opnd (Right_Opnd (gnat_cond)));
4812 gnu_high_bound = NULL_TREE;
4813 break;
4814
4815 case N_Op_Le:
4816 gnu_low_bound = NULL_TREE;
4817 gnu_high_bound = gnat_to_gnu (Right_Opnd (Right_Opnd (gnat_cond)));
4818 break;
4819
4820 default:
4821 goto common;
4822 }
4823
4824 gnat_index = Left_Opnd (Right_Opnd (gnat_cond));
4825 gnat_type = Etype (gnat_index);
4826 gnu_index = gnat_to_gnu (gnat_index);
4827
4828 if (with_extra_info
4829 && gnu_low_bound
4830 && gnu_high_bound
4831 && Known_Esize (gnat_type)
4832 && UI_To_Int (Esize (gnat_type)) <= 32)
4833 gnu_result
4834 = build_call_raise_range (reason, gnat_node, gnu_index,
4835 gnu_low_bound, gnu_high_bound);
4836
4837 /* If loop unswitching is enabled, we try to compute invariant
4838 conditions for checks applied to iteration variables, i.e.
4839 conditions that are both independent of the variable and
4840 necessary in order for the check to fail in the course of
4841 some iteration, and prepend them to the original condition
4842 of the checks. This will make it possible later for the
4843 loop unswitching pass to replace the loop with two loops,
4844 one of which has the checks eliminated and the other has
4845 the original checks reinstated, and a run time selection.
4846 The former loop will be suitable for vectorization. */
4847 if (flag_unswitch_loops
4848 && (!gnu_low_bound
4849 || (gnu_low_bound = gnat_invariant_expr (gnu_low_bound)))
4850 && (!gnu_high_bound
4851 || (gnu_high_bound = gnat_invariant_expr (gnu_high_bound)))
4852 && (rci = push_range_check_info (gnu_index)))
4853 {
4854 rci->low_bound = gnu_low_bound;
4855 rci->high_bound = gnu_high_bound;
4856 rci->type = gnat_to_gnu_type (gnat_type);
4857 rci->invariant_cond = build1 (SAVE_EXPR, boolean_type_node,
4858 boolean_true_node);
4859 gnu_cond = build_binary_op (TRUTH_ANDIF_EXPR,
4860 boolean_type_node,
4861 rci->invariant_cond,
4862 gnat_to_gnu (gnat_cond));
4863 }
4864 }
4865 break;
4866
4867 default:
4868 break;
4869 }
4870
4871 common:
4872 if (!gnu_result)
4873 gnu_result = build_call_raise (reason, gnat_node, kind);
4874 set_expr_location_from_node (gnu_result, gnat_node);
4875
4876 /* If the type is VOID, this is a statement, so we need to generate the code
4877 for the call. Handle a condition, if there is one. */
4878 if (VOID_TYPE_P (*gnu_result_type_p))
4879 {
4880 if (Present (gnat_cond))
4881 {
4882 if (!gnu_cond)
4883 gnu_cond = gnat_to_gnu (gnat_cond);
4884 gnu_result = build3 (COND_EXPR, void_type_node, gnu_cond, gnu_result,
4885 alloc_stmt_list ());
4886 }
4887 }
4888 else
4889 gnu_result = build1 (NULL_EXPR, *gnu_result_type_p, gnu_result);
4890
4891 return gnu_result;
4892 }
4893 \f
4894 /* Return true if GNAT_NODE is on the LHS of an assignment or an actual
4895 parameter of a call. */
4896
4897 static bool
4898 lhs_or_actual_p (Node_Id gnat_node)
4899 {
4900 Node_Id gnat_parent = Parent (gnat_node);
4901 Node_Kind kind = Nkind (gnat_parent);
4902
4903 if (kind == N_Assignment_Statement && Name (gnat_parent) == gnat_node)
4904 return true;
4905
4906 if ((kind == N_Procedure_Call_Statement || kind == N_Function_Call)
4907 && Name (gnat_parent) != gnat_node)
4908 return true;
4909
4910 if (kind == N_Parameter_Association)
4911 return true;
4912
4913 return false;
4914 }
4915
4916 /* Return true if either GNAT_NODE or a view of GNAT_NODE is on the LHS
4917 of an assignment or an actual parameter of a call. */
4918
4919 static bool
4920 present_in_lhs_or_actual_p (Node_Id gnat_node)
4921 {
4922 Node_Kind kind;
4923
4924 if (lhs_or_actual_p (gnat_node))
4925 return true;
4926
4927 kind = Nkind (Parent (gnat_node));
4928
4929 if ((kind == N_Type_Conversion || kind == N_Unchecked_Type_Conversion)
4930 && lhs_or_actual_p (Parent (gnat_node)))
4931 return true;
4932
4933 return false;
4934 }
4935
4936 /* Return true if GNAT_NODE, an unchecked type conversion, is a no-op as far
4937 as gigi is concerned. This is used to avoid conversions on the LHS. */
4938
4939 static bool
4940 unchecked_conversion_nop (Node_Id gnat_node)
4941 {
4942 Entity_Id from_type, to_type;
4943
4944 /* The conversion must be on the LHS of an assignment or an actual parameter
4945 of a call. Otherwise, even if the conversion was essentially a no-op, it
4946 could de facto ensure type consistency and this should be preserved. */
4947 if (!lhs_or_actual_p (gnat_node))
4948 return false;
4949
4950 from_type = Etype (Expression (gnat_node));
4951
4952 /* We're interested in artificial conversions generated by the front-end
4953 to make private types explicit, e.g. in Expand_Assign_Array. */
4954 if (!Is_Private_Type (from_type))
4955 return false;
4956
4957 from_type = Underlying_Type (from_type);
4958 to_type = Etype (gnat_node);
4959
4960 /* The direct conversion to the underlying type is a no-op. */
4961 if (to_type == from_type)
4962 return true;
4963
4964 /* For an array subtype, the conversion to the PAT is a no-op. */
4965 if (Ekind (from_type) == E_Array_Subtype
4966 && to_type == Packed_Array_Type (from_type))
4967 return true;
4968
4969 /* For a record subtype, the conversion to the type is a no-op. */
4970 if (Ekind (from_type) == E_Record_Subtype
4971 && to_type == Etype (from_type))
4972 return true;
4973
4974 return false;
4975 }
4976
4977 /* This function is the driver of the GNAT to GCC tree transformation process.
4978 It is the entry point of the tree transformer. GNAT_NODE is the root of
4979 some GNAT tree. Return the root of the corresponding GCC tree. If this
4980 is an expression, return the GCC equivalent of the expression. If this
4981 is a statement, return the statement or add it to the current statement
4982 group, in which case anything returned is to be interpreted as occurring
4983 after anything added. */
4984
4985 tree
4986 gnat_to_gnu (Node_Id gnat_node)
4987 {
4988 const Node_Kind kind = Nkind (gnat_node);
4989 bool went_into_elab_proc = false;
4990 tree gnu_result = error_mark_node; /* Default to no value. */
4991 tree gnu_result_type = void_type_node;
4992 tree gnu_expr, gnu_lhs, gnu_rhs;
4993 Node_Id gnat_temp;
4994
4995 /* Save node number for error message and set location information. */
4996 error_gnat_node = gnat_node;
4997 Sloc_to_locus (Sloc (gnat_node), &input_location);
4998
4999 /* If this node is a statement and we are only annotating types, return an
5000 empty statement list. */
5001 if (type_annotate_only && IN (kind, N_Statement_Other_Than_Procedure_Call))
5002 return alloc_stmt_list ();
5003
5004 /* If this node is a non-static subexpression and we are only annotating
5005 types, make this into a NULL_EXPR. */
5006 if (type_annotate_only
5007 && IN (kind, N_Subexpr)
5008 && kind != N_Identifier
5009 && !Compile_Time_Known_Value (gnat_node))
5010 return build1 (NULL_EXPR, get_unpadded_type (Etype (gnat_node)),
5011 build_call_raise (CE_Range_Check_Failed, gnat_node,
5012 N_Raise_Constraint_Error));
5013
5014 if ((IN (kind, N_Statement_Other_Than_Procedure_Call)
5015 && kind != N_Null_Statement)
5016 || kind == N_Procedure_Call_Statement
5017 || kind == N_Label
5018 || kind == N_Implicit_Label_Declaration
5019 || kind == N_Handled_Sequence_Of_Statements
5020 || (IN (kind, N_Raise_xxx_Error) && Ekind (Etype (gnat_node)) == E_Void))
5021 {
5022 tree current_elab_proc = get_elaboration_procedure ();
5023
5024 /* If this is a statement and we are at top level, it must be part of
5025 the elaboration procedure, so mark us as being in that procedure. */
5026 if (!current_function_decl)
5027 {
5028 current_function_decl = current_elab_proc;
5029 went_into_elab_proc = true;
5030 }
5031
5032 /* If we are in the elaboration procedure, check if we are violating a
5033 No_Elaboration_Code restriction by having a statement there. Don't
5034 check for a possible No_Elaboration_Code restriction violation on
5035 N_Handled_Sequence_Of_Statements, as we want to signal an error on
5036 every nested real statement instead. This also avoids triggering
5037 spurious errors on dummy (empty) sequences created by the front-end
5038 for package bodies in some cases. */
5039 if (current_function_decl == current_elab_proc
5040 && kind != N_Handled_Sequence_Of_Statements)
5041 Check_Elaboration_Code_Allowed (gnat_node);
5042 }
5043
5044 switch (kind)
5045 {
5046 /********************************/
5047 /* Chapter 2: Lexical Elements */
5048 /********************************/
5049
5050 case N_Identifier:
5051 case N_Expanded_Name:
5052 case N_Operator_Symbol:
5053 case N_Defining_Identifier:
5054 gnu_result = Identifier_to_gnu (gnat_node, &gnu_result_type);
5055
5056 /* If this is an atomic access on the RHS for which synchronization is
5057 required, build the atomic load. */
5058 if (atomic_sync_required_p (gnat_node)
5059 && !present_in_lhs_or_actual_p (gnat_node))
5060 gnu_result = build_atomic_load (gnu_result);
5061 break;
5062
5063 case N_Integer_Literal:
5064 {
5065 tree gnu_type;
5066
5067 /* Get the type of the result, looking inside any padding and
5068 justified modular types. Then get the value in that type. */
5069 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
5070
5071 if (TREE_CODE (gnu_type) == RECORD_TYPE
5072 && TYPE_JUSTIFIED_MODULAR_P (gnu_type))
5073 gnu_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
5074
5075 gnu_result = UI_To_gnu (Intval (gnat_node), gnu_type);
5076
5077 /* If the result overflows (meaning it doesn't fit in its base type),
5078 abort. We would like to check that the value is within the range
5079 of the subtype, but that causes problems with subtypes whose usage
5080 will raise Constraint_Error and with biased representation, so
5081 we don't. */
5082 gcc_assert (!TREE_OVERFLOW (gnu_result));
5083 }
5084 break;
5085
5086 case N_Character_Literal:
5087 /* If a Entity is present, it means that this was one of the
5088 literals in a user-defined character type. In that case,
5089 just return the value in the CONST_DECL. Otherwise, use the
5090 character code. In that case, the base type should be an
5091 INTEGER_TYPE, but we won't bother checking for that. */
5092 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5093 if (Present (Entity (gnat_node)))
5094 gnu_result = DECL_INITIAL (get_gnu_tree (Entity (gnat_node)));
5095 else
5096 gnu_result
5097 = build_int_cst_type
5098 (gnu_result_type, UI_To_CC (Char_Literal_Value (gnat_node)));
5099 break;
5100
5101 case N_Real_Literal:
5102 /* If this is of a fixed-point type, the value we want is the
5103 value of the corresponding integer. */
5104 if (IN (Ekind (Underlying_Type (Etype (gnat_node))), Fixed_Point_Kind))
5105 {
5106 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5107 gnu_result = UI_To_gnu (Corresponding_Integer_Value (gnat_node),
5108 gnu_result_type);
5109 gcc_assert (!TREE_OVERFLOW (gnu_result));
5110 }
5111
5112 /* We should never see a Vax_Float type literal, since the front end
5113 is supposed to transform these using appropriate conversions. */
5114 else if (Vax_Float (Underlying_Type (Etype (gnat_node))))
5115 gcc_unreachable ();
5116
5117 else
5118 {
5119 Ureal ur_realval = Realval (gnat_node);
5120
5121 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5122
5123 /* If the real value is zero, so is the result. Otherwise,
5124 convert it to a machine number if it isn't already. That
5125 forces BASE to 0 or 2 and simplifies the rest of our logic. */
5126 if (UR_Is_Zero (ur_realval))
5127 gnu_result = convert (gnu_result_type, integer_zero_node);
5128 else
5129 {
5130 if (!Is_Machine_Number (gnat_node))
5131 ur_realval
5132 = Machine (Base_Type (Underlying_Type (Etype (gnat_node))),
5133 ur_realval, Round_Even, gnat_node);
5134
5135 gnu_result
5136 = UI_To_gnu (Numerator (ur_realval), gnu_result_type);
5137
5138 /* If we have a base of zero, divide by the denominator.
5139 Otherwise, the base must be 2 and we scale the value, which
5140 we know can fit in the mantissa of the type (hence the use
5141 of that type above). */
5142 if (No (Rbase (ur_realval)))
5143 gnu_result
5144 = build_binary_op (RDIV_EXPR,
5145 get_base_type (gnu_result_type),
5146 gnu_result,
5147 UI_To_gnu (Denominator (ur_realval),
5148 gnu_result_type));
5149 else
5150 {
5151 REAL_VALUE_TYPE tmp;
5152
5153 gcc_assert (Rbase (ur_realval) == 2);
5154 real_ldexp (&tmp, &TREE_REAL_CST (gnu_result),
5155 - UI_To_Int (Denominator (ur_realval)));
5156 gnu_result = build_real (gnu_result_type, tmp);
5157 }
5158 }
5159
5160 /* Now see if we need to negate the result. Do it this way to
5161 properly handle -0. */
5162 if (UR_Is_Negative (Realval (gnat_node)))
5163 gnu_result
5164 = build_unary_op (NEGATE_EXPR, get_base_type (gnu_result_type),
5165 gnu_result);
5166 }
5167
5168 break;
5169
5170 case N_String_Literal:
5171 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5172 if (TYPE_PRECISION (TREE_TYPE (gnu_result_type)) == HOST_BITS_PER_CHAR)
5173 {
5174 String_Id gnat_string = Strval (gnat_node);
5175 int length = String_Length (gnat_string);
5176 int i;
5177 char *string;
5178 if (length >= ALLOCA_THRESHOLD)
5179 string = XNEWVEC (char, length + 1);
5180 else
5181 string = (char *) alloca (length + 1);
5182
5183 /* Build the string with the characters in the literal. Note
5184 that Ada strings are 1-origin. */
5185 for (i = 0; i < length; i++)
5186 string[i] = Get_String_Char (gnat_string, i + 1);
5187
5188 /* Put a null at the end of the string in case it's in a context
5189 where GCC will want to treat it as a C string. */
5190 string[i] = 0;
5191
5192 gnu_result = build_string (length, string);
5193
5194 /* Strings in GCC don't normally have types, but we want
5195 this to not be converted to the array type. */
5196 TREE_TYPE (gnu_result) = gnu_result_type;
5197
5198 if (length >= ALLOCA_THRESHOLD)
5199 free (string);
5200 }
5201 else
5202 {
5203 /* Build a list consisting of each character, then make
5204 the aggregate. */
5205 String_Id gnat_string = Strval (gnat_node);
5206 int length = String_Length (gnat_string);
5207 int i;
5208 tree gnu_idx = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
5209 VEC(constructor_elt,gc) *gnu_vec
5210 = VEC_alloc (constructor_elt, gc, length);
5211
5212 for (i = 0; i < length; i++)
5213 {
5214 tree t = build_int_cst (TREE_TYPE (gnu_result_type),
5215 Get_String_Char (gnat_string, i + 1));
5216
5217 CONSTRUCTOR_APPEND_ELT (gnu_vec, gnu_idx, t);
5218 gnu_idx = int_const_binop (PLUS_EXPR, gnu_idx, integer_one_node);
5219 }
5220
5221 gnu_result = gnat_build_constructor (gnu_result_type, gnu_vec);
5222 }
5223 break;
5224
5225 case N_Pragma:
5226 gnu_result = Pragma_to_gnu (gnat_node);
5227 break;
5228
5229 /**************************************/
5230 /* Chapter 3: Declarations and Types */
5231 /**************************************/
5232
5233 case N_Subtype_Declaration:
5234 case N_Full_Type_Declaration:
5235 case N_Incomplete_Type_Declaration:
5236 case N_Private_Type_Declaration:
5237 case N_Private_Extension_Declaration:
5238 case N_Task_Type_Declaration:
5239 process_type (Defining_Entity (gnat_node));
5240 gnu_result = alloc_stmt_list ();
5241 break;
5242
5243 case N_Object_Declaration:
5244 case N_Exception_Declaration:
5245 gnat_temp = Defining_Entity (gnat_node);
5246 gnu_result = alloc_stmt_list ();
5247
5248 /* If we are just annotating types and this object has an unconstrained
5249 or task type, don't elaborate it. */
5250 if (type_annotate_only
5251 && (((Is_Array_Type (Etype (gnat_temp))
5252 || Is_Record_Type (Etype (gnat_temp)))
5253 && !Is_Constrained (Etype (gnat_temp)))
5254 || Is_Concurrent_Type (Etype (gnat_temp))))
5255 break;
5256
5257 if (Present (Expression (gnat_node))
5258 && !(kind == N_Object_Declaration && No_Initialization (gnat_node))
5259 && (!type_annotate_only
5260 || Compile_Time_Known_Value (Expression (gnat_node))))
5261 {
5262 gnu_expr = gnat_to_gnu (Expression (gnat_node));
5263 if (Do_Range_Check (Expression (gnat_node)))
5264 gnu_expr
5265 = emit_range_check (gnu_expr, Etype (gnat_temp), gnat_node);
5266
5267 /* If this object has its elaboration delayed, we must force
5268 evaluation of GNU_EXPR right now and save it for when the object
5269 is frozen. */
5270 if (Present (Freeze_Node (gnat_temp)))
5271 {
5272 if (TREE_CONSTANT (gnu_expr))
5273 ;
5274 else if (global_bindings_p ())
5275 gnu_expr
5276 = create_var_decl (create_concat_name (gnat_temp, "init"),
5277 NULL_TREE, TREE_TYPE (gnu_expr), gnu_expr,
5278 false, false, false, false,
5279 NULL, gnat_temp);
5280 else
5281 gnu_expr = gnat_save_expr (gnu_expr);
5282
5283 save_gnu_tree (gnat_node, gnu_expr, true);
5284 }
5285 }
5286 else
5287 gnu_expr = NULL_TREE;
5288
5289 if (type_annotate_only && gnu_expr && TREE_CODE (gnu_expr) == ERROR_MARK)
5290 gnu_expr = NULL_TREE;
5291
5292 /* If this is a deferred constant with an address clause, we ignore the
5293 full view since the clause is on the partial view and we cannot have
5294 2 different GCC trees for the object. The only bits of the full view
5295 we will use is the initializer, but it will be directly fetched. */
5296 if (Ekind(gnat_temp) == E_Constant
5297 && Present (Address_Clause (gnat_temp))
5298 && Present (Full_View (gnat_temp)))
5299 save_gnu_tree (Full_View (gnat_temp), error_mark_node, true);
5300
5301 if (No (Freeze_Node (gnat_temp)))
5302 gnat_to_gnu_entity (gnat_temp, gnu_expr, 1);
5303 break;
5304
5305 case N_Object_Renaming_Declaration:
5306 gnat_temp = Defining_Entity (gnat_node);
5307
5308 /* Don't do anything if this renaming is handled by the front end or if
5309 we are just annotating types and this object has a composite or task
5310 type, don't elaborate it. We return the result in case it has any
5311 SAVE_EXPRs in it that need to be evaluated here. */
5312 if (!Is_Renaming_Of_Object (gnat_temp)
5313 && ! (type_annotate_only
5314 && (Is_Array_Type (Etype (gnat_temp))
5315 || Is_Record_Type (Etype (gnat_temp))
5316 || Is_Concurrent_Type (Etype (gnat_temp)))))
5317 gnu_result
5318 = gnat_to_gnu_entity (gnat_temp,
5319 gnat_to_gnu (Renamed_Object (gnat_temp)), 1);
5320 else
5321 gnu_result = alloc_stmt_list ();
5322 break;
5323
5324 case N_Implicit_Label_Declaration:
5325 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
5326 gnu_result = alloc_stmt_list ();
5327 break;
5328
5329 case N_Exception_Renaming_Declaration:
5330 case N_Number_Declaration:
5331 case N_Package_Renaming_Declaration:
5332 case N_Subprogram_Renaming_Declaration:
5333 /* These are fully handled in the front end. */
5334 gnu_result = alloc_stmt_list ();
5335 break;
5336
5337 /*************************************/
5338 /* Chapter 4: Names and Expressions */
5339 /*************************************/
5340
5341 case N_Explicit_Dereference:
5342 gnu_result = gnat_to_gnu (Prefix (gnat_node));
5343 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5344 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
5345
5346 /* If this is an atomic access on the RHS for which synchronization is
5347 required, build the atomic load. */
5348 if (atomic_sync_required_p (gnat_node)
5349 && !present_in_lhs_or_actual_p (gnat_node))
5350 gnu_result = build_atomic_load (gnu_result);
5351 break;
5352
5353 case N_Indexed_Component:
5354 {
5355 tree gnu_array_object = gnat_to_gnu (Prefix (gnat_node));
5356 tree gnu_type;
5357 int ndim;
5358 int i;
5359 Node_Id *gnat_expr_array;
5360
5361 gnu_array_object = maybe_implicit_deref (gnu_array_object);
5362
5363 /* Convert vector inputs to their representative array type, to fit
5364 what the code below expects. */
5365 gnu_array_object = maybe_vector_array (gnu_array_object);
5366
5367 gnu_array_object = maybe_unconstrained_array (gnu_array_object);
5368
5369 /* If we got a padded type, remove it too. */
5370 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_array_object)))
5371 gnu_array_object
5372 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_array_object))),
5373 gnu_array_object);
5374
5375 gnu_result = gnu_array_object;
5376
5377 /* First compute the number of dimensions of the array, then
5378 fill the expression array, the order depending on whether
5379 this is a Convention_Fortran array or not. */
5380 for (ndim = 1, gnu_type = TREE_TYPE (gnu_array_object);
5381 TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
5382 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type));
5383 ndim++, gnu_type = TREE_TYPE (gnu_type))
5384 ;
5385
5386 gnat_expr_array = XALLOCAVEC (Node_Id, ndim);
5387
5388 if (TYPE_CONVENTION_FORTRAN_P (TREE_TYPE (gnu_array_object)))
5389 for (i = ndim - 1, gnat_temp = First (Expressions (gnat_node));
5390 i >= 0;
5391 i--, gnat_temp = Next (gnat_temp))
5392 gnat_expr_array[i] = gnat_temp;
5393 else
5394 for (i = 0, gnat_temp = First (Expressions (gnat_node));
5395 i < ndim;
5396 i++, gnat_temp = Next (gnat_temp))
5397 gnat_expr_array[i] = gnat_temp;
5398
5399 for (i = 0, gnu_type = TREE_TYPE (gnu_array_object);
5400 i < ndim; i++, gnu_type = TREE_TYPE (gnu_type))
5401 {
5402 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
5403 gnat_temp = gnat_expr_array[i];
5404 gnu_expr = gnat_to_gnu (gnat_temp);
5405
5406 if (Do_Range_Check (gnat_temp))
5407 gnu_expr
5408 = emit_index_check
5409 (gnu_array_object, gnu_expr,
5410 TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type))),
5411 TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type))),
5412 gnat_temp);
5413
5414 gnu_result = build_binary_op (ARRAY_REF, NULL_TREE,
5415 gnu_result, gnu_expr);
5416 }
5417
5418 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5419
5420 /* If this is an atomic access on the RHS for which synchronization is
5421 required, build the atomic load. */
5422 if (atomic_sync_required_p (gnat_node)
5423 && !present_in_lhs_or_actual_p (gnat_node))
5424 gnu_result = build_atomic_load (gnu_result);
5425 }
5426 break;
5427
5428 case N_Slice:
5429 {
5430 Node_Id gnat_range_node = Discrete_Range (gnat_node);
5431 tree gnu_type;
5432
5433 gnu_result = gnat_to_gnu (Prefix (gnat_node));
5434 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5435
5436 /* Do any implicit dereferences of the prefix and do any needed
5437 range check. */
5438 gnu_result = maybe_implicit_deref (gnu_result);
5439 gnu_result = maybe_unconstrained_array (gnu_result);
5440 gnu_type = TREE_TYPE (gnu_result);
5441 if (Do_Range_Check (gnat_range_node))
5442 {
5443 /* Get the bounds of the slice. */
5444 tree gnu_index_type
5445 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_result_type));
5446 tree gnu_min_expr = TYPE_MIN_VALUE (gnu_index_type);
5447 tree gnu_max_expr = TYPE_MAX_VALUE (gnu_index_type);
5448 /* Get the permitted bounds. */
5449 tree gnu_base_index_type
5450 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type));
5451 tree gnu_base_min_expr = SUBSTITUTE_PLACEHOLDER_IN_EXPR
5452 (TYPE_MIN_VALUE (gnu_base_index_type), gnu_result);
5453 tree gnu_base_max_expr = SUBSTITUTE_PLACEHOLDER_IN_EXPR
5454 (TYPE_MAX_VALUE (gnu_base_index_type), gnu_result);
5455 tree gnu_expr_l, gnu_expr_h, gnu_expr_type;
5456
5457 gnu_min_expr = gnat_protect_expr (gnu_min_expr);
5458 gnu_max_expr = gnat_protect_expr (gnu_max_expr);
5459
5460 /* Derive a good type to convert everything to. */
5461 gnu_expr_type = get_base_type (gnu_index_type);
5462
5463 /* Test whether the minimum slice value is too small. */
5464 gnu_expr_l = build_binary_op (LT_EXPR, boolean_type_node,
5465 convert (gnu_expr_type,
5466 gnu_min_expr),
5467 convert (gnu_expr_type,
5468 gnu_base_min_expr));
5469
5470 /* Test whether the maximum slice value is too large. */
5471 gnu_expr_h = build_binary_op (GT_EXPR, boolean_type_node,
5472 convert (gnu_expr_type,
5473 gnu_max_expr),
5474 convert (gnu_expr_type,
5475 gnu_base_max_expr));
5476
5477 /* Build a slice index check that returns the low bound,
5478 assuming the slice is not empty. */
5479 gnu_expr = emit_check
5480 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
5481 gnu_expr_l, gnu_expr_h),
5482 gnu_min_expr, CE_Index_Check_Failed, gnat_node);
5483
5484 /* Build a conditional expression that does the index checks and
5485 returns the low bound if the slice is not empty (max >= min),
5486 and returns the naked low bound otherwise (max < min), unless
5487 it is non-constant and the high bound is; this prevents VRP
5488 from inferring bogus ranges on the unlikely path. */
5489 gnu_expr = fold_build3 (COND_EXPR, gnu_expr_type,
5490 build_binary_op (GE_EXPR, gnu_expr_type,
5491 convert (gnu_expr_type,
5492 gnu_max_expr),
5493 convert (gnu_expr_type,
5494 gnu_min_expr)),
5495 gnu_expr,
5496 TREE_CODE (gnu_min_expr) != INTEGER_CST
5497 && TREE_CODE (gnu_max_expr) == INTEGER_CST
5498 ? gnu_max_expr : gnu_min_expr);
5499 }
5500 else
5501 /* Simply return the naked low bound. */
5502 gnu_expr = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
5503
5504 /* If this is a slice with non-constant size of an array with constant
5505 size, set the maximum size for the allocation of temporaries. */
5506 if (!TREE_CONSTANT (TYPE_SIZE_UNIT (gnu_result_type))
5507 && TREE_CONSTANT (TYPE_SIZE_UNIT (gnu_type)))
5508 TYPE_ARRAY_MAX_SIZE (gnu_result_type) = TYPE_SIZE_UNIT (gnu_type);
5509
5510 gnu_result = build_binary_op (ARRAY_RANGE_REF, gnu_result_type,
5511 gnu_result, gnu_expr);
5512 }
5513 break;
5514
5515 case N_Selected_Component:
5516 {
5517 tree gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
5518 Entity_Id gnat_field = Entity (Selector_Name (gnat_node));
5519 Entity_Id gnat_pref_type = Etype (Prefix (gnat_node));
5520 tree gnu_field;
5521
5522 while (IN (Ekind (gnat_pref_type), Incomplete_Or_Private_Kind)
5523 || IN (Ekind (gnat_pref_type), Access_Kind))
5524 {
5525 if (IN (Ekind (gnat_pref_type), Incomplete_Or_Private_Kind))
5526 gnat_pref_type = Underlying_Type (gnat_pref_type);
5527 else if (IN (Ekind (gnat_pref_type), Access_Kind))
5528 gnat_pref_type = Designated_Type (gnat_pref_type);
5529 }
5530
5531 gnu_prefix = maybe_implicit_deref (gnu_prefix);
5532
5533 /* For discriminant references in tagged types always substitute the
5534 corresponding discriminant as the actual selected component. */
5535 if (Is_Tagged_Type (gnat_pref_type))
5536 while (Present (Corresponding_Discriminant (gnat_field)))
5537 gnat_field = Corresponding_Discriminant (gnat_field);
5538
5539 /* For discriminant references of untagged types always substitute the
5540 corresponding stored discriminant. */
5541 else if (Present (Corresponding_Discriminant (gnat_field)))
5542 gnat_field = Original_Record_Component (gnat_field);
5543
5544 /* Handle extracting the real or imaginary part of a complex.
5545 The real part is the first field and the imaginary the last. */
5546 if (TREE_CODE (TREE_TYPE (gnu_prefix)) == COMPLEX_TYPE)
5547 gnu_result = build_unary_op (Present (Next_Entity (gnat_field))
5548 ? REALPART_EXPR : IMAGPART_EXPR,
5549 NULL_TREE, gnu_prefix);
5550 else
5551 {
5552 gnu_field = gnat_to_gnu_field_decl (gnat_field);
5553
5554 /* If there are discriminants, the prefix might be evaluated more
5555 than once, which is a problem if it has side-effects. */
5556 if (Has_Discriminants (Is_Access_Type (Etype (Prefix (gnat_node)))
5557 ? Designated_Type (Etype
5558 (Prefix (gnat_node)))
5559 : Etype (Prefix (gnat_node))))
5560 gnu_prefix = gnat_stabilize_reference (gnu_prefix, false, NULL);
5561
5562 gnu_result
5563 = build_component_ref (gnu_prefix, NULL_TREE, gnu_field,
5564 (Nkind (Parent (gnat_node))
5565 == N_Attribute_Reference)
5566 && lvalue_required_for_attribute_p
5567 (Parent (gnat_node)));
5568 }
5569
5570 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5571
5572 /* If this is an atomic access on the RHS for which synchronization is
5573 required, build the atomic load. */
5574 if (atomic_sync_required_p (gnat_node)
5575 && !present_in_lhs_or_actual_p (gnat_node))
5576 gnu_result = build_atomic_load (gnu_result);
5577 }
5578 break;
5579
5580 case N_Attribute_Reference:
5581 {
5582 /* The attribute designator. */
5583 const int attr = Get_Attribute_Id (Attribute_Name (gnat_node));
5584
5585 /* The Elab_Spec and Elab_Body attributes are special in that Prefix
5586 is a unit, not an object with a GCC equivalent. */
5587 if (attr == Attr_Elab_Spec || attr == Attr_Elab_Body)
5588 return
5589 create_subprog_decl (create_concat_name
5590 (Entity (Prefix (gnat_node)),
5591 attr == Attr_Elab_Body ? "elabb" : "elabs"),
5592 NULL_TREE, void_ftype, NULL_TREE, false,
5593 true, true, true, NULL, gnat_node);
5594
5595 gnu_result = Attribute_to_gnu (gnat_node, &gnu_result_type, attr);
5596 }
5597 break;
5598
5599 case N_Reference:
5600 /* Like 'Access as far as we are concerned. */
5601 gnu_result = gnat_to_gnu (Prefix (gnat_node));
5602 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_result);
5603 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5604 break;
5605
5606 case N_Aggregate:
5607 case N_Extension_Aggregate:
5608 {
5609 tree gnu_aggr_type;
5610
5611 /* ??? It is wrong to evaluate the type now, but there doesn't
5612 seem to be any other practical way of doing it. */
5613
5614 gcc_assert (!Expansion_Delayed (gnat_node));
5615
5616 gnu_aggr_type = gnu_result_type
5617 = get_unpadded_type (Etype (gnat_node));
5618
5619 if (TREE_CODE (gnu_result_type) == RECORD_TYPE
5620 && TYPE_CONTAINS_TEMPLATE_P (gnu_result_type))
5621 gnu_aggr_type
5622 = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (gnu_result_type)));
5623 else if (TREE_CODE (gnu_result_type) == VECTOR_TYPE)
5624 gnu_aggr_type = TYPE_REPRESENTATIVE_ARRAY (gnu_result_type);
5625
5626 if (Null_Record_Present (gnat_node))
5627 gnu_result = gnat_build_constructor (gnu_aggr_type, NULL);
5628
5629 else if (TREE_CODE (gnu_aggr_type) == RECORD_TYPE
5630 || TREE_CODE (gnu_aggr_type) == UNION_TYPE)
5631 gnu_result
5632 = assoc_to_constructor (Etype (gnat_node),
5633 First (Component_Associations (gnat_node)),
5634 gnu_aggr_type);
5635 else if (TREE_CODE (gnu_aggr_type) == ARRAY_TYPE)
5636 gnu_result = pos_to_constructor (First (Expressions (gnat_node)),
5637 gnu_aggr_type,
5638 Component_Type (Etype (gnat_node)));
5639 else if (TREE_CODE (gnu_aggr_type) == COMPLEX_TYPE)
5640 gnu_result
5641 = build_binary_op
5642 (COMPLEX_EXPR, gnu_aggr_type,
5643 gnat_to_gnu (Expression (First
5644 (Component_Associations (gnat_node)))),
5645 gnat_to_gnu (Expression
5646 (Next
5647 (First (Component_Associations (gnat_node))))));
5648 else
5649 gcc_unreachable ();
5650
5651 gnu_result = convert (gnu_result_type, gnu_result);
5652 }
5653 break;
5654
5655 case N_Null:
5656 if (TARGET_VTABLE_USES_DESCRIPTORS
5657 && Ekind (Etype (gnat_node)) == E_Access_Subprogram_Type
5658 && Is_Dispatch_Table_Entity (Etype (gnat_node)))
5659 gnu_result = null_fdesc_node;
5660 else
5661 gnu_result = null_pointer_node;
5662 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5663 break;
5664
5665 case N_Type_Conversion:
5666 case N_Qualified_Expression:
5667 /* Get the operand expression. */
5668 gnu_result = gnat_to_gnu (Expression (gnat_node));
5669 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5670
5671 /* If this is a qualified expression for a tagged type, we mark the type
5672 as used. Because of polymorphism, this might be the only reference to
5673 the tagged type in the program while objects have it as dynamic type.
5674 The debugger needs to see it to display these objects properly. */
5675 if (kind == N_Qualified_Expression && Is_Tagged_Type (Etype (gnat_node)))
5676 used_types_insert (gnu_result_type);
5677
5678 gnu_result
5679 = convert_with_check (Etype (gnat_node), gnu_result,
5680 Do_Overflow_Check (gnat_node),
5681 Do_Range_Check (Expression (gnat_node)),
5682 kind == N_Type_Conversion
5683 && Float_Truncate (gnat_node), gnat_node);
5684 break;
5685
5686 case N_Unchecked_Type_Conversion:
5687 gnu_result = gnat_to_gnu (Expression (gnat_node));
5688
5689 /* Skip further processing if the conversion is deemed a no-op. */
5690 if (unchecked_conversion_nop (gnat_node))
5691 {
5692 gnu_result_type = TREE_TYPE (gnu_result);
5693 break;
5694 }
5695
5696 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5697
5698 /* If the result is a pointer type, see if we are improperly
5699 converting to a stricter alignment. */
5700 if (STRICT_ALIGNMENT && POINTER_TYPE_P (gnu_result_type)
5701 && IN (Ekind (Etype (gnat_node)), Access_Kind))
5702 {
5703 unsigned int align = known_alignment (gnu_result);
5704 tree gnu_obj_type = TREE_TYPE (gnu_result_type);
5705 unsigned int oalign = TYPE_ALIGN (gnu_obj_type);
5706
5707 if (align != 0 && align < oalign && !TYPE_ALIGN_OK (gnu_obj_type))
5708 post_error_ne_tree_2
5709 ("?source alignment (^) '< alignment of & (^)",
5710 gnat_node, Designated_Type (Etype (gnat_node)),
5711 size_int (align / BITS_PER_UNIT), oalign / BITS_PER_UNIT);
5712 }
5713
5714 /* If we are converting a descriptor to a function pointer, first
5715 build the pointer. */
5716 if (TARGET_VTABLE_USES_DESCRIPTORS
5717 && TREE_TYPE (gnu_result) == fdesc_type_node
5718 && POINTER_TYPE_P (gnu_result_type))
5719 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_result);
5720
5721 gnu_result = unchecked_convert (gnu_result_type, gnu_result,
5722 No_Truncation (gnat_node));
5723 break;
5724
5725 case N_In:
5726 case N_Not_In:
5727 {
5728 tree gnu_obj = gnat_to_gnu (Left_Opnd (gnat_node));
5729 Node_Id gnat_range = Right_Opnd (gnat_node);
5730 tree gnu_low, gnu_high;
5731
5732 /* GNAT_RANGE is either an N_Range node or an identifier denoting a
5733 subtype. */
5734 if (Nkind (gnat_range) == N_Range)
5735 {
5736 gnu_low = gnat_to_gnu (Low_Bound (gnat_range));
5737 gnu_high = gnat_to_gnu (High_Bound (gnat_range));
5738 }
5739 else if (Nkind (gnat_range) == N_Identifier
5740 || Nkind (gnat_range) == N_Expanded_Name)
5741 {
5742 tree gnu_range_type = get_unpadded_type (Entity (gnat_range));
5743
5744 gnu_low = TYPE_MIN_VALUE (gnu_range_type);
5745 gnu_high = TYPE_MAX_VALUE (gnu_range_type);
5746 }
5747 else
5748 gcc_unreachable ();
5749
5750 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5751
5752 /* If LOW and HIGH are identical, perform an equality test. Otherwise,
5753 ensure that GNU_OBJ is evaluated only once and perform a full range
5754 test. */
5755 if (operand_equal_p (gnu_low, gnu_high, 0))
5756 gnu_result
5757 = build_binary_op (EQ_EXPR, gnu_result_type, gnu_obj, gnu_low);
5758 else
5759 {
5760 tree t1, t2;
5761 gnu_obj = gnat_protect_expr (gnu_obj);
5762 t1 = build_binary_op (GE_EXPR, gnu_result_type, gnu_obj, gnu_low);
5763 if (EXPR_P (t1))
5764 set_expr_location_from_node (t1, gnat_node);
5765 t2 = build_binary_op (LE_EXPR, gnu_result_type, gnu_obj, gnu_high);
5766 if (EXPR_P (t2))
5767 set_expr_location_from_node (t2, gnat_node);
5768 gnu_result
5769 = build_binary_op (TRUTH_ANDIF_EXPR, gnu_result_type, t1, t2);
5770 }
5771
5772 if (kind == N_Not_In)
5773 gnu_result
5774 = invert_truthvalue_loc (EXPR_LOCATION (gnu_result), gnu_result);
5775 }
5776 break;
5777
5778 case N_Op_Divide:
5779 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
5780 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
5781 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5782 gnu_result = build_binary_op (FLOAT_TYPE_P (gnu_result_type)
5783 ? RDIV_EXPR
5784 : (Rounded_Result (gnat_node)
5785 ? ROUND_DIV_EXPR : TRUNC_DIV_EXPR),
5786 gnu_result_type, gnu_lhs, gnu_rhs);
5787 break;
5788
5789 case N_Op_Or: case N_Op_And: case N_Op_Xor:
5790 /* These can either be operations on booleans or on modular types.
5791 Fall through for boolean types since that's the way GNU_CODES is
5792 set up. */
5793 if (IN (Ekind (Underlying_Type (Etype (gnat_node))),
5794 Modular_Integer_Kind))
5795 {
5796 enum tree_code code
5797 = (kind == N_Op_Or ? BIT_IOR_EXPR
5798 : kind == N_Op_And ? BIT_AND_EXPR
5799 : BIT_XOR_EXPR);
5800
5801 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
5802 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
5803 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5804 gnu_result = build_binary_op (code, gnu_result_type,
5805 gnu_lhs, gnu_rhs);
5806 break;
5807 }
5808
5809 /* ... fall through ... */
5810
5811 case N_Op_Eq: case N_Op_Ne: case N_Op_Lt:
5812 case N_Op_Le: case N_Op_Gt: case N_Op_Ge:
5813 case N_Op_Add: case N_Op_Subtract: case N_Op_Multiply:
5814 case N_Op_Mod: case N_Op_Rem:
5815 case N_Op_Rotate_Left:
5816 case N_Op_Rotate_Right:
5817 case N_Op_Shift_Left:
5818 case N_Op_Shift_Right:
5819 case N_Op_Shift_Right_Arithmetic:
5820 case N_And_Then: case N_Or_Else:
5821 {
5822 enum tree_code code = gnu_codes[kind];
5823 bool ignore_lhs_overflow = false;
5824 location_t saved_location = input_location;
5825 tree gnu_type;
5826
5827 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
5828 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
5829 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
5830
5831 /* Pending generic support for efficient vector logical operations in
5832 GCC, convert vectors to their representative array type view and
5833 fallthrough. */
5834 gnu_lhs = maybe_vector_array (gnu_lhs);
5835 gnu_rhs = maybe_vector_array (gnu_rhs);
5836
5837 /* If this is a comparison operator, convert any references to
5838 an unconstrained array value into a reference to the
5839 actual array. */
5840 if (TREE_CODE_CLASS (code) == tcc_comparison)
5841 {
5842 gnu_lhs = maybe_unconstrained_array (gnu_lhs);
5843 gnu_rhs = maybe_unconstrained_array (gnu_rhs);
5844 }
5845
5846 /* If the result type is a private type, its full view may be a
5847 numeric subtype. The representation we need is that of its base
5848 type, given that it is the result of an arithmetic operation. */
5849 else if (Is_Private_Type (Etype (gnat_node)))
5850 gnu_type = gnu_result_type
5851 = get_unpadded_type (Base_Type (Full_View (Etype (gnat_node))));
5852
5853 /* If this is a shift whose count is not guaranteed to be correct,
5854 we need to adjust the shift count. */
5855 if (IN (kind, N_Op_Shift) && !Shift_Count_OK (gnat_node))
5856 {
5857 tree gnu_count_type = get_base_type (TREE_TYPE (gnu_rhs));
5858 tree gnu_max_shift
5859 = convert (gnu_count_type, TYPE_SIZE (gnu_type));
5860
5861 if (kind == N_Op_Rotate_Left || kind == N_Op_Rotate_Right)
5862 gnu_rhs = build_binary_op (TRUNC_MOD_EXPR, gnu_count_type,
5863 gnu_rhs, gnu_max_shift);
5864 else if (kind == N_Op_Shift_Right_Arithmetic)
5865 gnu_rhs
5866 = build_binary_op
5867 (MIN_EXPR, gnu_count_type,
5868 build_binary_op (MINUS_EXPR,
5869 gnu_count_type,
5870 gnu_max_shift,
5871 convert (gnu_count_type,
5872 integer_one_node)),
5873 gnu_rhs);
5874 }
5875
5876 /* For right shifts, the type says what kind of shift to do,
5877 so we may need to choose a different type. In this case,
5878 we have to ignore integer overflow lest it propagates all
5879 the way down and causes a CE to be explicitly raised. */
5880 if (kind == N_Op_Shift_Right && !TYPE_UNSIGNED (gnu_type))
5881 {
5882 gnu_type = gnat_unsigned_type (gnu_type);
5883 ignore_lhs_overflow = true;
5884 }
5885 else if (kind == N_Op_Shift_Right_Arithmetic
5886 && TYPE_UNSIGNED (gnu_type))
5887 {
5888 gnu_type = gnat_signed_type (gnu_type);
5889 ignore_lhs_overflow = true;
5890 }
5891
5892 if (gnu_type != gnu_result_type)
5893 {
5894 tree gnu_old_lhs = gnu_lhs;
5895 gnu_lhs = convert (gnu_type, gnu_lhs);
5896 if (TREE_CODE (gnu_lhs) == INTEGER_CST && ignore_lhs_overflow)
5897 TREE_OVERFLOW (gnu_lhs) = TREE_OVERFLOW (gnu_old_lhs);
5898 gnu_rhs = convert (gnu_type, gnu_rhs);
5899 }
5900
5901 /* Instead of expanding overflow checks for addition, subtraction
5902 and multiplication itself, the front end will leave this to
5903 the back end when Backend_Overflow_Checks_On_Target is set.
5904 As the GCC back end itself does not know yet how to properly
5905 do overflow checking, do it here. The goal is to push
5906 the expansions further into the back end over time. */
5907 if (Do_Overflow_Check (gnat_node) && Backend_Overflow_Checks_On_Target
5908 && (kind == N_Op_Add
5909 || kind == N_Op_Subtract
5910 || kind == N_Op_Multiply)
5911 && !TYPE_UNSIGNED (gnu_type)
5912 && !FLOAT_TYPE_P (gnu_type))
5913 gnu_result = build_binary_op_trapv (code, gnu_type,
5914 gnu_lhs, gnu_rhs, gnat_node);
5915 else
5916 {
5917 /* Some operations, e.g. comparisons of arrays, generate complex
5918 trees that need to be annotated while they are being built. */
5919 input_location = saved_location;
5920 gnu_result = build_binary_op (code, gnu_type, gnu_lhs, gnu_rhs);
5921 }
5922
5923 /* If this is a logical shift with the shift count not verified,
5924 we must return zero if it is too large. We cannot compensate
5925 above in this case. */
5926 if ((kind == N_Op_Shift_Left || kind == N_Op_Shift_Right)
5927 && !Shift_Count_OK (gnat_node))
5928 gnu_result
5929 = build_cond_expr
5930 (gnu_type,
5931 build_binary_op (GE_EXPR, boolean_type_node,
5932 gnu_rhs,
5933 convert (TREE_TYPE (gnu_rhs),
5934 TYPE_SIZE (gnu_type))),
5935 convert (gnu_type, integer_zero_node),
5936 gnu_result);
5937 }
5938 break;
5939
5940 case N_Conditional_Expression:
5941 {
5942 tree gnu_cond = gnat_to_gnu (First (Expressions (gnat_node)));
5943 tree gnu_true = gnat_to_gnu (Next (First (Expressions (gnat_node))));
5944 tree gnu_false
5945 = gnat_to_gnu (Next (Next (First (Expressions (gnat_node)))));
5946
5947 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5948 gnu_result
5949 = build_cond_expr (gnu_result_type, gnu_cond, gnu_true, gnu_false);
5950 }
5951 break;
5952
5953 case N_Op_Plus:
5954 gnu_result = gnat_to_gnu (Right_Opnd (gnat_node));
5955 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5956 break;
5957
5958 case N_Op_Not:
5959 /* This case can apply to a boolean or a modular type.
5960 Fall through for a boolean operand since GNU_CODES is set
5961 up to handle this. */
5962 if (Is_Modular_Integer_Type (Etype (gnat_node))
5963 || (Ekind (Etype (gnat_node)) == E_Private_Type
5964 && Is_Modular_Integer_Type (Full_View (Etype (gnat_node)))))
5965 {
5966 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
5967 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5968 gnu_result = build_unary_op (BIT_NOT_EXPR, gnu_result_type,
5969 gnu_expr);
5970 break;
5971 }
5972
5973 /* ... fall through ... */
5974
5975 case N_Op_Minus: case N_Op_Abs:
5976 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
5977
5978 if (Ekind (Etype (gnat_node)) != E_Private_Type)
5979 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5980 else
5981 gnu_result_type = get_unpadded_type (Base_Type
5982 (Full_View (Etype (gnat_node))));
5983
5984 if (Do_Overflow_Check (gnat_node)
5985 && !TYPE_UNSIGNED (gnu_result_type)
5986 && !FLOAT_TYPE_P (gnu_result_type))
5987 gnu_result
5988 = build_unary_op_trapv (gnu_codes[kind],
5989 gnu_result_type, gnu_expr, gnat_node);
5990 else
5991 gnu_result = build_unary_op (gnu_codes[kind],
5992 gnu_result_type, gnu_expr);
5993 break;
5994
5995 case N_Allocator:
5996 {
5997 tree gnu_init = 0;
5998 tree gnu_type;
5999 bool ignore_init_type = false;
6000
6001 gnat_temp = Expression (gnat_node);
6002
6003 /* The Expression operand can either be an N_Identifier or
6004 Expanded_Name, which must represent a type, or a
6005 N_Qualified_Expression, which contains both the object type and an
6006 initial value for the object. */
6007 if (Nkind (gnat_temp) == N_Identifier
6008 || Nkind (gnat_temp) == N_Expanded_Name)
6009 gnu_type = gnat_to_gnu_type (Entity (gnat_temp));
6010 else if (Nkind (gnat_temp) == N_Qualified_Expression)
6011 {
6012 Entity_Id gnat_desig_type
6013 = Designated_Type (Underlying_Type (Etype (gnat_node)));
6014
6015 ignore_init_type = Has_Constrained_Partial_View (gnat_desig_type);
6016 gnu_init = gnat_to_gnu (Expression (gnat_temp));
6017
6018 gnu_init = maybe_unconstrained_array (gnu_init);
6019 if (Do_Range_Check (Expression (gnat_temp)))
6020 gnu_init
6021 = emit_range_check (gnu_init, gnat_desig_type, gnat_temp);
6022
6023 if (Is_Elementary_Type (gnat_desig_type)
6024 || Is_Constrained (gnat_desig_type))
6025 gnu_type = gnat_to_gnu_type (gnat_desig_type);
6026 else
6027 {
6028 gnu_type = gnat_to_gnu_type (Etype (Expression (gnat_temp)));
6029 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
6030 gnu_type = TREE_TYPE (gnu_init);
6031 }
6032
6033 /* See the N_Qualified_Expression case for the rationale. */
6034 if (Is_Tagged_Type (gnat_desig_type))
6035 used_types_insert (gnu_type);
6036
6037 gnu_init = convert (gnu_type, gnu_init);
6038 }
6039 else
6040 gcc_unreachable ();
6041
6042 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6043 return build_allocator (gnu_type, gnu_init, gnu_result_type,
6044 Procedure_To_Call (gnat_node),
6045 Storage_Pool (gnat_node), gnat_node,
6046 ignore_init_type);
6047 }
6048 break;
6049
6050 /**************************/
6051 /* Chapter 5: Statements */
6052 /**************************/
6053
6054 case N_Label:
6055 gnu_result = build1 (LABEL_EXPR, void_type_node,
6056 gnat_to_gnu (Identifier (gnat_node)));
6057 break;
6058
6059 case N_Null_Statement:
6060 /* When not optimizing, turn null statements from source into gotos to
6061 the next statement that the middle-end knows how to preserve. */
6062 if (!optimize && Comes_From_Source (gnat_node))
6063 {
6064 tree stmt, label = create_label_decl (NULL_TREE, gnat_node);
6065 DECL_IGNORED_P (label) = 1;
6066 start_stmt_group ();
6067 stmt = build1 (GOTO_EXPR, void_type_node, label);
6068 set_expr_location_from_node (stmt, gnat_node);
6069 add_stmt (stmt);
6070 stmt = build1 (LABEL_EXPR, void_type_node, label);
6071 set_expr_location_from_node (stmt, gnat_node);
6072 add_stmt (stmt);
6073 gnu_result = end_stmt_group ();
6074 }
6075 else
6076 gnu_result = alloc_stmt_list ();
6077 break;
6078
6079 case N_Assignment_Statement:
6080 /* Get the LHS and RHS of the statement and convert any reference to an
6081 unconstrained array into a reference to the underlying array. */
6082 gnu_lhs = maybe_unconstrained_array (gnat_to_gnu (Name (gnat_node)));
6083
6084 /* If the type has a size that overflows, convert this into raise of
6085 Storage_Error: execution shouldn't have gotten here anyway. */
6086 if (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))) == INTEGER_CST
6087 && TREE_OVERFLOW (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))))
6088 gnu_result = build_call_raise (SE_Object_Too_Large, gnat_node,
6089 N_Raise_Storage_Error);
6090 else if (Nkind (Expression (gnat_node)) == N_Function_Call)
6091 gnu_result
6092 = Call_to_gnu (Expression (gnat_node), &gnu_result_type, gnu_lhs,
6093 atomic_sync_required_p (Name (gnat_node)));
6094 else
6095 {
6096 gnu_rhs
6097 = maybe_unconstrained_array (gnat_to_gnu (Expression (gnat_node)));
6098
6099 /* If range check is needed, emit code to generate it. */
6100 if (Do_Range_Check (Expression (gnat_node)))
6101 gnu_rhs = emit_range_check (gnu_rhs, Etype (Name (gnat_node)),
6102 gnat_node);
6103
6104 if (atomic_sync_required_p (Name (gnat_node)))
6105 gnu_result = build_atomic_store (gnu_lhs, gnu_rhs);
6106 else
6107 gnu_result
6108 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_lhs, gnu_rhs);
6109
6110 /* If the type being assigned is an array type and the two sides are
6111 not completely disjoint, play safe and use memmove. But don't do
6112 it for a bit-packed array as it might not be byte-aligned. */
6113 if (TREE_CODE (gnu_result) == MODIFY_EXPR
6114 && Is_Array_Type (Etype (Name (gnat_node)))
6115 && !Is_Bit_Packed_Array (Etype (Name (gnat_node)))
6116 && !(Forwards_OK (gnat_node) && Backwards_OK (gnat_node)))
6117 {
6118 tree to, from, size, to_ptr, from_ptr, t;
6119
6120 to = TREE_OPERAND (gnu_result, 0);
6121 from = TREE_OPERAND (gnu_result, 1);
6122
6123 size = TYPE_SIZE_UNIT (TREE_TYPE (from));
6124 size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, from);
6125
6126 to_ptr = build_fold_addr_expr (to);
6127 from_ptr = build_fold_addr_expr (from);
6128
6129 t = builtin_decl_implicit (BUILT_IN_MEMMOVE);
6130 gnu_result = build_call_expr (t, 3, to_ptr, from_ptr, size);
6131 }
6132 }
6133 break;
6134
6135 case N_If_Statement:
6136 {
6137 tree *gnu_else_ptr; /* Point to put next "else if" or "else". */
6138
6139 /* Make the outer COND_EXPR. Avoid non-determinism. */
6140 gnu_result = build3 (COND_EXPR, void_type_node,
6141 gnat_to_gnu (Condition (gnat_node)),
6142 NULL_TREE, NULL_TREE);
6143 COND_EXPR_THEN (gnu_result)
6144 = build_stmt_group (Then_Statements (gnat_node), false);
6145 TREE_SIDE_EFFECTS (gnu_result) = 1;
6146 gnu_else_ptr = &COND_EXPR_ELSE (gnu_result);
6147
6148 /* Now make a COND_EXPR for each of the "else if" parts. Put each
6149 into the previous "else" part and point to where to put any
6150 outer "else". Also avoid non-determinism. */
6151 if (Present (Elsif_Parts (gnat_node)))
6152 for (gnat_temp = First (Elsif_Parts (gnat_node));
6153 Present (gnat_temp); gnat_temp = Next (gnat_temp))
6154 {
6155 gnu_expr = build3 (COND_EXPR, void_type_node,
6156 gnat_to_gnu (Condition (gnat_temp)),
6157 NULL_TREE, NULL_TREE);
6158 COND_EXPR_THEN (gnu_expr)
6159 = build_stmt_group (Then_Statements (gnat_temp), false);
6160 TREE_SIDE_EFFECTS (gnu_expr) = 1;
6161 set_expr_location_from_node (gnu_expr, gnat_temp);
6162 *gnu_else_ptr = gnu_expr;
6163 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
6164 }
6165
6166 *gnu_else_ptr = build_stmt_group (Else_Statements (gnat_node), false);
6167 }
6168 break;
6169
6170 case N_Case_Statement:
6171 gnu_result = Case_Statement_to_gnu (gnat_node);
6172 break;
6173
6174 case N_Loop_Statement:
6175 gnu_result = Loop_Statement_to_gnu (gnat_node);
6176 break;
6177
6178 case N_Block_Statement:
6179 start_stmt_group ();
6180 gnat_pushlevel ();
6181 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
6182 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
6183 gnat_poplevel ();
6184 gnu_result = end_stmt_group ();
6185 break;
6186
6187 case N_Exit_Statement:
6188 gnu_result
6189 = build2 (EXIT_STMT, void_type_node,
6190 (Present (Condition (gnat_node))
6191 ? gnat_to_gnu (Condition (gnat_node)) : NULL_TREE),
6192 (Present (Name (gnat_node))
6193 ? get_gnu_tree (Entity (Name (gnat_node)))
6194 : VEC_last (loop_info, gnu_loop_stack)->label));
6195 break;
6196
6197 case N_Return_Statement:
6198 {
6199 tree gnu_ret_obj, gnu_ret_val;
6200
6201 /* If the subprogram is a function, we must return the expression. */
6202 if (Present (Expression (gnat_node)))
6203 {
6204 tree gnu_subprog_type = TREE_TYPE (current_function_decl);
6205
6206 /* If this function has copy-in/copy-out parameters, get the real
6207 object for the return. See Subprogram_to_gnu. */
6208 if (TYPE_CI_CO_LIST (gnu_subprog_type))
6209 gnu_ret_obj = VEC_last (tree, gnu_return_var_stack);
6210 else
6211 gnu_ret_obj = DECL_RESULT (current_function_decl);
6212
6213 /* Get the GCC tree for the expression to be returned. */
6214 gnu_ret_val = gnat_to_gnu (Expression (gnat_node));
6215
6216 /* Do not remove the padding from GNU_RET_VAL if the inner type is
6217 self-referential since we want to allocate the fixed size. */
6218 if (TREE_CODE (gnu_ret_val) == COMPONENT_REF
6219 && TYPE_IS_PADDING_P
6220 (TREE_TYPE (TREE_OPERAND (gnu_ret_val, 0)))
6221 && CONTAINS_PLACEHOLDER_P
6222 (TYPE_SIZE (TREE_TYPE (gnu_ret_val))))
6223 gnu_ret_val = TREE_OPERAND (gnu_ret_val, 0);
6224
6225 /* If the function returns by direct reference, return a pointer
6226 to the return value. */
6227 if (TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type)
6228 || By_Ref (gnat_node))
6229 gnu_ret_val = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_ret_val);
6230
6231 /* Otherwise, if it returns an unconstrained array, we have to
6232 allocate a new version of the result and return it. */
6233 else if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type))
6234 {
6235 gnu_ret_val = maybe_unconstrained_array (gnu_ret_val);
6236
6237 /* And find out whether this is a candidate for Named Return
6238 Value. If so, record it. */
6239 if (!TYPE_CI_CO_LIST (gnu_subprog_type) && optimize)
6240 {
6241 tree ret_val = gnu_ret_val;
6242
6243 /* Strip useless conversions around the return value. */
6244 if (gnat_useless_type_conversion (ret_val))
6245 ret_val = TREE_OPERAND (ret_val, 0);
6246
6247 /* Strip unpadding around the return value. */
6248 if (TREE_CODE (ret_val) == COMPONENT_REF
6249 && TYPE_IS_PADDING_P
6250 (TREE_TYPE (TREE_OPERAND (ret_val, 0))))
6251 ret_val = TREE_OPERAND (ret_val, 0);
6252
6253 /* Now apply the test to the return value. */
6254 if (return_value_ok_for_nrv_p (NULL_TREE, ret_val))
6255 {
6256 if (!f_named_ret_val)
6257 f_named_ret_val = BITMAP_GGC_ALLOC ();
6258 bitmap_set_bit (f_named_ret_val, DECL_UID (ret_val));
6259 if (!f_gnat_ret)
6260 f_gnat_ret = gnat_node;
6261 }
6262 }
6263
6264 gnu_ret_val = build_allocator (TREE_TYPE (gnu_ret_val),
6265 gnu_ret_val,
6266 TREE_TYPE (gnu_ret_obj),
6267 Procedure_To_Call (gnat_node),
6268 Storage_Pool (gnat_node),
6269 gnat_node, false);
6270 }
6271
6272 /* Otherwise, if it returns by invisible reference, dereference
6273 the pointer it is passed using the type of the return value
6274 and build the copy operation manually. This ensures that we
6275 don't copy too much data, for example if the return type is
6276 unconstrained with a maximum size. */
6277 else if (TREE_ADDRESSABLE (gnu_subprog_type))
6278 {
6279 tree gnu_ret_deref
6280 = build_unary_op (INDIRECT_REF, TREE_TYPE (gnu_ret_val),
6281 gnu_ret_obj);
6282 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
6283 gnu_ret_deref, gnu_ret_val);
6284 add_stmt_with_node (gnu_result, gnat_node);
6285 gnu_ret_val = NULL_TREE;
6286 }
6287 }
6288
6289 else
6290 gnu_ret_obj = gnu_ret_val = NULL_TREE;
6291
6292 /* If we have a return label defined, convert this into a branch to
6293 that label. The return proper will be handled elsewhere. */
6294 if (VEC_last (tree, gnu_return_label_stack))
6295 {
6296 if (gnu_ret_obj)
6297 add_stmt (build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_ret_obj,
6298 gnu_ret_val));
6299
6300 gnu_result = build1 (GOTO_EXPR, void_type_node,
6301 VEC_last (tree, gnu_return_label_stack));
6302
6303 /* When not optimizing, make sure the return is preserved. */
6304 if (!optimize && Comes_From_Source (gnat_node))
6305 DECL_ARTIFICIAL (VEC_last (tree, gnu_return_label_stack)) = 0;
6306 }
6307
6308 /* Otherwise, build a regular return. */
6309 else
6310 gnu_result = build_return_expr (gnu_ret_obj, gnu_ret_val);
6311 }
6312 break;
6313
6314 case N_Goto_Statement:
6315 gnu_result
6316 = build1 (GOTO_EXPR, void_type_node, gnat_to_gnu (Name (gnat_node)));
6317 break;
6318
6319 /***************************/
6320 /* Chapter 6: Subprograms */
6321 /***************************/
6322
6323 case N_Subprogram_Declaration:
6324 /* Unless there is a freeze node, declare the subprogram. We consider
6325 this a "definition" even though we're not generating code for
6326 the subprogram because we will be making the corresponding GCC
6327 node here. */
6328
6329 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node)))))
6330 gnat_to_gnu_entity (Defining_Entity (Specification (gnat_node)),
6331 NULL_TREE, 1);
6332 gnu_result = alloc_stmt_list ();
6333 break;
6334
6335 case N_Abstract_Subprogram_Declaration:
6336 /* This subprogram doesn't exist for code generation purposes, but we
6337 have to elaborate the types of any parameters and result, unless
6338 they are imported types (nothing to generate in this case).
6339
6340 The parameter list may contain types with freeze nodes, e.g. not null
6341 subtypes, so the subprogram itself may carry a freeze node, in which
6342 case its elaboration must be deferred. */
6343
6344 /* Process the parameter types first. */
6345 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node)))))
6346 for (gnat_temp
6347 = First_Formal_With_Extras
6348 (Defining_Entity (Specification (gnat_node)));
6349 Present (gnat_temp);
6350 gnat_temp = Next_Formal_With_Extras (gnat_temp))
6351 if (Is_Itype (Etype (gnat_temp))
6352 && !From_With_Type (Etype (gnat_temp)))
6353 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
6354
6355 /* Then the result type, set to Standard_Void_Type for procedures. */
6356 {
6357 Entity_Id gnat_temp_type
6358 = Etype (Defining_Entity (Specification (gnat_node)));
6359
6360 if (Is_Itype (gnat_temp_type) && !From_With_Type (gnat_temp_type))
6361 gnat_to_gnu_entity (Etype (gnat_temp_type), NULL_TREE, 0);
6362 }
6363
6364 gnu_result = alloc_stmt_list ();
6365 break;
6366
6367 case N_Defining_Program_Unit_Name:
6368 /* For a child unit identifier go up a level to get the specification.
6369 We get this when we try to find the spec of a child unit package
6370 that is the compilation unit being compiled. */
6371 gnu_result = gnat_to_gnu (Parent (gnat_node));
6372 break;
6373
6374 case N_Subprogram_Body:
6375 Subprogram_Body_to_gnu (gnat_node);
6376 gnu_result = alloc_stmt_list ();
6377 break;
6378
6379 case N_Function_Call:
6380 case N_Procedure_Call_Statement:
6381 gnu_result = Call_to_gnu (gnat_node, &gnu_result_type, NULL_TREE, false);
6382 break;
6383
6384 /************************/
6385 /* Chapter 7: Packages */
6386 /************************/
6387
6388 case N_Package_Declaration:
6389 gnu_result = gnat_to_gnu (Specification (gnat_node));
6390 break;
6391
6392 case N_Package_Specification:
6393
6394 start_stmt_group ();
6395 process_decls (Visible_Declarations (gnat_node),
6396 Private_Declarations (gnat_node), Empty, true, true);
6397 gnu_result = end_stmt_group ();
6398 break;
6399
6400 case N_Package_Body:
6401
6402 /* If this is the body of a generic package - do nothing. */
6403 if (Ekind (Corresponding_Spec (gnat_node)) == E_Generic_Package)
6404 {
6405 gnu_result = alloc_stmt_list ();
6406 break;
6407 }
6408
6409 start_stmt_group ();
6410 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
6411
6412 if (Present (Handled_Statement_Sequence (gnat_node)))
6413 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
6414
6415 gnu_result = end_stmt_group ();
6416 break;
6417
6418 /********************************/
6419 /* Chapter 8: Visibility Rules */
6420 /********************************/
6421
6422 case N_Use_Package_Clause:
6423 case N_Use_Type_Clause:
6424 /* Nothing to do here - but these may appear in list of declarations. */
6425 gnu_result = alloc_stmt_list ();
6426 break;
6427
6428 /*********************/
6429 /* Chapter 9: Tasks */
6430 /*********************/
6431
6432 case N_Protected_Type_Declaration:
6433 gnu_result = alloc_stmt_list ();
6434 break;
6435
6436 case N_Single_Task_Declaration:
6437 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
6438 gnu_result = alloc_stmt_list ();
6439 break;
6440
6441 /*********************************************************/
6442 /* Chapter 10: Program Structure and Compilation Issues */
6443 /*********************************************************/
6444
6445 case N_Compilation_Unit:
6446 /* This is not called for the main unit on which gigi is invoked. */
6447 Compilation_Unit_to_gnu (gnat_node);
6448 gnu_result = alloc_stmt_list ();
6449 break;
6450
6451 case N_Subprogram_Body_Stub:
6452 case N_Package_Body_Stub:
6453 case N_Protected_Body_Stub:
6454 case N_Task_Body_Stub:
6455 /* Simply process whatever unit is being inserted. */
6456 gnu_result = gnat_to_gnu (Unit (Library_Unit (gnat_node)));
6457 break;
6458
6459 case N_Subunit:
6460 gnu_result = gnat_to_gnu (Proper_Body (gnat_node));
6461 break;
6462
6463 /***************************/
6464 /* Chapter 11: Exceptions */
6465 /***************************/
6466
6467 case N_Handled_Sequence_Of_Statements:
6468 /* If there is an At_End procedure attached to this node, and the EH
6469 mechanism is SJLJ, we must have at least a corresponding At_End
6470 handler, unless the No_Exception_Handlers restriction is set. */
6471 gcc_assert (type_annotate_only
6472 || Exception_Mechanism != Setjmp_Longjmp
6473 || No (At_End_Proc (gnat_node))
6474 || Present (Exception_Handlers (gnat_node))
6475 || No_Exception_Handlers_Set ());
6476
6477 gnu_result = Handled_Sequence_Of_Statements_to_gnu (gnat_node);
6478 break;
6479
6480 case N_Exception_Handler:
6481 if (Exception_Mechanism == Setjmp_Longjmp)
6482 gnu_result = Exception_Handler_to_gnu_sjlj (gnat_node);
6483 else if (Exception_Mechanism == Back_End_Exceptions)
6484 gnu_result = Exception_Handler_to_gnu_zcx (gnat_node);
6485 else
6486 gcc_unreachable ();
6487 break;
6488
6489 case N_Raise_Statement:
6490 /* Only for reraise in back-end exceptions mode. */
6491 gcc_assert (No (Name (gnat_node))
6492 && Exception_Mechanism == Back_End_Exceptions);
6493
6494 start_stmt_group ();
6495 gnat_pushlevel ();
6496
6497 /* Clear the current exception pointer so that the occurrence won't be
6498 deallocated. */
6499 gnu_expr = create_var_decl (get_identifier ("SAVED_EXPTR"), NULL_TREE,
6500 ptr_type_node, gnu_incoming_exc_ptr,
6501 false, false, false, false, NULL, gnat_node);
6502
6503 add_stmt (build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_incoming_exc_ptr,
6504 convert (ptr_type_node, integer_zero_node)));
6505 add_stmt (build_call_n_expr (reraise_zcx_decl, 1, gnu_expr));
6506 gnat_poplevel ();
6507 gnu_result = end_stmt_group ();
6508 break;
6509
6510 case N_Push_Constraint_Error_Label:
6511 push_exception_label_stack (&gnu_constraint_error_label_stack,
6512 Exception_Label (gnat_node));
6513 break;
6514
6515 case N_Push_Storage_Error_Label:
6516 push_exception_label_stack (&gnu_storage_error_label_stack,
6517 Exception_Label (gnat_node));
6518 break;
6519
6520 case N_Push_Program_Error_Label:
6521 push_exception_label_stack (&gnu_program_error_label_stack,
6522 Exception_Label (gnat_node));
6523 break;
6524
6525 case N_Pop_Constraint_Error_Label:
6526 VEC_pop (tree, gnu_constraint_error_label_stack);
6527 break;
6528
6529 case N_Pop_Storage_Error_Label:
6530 VEC_pop (tree, gnu_storage_error_label_stack);
6531 break;
6532
6533 case N_Pop_Program_Error_Label:
6534 VEC_pop (tree, gnu_program_error_label_stack);
6535 break;
6536
6537 /******************************/
6538 /* Chapter 12: Generic Units */
6539 /******************************/
6540
6541 case N_Generic_Function_Renaming_Declaration:
6542 case N_Generic_Package_Renaming_Declaration:
6543 case N_Generic_Procedure_Renaming_Declaration:
6544 case N_Generic_Package_Declaration:
6545 case N_Generic_Subprogram_Declaration:
6546 case N_Package_Instantiation:
6547 case N_Procedure_Instantiation:
6548 case N_Function_Instantiation:
6549 /* These nodes can appear on a declaration list but there is nothing to
6550 to be done with them. */
6551 gnu_result = alloc_stmt_list ();
6552 break;
6553
6554 /**************************************************/
6555 /* Chapter 13: Representation Clauses and */
6556 /* Implementation-Dependent Features */
6557 /**************************************************/
6558
6559 case N_Attribute_Definition_Clause:
6560 gnu_result = alloc_stmt_list ();
6561
6562 /* The only one we need to deal with is 'Address since, for the others,
6563 the front-end puts the information elsewhere. */
6564 if (Get_Attribute_Id (Chars (gnat_node)) != Attr_Address)
6565 break;
6566
6567 /* And we only deal with 'Address if the object has a Freeze node. */
6568 gnat_temp = Entity (Name (gnat_node));
6569 if (No (Freeze_Node (gnat_temp)))
6570 break;
6571
6572 /* Get the value to use as the address and save it as the equivalent
6573 for the object. When it is frozen, gnat_to_gnu_entity will do the
6574 right thing. */
6575 save_gnu_tree (gnat_temp, gnat_to_gnu (Expression (gnat_node)), true);
6576 break;
6577
6578 case N_Enumeration_Representation_Clause:
6579 case N_Record_Representation_Clause:
6580 case N_At_Clause:
6581 /* We do nothing with these. SEM puts the information elsewhere. */
6582 gnu_result = alloc_stmt_list ();
6583 break;
6584
6585 case N_Code_Statement:
6586 if (!type_annotate_only)
6587 {
6588 tree gnu_template = gnat_to_gnu (Asm_Template (gnat_node));
6589 tree gnu_inputs = NULL_TREE, gnu_outputs = NULL_TREE;
6590 tree gnu_clobbers = NULL_TREE, tail;
6591 bool allows_mem, allows_reg, fake;
6592 int ninputs, noutputs, i;
6593 const char **oconstraints;
6594 const char *constraint;
6595 char *clobber;
6596
6597 /* First retrieve the 3 operand lists built by the front-end. */
6598 Setup_Asm_Outputs (gnat_node);
6599 while (Present (gnat_temp = Asm_Output_Variable ()))
6600 {
6601 tree gnu_value = gnat_to_gnu (gnat_temp);
6602 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
6603 (Asm_Output_Constraint ()));
6604
6605 gnu_outputs = tree_cons (gnu_constr, gnu_value, gnu_outputs);
6606 Next_Asm_Output ();
6607 }
6608
6609 Setup_Asm_Inputs (gnat_node);
6610 while (Present (gnat_temp = Asm_Input_Value ()))
6611 {
6612 tree gnu_value = gnat_to_gnu (gnat_temp);
6613 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
6614 (Asm_Input_Constraint ()));
6615
6616 gnu_inputs = tree_cons (gnu_constr, gnu_value, gnu_inputs);
6617 Next_Asm_Input ();
6618 }
6619
6620 Clobber_Setup (gnat_node);
6621 while ((clobber = Clobber_Get_Next ()))
6622 gnu_clobbers
6623 = tree_cons (NULL_TREE,
6624 build_string (strlen (clobber) + 1, clobber),
6625 gnu_clobbers);
6626
6627 /* Then perform some standard checking and processing on the
6628 operands. In particular, mark them addressable if needed. */
6629 gnu_outputs = nreverse (gnu_outputs);
6630 noutputs = list_length (gnu_outputs);
6631 gnu_inputs = nreverse (gnu_inputs);
6632 ninputs = list_length (gnu_inputs);
6633 oconstraints = XALLOCAVEC (const char *, noutputs);
6634
6635 for (i = 0, tail = gnu_outputs; tail; ++i, tail = TREE_CHAIN (tail))
6636 {
6637 tree output = TREE_VALUE (tail);
6638 constraint
6639 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
6640 oconstraints[i] = constraint;
6641
6642 if (parse_output_constraint (&constraint, i, ninputs, noutputs,
6643 &allows_mem, &allows_reg, &fake))
6644 {
6645 /* If the operand is going to end up in memory,
6646 mark it addressable. Note that we don't test
6647 allows_mem like in the input case below; this
6648 is modelled on the C front-end. */
6649 if (!allows_reg)
6650 {
6651 output = remove_conversions (output, false);
6652 if (TREE_CODE (output) == CONST_DECL
6653 && DECL_CONST_CORRESPONDING_VAR (output))
6654 output = DECL_CONST_CORRESPONDING_VAR (output);
6655 if (!gnat_mark_addressable (output))
6656 output = error_mark_node;
6657 }
6658 }
6659 else
6660 output = error_mark_node;
6661
6662 TREE_VALUE (tail) = output;
6663 }
6664
6665 for (i = 0, tail = gnu_inputs; tail; ++i, tail = TREE_CHAIN (tail))
6666 {
6667 tree input = TREE_VALUE (tail);
6668 constraint
6669 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
6670
6671 if (parse_input_constraint (&constraint, i, ninputs, noutputs,
6672 0, oconstraints,
6673 &allows_mem, &allows_reg))
6674 {
6675 /* If the operand is going to end up in memory,
6676 mark it addressable. */
6677 if (!allows_reg && allows_mem)
6678 {
6679 input = remove_conversions (input, false);
6680 if (TREE_CODE (input) == CONST_DECL
6681 && DECL_CONST_CORRESPONDING_VAR (input))
6682 input = DECL_CONST_CORRESPONDING_VAR (input);
6683 if (!gnat_mark_addressable (input))
6684 input = error_mark_node;
6685 }
6686 }
6687 else
6688 input = error_mark_node;
6689
6690 TREE_VALUE (tail) = input;
6691 }
6692
6693 gnu_result = build5 (ASM_EXPR, void_type_node,
6694 gnu_template, gnu_outputs,
6695 gnu_inputs, gnu_clobbers, NULL_TREE);
6696 ASM_VOLATILE_P (gnu_result) = Is_Asm_Volatile (gnat_node);
6697 }
6698 else
6699 gnu_result = alloc_stmt_list ();
6700
6701 break;
6702
6703 /****************/
6704 /* Added Nodes */
6705 /****************/
6706
6707 case N_Expression_With_Actions:
6708 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6709 /* This construct doesn't define a scope so we don't wrap the statement
6710 list in a BIND_EXPR; however, we wrap it in a SAVE_EXPR to protect it
6711 from unsharing. */
6712 gnu_result = build_stmt_group (Actions (gnat_node), false);
6713 gnu_result = build1 (SAVE_EXPR, void_type_node, gnu_result);
6714 TREE_SIDE_EFFECTS (gnu_result) = 1;
6715 gnu_expr = gnat_to_gnu (Expression (gnat_node));
6716 gnu_result
6717 = build_compound_expr (TREE_TYPE (gnu_expr), gnu_result, gnu_expr);
6718 break;
6719
6720 case N_Freeze_Entity:
6721 start_stmt_group ();
6722 process_freeze_entity (gnat_node);
6723 process_decls (Actions (gnat_node), Empty, Empty, true, true);
6724 gnu_result = end_stmt_group ();
6725 break;
6726
6727 case N_Itype_Reference:
6728 if (!present_gnu_tree (Itype (gnat_node)))
6729 process_type (Itype (gnat_node));
6730
6731 gnu_result = alloc_stmt_list ();
6732 break;
6733
6734 case N_Free_Statement:
6735 if (!type_annotate_only)
6736 {
6737 tree gnu_ptr = gnat_to_gnu (Expression (gnat_node));
6738 tree gnu_ptr_type = TREE_TYPE (gnu_ptr);
6739 tree gnu_obj_type, gnu_actual_obj_type;
6740
6741 /* If this is a thin pointer, we must first dereference it to create
6742 a fat pointer, then go back below to a thin pointer. The reason
6743 for this is that we need to have a fat pointer someplace in order
6744 to properly compute the size. */
6745 if (TYPE_IS_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
6746 gnu_ptr = build_unary_op (ADDR_EXPR, NULL_TREE,
6747 build_unary_op (INDIRECT_REF, NULL_TREE,
6748 gnu_ptr));
6749
6750 /* If this is a fat pointer, the object must have been allocated with
6751 the template in front of the array. So pass the template address,
6752 and get the total size; do it by converting to a thin pointer. */
6753 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
6754 gnu_ptr
6755 = convert (build_pointer_type
6756 (TYPE_OBJECT_RECORD_TYPE
6757 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
6758 gnu_ptr);
6759
6760 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
6761
6762 /* If this is a thin pointer, the object must have been allocated with
6763 the template in front of the array. So pass the template address,
6764 and get the total size. */
6765 if (TYPE_IS_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
6766 gnu_ptr
6767 = build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (gnu_ptr),
6768 gnu_ptr,
6769 fold_build1 (NEGATE_EXPR, sizetype,
6770 byte_position
6771 (DECL_CHAIN
6772 TYPE_FIELDS ((gnu_obj_type)))));
6773
6774 /* If we have a special dynamic constrained subtype on the node, use
6775 it to compute the size; otherwise, use the designated subtype. */
6776 if (Present (Actual_Designated_Subtype (gnat_node)))
6777 {
6778 gnu_actual_obj_type
6779 = gnat_to_gnu_type (Actual_Designated_Subtype (gnat_node));
6780
6781 if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type))
6782 gnu_actual_obj_type
6783 = build_unc_object_type_from_ptr (gnu_ptr_type,
6784 gnu_actual_obj_type,
6785 get_identifier ("DEALLOC"),
6786 false);
6787 }
6788 else
6789 gnu_actual_obj_type = gnu_obj_type;
6790
6791 gnu_result
6792 = build_call_alloc_dealloc (gnu_ptr,
6793 TYPE_SIZE_UNIT (gnu_actual_obj_type),
6794 gnu_obj_type,
6795 Procedure_To_Call (gnat_node),
6796 Storage_Pool (gnat_node),
6797 gnat_node);
6798 }
6799 break;
6800
6801 case N_Raise_Constraint_Error:
6802 case N_Raise_Program_Error:
6803 case N_Raise_Storage_Error:
6804 if (type_annotate_only)
6805 gnu_result = alloc_stmt_list ();
6806 else
6807 gnu_result = Raise_Error_to_gnu (gnat_node, &gnu_result_type);
6808 break;
6809
6810 case N_Validate_Unchecked_Conversion:
6811 /* The only validation we currently do on an unchecked conversion is
6812 that of aliasing assumptions. */
6813 if (flag_strict_aliasing)
6814 VEC_safe_push (Node_Id, heap, gnat_validate_uc_list, gnat_node);
6815 gnu_result = alloc_stmt_list ();
6816 break;
6817
6818 default:
6819 /* SCIL nodes require no processing for GCC. Other nodes should only
6820 be present when annotating types. */
6821 gcc_assert (IN (kind, N_SCIL_Node) || type_annotate_only);
6822 gnu_result = alloc_stmt_list ();
6823 }
6824
6825 /* If we pushed the processing of the elaboration routine, pop it back. */
6826 if (went_into_elab_proc)
6827 current_function_decl = NULL_TREE;
6828
6829 /* When not optimizing, turn boolean rvalues B into B != false tests
6830 so that the code just below can put the location information of the
6831 reference to B on the inequality operator for better debug info. */
6832 if (!optimize
6833 && TREE_CODE (gnu_result) != INTEGER_CST
6834 && (kind == N_Identifier
6835 || kind == N_Expanded_Name
6836 || kind == N_Explicit_Dereference
6837 || kind == N_Function_Call
6838 || kind == N_Indexed_Component
6839 || kind == N_Selected_Component)
6840 && TREE_CODE (get_base_type (gnu_result_type)) == BOOLEAN_TYPE
6841 && !lvalue_required_p (gnat_node, gnu_result_type, false, false, false))
6842 gnu_result = build_binary_op (NE_EXPR, gnu_result_type,
6843 convert (gnu_result_type, gnu_result),
6844 convert (gnu_result_type,
6845 boolean_false_node));
6846
6847 /* Set the location information on the result. Note that we may have
6848 no result if we tried to build a CALL_EXPR node to a procedure with
6849 no side-effects and optimization is enabled. */
6850 if (gnu_result && EXPR_P (gnu_result))
6851 set_gnu_expr_location_from_node (gnu_result, gnat_node);
6852
6853 /* If we're supposed to return something of void_type, it means we have
6854 something we're elaborating for effect, so just return. */
6855 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
6856 return gnu_result;
6857
6858 /* If the result is a constant that overflowed, raise Constraint_Error. */
6859 if (TREE_CODE (gnu_result) == INTEGER_CST && TREE_OVERFLOW (gnu_result))
6860 {
6861 post_error ("?`Constraint_Error` will be raised at run time", gnat_node);
6862 gnu_result
6863 = build1 (NULL_EXPR, gnu_result_type,
6864 build_call_raise (CE_Overflow_Check_Failed, gnat_node,
6865 N_Raise_Constraint_Error));
6866 }
6867
6868 /* If the result has side-effects and is of an unconstrained type, make a
6869 SAVE_EXPR so that we can be sure it will only be referenced once. But
6870 this is useless for a call to a function that returns an unconstrained
6871 type with default discriminant, as we cannot compute the size of the
6872 actual returned object. We must do this before any conversions. */
6873 if (TREE_SIDE_EFFECTS (gnu_result)
6874 && !(TREE_CODE (gnu_result) == CALL_EXPR
6875 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
6876 && (TREE_CODE (gnu_result_type) == UNCONSTRAINED_ARRAY_TYPE
6877 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))))
6878 gnu_result = gnat_stabilize_reference (gnu_result, false, NULL);
6879
6880 /* Now convert the result to the result type, unless we are in one of the
6881 following cases:
6882
6883 1. If this is the LHS of an assignment or an actual parameter of a
6884 call, return the result almost unmodified since the RHS will have
6885 to be converted to our type in that case, unless the result type
6886 has a simpler size. Likewise if there is just a no-op unchecked
6887 conversion in-between. Similarly, don't convert integral types
6888 that are the operands of an unchecked conversion since we need
6889 to ignore those conversions (for 'Valid).
6890
6891 2. If we have a label (which doesn't have any well-defined type), a
6892 field or an error, return the result almost unmodified. Similarly,
6893 if the two types are record types with the same name, don't convert.
6894 This will be the case when we are converting from a packable version
6895 of a type to its original type and we need those conversions to be
6896 NOPs in order for assignments into these types to work properly.
6897
6898 3. If the type is void or if we have no result, return error_mark_node
6899 to show we have no result.
6900
6901 4. If this a call to a function that returns an unconstrained type with
6902 default discriminant, return the call expression unmodified since we
6903 cannot compute the size of the actual returned object.
6904
6905 5. Finally, if the type of the result is already correct. */
6906
6907 if (Present (Parent (gnat_node))
6908 && (lhs_or_actual_p (gnat_node)
6909 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
6910 && unchecked_conversion_nop (Parent (gnat_node)))
6911 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
6912 && !AGGREGATE_TYPE_P (gnu_result_type)
6913 && !AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))))
6914 && !(TYPE_SIZE (gnu_result_type)
6915 && TYPE_SIZE (TREE_TYPE (gnu_result))
6916 && (AGGREGATE_TYPE_P (gnu_result_type)
6917 == AGGREGATE_TYPE_P (TREE_TYPE (gnu_result)))
6918 && ((TREE_CODE (TYPE_SIZE (gnu_result_type)) == INTEGER_CST
6919 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_result)))
6920 != INTEGER_CST))
6921 || (TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
6922 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))
6923 && (CONTAINS_PLACEHOLDER_P
6924 (TYPE_SIZE (TREE_TYPE (gnu_result))))))
6925 && !(TREE_CODE (gnu_result_type) == RECORD_TYPE
6926 && TYPE_JUSTIFIED_MODULAR_P (gnu_result_type))))
6927 {
6928 /* Remove padding only if the inner object is of self-referential
6929 size: in that case it must be an object of unconstrained type
6930 with a default discriminant and we want to avoid copying too
6931 much data. */
6932 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result))
6933 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS
6934 (TREE_TYPE (gnu_result))))))
6935 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
6936 gnu_result);
6937 }
6938
6939 else if (TREE_CODE (gnu_result) == LABEL_DECL
6940 || TREE_CODE (gnu_result) == FIELD_DECL
6941 || TREE_CODE (gnu_result) == ERROR_MARK
6942 || (TYPE_NAME (gnu_result_type)
6943 == TYPE_NAME (TREE_TYPE (gnu_result))
6944 && TREE_CODE (gnu_result_type) == RECORD_TYPE
6945 && TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE))
6946 {
6947 /* Remove any padding. */
6948 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
6949 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
6950 gnu_result);
6951 }
6952
6953 else if (gnu_result == error_mark_node || gnu_result_type == void_type_node)
6954 gnu_result = error_mark_node;
6955
6956 else if (TREE_CODE (gnu_result) == CALL_EXPR
6957 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_result))
6958 && TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result)))
6959 == gnu_result_type
6960 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type)))
6961 ;
6962
6963 else if (TREE_TYPE (gnu_result) != gnu_result_type)
6964 gnu_result = convert (gnu_result_type, gnu_result);
6965
6966 /* We don't need any NOP_EXPR or NON_LVALUE_EXPR on the result. */
6967 while ((TREE_CODE (gnu_result) == NOP_EXPR
6968 || TREE_CODE (gnu_result) == NON_LVALUE_EXPR)
6969 && TREE_TYPE (TREE_OPERAND (gnu_result, 0)) == TREE_TYPE (gnu_result))
6970 gnu_result = TREE_OPERAND (gnu_result, 0);
6971
6972 return gnu_result;
6973 }
6974 \f
6975 /* Subroutine of above to push the exception label stack. GNU_STACK is
6976 a pointer to the stack to update and GNAT_LABEL, if present, is the
6977 label to push onto the stack. */
6978
6979 static void
6980 push_exception_label_stack (VEC(tree,gc) **gnu_stack, Entity_Id gnat_label)
6981 {
6982 tree gnu_label = (Present (gnat_label)
6983 ? gnat_to_gnu_entity (gnat_label, NULL_TREE, 0)
6984 : NULL_TREE);
6985
6986 VEC_safe_push (tree, gc, *gnu_stack, gnu_label);
6987 }
6988 \f
6989 /* Record the current code position in GNAT_NODE. */
6990
6991 static void
6992 record_code_position (Node_Id gnat_node)
6993 {
6994 tree stmt_stmt = build1 (STMT_STMT, void_type_node, NULL_TREE);
6995
6996 add_stmt_with_node (stmt_stmt, gnat_node);
6997 save_gnu_tree (gnat_node, stmt_stmt, true);
6998 }
6999
7000 /* Insert the code for GNAT_NODE at the position saved for that node. */
7001
7002 static void
7003 insert_code_for (Node_Id gnat_node)
7004 {
7005 STMT_STMT_STMT (get_gnu_tree (gnat_node)) = gnat_to_gnu (gnat_node);
7006 save_gnu_tree (gnat_node, NULL_TREE, true);
7007 }
7008 \f
7009 /* Start a new statement group chained to the previous group. */
7010
7011 void
7012 start_stmt_group (void)
7013 {
7014 struct stmt_group *group = stmt_group_free_list;
7015
7016 /* First see if we can get one from the free list. */
7017 if (group)
7018 stmt_group_free_list = group->previous;
7019 else
7020 group = ggc_alloc_stmt_group ();
7021
7022 group->previous = current_stmt_group;
7023 group->stmt_list = group->block = group->cleanups = NULL_TREE;
7024 current_stmt_group = group;
7025 }
7026
7027 /* Add GNU_STMT to the current statement group. If it is an expression with
7028 no effects, it is ignored. */
7029
7030 void
7031 add_stmt (tree gnu_stmt)
7032 {
7033 append_to_statement_list (gnu_stmt, &current_stmt_group->stmt_list);
7034 }
7035
7036 /* Similar, but the statement is always added, regardless of side-effects. */
7037
7038 void
7039 add_stmt_force (tree gnu_stmt)
7040 {
7041 append_to_statement_list_force (gnu_stmt, &current_stmt_group->stmt_list);
7042 }
7043
7044 /* Like add_stmt, but set the location of GNU_STMT to that of GNAT_NODE. */
7045
7046 void
7047 add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node)
7048 {
7049 if (Present (gnat_node))
7050 set_expr_location_from_node (gnu_stmt, gnat_node);
7051 add_stmt (gnu_stmt);
7052 }
7053
7054 /* Similar, but the statement is always added, regardless of side-effects. */
7055
7056 void
7057 add_stmt_with_node_force (tree gnu_stmt, Node_Id gnat_node)
7058 {
7059 if (Present (gnat_node))
7060 set_expr_location_from_node (gnu_stmt, gnat_node);
7061 add_stmt_force (gnu_stmt);
7062 }
7063
7064 /* Add a declaration statement for GNU_DECL to the current statement group.
7065 Get SLOC from Entity_Id. */
7066
7067 void
7068 add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
7069 {
7070 tree type = TREE_TYPE (gnu_decl);
7071 tree gnu_stmt, gnu_init, t;
7072
7073 /* If this is a variable that Gigi is to ignore, we may have been given
7074 an ERROR_MARK. So test for it. We also might have been given a
7075 reference for a renaming. So only do something for a decl. Also
7076 ignore a TYPE_DECL for an UNCONSTRAINED_ARRAY_TYPE. */
7077 if (!DECL_P (gnu_decl)
7078 || (TREE_CODE (gnu_decl) == TYPE_DECL
7079 && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE))
7080 return;
7081
7082 gnu_stmt = build1 (DECL_EXPR, void_type_node, gnu_decl);
7083
7084 /* If we are external or global, we don't want to output the DECL_EXPR for
7085 this DECL node since we already have evaluated the expressions in the
7086 sizes and positions as globals and doing it again would be wrong. */
7087 if (DECL_EXTERNAL (gnu_decl) || global_bindings_p ())
7088 {
7089 /* Mark everything as used to prevent node sharing with subprograms.
7090 Note that walk_tree knows how to deal with TYPE_DECL, but neither
7091 VAR_DECL nor CONST_DECL. This appears to be somewhat arbitrary. */
7092 MARK_VISITED (gnu_stmt);
7093 if (TREE_CODE (gnu_decl) == VAR_DECL
7094 || TREE_CODE (gnu_decl) == CONST_DECL)
7095 {
7096 MARK_VISITED (DECL_SIZE (gnu_decl));
7097 MARK_VISITED (DECL_SIZE_UNIT (gnu_decl));
7098 MARK_VISITED (DECL_INITIAL (gnu_decl));
7099 }
7100 /* In any case, we have to deal with our own TYPE_ADA_SIZE field. */
7101 else if (TREE_CODE (gnu_decl) == TYPE_DECL
7102 && RECORD_OR_UNION_TYPE_P (type)
7103 && !TYPE_FAT_POINTER_P (type))
7104 MARK_VISITED (TYPE_ADA_SIZE (type));
7105 }
7106 else
7107 add_stmt_with_node (gnu_stmt, gnat_entity);
7108
7109 /* If this is a variable and an initializer is attached to it, it must be
7110 valid for the context. Similar to init_const in create_var_decl_1. */
7111 if (TREE_CODE (gnu_decl) == VAR_DECL
7112 && (gnu_init = DECL_INITIAL (gnu_decl)) != NULL_TREE
7113 && (!gnat_types_compatible_p (type, TREE_TYPE (gnu_init))
7114 || (TREE_STATIC (gnu_decl)
7115 && !initializer_constant_valid_p (gnu_init,
7116 TREE_TYPE (gnu_init)))))
7117 {
7118 /* If GNU_DECL has a padded type, convert it to the unpadded
7119 type so the assignment is done properly. */
7120 if (TYPE_IS_PADDING_P (type))
7121 t = convert (TREE_TYPE (TYPE_FIELDS (type)), gnu_decl);
7122 else
7123 t = gnu_decl;
7124
7125 gnu_stmt = build_binary_op (INIT_EXPR, NULL_TREE, t, gnu_init);
7126
7127 DECL_INITIAL (gnu_decl) = NULL_TREE;
7128 if (TREE_READONLY (gnu_decl))
7129 {
7130 TREE_READONLY (gnu_decl) = 0;
7131 DECL_READONLY_ONCE_ELAB (gnu_decl) = 1;
7132 }
7133
7134 add_stmt_with_node (gnu_stmt, gnat_entity);
7135 }
7136 }
7137
7138 /* Callback for walk_tree to mark the visited trees rooted at *TP. */
7139
7140 static tree
7141 mark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
7142 {
7143 tree t = *tp;
7144
7145 if (TREE_VISITED (t))
7146 *walk_subtrees = 0;
7147
7148 /* Don't mark a dummy type as visited because we want to mark its sizes
7149 and fields once it's filled in. */
7150 else if (!TYPE_IS_DUMMY_P (t))
7151 TREE_VISITED (t) = 1;
7152
7153 if (TYPE_P (t))
7154 TYPE_SIZES_GIMPLIFIED (t) = 1;
7155
7156 return NULL_TREE;
7157 }
7158
7159 /* Mark nodes rooted at T with TREE_VISITED and types as having their
7160 sized gimplified. We use this to indicate all variable sizes and
7161 positions in global types may not be shared by any subprogram. */
7162
7163 void
7164 mark_visited (tree t)
7165 {
7166 walk_tree (&t, mark_visited_r, NULL, NULL);
7167 }
7168
7169 /* Add GNU_CLEANUP, a cleanup action, to the current code group and
7170 set its location to that of GNAT_NODE if present. */
7171
7172 static void
7173 add_cleanup (tree gnu_cleanup, Node_Id gnat_node)
7174 {
7175 if (Present (gnat_node))
7176 set_expr_location_from_node (gnu_cleanup, gnat_node);
7177 append_to_statement_list (gnu_cleanup, &current_stmt_group->cleanups);
7178 }
7179
7180 /* Set the BLOCK node corresponding to the current code group to GNU_BLOCK. */
7181
7182 void
7183 set_block_for_group (tree gnu_block)
7184 {
7185 gcc_assert (!current_stmt_group->block);
7186 current_stmt_group->block = gnu_block;
7187 }
7188
7189 /* Return code corresponding to the current code group. It is normally
7190 a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
7191 BLOCK or cleanups were set. */
7192
7193 tree
7194 end_stmt_group (void)
7195 {
7196 struct stmt_group *group = current_stmt_group;
7197 tree gnu_retval = group->stmt_list;
7198
7199 /* If this is a null list, allocate a new STATEMENT_LIST. Then, if there
7200 are cleanups, make a TRY_FINALLY_EXPR. Last, if there is a BLOCK,
7201 make a BIND_EXPR. Note that we nest in that because the cleanup may
7202 reference variables in the block. */
7203 if (gnu_retval == NULL_TREE)
7204 gnu_retval = alloc_stmt_list ();
7205
7206 if (group->cleanups)
7207 gnu_retval = build2 (TRY_FINALLY_EXPR, void_type_node, gnu_retval,
7208 group->cleanups);
7209
7210 if (current_stmt_group->block)
7211 gnu_retval = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (group->block),
7212 gnu_retval, group->block);
7213
7214 /* Remove this group from the stack and add it to the free list. */
7215 current_stmt_group = group->previous;
7216 group->previous = stmt_group_free_list;
7217 stmt_group_free_list = group;
7218
7219 return gnu_retval;
7220 }
7221
7222 /* Add a list of statements from GNAT_LIST, a possibly-empty list of
7223 statements.*/
7224
7225 static void
7226 add_stmt_list (List_Id gnat_list)
7227 {
7228 Node_Id gnat_node;
7229
7230 if (Present (gnat_list))
7231 for (gnat_node = First (gnat_list); Present (gnat_node);
7232 gnat_node = Next (gnat_node))
7233 add_stmt (gnat_to_gnu (gnat_node));
7234 }
7235
7236 /* Build a tree from GNAT_LIST, a possibly-empty list of statements.
7237 If BINDING_P is true, push and pop a binding level around the list. */
7238
7239 static tree
7240 build_stmt_group (List_Id gnat_list, bool binding_p)
7241 {
7242 start_stmt_group ();
7243 if (binding_p)
7244 gnat_pushlevel ();
7245
7246 add_stmt_list (gnat_list);
7247 if (binding_p)
7248 gnat_poplevel ();
7249
7250 return end_stmt_group ();
7251 }
7252 \f
7253 /* Generate GIMPLE in place for the expression at *EXPR_P. */
7254
7255 int
7256 gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
7257 gimple_seq *post_p ATTRIBUTE_UNUSED)
7258 {
7259 tree expr = *expr_p;
7260 tree op;
7261
7262 if (IS_ADA_STMT (expr))
7263 return gnat_gimplify_stmt (expr_p);
7264
7265 switch (TREE_CODE (expr))
7266 {
7267 case NULL_EXPR:
7268 /* If this is for a scalar, just make a VAR_DECL for it. If for
7269 an aggregate, get a null pointer of the appropriate type and
7270 dereference it. */
7271 if (AGGREGATE_TYPE_P (TREE_TYPE (expr)))
7272 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (expr),
7273 convert (build_pointer_type (TREE_TYPE (expr)),
7274 integer_zero_node));
7275 else
7276 {
7277 *expr_p = create_tmp_var (TREE_TYPE (expr), NULL);
7278 TREE_NO_WARNING (*expr_p) = 1;
7279 }
7280
7281 gimplify_and_add (TREE_OPERAND (expr, 0), pre_p);
7282 return GS_OK;
7283
7284 case UNCONSTRAINED_ARRAY_REF:
7285 /* We should only do this if we are just elaborating for side-effects,
7286 but we can't know that yet. */
7287 *expr_p = TREE_OPERAND (*expr_p, 0);
7288 return GS_OK;
7289
7290 case ADDR_EXPR:
7291 op = TREE_OPERAND (expr, 0);
7292
7293 /* If we are taking the address of a constant CONSTRUCTOR, make sure it
7294 is put into static memory. We know that it's going to be read-only
7295 given the semantics we have and it must be in static memory when the
7296 reference is in an elaboration procedure. */
7297 if (TREE_CODE (op) == CONSTRUCTOR && TREE_CONSTANT (op))
7298 {
7299 tree addr = build_fold_addr_expr (tree_output_constant_def (op));
7300 *expr_p = fold_convert (TREE_TYPE (expr), addr);
7301 return GS_ALL_DONE;
7302 }
7303
7304 return GS_UNHANDLED;
7305
7306 case VIEW_CONVERT_EXPR:
7307 op = TREE_OPERAND (expr, 0);
7308
7309 /* If we are view-converting a CONSTRUCTOR or a call from an aggregate
7310 type to a scalar one, explicitly create the local temporary. That's
7311 required if the type is passed by reference. */
7312 if ((TREE_CODE (op) == CONSTRUCTOR || TREE_CODE (op) == CALL_EXPR)
7313 && AGGREGATE_TYPE_P (TREE_TYPE (op))
7314 && !AGGREGATE_TYPE_P (TREE_TYPE (expr)))
7315 {
7316 tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
7317 gimple_add_tmp_var (new_var);
7318
7319 mod = build2 (INIT_EXPR, TREE_TYPE (new_var), new_var, op);
7320 gimplify_and_add (mod, pre_p);
7321
7322 TREE_OPERAND (expr, 0) = new_var;
7323 return GS_OK;
7324 }
7325
7326 return GS_UNHANDLED;
7327
7328 case DECL_EXPR:
7329 op = DECL_EXPR_DECL (expr);
7330
7331 /* The expressions for the RM bounds must be gimplified to ensure that
7332 they are properly elaborated. See gimplify_decl_expr. */
7333 if ((TREE_CODE (op) == TYPE_DECL || TREE_CODE (op) == VAR_DECL)
7334 && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (op)))
7335 switch (TREE_CODE (TREE_TYPE (op)))
7336 {
7337 case INTEGER_TYPE:
7338 case ENUMERAL_TYPE:
7339 case BOOLEAN_TYPE:
7340 case REAL_TYPE:
7341 {
7342 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (op)), t, val;
7343
7344 val = TYPE_RM_MIN_VALUE (type);
7345 if (val)
7346 {
7347 gimplify_one_sizepos (&val, pre_p);
7348 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
7349 SET_TYPE_RM_MIN_VALUE (t, val);
7350 }
7351
7352 val = TYPE_RM_MAX_VALUE (type);
7353 if (val)
7354 {
7355 gimplify_one_sizepos (&val, pre_p);
7356 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
7357 SET_TYPE_RM_MAX_VALUE (t, val);
7358 }
7359
7360 }
7361 break;
7362
7363 default:
7364 break;
7365 }
7366
7367 /* ... fall through ... */
7368
7369 default:
7370 return GS_UNHANDLED;
7371 }
7372 }
7373
7374 /* Generate GIMPLE in place for the statement at *STMT_P. */
7375
7376 static enum gimplify_status
7377 gnat_gimplify_stmt (tree *stmt_p)
7378 {
7379 tree stmt = *stmt_p;
7380
7381 switch (TREE_CODE (stmt))
7382 {
7383 case STMT_STMT:
7384 *stmt_p = STMT_STMT_STMT (stmt);
7385 return GS_OK;
7386
7387 case LOOP_STMT:
7388 {
7389 tree gnu_start_label = create_artificial_label (input_location);
7390 tree gnu_cond = LOOP_STMT_COND (stmt);
7391 tree gnu_update = LOOP_STMT_UPDATE (stmt);
7392 tree gnu_end_label = LOOP_STMT_LABEL (stmt);
7393 tree t;
7394
7395 /* Build the condition expression from the test, if any. */
7396 if (gnu_cond)
7397 gnu_cond
7398 = build3 (COND_EXPR, void_type_node, gnu_cond, alloc_stmt_list (),
7399 build1 (GOTO_EXPR, void_type_node, gnu_end_label));
7400
7401 /* Set to emit the statements of the loop. */
7402 *stmt_p = NULL_TREE;
7403
7404 /* We first emit the start label and then a conditional jump to the
7405 end label if there's a top condition, then the update if it's at
7406 the top, then the body of the loop, then a conditional jump to
7407 the end label if there's a bottom condition, then the update if
7408 it's at the bottom, and finally a jump to the start label and the
7409 definition of the end label. */
7410 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
7411 gnu_start_label),
7412 stmt_p);
7413
7414 if (gnu_cond && !LOOP_STMT_BOTTOM_COND_P (stmt))
7415 append_to_statement_list (gnu_cond, stmt_p);
7416
7417 if (gnu_update && LOOP_STMT_TOP_UPDATE_P (stmt))
7418 append_to_statement_list (gnu_update, stmt_p);
7419
7420 append_to_statement_list (LOOP_STMT_BODY (stmt), stmt_p);
7421
7422 if (gnu_cond && LOOP_STMT_BOTTOM_COND_P (stmt))
7423 append_to_statement_list (gnu_cond, stmt_p);
7424
7425 if (gnu_update && !LOOP_STMT_TOP_UPDATE_P (stmt))
7426 append_to_statement_list (gnu_update, stmt_p);
7427
7428 t = build1 (GOTO_EXPR, void_type_node, gnu_start_label);
7429 SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (gnu_end_label));
7430 append_to_statement_list (t, stmt_p);
7431
7432 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
7433 gnu_end_label),
7434 stmt_p);
7435 return GS_OK;
7436 }
7437
7438 case EXIT_STMT:
7439 /* Build a statement to jump to the corresponding end label, then
7440 see if it needs to be conditional. */
7441 *stmt_p = build1 (GOTO_EXPR, void_type_node, EXIT_STMT_LABEL (stmt));
7442 if (EXIT_STMT_COND (stmt))
7443 *stmt_p = build3 (COND_EXPR, void_type_node,
7444 EXIT_STMT_COND (stmt), *stmt_p, alloc_stmt_list ());
7445 return GS_OK;
7446
7447 default:
7448 gcc_unreachable ();
7449 }
7450 }
7451 \f
7452 /* Force references to each of the entities in packages withed by GNAT_NODE.
7453 Operate recursively but check that we aren't elaborating something more
7454 than once.
7455
7456 This routine is exclusively called in type_annotate mode, to compute DDA
7457 information for types in withed units, for ASIS use. */
7458
7459 static void
7460 elaborate_all_entities (Node_Id gnat_node)
7461 {
7462 Entity_Id gnat_with_clause, gnat_entity;
7463
7464 /* Process each unit only once. As we trace the context of all relevant
7465 units transitively, including generic bodies, we may encounter the
7466 same generic unit repeatedly. */
7467 if (!present_gnu_tree (gnat_node))
7468 save_gnu_tree (gnat_node, integer_zero_node, true);
7469
7470 /* Save entities in all context units. A body may have an implicit_with
7471 on its own spec, if the context includes a child unit, so don't save
7472 the spec twice. */
7473 for (gnat_with_clause = First (Context_Items (gnat_node));
7474 Present (gnat_with_clause);
7475 gnat_with_clause = Next (gnat_with_clause))
7476 if (Nkind (gnat_with_clause) == N_With_Clause
7477 && !present_gnu_tree (Library_Unit (gnat_with_clause))
7478 && Library_Unit (gnat_with_clause) != Library_Unit (Cunit (Main_Unit)))
7479 {
7480 elaborate_all_entities (Library_Unit (gnat_with_clause));
7481
7482 if (Ekind (Entity (Name (gnat_with_clause))) == E_Package)
7483 {
7484 for (gnat_entity = First_Entity (Entity (Name (gnat_with_clause)));
7485 Present (gnat_entity);
7486 gnat_entity = Next_Entity (gnat_entity))
7487 if (Is_Public (gnat_entity)
7488 && Convention (gnat_entity) != Convention_Intrinsic
7489 && Ekind (gnat_entity) != E_Package
7490 && Ekind (gnat_entity) != E_Package_Body
7491 && Ekind (gnat_entity) != E_Operator
7492 && !(IN (Ekind (gnat_entity), Type_Kind)
7493 && !Is_Frozen (gnat_entity))
7494 && !((Ekind (gnat_entity) == E_Procedure
7495 || Ekind (gnat_entity) == E_Function)
7496 && Is_Intrinsic_Subprogram (gnat_entity))
7497 && !IN (Ekind (gnat_entity), Named_Kind)
7498 && !IN (Ekind (gnat_entity), Generic_Unit_Kind))
7499 gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
7500 }
7501 else if (Ekind (Entity (Name (gnat_with_clause))) == E_Generic_Package)
7502 {
7503 Node_Id gnat_body
7504 = Corresponding_Body (Unit (Library_Unit (gnat_with_clause)));
7505
7506 /* Retrieve compilation unit node of generic body. */
7507 while (Present (gnat_body)
7508 && Nkind (gnat_body) != N_Compilation_Unit)
7509 gnat_body = Parent (gnat_body);
7510
7511 /* If body is available, elaborate its context. */
7512 if (Present (gnat_body))
7513 elaborate_all_entities (gnat_body);
7514 }
7515 }
7516
7517 if (Nkind (Unit (gnat_node)) == N_Package_Body)
7518 elaborate_all_entities (Library_Unit (gnat_node));
7519 }
7520 \f
7521 /* Do the processing of GNAT_NODE, an N_Freeze_Entity. */
7522
7523 static void
7524 process_freeze_entity (Node_Id gnat_node)
7525 {
7526 const Entity_Id gnat_entity = Entity (gnat_node);
7527 const Entity_Kind kind = Ekind (gnat_entity);
7528 tree gnu_old, gnu_new;
7529
7530 /* If this is a package, we need to generate code for the package. */
7531 if (kind == E_Package)
7532 {
7533 insert_code_for
7534 (Parent (Corresponding_Body
7535 (Parent (Declaration_Node (gnat_entity)))));
7536 return;
7537 }
7538
7539 /* Don't do anything for class-wide types as they are always transformed
7540 into their root type. */
7541 if (kind == E_Class_Wide_Type)
7542 return;
7543
7544 /* Check for an old definition. This freeze node might be for an Itype. */
7545 gnu_old
7546 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : NULL_TREE;
7547
7548 /* If this entity has an address representation clause, GNU_OLD is the
7549 address, so discard it here. */
7550 if (Present (Address_Clause (gnat_entity)))
7551 gnu_old = NULL_TREE;
7552
7553 /* Don't do anything for subprograms that may have been elaborated before
7554 their freeze nodes. This can happen, for example, because of an inner
7555 call in an instance body or because of previous compilation of a spec
7556 for inlining purposes. */
7557 if (gnu_old
7558 && ((TREE_CODE (gnu_old) == FUNCTION_DECL
7559 && (kind == E_Function || kind == E_Procedure))
7560 || (TREE_CODE (TREE_TYPE (gnu_old)) == FUNCTION_TYPE
7561 && kind == E_Subprogram_Type)))
7562 return;
7563
7564 /* If we have a non-dummy type old tree, we have nothing to do, except
7565 aborting if this is the public view of a private type whose full view was
7566 not delayed, as this node was never delayed as it should have been. We
7567 let this happen for concurrent types and their Corresponding_Record_Type,
7568 however, because each might legitimately be elaborated before its own
7569 freeze node, e.g. while processing the other. */
7570 if (gnu_old
7571 && !(TREE_CODE (gnu_old) == TYPE_DECL
7572 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old))))
7573 {
7574 gcc_assert ((IN (kind, Incomplete_Or_Private_Kind)
7575 && Present (Full_View (gnat_entity))
7576 && No (Freeze_Node (Full_View (gnat_entity))))
7577 || Is_Concurrent_Type (gnat_entity)
7578 || (IN (kind, Record_Kind)
7579 && Is_Concurrent_Record_Type (gnat_entity)));
7580 return;
7581 }
7582
7583 /* Reset the saved tree, if any, and elaborate the object or type for real.
7584 If there is a full view, elaborate it and use the result. And, if this
7585 is the root type of a class-wide type, reuse it for the latter. */
7586 if (gnu_old)
7587 {
7588 save_gnu_tree (gnat_entity, NULL_TREE, false);
7589 if (IN (kind, Incomplete_Or_Private_Kind)
7590 && Present (Full_View (gnat_entity))
7591 && present_gnu_tree (Full_View (gnat_entity)))
7592 save_gnu_tree (Full_View (gnat_entity), NULL_TREE, false);
7593 if (IN (kind, Type_Kind)
7594 && Present (Class_Wide_Type (gnat_entity))
7595 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
7596 save_gnu_tree (Class_Wide_Type (gnat_entity), NULL_TREE, false);
7597 }
7598
7599 if (IN (kind, Incomplete_Or_Private_Kind)
7600 && Present (Full_View (gnat_entity)))
7601 {
7602 gnu_new = gnat_to_gnu_entity (Full_View (gnat_entity), NULL_TREE, 1);
7603
7604 /* Propagate back-annotations from full view to partial view. */
7605 if (Unknown_Alignment (gnat_entity))
7606 Set_Alignment (gnat_entity, Alignment (Full_View (gnat_entity)));
7607
7608 if (Unknown_Esize (gnat_entity))
7609 Set_Esize (gnat_entity, Esize (Full_View (gnat_entity)));
7610
7611 if (Unknown_RM_Size (gnat_entity))
7612 Set_RM_Size (gnat_entity, RM_Size (Full_View (gnat_entity)));
7613
7614 /* The above call may have defined this entity (the simplest example
7615 of this is when we have a private enumeral type since the bounds
7616 will have the public view). */
7617 if (!present_gnu_tree (gnat_entity))
7618 save_gnu_tree (gnat_entity, gnu_new, false);
7619 }
7620 else
7621 {
7622 tree gnu_init
7623 = (Nkind (Declaration_Node (gnat_entity)) == N_Object_Declaration
7624 && present_gnu_tree (Declaration_Node (gnat_entity)))
7625 ? get_gnu_tree (Declaration_Node (gnat_entity)) : NULL_TREE;
7626
7627 gnu_new = gnat_to_gnu_entity (gnat_entity, gnu_init, 1);
7628 }
7629
7630 if (IN (kind, Type_Kind)
7631 && Present (Class_Wide_Type (gnat_entity))
7632 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
7633 save_gnu_tree (Class_Wide_Type (gnat_entity), gnu_new, false);
7634
7635 /* If we have an old type and we've made pointers to this type, update those
7636 pointers. If this is a Taft amendment type in the main unit, we need to
7637 mark the type as used since other units referencing it don't see the full
7638 declaration and, therefore, cannot mark it as used themselves. */
7639 if (gnu_old)
7640 {
7641 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
7642 TREE_TYPE (gnu_new));
7643 if (DECL_TAFT_TYPE_P (gnu_old))
7644 used_types_insert (TREE_TYPE (gnu_new));
7645 }
7646 }
7647 \f
7648 /* Elaborate decls in the lists GNAT_DECLS and GNAT_DECLS2, if present.
7649 We make two passes, one to elaborate anything other than bodies (but
7650 we declare a function if there was no spec). The second pass
7651 elaborates the bodies.
7652
7653 GNAT_END_LIST gives the element in the list past the end. Normally,
7654 this is Empty, but can be First_Real_Statement for a
7655 Handled_Sequence_Of_Statements.
7656
7657 We make a complete pass through both lists if PASS1P is true, then make
7658 the second pass over both lists if PASS2P is true. The lists usually
7659 correspond to the public and private parts of a package. */
7660
7661 static void
7662 process_decls (List_Id gnat_decls, List_Id gnat_decls2,
7663 Node_Id gnat_end_list, bool pass1p, bool pass2p)
7664 {
7665 List_Id gnat_decl_array[2];
7666 Node_Id gnat_decl;
7667 int i;
7668
7669 gnat_decl_array[0] = gnat_decls, gnat_decl_array[1] = gnat_decls2;
7670
7671 if (pass1p)
7672 for (i = 0; i <= 1; i++)
7673 if (Present (gnat_decl_array[i]))
7674 for (gnat_decl = First (gnat_decl_array[i]);
7675 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
7676 {
7677 /* For package specs, we recurse inside the declarations,
7678 thus taking the two pass approach inside the boundary. */
7679 if (Nkind (gnat_decl) == N_Package_Declaration
7680 && (Nkind (Specification (gnat_decl)
7681 == N_Package_Specification)))
7682 process_decls (Visible_Declarations (Specification (gnat_decl)),
7683 Private_Declarations (Specification (gnat_decl)),
7684 Empty, true, false);
7685
7686 /* Similarly for any declarations in the actions of a
7687 freeze node. */
7688 else if (Nkind (gnat_decl) == N_Freeze_Entity)
7689 {
7690 process_freeze_entity (gnat_decl);
7691 process_decls (Actions (gnat_decl), Empty, Empty, true, false);
7692 }
7693
7694 /* Package bodies with freeze nodes get their elaboration deferred
7695 until the freeze node, but the code must be placed in the right
7696 place, so record the code position now. */
7697 else if (Nkind (gnat_decl) == N_Package_Body
7698 && Present (Freeze_Node (Corresponding_Spec (gnat_decl))))
7699 record_code_position (gnat_decl);
7700
7701 else if (Nkind (gnat_decl) == N_Package_Body_Stub
7702 && Present (Library_Unit (gnat_decl))
7703 && Present (Freeze_Node
7704 (Corresponding_Spec
7705 (Proper_Body (Unit
7706 (Library_Unit (gnat_decl)))))))
7707 record_code_position
7708 (Proper_Body (Unit (Library_Unit (gnat_decl))));
7709
7710 /* We defer most subprogram bodies to the second pass. */
7711 else if (Nkind (gnat_decl) == N_Subprogram_Body)
7712 {
7713 if (Acts_As_Spec (gnat_decl))
7714 {
7715 Node_Id gnat_subprog_id = Defining_Entity (gnat_decl);
7716
7717 if (Ekind (gnat_subprog_id) != E_Generic_Procedure
7718 && Ekind (gnat_subprog_id) != E_Generic_Function)
7719 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
7720 }
7721 }
7722
7723 /* For bodies and stubs that act as their own specs, the entity
7724 itself must be elaborated in the first pass, because it may
7725 be used in other declarations. */
7726 else if (Nkind (gnat_decl) == N_Subprogram_Body_Stub)
7727 {
7728 Node_Id gnat_subprog_id
7729 = Defining_Entity (Specification (gnat_decl));
7730
7731 if (Ekind (gnat_subprog_id) != E_Subprogram_Body
7732 && Ekind (gnat_subprog_id) != E_Generic_Procedure
7733 && Ekind (gnat_subprog_id) != E_Generic_Function)
7734 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
7735 }
7736
7737 /* Concurrent stubs stand for the corresponding subprogram bodies,
7738 which are deferred like other bodies. */
7739 else if (Nkind (gnat_decl) == N_Task_Body_Stub
7740 || Nkind (gnat_decl) == N_Protected_Body_Stub)
7741 ;
7742
7743 else
7744 add_stmt (gnat_to_gnu (gnat_decl));
7745 }
7746
7747 /* Here we elaborate everything we deferred above except for package bodies,
7748 which are elaborated at their freeze nodes. Note that we must also
7749 go inside things (package specs and freeze nodes) the first pass did. */
7750 if (pass2p)
7751 for (i = 0; i <= 1; i++)
7752 if (Present (gnat_decl_array[i]))
7753 for (gnat_decl = First (gnat_decl_array[i]);
7754 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
7755 {
7756 if (Nkind (gnat_decl) == N_Subprogram_Body
7757 || Nkind (gnat_decl) == N_Subprogram_Body_Stub
7758 || Nkind (gnat_decl) == N_Task_Body_Stub
7759 || Nkind (gnat_decl) == N_Protected_Body_Stub)
7760 add_stmt (gnat_to_gnu (gnat_decl));
7761
7762 else if (Nkind (gnat_decl) == N_Package_Declaration
7763 && (Nkind (Specification (gnat_decl)
7764 == N_Package_Specification)))
7765 process_decls (Visible_Declarations (Specification (gnat_decl)),
7766 Private_Declarations (Specification (gnat_decl)),
7767 Empty, false, true);
7768
7769 else if (Nkind (gnat_decl) == N_Freeze_Entity)
7770 process_decls (Actions (gnat_decl), Empty, Empty, false, true);
7771 }
7772 }
7773 \f
7774 /* Make a unary operation of kind CODE using build_unary_op, but guard
7775 the operation by an overflow check. CODE can be one of NEGATE_EXPR
7776 or ABS_EXPR. GNU_TYPE is the type desired for the result. Usually
7777 the operation is to be performed in that type. GNAT_NODE is the gnat
7778 node conveying the source location for which the error should be
7779 signaled. */
7780
7781 static tree
7782 build_unary_op_trapv (enum tree_code code, tree gnu_type, tree operand,
7783 Node_Id gnat_node)
7784 {
7785 gcc_assert (code == NEGATE_EXPR || code == ABS_EXPR);
7786
7787 operand = gnat_protect_expr (operand);
7788
7789 return emit_check (build_binary_op (EQ_EXPR, boolean_type_node,
7790 operand, TYPE_MIN_VALUE (gnu_type)),
7791 build_unary_op (code, gnu_type, operand),
7792 CE_Overflow_Check_Failed, gnat_node);
7793 }
7794
7795 /* Make a binary operation of kind CODE using build_binary_op, but guard
7796 the operation by an overflow check. CODE can be one of PLUS_EXPR,
7797 MINUS_EXPR or MULT_EXPR. GNU_TYPE is the type desired for the result.
7798 Usually the operation is to be performed in that type. GNAT_NODE is
7799 the GNAT node conveying the source location for which the error should
7800 be signaled. */
7801
7802 static tree
7803 build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left,
7804 tree right, Node_Id gnat_node)
7805 {
7806 tree lhs = gnat_protect_expr (left);
7807 tree rhs = gnat_protect_expr (right);
7808 tree type_max = TYPE_MAX_VALUE (gnu_type);
7809 tree type_min = TYPE_MIN_VALUE (gnu_type);
7810 tree gnu_expr;
7811 tree tmp1, tmp2;
7812 tree zero = convert (gnu_type, integer_zero_node);
7813 tree rhs_lt_zero;
7814 tree check_pos;
7815 tree check_neg;
7816 tree check;
7817 int precision = TYPE_PRECISION (gnu_type);
7818
7819 gcc_assert (!(precision & (precision - 1))); /* ensure power of 2 */
7820
7821 /* Prefer a constant or known-positive rhs to simplify checks. */
7822 if (!TREE_CONSTANT (rhs)
7823 && commutative_tree_code (code)
7824 && (TREE_CONSTANT (lhs) || (!tree_expr_nonnegative_p (rhs)
7825 && tree_expr_nonnegative_p (lhs))))
7826 {
7827 tree tmp = lhs;
7828 lhs = rhs;
7829 rhs = tmp;
7830 }
7831
7832 rhs_lt_zero = tree_expr_nonnegative_p (rhs)
7833 ? boolean_false_node
7834 : build_binary_op (LT_EXPR, boolean_type_node, rhs, zero);
7835
7836 /* ??? Should use more efficient check for operand_equal_p (lhs, rhs, 0) */
7837
7838 /* Try a few strategies that may be cheaper than the general
7839 code at the end of the function, if the rhs is not known.
7840 The strategies are:
7841 - Call library function for 64-bit multiplication (complex)
7842 - Widen, if input arguments are sufficiently small
7843 - Determine overflow using wrapped result for addition/subtraction. */
7844
7845 if (!TREE_CONSTANT (rhs))
7846 {
7847 /* Even for add/subtract double size to get another base type. */
7848 int needed_precision = precision * 2;
7849
7850 if (code == MULT_EXPR && precision == 64)
7851 {
7852 tree int_64 = gnat_type_for_size (64, 0);
7853
7854 return convert (gnu_type, build_call_n_expr (mulv64_decl, 2,
7855 convert (int_64, lhs),
7856 convert (int_64, rhs)));
7857 }
7858
7859 else if (needed_precision <= BITS_PER_WORD
7860 || (code == MULT_EXPR
7861 && needed_precision <= LONG_LONG_TYPE_SIZE))
7862 {
7863 tree wide_type = gnat_type_for_size (needed_precision, 0);
7864
7865 tree wide_result = build_binary_op (code, wide_type,
7866 convert (wide_type, lhs),
7867 convert (wide_type, rhs));
7868
7869 tree check = build_binary_op
7870 (TRUTH_ORIF_EXPR, boolean_type_node,
7871 build_binary_op (LT_EXPR, boolean_type_node, wide_result,
7872 convert (wide_type, type_min)),
7873 build_binary_op (GT_EXPR, boolean_type_node, wide_result,
7874 convert (wide_type, type_max)));
7875
7876 tree result = convert (gnu_type, wide_result);
7877
7878 return
7879 emit_check (check, result, CE_Overflow_Check_Failed, gnat_node);
7880 }
7881
7882 else if (code == PLUS_EXPR || code == MINUS_EXPR)
7883 {
7884 tree unsigned_type = gnat_type_for_size (precision, 1);
7885 tree wrapped_expr = convert
7886 (gnu_type, build_binary_op (code, unsigned_type,
7887 convert (unsigned_type, lhs),
7888 convert (unsigned_type, rhs)));
7889
7890 tree result = convert
7891 (gnu_type, build_binary_op (code, gnu_type, lhs, rhs));
7892
7893 /* Overflow when (rhs < 0) ^ (wrapped_expr < lhs)), for addition
7894 or when (rhs < 0) ^ (wrapped_expr > lhs) for subtraction. */
7895 tree check = build_binary_op
7896 (TRUTH_XOR_EXPR, boolean_type_node, rhs_lt_zero,
7897 build_binary_op (code == PLUS_EXPR ? LT_EXPR : GT_EXPR,
7898 boolean_type_node, wrapped_expr, lhs));
7899
7900 return
7901 emit_check (check, result, CE_Overflow_Check_Failed, gnat_node);
7902 }
7903 }
7904
7905 switch (code)
7906 {
7907 case PLUS_EXPR:
7908 /* When rhs >= 0, overflow when lhs > type_max - rhs. */
7909 check_pos = build_binary_op (GT_EXPR, boolean_type_node, lhs,
7910 build_binary_op (MINUS_EXPR, gnu_type,
7911 type_max, rhs)),
7912
7913 /* When rhs < 0, overflow when lhs < type_min - rhs. */
7914 check_neg = build_binary_op (LT_EXPR, boolean_type_node, lhs,
7915 build_binary_op (MINUS_EXPR, gnu_type,
7916 type_min, rhs));
7917 break;
7918
7919 case MINUS_EXPR:
7920 /* When rhs >= 0, overflow when lhs < type_min + rhs. */
7921 check_pos = build_binary_op (LT_EXPR, boolean_type_node, lhs,
7922 build_binary_op (PLUS_EXPR, gnu_type,
7923 type_min, rhs)),
7924
7925 /* When rhs < 0, overflow when lhs > type_max + rhs. */
7926 check_neg = build_binary_op (GT_EXPR, boolean_type_node, lhs,
7927 build_binary_op (PLUS_EXPR, gnu_type,
7928 type_max, rhs));
7929 break;
7930
7931 case MULT_EXPR:
7932 /* The check here is designed to be efficient if the rhs is constant,
7933 but it will work for any rhs by using integer division.
7934 Four different check expressions determine whether X * C overflows,
7935 depending on C.
7936 C == 0 => false
7937 C > 0 => X > type_max / C || X < type_min / C
7938 C == -1 => X == type_min
7939 C < -1 => X > type_min / C || X < type_max / C */
7940
7941 tmp1 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_max, rhs);
7942 tmp2 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_min, rhs);
7943
7944 check_pos
7945 = build_binary_op (TRUTH_ANDIF_EXPR, boolean_type_node,
7946 build_binary_op (NE_EXPR, boolean_type_node, zero,
7947 rhs),
7948 build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
7949 build_binary_op (GT_EXPR,
7950 boolean_type_node,
7951 lhs, tmp1),
7952 build_binary_op (LT_EXPR,
7953 boolean_type_node,
7954 lhs, tmp2)));
7955
7956 check_neg
7957 = fold_build3 (COND_EXPR, boolean_type_node,
7958 build_binary_op (EQ_EXPR, boolean_type_node, rhs,
7959 build_int_cst (gnu_type, -1)),
7960 build_binary_op (EQ_EXPR, boolean_type_node, lhs,
7961 type_min),
7962 build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
7963 build_binary_op (GT_EXPR,
7964 boolean_type_node,
7965 lhs, tmp2),
7966 build_binary_op (LT_EXPR,
7967 boolean_type_node,
7968 lhs, tmp1)));
7969 break;
7970
7971 default:
7972 gcc_unreachable();
7973 }
7974
7975 gnu_expr = build_binary_op (code, gnu_type, lhs, rhs);
7976
7977 /* If we can fold the expression to a constant, just return it.
7978 The caller will deal with overflow, no need to generate a check. */
7979 if (TREE_CONSTANT (gnu_expr))
7980 return gnu_expr;
7981
7982 check = fold_build3 (COND_EXPR, boolean_type_node, rhs_lt_zero, check_neg,
7983 check_pos);
7984
7985 return emit_check (check, gnu_expr, CE_Overflow_Check_Failed, gnat_node);
7986 }
7987
7988 /* Emit code for a range check. GNU_EXPR is the expression to be checked,
7989 GNAT_RANGE_TYPE the gnat type or subtype containing the bounds against
7990 which we have to check. GNAT_NODE is the GNAT node conveying the source
7991 location for which the error should be signaled. */
7992
7993 static tree
7994 emit_range_check (tree gnu_expr, Entity_Id gnat_range_type, Node_Id gnat_node)
7995 {
7996 tree gnu_range_type = get_unpadded_type (gnat_range_type);
7997 tree gnu_low = TYPE_MIN_VALUE (gnu_range_type);
7998 tree gnu_high = TYPE_MAX_VALUE (gnu_range_type);
7999 tree gnu_compare_type = get_base_type (TREE_TYPE (gnu_expr));
8000
8001 /* If GNU_EXPR has GNAT_RANGE_TYPE as its base type, no check is needed.
8002 This can for example happen when translating 'Val or 'Value. */
8003 if (gnu_compare_type == gnu_range_type)
8004 return gnu_expr;
8005
8006 /* If GNU_EXPR has an integral type that is narrower than GNU_RANGE_TYPE,
8007 we can't do anything since we might be truncating the bounds. No
8008 check is needed in this case. */
8009 if (INTEGRAL_TYPE_P (TREE_TYPE (gnu_expr))
8010 && (TYPE_PRECISION (gnu_compare_type)
8011 < TYPE_PRECISION (get_base_type (gnu_range_type))))
8012 return gnu_expr;
8013
8014 /* Checked expressions must be evaluated only once. */
8015 gnu_expr = gnat_protect_expr (gnu_expr);
8016
8017 /* Note that the form of the check is
8018 (not (expr >= lo)) or (not (expr <= hi))
8019 the reason for this slightly convoluted form is that NaNs
8020 are not considered to be in range in the float case. */
8021 return emit_check
8022 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
8023 invert_truthvalue
8024 (build_binary_op (GE_EXPR, boolean_type_node,
8025 convert (gnu_compare_type, gnu_expr),
8026 convert (gnu_compare_type, gnu_low))),
8027 invert_truthvalue
8028 (build_binary_op (LE_EXPR, boolean_type_node,
8029 convert (gnu_compare_type, gnu_expr),
8030 convert (gnu_compare_type,
8031 gnu_high)))),
8032 gnu_expr, CE_Range_Check_Failed, gnat_node);
8033 }
8034 \f
8035 /* Emit code for an index check. GNU_ARRAY_OBJECT is the array object which
8036 we are about to index, GNU_EXPR is the index expression to be checked,
8037 GNU_LOW and GNU_HIGH are the lower and upper bounds against which GNU_EXPR
8038 has to be checked. Note that for index checking we cannot simply use the
8039 emit_range_check function (although very similar code needs to be generated
8040 in both cases) since for index checking the array type against which we are
8041 checking the indices may be unconstrained and consequently we need to get
8042 the actual index bounds from the array object itself (GNU_ARRAY_OBJECT).
8043 The place where we need to do that is in subprograms having unconstrained
8044 array formal parameters. GNAT_NODE is the GNAT node conveying the source
8045 location for which the error should be signaled. */
8046
8047 static tree
8048 emit_index_check (tree gnu_array_object, tree gnu_expr, tree gnu_low,
8049 tree gnu_high, Node_Id gnat_node)
8050 {
8051 tree gnu_expr_check;
8052
8053 /* Checked expressions must be evaluated only once. */
8054 gnu_expr = gnat_protect_expr (gnu_expr);
8055
8056 /* Must do this computation in the base type in case the expression's
8057 type is an unsigned subtypes. */
8058 gnu_expr_check = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
8059
8060 /* If GNU_LOW or GNU_HIGH are a PLACEHOLDER_EXPR, qualify them by
8061 the object we are handling. */
8062 gnu_low = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_low, gnu_array_object);
8063 gnu_high = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_high, gnu_array_object);
8064
8065 return emit_check
8066 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
8067 build_binary_op (LT_EXPR, boolean_type_node,
8068 gnu_expr_check,
8069 convert (TREE_TYPE (gnu_expr_check),
8070 gnu_low)),
8071 build_binary_op (GT_EXPR, boolean_type_node,
8072 gnu_expr_check,
8073 convert (TREE_TYPE (gnu_expr_check),
8074 gnu_high))),
8075 gnu_expr, CE_Index_Check_Failed, gnat_node);
8076 }
8077 \f
8078 /* GNU_COND contains the condition corresponding to an access, discriminant or
8079 range check of value GNU_EXPR. Build a COND_EXPR that returns GNU_EXPR if
8080 GNU_COND is false and raises a CONSTRAINT_ERROR if GNU_COND is true.
8081 REASON is the code that says why the exception was raised. GNAT_NODE is
8082 the GNAT node conveying the source location for which the error should be
8083 signaled. */
8084
8085 static tree
8086 emit_check (tree gnu_cond, tree gnu_expr, int reason, Node_Id gnat_node)
8087 {
8088 tree gnu_call
8089 = build_call_raise (reason, gnat_node, N_Raise_Constraint_Error);
8090 tree gnu_result
8091 = fold_build3 (COND_EXPR, TREE_TYPE (gnu_expr), gnu_cond,
8092 build2 (COMPOUND_EXPR, TREE_TYPE (gnu_expr), gnu_call,
8093 convert (TREE_TYPE (gnu_expr), integer_zero_node)),
8094 gnu_expr);
8095
8096 /* GNU_RESULT has side effects if and only if GNU_EXPR has:
8097 we don't need to evaluate it just for the check. */
8098 TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr);
8099
8100 return gnu_result;
8101 }
8102 \f
8103 /* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing overflow
8104 checks if OVERFLOW_P is true and range checks if RANGE_P is true.
8105 GNAT_TYPE is known to be an integral type. If TRUNCATE_P true, do a
8106 float to integer conversion with truncation; otherwise round.
8107 GNAT_NODE is the GNAT node conveying the source location for which the
8108 error should be signaled. */
8109
8110 static tree
8111 convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp,
8112 bool rangep, bool truncatep, Node_Id gnat_node)
8113 {
8114 tree gnu_type = get_unpadded_type (gnat_type);
8115 tree gnu_in_type = TREE_TYPE (gnu_expr);
8116 tree gnu_in_basetype = get_base_type (gnu_in_type);
8117 tree gnu_base_type = get_base_type (gnu_type);
8118 tree gnu_result = gnu_expr;
8119
8120 /* If we are not doing any checks, the output is an integral type, and
8121 the input is not a floating type, just do the conversion. This
8122 shortcut is required to avoid problems with packed array types
8123 and simplifies code in all cases anyway. */
8124 if (!rangep && !overflowp && INTEGRAL_TYPE_P (gnu_base_type)
8125 && !FLOAT_TYPE_P (gnu_in_type))
8126 return convert (gnu_type, gnu_expr);
8127
8128 /* First convert the expression to its base type. This
8129 will never generate code, but makes the tests below much simpler.
8130 But don't do this if converting from an integer type to an unconstrained
8131 array type since then we need to get the bounds from the original
8132 (unpacked) type. */
8133 if (TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE)
8134 gnu_result = convert (gnu_in_basetype, gnu_result);
8135
8136 /* If overflow checks are requested, we need to be sure the result will
8137 fit in the output base type. But don't do this if the input
8138 is integer and the output floating-point. */
8139 if (overflowp
8140 && !(FLOAT_TYPE_P (gnu_base_type) && INTEGRAL_TYPE_P (gnu_in_basetype)))
8141 {
8142 /* Ensure GNU_EXPR only gets evaluated once. */
8143 tree gnu_input = gnat_protect_expr (gnu_result);
8144 tree gnu_cond = boolean_false_node;
8145 tree gnu_in_lb = TYPE_MIN_VALUE (gnu_in_basetype);
8146 tree gnu_in_ub = TYPE_MAX_VALUE (gnu_in_basetype);
8147 tree gnu_out_lb = TYPE_MIN_VALUE (gnu_base_type);
8148 tree gnu_out_ub = TYPE_MAX_VALUE (gnu_base_type);
8149
8150 /* Convert the lower bounds to signed types, so we're sure we're
8151 comparing them properly. Likewise, convert the upper bounds
8152 to unsigned types. */
8153 if (INTEGRAL_TYPE_P (gnu_in_basetype) && TYPE_UNSIGNED (gnu_in_basetype))
8154 gnu_in_lb = convert (gnat_signed_type (gnu_in_basetype), gnu_in_lb);
8155
8156 if (INTEGRAL_TYPE_P (gnu_in_basetype)
8157 && !TYPE_UNSIGNED (gnu_in_basetype))
8158 gnu_in_ub = convert (gnat_unsigned_type (gnu_in_basetype), gnu_in_ub);
8159
8160 if (INTEGRAL_TYPE_P (gnu_base_type) && TYPE_UNSIGNED (gnu_base_type))
8161 gnu_out_lb = convert (gnat_signed_type (gnu_base_type), gnu_out_lb);
8162
8163 if (INTEGRAL_TYPE_P (gnu_base_type) && !TYPE_UNSIGNED (gnu_base_type))
8164 gnu_out_ub = convert (gnat_unsigned_type (gnu_base_type), gnu_out_ub);
8165
8166 /* Check each bound separately and only if the result bound
8167 is tighter than the bound on the input type. Note that all the
8168 types are base types, so the bounds must be constant. Also,
8169 the comparison is done in the base type of the input, which
8170 always has the proper signedness. First check for input
8171 integer (which means output integer), output float (which means
8172 both float), or mixed, in which case we always compare.
8173 Note that we have to do the comparison which would *fail* in the
8174 case of an error since if it's an FP comparison and one of the
8175 values is a NaN or Inf, the comparison will fail. */
8176 if (INTEGRAL_TYPE_P (gnu_in_basetype)
8177 ? tree_int_cst_lt (gnu_in_lb, gnu_out_lb)
8178 : (FLOAT_TYPE_P (gnu_base_type)
8179 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_in_lb),
8180 TREE_REAL_CST (gnu_out_lb))
8181 : 1))
8182 gnu_cond
8183 = invert_truthvalue
8184 (build_binary_op (GE_EXPR, boolean_type_node,
8185 gnu_input, convert (gnu_in_basetype,
8186 gnu_out_lb)));
8187
8188 if (INTEGRAL_TYPE_P (gnu_in_basetype)
8189 ? tree_int_cst_lt (gnu_out_ub, gnu_in_ub)
8190 : (FLOAT_TYPE_P (gnu_base_type)
8191 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_out_ub),
8192 TREE_REAL_CST (gnu_in_lb))
8193 : 1))
8194 gnu_cond
8195 = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node, gnu_cond,
8196 invert_truthvalue
8197 (build_binary_op (LE_EXPR, boolean_type_node,
8198 gnu_input,
8199 convert (gnu_in_basetype,
8200 gnu_out_ub))));
8201
8202 if (!integer_zerop (gnu_cond))
8203 gnu_result = emit_check (gnu_cond, gnu_input,
8204 CE_Overflow_Check_Failed, gnat_node);
8205 }
8206
8207 /* Now convert to the result base type. If this is a non-truncating
8208 float-to-integer conversion, round. */
8209 if (INTEGRAL_TYPE_P (gnu_base_type) && FLOAT_TYPE_P (gnu_in_basetype)
8210 && !truncatep)
8211 {
8212 REAL_VALUE_TYPE half_minus_pred_half, pred_half;
8213 tree gnu_conv, gnu_zero, gnu_comp, calc_type;
8214 tree gnu_pred_half, gnu_add_pred_half, gnu_subtract_pred_half;
8215 const struct real_format *fmt;
8216
8217 /* The following calculations depend on proper rounding to even
8218 of each arithmetic operation. In order to prevent excess
8219 precision from spoiling this property, use the widest hardware
8220 floating-point type if FP_ARITH_MAY_WIDEN is true. */
8221 calc_type
8222 = FP_ARITH_MAY_WIDEN ? longest_float_type_node : gnu_in_basetype;
8223
8224 /* FIXME: Should not have padding in the first place. */
8225 if (TYPE_IS_PADDING_P (calc_type))
8226 calc_type = TREE_TYPE (TYPE_FIELDS (calc_type));
8227
8228 /* Compute the exact value calc_type'Pred (0.5) at compile time. */
8229 fmt = REAL_MODE_FORMAT (TYPE_MODE (calc_type));
8230 real_2expN (&half_minus_pred_half, -(fmt->p) - 1, TYPE_MODE (calc_type));
8231 REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf,
8232 half_minus_pred_half);
8233 gnu_pred_half = build_real (calc_type, pred_half);
8234
8235 /* If the input is strictly negative, subtract this value
8236 and otherwise add it from the input. For 0.5, the result
8237 is exactly between 1.0 and the machine number preceding 1.0
8238 (for calc_type). Since the last bit of 1.0 is even, this 0.5
8239 will round to 1.0, while all other number with an absolute
8240 value less than 0.5 round to 0.0. For larger numbers exactly
8241 halfway between integers, rounding will always be correct as
8242 the true mathematical result will be closer to the higher
8243 integer compared to the lower one. So, this constant works
8244 for all floating-point numbers.
8245
8246 The reason to use the same constant with subtract/add instead
8247 of a positive and negative constant is to allow the comparison
8248 to be scheduled in parallel with retrieval of the constant and
8249 conversion of the input to the calc_type (if necessary). */
8250
8251 gnu_zero = convert (gnu_in_basetype, integer_zero_node);
8252 gnu_result = gnat_protect_expr (gnu_result);
8253 gnu_conv = convert (calc_type, gnu_result);
8254 gnu_comp
8255 = fold_build2 (GE_EXPR, boolean_type_node, gnu_result, gnu_zero);
8256 gnu_add_pred_half
8257 = fold_build2 (PLUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
8258 gnu_subtract_pred_half
8259 = fold_build2 (MINUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
8260 gnu_result = fold_build3 (COND_EXPR, calc_type, gnu_comp,
8261 gnu_add_pred_half, gnu_subtract_pred_half);
8262 }
8263
8264 if (TREE_CODE (gnu_base_type) == INTEGER_TYPE
8265 && TYPE_HAS_ACTUAL_BOUNDS_P (gnu_base_type)
8266 && TREE_CODE (gnu_result) == UNCONSTRAINED_ARRAY_REF)
8267 gnu_result = unchecked_convert (gnu_base_type, gnu_result, false);
8268 else
8269 gnu_result = convert (gnu_base_type, gnu_result);
8270
8271 /* Finally, do the range check if requested. Note that if the result type
8272 is a modular type, the range check is actually an overflow check. */
8273 if (rangep
8274 || (TREE_CODE (gnu_base_type) == INTEGER_TYPE
8275 && TYPE_MODULAR_P (gnu_base_type) && overflowp))
8276 gnu_result = emit_range_check (gnu_result, gnat_type, gnat_node);
8277
8278 return convert (gnu_type, gnu_result);
8279 }
8280 \f
8281 /* Return true if GNU_EXPR can be directly addressed. This is the case
8282 unless it is an expression involving computation or if it involves a
8283 reference to a bitfield or to an object not sufficiently aligned for
8284 its type. If GNU_TYPE is non-null, return true only if GNU_EXPR can
8285 be directly addressed as an object of this type.
8286
8287 *** Notes on addressability issues in the Ada compiler ***
8288
8289 This predicate is necessary in order to bridge the gap between Gigi
8290 and the middle-end about addressability of GENERIC trees. A tree
8291 is said to be addressable if it can be directly addressed, i.e. if
8292 its address can be taken, is a multiple of the type's alignment on
8293 strict-alignment architectures and returns the first storage unit
8294 assigned to the object represented by the tree.
8295
8296 In the C family of languages, everything is in practice addressable
8297 at the language level, except for bit-fields. This means that these
8298 compilers will take the address of any tree that doesn't represent
8299 a bit-field reference and expect the result to be the first storage
8300 unit assigned to the object. Even in cases where this will result
8301 in unaligned accesses at run time, nothing is supposed to be done
8302 and the program is considered as erroneous instead (see PR c/18287).
8303
8304 The implicit assumptions made in the middle-end are in keeping with
8305 the C viewpoint described above:
8306 - the address of a bit-field reference is supposed to be never
8307 taken; the compiler (generally) will stop on such a construct,
8308 - any other tree is addressable if it is formally addressable,
8309 i.e. if it is formally allowed to be the operand of ADDR_EXPR.
8310
8311 In Ada, the viewpoint is the opposite one: nothing is addressable
8312 at the language level unless explicitly declared so. This means
8313 that the compiler will both make sure that the trees representing
8314 references to addressable ("aliased" in Ada parlance) objects are
8315 addressable and make no real attempts at ensuring that the trees
8316 representing references to non-addressable objects are addressable.
8317
8318 In the first case, Ada is effectively equivalent to C and handing
8319 down the direct result of applying ADDR_EXPR to these trees to the
8320 middle-end works flawlessly. In the second case, Ada cannot afford
8321 to consider the program as erroneous if the address of trees that
8322 are not addressable is requested for technical reasons, unlike C;
8323 as a consequence, the Ada compiler must arrange for either making
8324 sure that this address is not requested in the middle-end or for
8325 compensating by inserting temporaries if it is requested in Gigi.
8326
8327 The first goal can be achieved because the middle-end should not
8328 request the address of non-addressable trees on its own; the only
8329 exception is for the invocation of low-level block operations like
8330 memcpy, for which the addressability requirements are lower since
8331 the type's alignment can be disregarded. In practice, this means
8332 that Gigi must make sure that such operations cannot be applied to
8333 non-BLKmode bit-fields.
8334
8335 The second goal is achieved by means of the addressable_p predicate,
8336 which computes whether a temporary must be inserted by Gigi when the
8337 address of a tree is requested; if so, the address of the temporary
8338 will be used in lieu of that of the original tree and some glue code
8339 generated to connect everything together. */
8340
8341 static bool
8342 addressable_p (tree gnu_expr, tree gnu_type)
8343 {
8344 /* For an integral type, the size of the actual type of the object may not
8345 be greater than that of the expected type, otherwise an indirect access
8346 in the latter type wouldn't correctly set all the bits of the object. */
8347 if (gnu_type
8348 && INTEGRAL_TYPE_P (gnu_type)
8349 && smaller_form_type_p (gnu_type, TREE_TYPE (gnu_expr)))
8350 return false;
8351
8352 /* The size of the actual type of the object may not be smaller than that
8353 of the expected type, otherwise an indirect access in the latter type
8354 would be larger than the object. But only record types need to be
8355 considered in practice for this case. */
8356 if (gnu_type
8357 && TREE_CODE (gnu_type) == RECORD_TYPE
8358 && smaller_form_type_p (TREE_TYPE (gnu_expr), gnu_type))
8359 return false;
8360
8361 switch (TREE_CODE (gnu_expr))
8362 {
8363 case VAR_DECL:
8364 case PARM_DECL:
8365 case FUNCTION_DECL:
8366 case RESULT_DECL:
8367 /* All DECLs are addressable: if they are in a register, we can force
8368 them to memory. */
8369 return true;
8370
8371 case UNCONSTRAINED_ARRAY_REF:
8372 case INDIRECT_REF:
8373 /* Taking the address of a dereference yields the original pointer. */
8374 return true;
8375
8376 case STRING_CST:
8377 case INTEGER_CST:
8378 /* Taking the address yields a pointer to the constant pool. */
8379 return true;
8380
8381 case CONSTRUCTOR:
8382 /* Taking the address of a static constructor yields a pointer to the
8383 tree constant pool. */
8384 return TREE_STATIC (gnu_expr) ? true : false;
8385
8386 case NULL_EXPR:
8387 case SAVE_EXPR:
8388 case CALL_EXPR:
8389 case PLUS_EXPR:
8390 case MINUS_EXPR:
8391 case BIT_IOR_EXPR:
8392 case BIT_XOR_EXPR:
8393 case BIT_AND_EXPR:
8394 case BIT_NOT_EXPR:
8395 /* All rvalues are deemed addressable since taking their address will
8396 force a temporary to be created by the middle-end. */
8397 return true;
8398
8399 case COMPOUND_EXPR:
8400 /* The address of a compound expression is that of its 2nd operand. */
8401 return addressable_p (TREE_OPERAND (gnu_expr, 1), gnu_type);
8402
8403 case COND_EXPR:
8404 /* We accept &COND_EXPR as soon as both operands are addressable and
8405 expect the outcome to be the address of the selected operand. */
8406 return (addressable_p (TREE_OPERAND (gnu_expr, 1), NULL_TREE)
8407 && addressable_p (TREE_OPERAND (gnu_expr, 2), NULL_TREE));
8408
8409 case COMPONENT_REF:
8410 return (((!DECL_BIT_FIELD (TREE_OPERAND (gnu_expr, 1))
8411 /* Even with DECL_BIT_FIELD cleared, we have to ensure that
8412 the field is sufficiently aligned, in case it is subject
8413 to a pragma Component_Alignment. But we don't need to
8414 check the alignment of the containing record, as it is
8415 guaranteed to be not smaller than that of its most
8416 aligned field that is not a bit-field. */
8417 && (!STRICT_ALIGNMENT
8418 || DECL_ALIGN (TREE_OPERAND (gnu_expr, 1))
8419 >= TYPE_ALIGN (TREE_TYPE (gnu_expr))))
8420 /* The field of a padding record is always addressable. */
8421 || TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))))
8422 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
8423
8424 case ARRAY_REF: case ARRAY_RANGE_REF:
8425 case REALPART_EXPR: case IMAGPART_EXPR:
8426 case NOP_EXPR:
8427 return addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE);
8428
8429 case CONVERT_EXPR:
8430 return (AGGREGATE_TYPE_P (TREE_TYPE (gnu_expr))
8431 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
8432
8433 case VIEW_CONVERT_EXPR:
8434 {
8435 /* This is addressable if we can avoid a copy. */
8436 tree type = TREE_TYPE (gnu_expr);
8437 tree inner_type = TREE_TYPE (TREE_OPERAND (gnu_expr, 0));
8438 return (((TYPE_MODE (type) == TYPE_MODE (inner_type)
8439 && (!STRICT_ALIGNMENT
8440 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
8441 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT))
8442 || ((TYPE_MODE (type) == BLKmode
8443 || TYPE_MODE (inner_type) == BLKmode)
8444 && (!STRICT_ALIGNMENT
8445 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
8446 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT
8447 || TYPE_ALIGN_OK (type)
8448 || TYPE_ALIGN_OK (inner_type))))
8449 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
8450 }
8451
8452 default:
8453 return false;
8454 }
8455 }
8456 \f
8457 /* Do the processing for the declaration of a GNAT_ENTITY, a type. If
8458 a separate Freeze node exists, delay the bulk of the processing. Otherwise
8459 make a GCC type for GNAT_ENTITY and set up the correspondence. */
8460
8461 void
8462 process_type (Entity_Id gnat_entity)
8463 {
8464 tree gnu_old
8465 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : 0;
8466 tree gnu_new;
8467
8468 /* If we are to delay elaboration of this type, just do any
8469 elaborations needed for expressions within the declaration and
8470 make a dummy type entry for this node and its Full_View (if
8471 any) in case something points to it. Don't do this if it
8472 has already been done (the only way that can happen is if
8473 the private completion is also delayed). */
8474 if (Present (Freeze_Node (gnat_entity))
8475 || (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
8476 && Present (Full_View (gnat_entity))
8477 && Freeze_Node (Full_View (gnat_entity))
8478 && !present_gnu_tree (Full_View (gnat_entity))))
8479 {
8480 elaborate_entity (gnat_entity);
8481
8482 if (!gnu_old)
8483 {
8484 tree gnu_decl = TYPE_STUB_DECL (make_dummy_type (gnat_entity));
8485 save_gnu_tree (gnat_entity, gnu_decl, false);
8486 if (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
8487 && Present (Full_View (gnat_entity)))
8488 {
8489 if (Has_Completion_In_Body (gnat_entity))
8490 DECL_TAFT_TYPE_P (gnu_decl) = 1;
8491 save_gnu_tree (Full_View (gnat_entity), gnu_decl, false);
8492 }
8493 }
8494
8495 return;
8496 }
8497
8498 /* If we saved away a dummy type for this node it means that this
8499 made the type that corresponds to the full type of an incomplete
8500 type. Clear that type for now and then update the type in the
8501 pointers. */
8502 if (gnu_old)
8503 {
8504 gcc_assert (TREE_CODE (gnu_old) == TYPE_DECL
8505 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old)));
8506
8507 save_gnu_tree (gnat_entity, NULL_TREE, false);
8508 }
8509
8510 /* Now fully elaborate the type. */
8511 gnu_new = gnat_to_gnu_entity (gnat_entity, NULL_TREE, 1);
8512 gcc_assert (TREE_CODE (gnu_new) == TYPE_DECL);
8513
8514 /* If we have an old type and we've made pointers to this type, update those
8515 pointers. If this is a Taft amendment type in the main unit, we need to
8516 mark the type as used since other units referencing it don't see the full
8517 declaration and, therefore, cannot mark it as used themselves. */
8518 if (gnu_old)
8519 {
8520 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
8521 TREE_TYPE (gnu_new));
8522 if (DECL_TAFT_TYPE_P (gnu_old))
8523 used_types_insert (TREE_TYPE (gnu_new));
8524 }
8525
8526 /* If this is a record type corresponding to a task or protected type
8527 that is a completion of an incomplete type, perform a similar update
8528 on the type. ??? Including protected types here is a guess. */
8529 if (IN (Ekind (gnat_entity), Record_Kind)
8530 && Is_Concurrent_Record_Type (gnat_entity)
8531 && present_gnu_tree (Corresponding_Concurrent_Type (gnat_entity)))
8532 {
8533 tree gnu_task_old
8534 = get_gnu_tree (Corresponding_Concurrent_Type (gnat_entity));
8535
8536 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
8537 NULL_TREE, false);
8538 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
8539 gnu_new, false);
8540
8541 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_task_old)),
8542 TREE_TYPE (gnu_new));
8543 }
8544 }
8545 \f
8546 /* GNAT_ENTITY is the type of the resulting constructor, GNAT_ASSOC is the
8547 front of the Component_Associations of an N_Aggregate and GNU_TYPE is the
8548 GCC type of the corresponding record type. Return the CONSTRUCTOR. */
8549
8550 static tree
8551 assoc_to_constructor (Entity_Id gnat_entity, Node_Id gnat_assoc, tree gnu_type)
8552 {
8553 tree gnu_list = NULL_TREE, gnu_result;
8554
8555 /* We test for GNU_FIELD being empty in the case where a variant
8556 was the last thing since we don't take things off GNAT_ASSOC in
8557 that case. We check GNAT_ASSOC in case we have a variant, but it
8558 has no fields. */
8559
8560 for (; Present (gnat_assoc); gnat_assoc = Next (gnat_assoc))
8561 {
8562 Node_Id gnat_field = First (Choices (gnat_assoc));
8563 tree gnu_field = gnat_to_gnu_field_decl (Entity (gnat_field));
8564 tree gnu_expr = gnat_to_gnu (Expression (gnat_assoc));
8565
8566 /* The expander is supposed to put a single component selector name
8567 in every record component association. */
8568 gcc_assert (No (Next (gnat_field)));
8569
8570 /* Ignore fields that have Corresponding_Discriminants since we'll
8571 be setting that field in the parent. */
8572 if (Present (Corresponding_Discriminant (Entity (gnat_field)))
8573 && Is_Tagged_Type (Scope (Entity (gnat_field))))
8574 continue;
8575
8576 /* Also ignore discriminants of Unchecked_Unions. */
8577 if (Is_Unchecked_Union (gnat_entity)
8578 && Ekind (Entity (gnat_field)) == E_Discriminant)
8579 continue;
8580
8581 /* Before assigning a value in an aggregate make sure range checks
8582 are done if required. Then convert to the type of the field. */
8583 if (Do_Range_Check (Expression (gnat_assoc)))
8584 gnu_expr = emit_range_check (gnu_expr, Etype (gnat_field), Empty);
8585
8586 gnu_expr = convert (TREE_TYPE (gnu_field), gnu_expr);
8587
8588 /* Add the field and expression to the list. */
8589 gnu_list = tree_cons (gnu_field, gnu_expr, gnu_list);
8590 }
8591
8592 gnu_result = extract_values (gnu_list, gnu_type);
8593
8594 #ifdef ENABLE_CHECKING
8595 /* Verify that every entry in GNU_LIST was used. */
8596 for (; gnu_list; gnu_list = TREE_CHAIN (gnu_list))
8597 gcc_assert (TREE_ADDRESSABLE (gnu_list));
8598 #endif
8599
8600 return gnu_result;
8601 }
8602
8603 /* Build a possibly nested constructor for array aggregates. GNAT_EXPR is
8604 the first element of an array aggregate. It may itself be an aggregate.
8605 GNU_ARRAY_TYPE is the GCC type corresponding to the array aggregate.
8606 GNAT_COMPONENT_TYPE is the type of the array component; it is needed
8607 for range checking. */
8608
8609 static tree
8610 pos_to_constructor (Node_Id gnat_expr, tree gnu_array_type,
8611 Entity_Id gnat_component_type)
8612 {
8613 tree gnu_index = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_array_type));
8614 tree gnu_expr;
8615 VEC(constructor_elt,gc) *gnu_expr_vec = NULL;
8616
8617 for ( ; Present (gnat_expr); gnat_expr = Next (gnat_expr))
8618 {
8619 /* If the expression is itself an array aggregate then first build the
8620 innermost constructor if it is part of our array (multi-dimensional
8621 case). */
8622 if (Nkind (gnat_expr) == N_Aggregate
8623 && TREE_CODE (TREE_TYPE (gnu_array_type)) == ARRAY_TYPE
8624 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_array_type)))
8625 gnu_expr = pos_to_constructor (First (Expressions (gnat_expr)),
8626 TREE_TYPE (gnu_array_type),
8627 gnat_component_type);
8628 else
8629 {
8630 gnu_expr = gnat_to_gnu (gnat_expr);
8631
8632 /* Before assigning the element to the array, make sure it is
8633 in range. */
8634 if (Do_Range_Check (gnat_expr))
8635 gnu_expr = emit_range_check (gnu_expr, gnat_component_type, Empty);
8636 }
8637
8638 CONSTRUCTOR_APPEND_ELT (gnu_expr_vec, gnu_index,
8639 convert (TREE_TYPE (gnu_array_type), gnu_expr));
8640
8641 gnu_index = int_const_binop (PLUS_EXPR, gnu_index, integer_one_node);
8642 }
8643
8644 return gnat_build_constructor (gnu_array_type, gnu_expr_vec);
8645 }
8646 \f
8647 /* Subroutine of assoc_to_constructor: VALUES is a list of field associations,
8648 some of which are from RECORD_TYPE. Return a CONSTRUCTOR consisting
8649 of the associations that are from RECORD_TYPE. If we see an internal
8650 record, make a recursive call to fill it in as well. */
8651
8652 static tree
8653 extract_values (tree values, tree record_type)
8654 {
8655 tree field, tem;
8656 VEC(constructor_elt,gc) *v = NULL;
8657
8658 for (field = TYPE_FIELDS (record_type); field; field = DECL_CHAIN (field))
8659 {
8660 tree value = 0;
8661
8662 /* _Parent is an internal field, but may have values in the aggregate,
8663 so check for values first. */
8664 if ((tem = purpose_member (field, values)))
8665 {
8666 value = TREE_VALUE (tem);
8667 TREE_ADDRESSABLE (tem) = 1;
8668 }
8669
8670 else if (DECL_INTERNAL_P (field))
8671 {
8672 value = extract_values (values, TREE_TYPE (field));
8673 if (TREE_CODE (value) == CONSTRUCTOR
8674 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (value)))
8675 value = 0;
8676 }
8677 else
8678 /* If we have a record subtype, the names will match, but not the
8679 actual FIELD_DECLs. */
8680 for (tem = values; tem; tem = TREE_CHAIN (tem))
8681 if (DECL_NAME (TREE_PURPOSE (tem)) == DECL_NAME (field))
8682 {
8683 value = convert (TREE_TYPE (field), TREE_VALUE (tem));
8684 TREE_ADDRESSABLE (tem) = 1;
8685 }
8686
8687 if (!value)
8688 continue;
8689
8690 CONSTRUCTOR_APPEND_ELT (v, field, value);
8691 }
8692
8693 return gnat_build_constructor (record_type, v);
8694 }
8695 \f
8696 /* Process a N_Validate_Unchecked_Conversion node. */
8697
8698 static void
8699 validate_unchecked_conversion (Node_Id gnat_node)
8700 {
8701 tree gnu_source_type = gnat_to_gnu_type (Source_Type (gnat_node));
8702 tree gnu_target_type = gnat_to_gnu_type (Target_Type (gnat_node));
8703
8704 /* If the target is a pointer type, see if we are either converting from a
8705 non-pointer or from a pointer to a type with a different alias set and
8706 warn if so, unless the pointer has been marked to alias everything. */
8707 if (POINTER_TYPE_P (gnu_target_type)
8708 && !TYPE_REF_CAN_ALIAS_ALL (gnu_target_type))
8709 {
8710 tree gnu_source_desig_type = POINTER_TYPE_P (gnu_source_type)
8711 ? TREE_TYPE (gnu_source_type)
8712 : NULL_TREE;
8713 tree gnu_target_desig_type = TREE_TYPE (gnu_target_type);
8714 alias_set_type target_alias_set = get_alias_set (gnu_target_desig_type);
8715
8716 if (target_alias_set != 0
8717 && (!POINTER_TYPE_P (gnu_source_type)
8718 || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type),
8719 target_alias_set)))
8720 {
8721 post_error_ne ("?possible aliasing problem for type&",
8722 gnat_node, Target_Type (gnat_node));
8723 post_error ("\\?use -fno-strict-aliasing switch for references",
8724 gnat_node);
8725 post_error_ne ("\\?or use `pragma No_Strict_Aliasing (&);`",
8726 gnat_node, Target_Type (gnat_node));
8727 }
8728 }
8729
8730 /* Likewise if the target is a fat pointer type, but we have no mechanism to
8731 mitigate the problem in this case, so we unconditionally warn. */
8732 else if (TYPE_IS_FAT_POINTER_P (gnu_target_type))
8733 {
8734 tree gnu_source_desig_type
8735 = TYPE_IS_FAT_POINTER_P (gnu_source_type)
8736 ? TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_source_type)))
8737 : NULL_TREE;
8738 tree gnu_target_desig_type
8739 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_target_type)));
8740 alias_set_type target_alias_set = get_alias_set (gnu_target_desig_type);
8741
8742 if (target_alias_set != 0
8743 && (!TYPE_IS_FAT_POINTER_P (gnu_source_type)
8744 || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type),
8745 target_alias_set)))
8746 {
8747 post_error_ne ("?possible aliasing problem for type&",
8748 gnat_node, Target_Type (gnat_node));
8749 post_error ("\\?use -fno-strict-aliasing switch for references",
8750 gnat_node);
8751 }
8752 }
8753 }
8754 \f
8755 /* EXP is to be treated as an array or record. Handle the cases when it is
8756 an access object and perform the required dereferences. */
8757
8758 static tree
8759 maybe_implicit_deref (tree exp)
8760 {
8761 /* If the type is a pointer, dereference it. */
8762 if (POINTER_TYPE_P (TREE_TYPE (exp))
8763 || TYPE_IS_FAT_POINTER_P (TREE_TYPE (exp)))
8764 exp = build_unary_op (INDIRECT_REF, NULL_TREE, exp);
8765
8766 /* If we got a padded type, remove it too. */
8767 if (TYPE_IS_PADDING_P (TREE_TYPE (exp)))
8768 exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
8769
8770 return exp;
8771 }
8772 \f
8773 /* Convert SLOC into LOCUS. Return true if SLOC corresponds to a source code
8774 location and false if it doesn't. In the former case, set the Gigi global
8775 variable REF_FILENAME to the simple debug file name as given by sinput. */
8776
8777 bool
8778 Sloc_to_locus (Source_Ptr Sloc, location_t *locus)
8779 {
8780 if (Sloc == No_Location)
8781 return false;
8782
8783 if (Sloc <= Standard_Location)
8784 {
8785 *locus = BUILTINS_LOCATION;
8786 return false;
8787 }
8788 else
8789 {
8790 Source_File_Index file = Get_Source_File_Index (Sloc);
8791 Logical_Line_Number line = Get_Logical_Line_Number (Sloc);
8792 Column_Number column = Get_Column_Number (Sloc);
8793 struct line_map *map = LINEMAPS_ORDINARY_MAP_AT (line_table, file - 1);
8794
8795 /* We can have zero if pragma Source_Reference is in effect. */
8796 if (line < 1)
8797 line = 1;
8798
8799 /* Translate the location. */
8800 *locus = linemap_position_for_line_and_column (map, line, column);
8801 }
8802
8803 ref_filename
8804 = IDENTIFIER_POINTER
8805 (get_identifier
8806 (Get_Name_String (Debug_Source_Name (Get_Source_File_Index (Sloc)))));;
8807
8808 return true;
8809 }
8810
8811 /* Similar to set_expr_location, but start with the Sloc of GNAT_NODE and
8812 don't do anything if it doesn't correspond to a source location. */
8813
8814 static void
8815 set_expr_location_from_node (tree node, Node_Id gnat_node)
8816 {
8817 location_t locus;
8818
8819 if (!Sloc_to_locus (Sloc (gnat_node), &locus))
8820 return;
8821
8822 SET_EXPR_LOCATION (node, locus);
8823 }
8824
8825 /* More elaborate version of set_expr_location_from_node to be used in more
8826 general contexts, for example the result of the translation of a generic
8827 GNAT node. */
8828
8829 static void
8830 set_gnu_expr_location_from_node (tree node, Node_Id gnat_node)
8831 {
8832 /* Set the location information on the node if it is a real expression.
8833 References can be reused for multiple GNAT nodes and they would get
8834 the location information of their last use. Also make sure not to
8835 overwrite an existing location as it is probably more precise. */
8836
8837 switch (TREE_CODE (node))
8838 {
8839 CASE_CONVERT:
8840 case NON_LVALUE_EXPR:
8841 break;
8842
8843 case COMPOUND_EXPR:
8844 if (EXPR_P (TREE_OPERAND (node, 1)))
8845 set_gnu_expr_location_from_node (TREE_OPERAND (node, 1), gnat_node);
8846
8847 /* ... fall through ... */
8848
8849 default:
8850 if (!REFERENCE_CLASS_P (node) && !EXPR_HAS_LOCATION (node))
8851 {
8852 set_expr_location_from_node (node, gnat_node);
8853 set_end_locus_from_node (node, gnat_node);
8854 }
8855 break;
8856 }
8857 }
8858 \f
8859 /* Return a colon-separated list of encodings contained in encoded Ada
8860 name. */
8861
8862 static const char *
8863 extract_encoding (const char *name)
8864 {
8865 char *encoding = (char *) ggc_alloc_atomic (strlen (name));
8866 get_encoding (name, encoding);
8867 return encoding;
8868 }
8869
8870 /* Extract the Ada name from an encoded name. */
8871
8872 static const char *
8873 decode_name (const char *name)
8874 {
8875 char *decoded = (char *) ggc_alloc_atomic (strlen (name) * 2 + 60);
8876 __gnat_decode (name, decoded, 0);
8877 return decoded;
8878 }
8879 \f
8880 /* Post an error message. MSG is the error message, properly annotated.
8881 NODE is the node at which to post the error and the node to use for the
8882 '&' substitution. */
8883
8884 void
8885 post_error (const char *msg, Node_Id node)
8886 {
8887 String_Template temp;
8888 Fat_Pointer fp;
8889
8890 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
8891 fp.Array = msg, fp.Bounds = &temp;
8892 if (Present (node))
8893 Error_Msg_N (fp, node);
8894 }
8895
8896 /* Similar to post_error, but NODE is the node at which to post the error and
8897 ENT is the node to use for the '&' substitution. */
8898
8899 void
8900 post_error_ne (const char *msg, Node_Id node, Entity_Id ent)
8901 {
8902 String_Template temp;
8903 Fat_Pointer fp;
8904
8905 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
8906 fp.Array = msg, fp.Bounds = &temp;
8907 if (Present (node))
8908 Error_Msg_NE (fp, node, ent);
8909 }
8910
8911 /* Similar to post_error_ne, but NUM is the number to use for the '^'. */
8912
8913 void
8914 post_error_ne_num (const char *msg, Node_Id node, Entity_Id ent, int num)
8915 {
8916 Error_Msg_Uint_1 = UI_From_Int (num);
8917 post_error_ne (msg, node, ent);
8918 }
8919
8920 /* Set the end_locus information for GNU_NODE, if any, from an explicit end
8921 location associated with GNAT_NODE or GNAT_NODE itself, whichever makes
8922 most sense. Return true if a sensible assignment was performed. */
8923
8924 static bool
8925 set_end_locus_from_node (tree gnu_node, Node_Id gnat_node)
8926 {
8927 Node_Id gnat_end_label = Empty;
8928 location_t end_locus;
8929
8930 /* Pick the GNAT node of which we'll take the sloc to assign to the GCC node
8931 end_locus when there is one. We consider only GNAT nodes with a possible
8932 End_Label attached. If the End_Label actually was unassigned, fallback
8933 on the orginal node. We'd better assign an explicit sloc associated with
8934 the outer construct in any case. */
8935
8936 switch (Nkind (gnat_node))
8937 {
8938 case N_Package_Body:
8939 case N_Subprogram_Body:
8940 case N_Block_Statement:
8941 gnat_end_label = End_Label (Handled_Statement_Sequence (gnat_node));
8942 break;
8943
8944 case N_Package_Declaration:
8945 gnat_end_label = End_Label (Specification (gnat_node));
8946 break;
8947
8948 default:
8949 return false;
8950 }
8951
8952 gnat_node = Present (gnat_end_label) ? gnat_end_label : gnat_node;
8953
8954 /* Some expanded subprograms have neither an End_Label nor a Sloc
8955 attached. Notify that to callers. */
8956
8957 if (!Sloc_to_locus (Sloc (gnat_node), &end_locus))
8958 return false;
8959
8960 switch (TREE_CODE (gnu_node))
8961 {
8962 case BIND_EXPR:
8963 BLOCK_SOURCE_END_LOCATION (BIND_EXPR_BLOCK (gnu_node)) = end_locus;
8964 return true;
8965
8966 case FUNCTION_DECL:
8967 DECL_STRUCT_FUNCTION (gnu_node)->function_end_locus = end_locus;
8968 return true;
8969
8970 default:
8971 return false;
8972 }
8973 }
8974 \f
8975 /* Similar to post_error_ne, but T is a GCC tree representing the number to
8976 write. If T represents a constant, the text inside curly brackets in
8977 MSG will be output (presumably including a '^'). Otherwise it will not
8978 be output and the text inside square brackets will be output instead. */
8979
8980 void
8981 post_error_ne_tree (const char *msg, Node_Id node, Entity_Id ent, tree t)
8982 {
8983 char *new_msg = XALLOCAVEC (char, strlen (msg) + 1);
8984 char start_yes, end_yes, start_no, end_no;
8985 const char *p;
8986 char *q;
8987
8988 if (TREE_CODE (t) == INTEGER_CST)
8989 {
8990 Error_Msg_Uint_1 = UI_From_gnu (t);
8991 start_yes = '{', end_yes = '}', start_no = '[', end_no = ']';
8992 }
8993 else
8994 start_yes = '[', end_yes = ']', start_no = '{', end_no = '}';
8995
8996 for (p = msg, q = new_msg; *p; p++)
8997 {
8998 if (*p == start_yes)
8999 for (p++; *p != end_yes; p++)
9000 *q++ = *p;
9001 else if (*p == start_no)
9002 for (p++; *p != end_no; p++)
9003 ;
9004 else
9005 *q++ = *p;
9006 }
9007
9008 *q = 0;
9009
9010 post_error_ne (new_msg, node, ent);
9011 }
9012
9013 /* Similar to post_error_ne_tree, but NUM is a second integer to write. */
9014
9015 void
9016 post_error_ne_tree_2 (const char *msg, Node_Id node, Entity_Id ent, tree t,
9017 int num)
9018 {
9019 Error_Msg_Uint_2 = UI_From_Int (num);
9020 post_error_ne_tree (msg, node, ent, t);
9021 }
9022 \f
9023 /* Initialize the table that maps GNAT codes to GCC codes for simple
9024 binary and unary operations. */
9025
9026 static void
9027 init_code_table (void)
9028 {
9029 gnu_codes[N_And_Then] = TRUTH_ANDIF_EXPR;
9030 gnu_codes[N_Or_Else] = TRUTH_ORIF_EXPR;
9031
9032 gnu_codes[N_Op_And] = TRUTH_AND_EXPR;
9033 gnu_codes[N_Op_Or] = TRUTH_OR_EXPR;
9034 gnu_codes[N_Op_Xor] = TRUTH_XOR_EXPR;
9035 gnu_codes[N_Op_Eq] = EQ_EXPR;
9036 gnu_codes[N_Op_Ne] = NE_EXPR;
9037 gnu_codes[N_Op_Lt] = LT_EXPR;
9038 gnu_codes[N_Op_Le] = LE_EXPR;
9039 gnu_codes[N_Op_Gt] = GT_EXPR;
9040 gnu_codes[N_Op_Ge] = GE_EXPR;
9041 gnu_codes[N_Op_Add] = PLUS_EXPR;
9042 gnu_codes[N_Op_Subtract] = MINUS_EXPR;
9043 gnu_codes[N_Op_Multiply] = MULT_EXPR;
9044 gnu_codes[N_Op_Mod] = FLOOR_MOD_EXPR;
9045 gnu_codes[N_Op_Rem] = TRUNC_MOD_EXPR;
9046 gnu_codes[N_Op_Minus] = NEGATE_EXPR;
9047 gnu_codes[N_Op_Abs] = ABS_EXPR;
9048 gnu_codes[N_Op_Not] = TRUTH_NOT_EXPR;
9049 gnu_codes[N_Op_Rotate_Left] = LROTATE_EXPR;
9050 gnu_codes[N_Op_Rotate_Right] = RROTATE_EXPR;
9051 gnu_codes[N_Op_Shift_Left] = LSHIFT_EXPR;
9052 gnu_codes[N_Op_Shift_Right] = RSHIFT_EXPR;
9053 gnu_codes[N_Op_Shift_Right_Arithmetic] = RSHIFT_EXPR;
9054 }
9055
9056 /* Return a label to branch to for the exception type in KIND or NULL_TREE
9057 if none. */
9058
9059 tree
9060 get_exception_label (char kind)
9061 {
9062 if (kind == N_Raise_Constraint_Error)
9063 return VEC_last (tree, gnu_constraint_error_label_stack);
9064 else if (kind == N_Raise_Storage_Error)
9065 return VEC_last (tree, gnu_storage_error_label_stack);
9066 else if (kind == N_Raise_Program_Error)
9067 return VEC_last (tree, gnu_program_error_label_stack);
9068 else
9069 return NULL_TREE;
9070 }
9071
9072 /* Return the decl for the current elaboration procedure. */
9073
9074 tree
9075 get_elaboration_procedure (void)
9076 {
9077 return VEC_last (tree, gnu_elab_proc_stack);
9078 }
9079
9080 #include "gt-ada-trans.h"