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