* gcc-interface/trans.c (process_freeze_entity): Be prepared for a
[official-gcc.git] / gcc / ada / gcc-interface / trans.c
blob7a83acfd0b40af7e24948e778b6a7f76544870f1
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 ****************************************************************************/
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"
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"
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
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;
85 /* Highest number in the front-end node table. */
86 int max_gnat_nodes;
88 /* Current node being treated, in case abort called. */
89 Node_Id error_gnat_node;
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;
96 /* List of N_Validate_Unchecked_Conversion nodes in the unit. */
97 static vec<Node_Id> gnat_validate_uc_list;
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;
110 typedef struct parm_attr_d *parm_attr;
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;
120 #define f_parm_attr_cache \
121 DECL_STRUCT_FUNCTION (current_function_decl)->language->parm_attr_cache
123 #define f_named_ret_val \
124 DECL_STRUCT_FUNCTION (current_function_decl)->language->named_ret_val
126 #define f_other_ret_val \
127 DECL_STRUCT_FUNCTION (current_function_decl)->language->other_ret_val
129 #define f_gnat_ret \
130 DECL_STRUCT_FUNCTION (current_function_decl)->language->gnat_ret
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. */
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. */
144 static GTY(()) struct stmt_group *current_stmt_group;
146 /* List of unused struct stmt_group nodes. */
147 static GTY((deletable)) struct stmt_group *stmt_group_free_list;
149 /* A structure used to record information on elaboration procedures
150 we've made and need to process.
152 ??? gnat_node should be Node_Id, but gengtype gets confused. */
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. */
160 static GTY(()) struct elab_info *elab_info_list;
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;
167 /* In ZCX case, current exception pointer. Used to re-raise it. */
168 static GTY(()) tree gnu_incoming_exc_ptr;
170 /* Stack for storing the current elaboration procedure decl. */
171 static GTY(()) vec<tree, va_gc> *gnu_elab_proc_stack;
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;
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;
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;
192 typedef struct range_check_info_d *range_check_info;
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;
207 typedef struct loop_info_d *loop_info;
210 /* Stack of loop_info structures associated with LOOP_STMT nodes. */
211 static GTY(()) vec<loop_info, va_gc> *gnu_loop_stack;
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;
218 /* Map GNAT tree codes to GCC tree codes for simple expressions. */
219 static enum tree_code gnu_codes[Number_Node_Kinds];
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);
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;
258 /* This is the main program of the back-end. It sets up all the table
259 structures and then generates code. */
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)
283 Node_Id gnat_iter;
284 Entity_Id gnat_literal;
285 tree t, ftype, int64_type;
286 struct elab_info *info;
287 int i;
289 max_gnat_nodes = max_gnat_node;
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;
301 type_annotate_only = (gigi_operating_mode == 1);
303 for (i = 0; i < number_file; i++)
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))));
316 /* We rely on the order isomorphism between files and line maps. */
317 gcc_assert ((int) LINEMAPS_ORDINARY_USED (line_table) == i);
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);
327 gcc_assert (Nkind (gnat_root) == N_Compilation_Unit);
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));
334 /* Initialize ourselves. */
335 init_code_table ();
336 init_gnat_decl ();
337 init_gnat_utils ();
339 /* If we are just annotating types, give VOID_TYPE zero sizes to avoid
340 errors. */
341 if (type_annotate_only)
343 TYPE_SIZE (void_type_node) = bitsize_zero_node;
344 TYPE_SIZE_UNIT (void_type_node) = size_zero_node;
347 /* Enable GNAT stack checking method if needed */
348 if (!Stack_Check_Probes_On_Target)
349 set_stack_check_libfunc ("_gnat_stack_check");
351 /* Retrieve alignment settings. */
352 double_float_alignment = get_target_double_float_alignment ();
353 double_scalar_alignment = get_target_double_scalar_alignment ();
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);
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);
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);
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);
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);
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;
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);
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);
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);
430 /* Name of the _Parent field in tagged record types. */
431 parent_name_id = get_identifier (Get_Name_String (Name_uParent));
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");
437 /* Make the types and functions used for exception processing. */
438 except_type_node = gnat_to_gnu_type (Base_Type (standard_exception_type));
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);
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);
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);
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);
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)
471 not_handled_by_others_decl = t;
472 break;
474 gcc_assert (DECL_P (not_handled_by_others_decl));
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;
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;
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);
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);
514 /* Hooks to call when entering/leaving an exception handler. */
515 ftype = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
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;
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);
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);
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);
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);
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);
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);
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 ())
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;
587 else
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);
601 /* Build the special descriptor type and its null node if needed. */
602 if (TARGET_VTABLE_USES_DESCRIPTORS)
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;
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);
614 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; j++)
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--;
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);
631 longest_float_type_node
632 = get_unpadded_type (Base_Type (standard_long_long_float));
634 main_identifier_node = get_identifier ("main");
636 /* If we are using the GCC exception mechanism, let GCC know. */
637 if (Back_End_Exceptions ())
638 gnat_init_gcc_eh ();
640 /* Initialize the GCC support for FP operations. */
641 gnat_init_gcc_fp ();
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 ();
648 vec_safe_push (gnu_except_ptr_stack, NULL_TREE);
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);
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))));
659 /* Force -fno-strict-aliasing if the configuration pragma was seen. */
660 if (No_Strict_Aliasing_CP)
661 flag_strict_aliasing = 0;
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;
668 /* Now translate the compilation unit proper. */
669 Compilation_Unit_to_gnu (gnat_root);
671 /* Disable -Waggressive-loop-optimizations since we implement our own
672 version of the warning. */
673 warn_aggressive_loop_optimizations = 0;
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 ();
682 /* Finally see if we have any elaboration procedures to deal with. */
683 for (info = elab_info_list; info; info = info->next)
685 tree gnu_body = DECL_SAVED_TREE (info->elab_proc);
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
697 begin_subprog_body (info->elab_proc);
698 end_subprog_body (gnu_body);
699 rest_of_subprog_body_compilation (info->elab_proc);
703 /* Destroy ourselves. */
704 destroy_gnat_decl ();
705 destroy_gnat_utils ();
707 /* We cannot track the location of errors past this point. */
708 error_gnat_node = Empty;
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. */
714 static tree
715 build_raise_check (int check, enum exception_info_kind kind)
717 tree result, ftype;
718 const char pfx[] = "__gnat_rcheck_";
720 strcpy (Name_Buffer, pfx);
721 Name_Len = sizeof (pfx) - 1;
722 Get_RT_Exception_Name (check);
724 if (kind == exception_simple)
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);
732 else
734 tree t = (kind == exception_column ? NULL_TREE : integer_type_node);
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);
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);
752 return result;
755 /* Return a positive value if an lvalue is required for GNAT_NODE, which is
756 an N_Attribute_Reference. */
758 static int
759 lvalue_required_for_attribute_p (Node_Id gnat_node)
761 switch (Get_Attribute_Id (Attribute_Name (gnat_node)))
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;
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;
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.
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. */
817 static int
818 lvalue_required_p (Node_Id gnat_node, tree gnu_type, bool constant,
819 bool address_of_constant, bool aliased)
821 Node_Id gnat_parent = Parent (gnat_node), gnat_temp;
823 switch (Nkind (gnat_parent))
825 case N_Reference:
826 return 1;
828 case N_Attribute_Reference:
829 return lvalue_required_for_attribute_p (gnat_parent);
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));
839 case N_Indexed_Component:
840 /* Only the array expression can require an lvalue. */
841 if (Prefix (gnat_parent) != gnat_node)
842 return 0;
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;
857 /* ... fall through ... */
859 case N_Slice:
860 /* Only the array expression can require an lvalue. */
861 if (Prefix (gnat_parent) != gnat_node)
862 return 0;
864 aliased |= Has_Aliased_Components (Etype (gnat_node));
865 return lvalue_required_p (gnat_parent, gnu_type, constant,
866 address_of_constant, aliased);
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);
873 case N_Object_Renaming_Declaration:
874 /* We need to preserve addresses through a renaming. */
875 return 1;
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);
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)))));
899 case N_Unchecked_Type_Conversion:
900 if (!constant)
901 return 1;
903 /* ... fall through ... */
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);
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)));
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);
927 /* ... fall through ... */
929 default:
930 return 0;
933 gcc_unreachable ();
936 /* Return true if T is a constant DECL node that can be safely replaced
937 by its initializer. */
939 static bool
940 constant_decl_with_initializer_p (tree t)
942 if (!TREE_CONSTANT (t) || !DECL_P (t) || !DECL_INITIAL (t))
943 return false;
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;
952 return true;
955 /* Return an expression equivalent to EXP but where constant DECL nodes
956 have been replaced by their initializer. */
958 static tree
959 fold_constant_decl_in_expr (tree exp)
961 enum tree_code code = TREE_CODE (exp);
962 tree op0;
964 switch (code)
966 case CONST_DECL:
967 case VAR_DECL:
968 if (!constant_decl_with_initializer_p (exp))
969 return exp;
971 return DECL_INITIAL (exp);
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;
978 return fold_build3 (COMPONENT_REF, TREE_TYPE (exp), op0,
979 TREE_OPERAND (exp, 1), NULL_TREE);
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;
986 return fold_build3 (BIT_FIELD_REF, TREE_TYPE (exp), op0,
987 TREE_OPERAND (exp, 1), TREE_OPERAND (exp, 2));
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;
998 return fold (build4 (code, TREE_TYPE (exp), op0, TREE_OPERAND (exp, 1),
999 TREE_OPERAND (exp, 2), NULL_TREE));
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;
1008 return fold_build1 (code, TREE_TYPE (exp), op0);
1010 default:
1011 return exp;
1014 gcc_unreachable ();
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. */
1021 static tree
1022 Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
1024 Node_Id gnat_temp, gnat_temp_type;
1025 tree gnu_result, gnu_result_type;
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;
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;
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);
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)));
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.
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)))
1089 gnat_temp = Full_View (gnat_temp);
1090 gnat_temp_type = Etype (gnat_temp);
1092 else
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);
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);
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)))
1126 require_lvalue = lvalue_required_p (gnat_node, gnu_result_type, true,
1127 false, Is_Aliased (gnat_temp));
1128 use_constant_initializer = !require_lvalue;
1131 if (use_constant_initializer)
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);
1138 gnu_result = gnat_to_gnu (Expression (Declaration_Node (gnat_temp)));
1140 else
1141 gnu_result = gnat_to_gnu_entity (gnat_temp, NULL_TREE, false);
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))))
1152 const bool read_only = DECL_POINTS_TO_READONLY_P (gnu_result);
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);
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);
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);
1173 /* Otherwise, do the final dereference. */
1174 else
1176 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
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;
1183 if (read_only)
1184 TREE_READONLY (gnu_result) = 1;
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))
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));
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));
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);
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)))
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);
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))
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));
1244 *gnu_result_type_p = gnu_result_type;
1246 return gnu_result;
1249 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Pragma. Return
1250 any statements we generate. */
1252 static tree
1253 Pragma_to_gnu (Node_Id gnat_node)
1255 tree gnu_result = alloc_stmt_list ();
1256 unsigned char pragma_id;
1257 Node_Id gnat_temp;
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;
1265 pragma_id = Get_Pragma_Id (Chars (Pragma_Identifier (gnat_node)));
1266 switch (pragma_id)
1268 case Pragma_Inspection_Point:
1269 /* Do nothing at top level: all such variables are already viewable. */
1270 if (global_bindings_p ())
1271 break;
1273 for (gnat_temp = First (Pragma_Argument_Associations (gnat_node));
1274 Present (gnat_temp);
1275 gnat_temp = Next (gnat_temp))
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
1287 if (TREE_CODE (gnu_expr) == UNCONSTRAINED_ARRAY_REF)
1288 gnu_expr = TREE_OPERAND (gnu_expr, 0);
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);
1296 if (use_address)
1297 gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
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);
1321 break;
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))
1328 tree gnu_loop_stmt = gnu_loop_stack->last ()->stmt;
1330 switch (Chars (Expression (gnat_temp)))
1332 case Name_Ivdep:
1333 LOOP_STMT_IVDEP (gnu_loop_stmt) = 1;
1334 break;
1336 case Name_No_Unroll:
1337 LOOP_STMT_NO_UNROLL (gnu_loop_stmt) = 1;
1338 break;
1340 case Name_Unroll:
1341 LOOP_STMT_UNROLL (gnu_loop_stmt) = 1;
1342 break;
1344 case Name_No_Vector:
1345 LOOP_STMT_NO_VECTOR (gnu_loop_stmt) = 1;
1346 break;
1348 case Name_Vector:
1349 LOOP_STMT_VECTOR (gnu_loop_stmt) = 1;
1350 break;
1352 default:
1353 gcc_unreachable ();
1356 break;
1358 case Pragma_Optimize:
1359 switch (Chars (Expression
1360 (First (Pragma_Argument_Associations (gnat_node)))))
1362 case Name_Off:
1363 if (optimize)
1364 post_error ("must specify -O0?", gnat_node);
1365 break;
1367 case Name_Space:
1368 if (!optimize_size)
1369 post_error ("must specify -Os?", gnat_node);
1370 break;
1372 case Name_Time:
1373 if (!optimize)
1374 post_error ("insufficient -O value?", gnat_node);
1375 break;
1377 default:
1378 gcc_unreachable ();
1380 break;
1382 case Pragma_Reviewable:
1383 if (write_symbols == NO_DEBUG)
1384 post_error ("must specify -g?", gnat_node);
1385 break;
1387 case Pragma_Warning_As_Error:
1388 case Pragma_Warnings:
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;
1398 gnat_temp = First (Pragma_Argument_Associations (gnat_node));
1400 /* This is the String form: pragma Warning{s|_As_Error}(String). */
1401 if (Nkind (Expression (gnat_temp)) == N_String_Literal)
1403 switch (pragma_id)
1405 case Pragma_Warning_As_Error:
1406 kind = DK_ERROR;
1407 imply = false;
1408 break;
1410 case Pragma_Warnings:
1411 kind = DK_WARNING;
1412 imply = true;
1413 break;
1415 default:
1416 gcc_unreachable ();
1419 gnat_expr = Expression (gnat_temp);
1422 /* This is the On/Off form: pragma Warnings (On | Off [,String]). */
1423 else if (Nkind (Expression (gnat_temp)) == N_Identifier)
1425 switch (Chars (Expression (gnat_temp)))
1427 case Name_Off:
1428 kind = DK_IGNORED;
1429 break;
1431 case Name_On:
1432 kind = DK_WARNING;
1433 break;
1435 default:
1436 gcc_unreachable ();
1439 /* Deal with optional pattern (but ignore Reason => "..."). */
1440 if (Present (Next (gnat_temp))
1441 && Chars (Next (gnat_temp)) != Name_Reason)
1443 /* pragma Warnings (On | Off, Name) is handled differently. */
1444 if (Nkind (Expression (Next (gnat_temp))) != N_String_Literal)
1445 break;
1447 gnat_expr = Expression (Next (gnat_temp));
1449 else
1450 gnat_expr = Empty;
1452 imply = false;
1455 else
1456 gcc_unreachable ();
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))
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)
1471 post_error ("?unknown -W switch", gnat_node);
1472 break;
1474 else if (!(cl_options[option_index].flags & CL_WARNING))
1476 post_error ("?-W switch does not control warning", gnat_node);
1477 break;
1479 else if (!(cl_options[option_index].flags & lang_mask))
1481 post_error ("?-W switch not valid for Ada", gnat_node);
1482 break;
1484 if (cl_options[option_index].flags & CL_JOINED)
1485 arg = option_string + 1 + cl_options[option_index].opt_len;
1487 else
1488 option_index = 0;
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);
1495 break;
1497 default:
1498 break;
1501 return gnu_result;
1505 /* Check the inline status of nested function FNDECL wrt its parent function.
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.
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. */
1518 static void
1519 check_inlining_for_nested_subprog (tree fndecl)
1521 if (DECL_IGNORED_P (current_function_decl) || DECL_IGNORED_P (fndecl))
1522 return;
1524 if (DECL_DECLARED_INLINE_P (fndecl))
1525 return;
1527 tree parent_decl = decl_function_context (fndecl);
1528 if (DECL_EXTERNAL (parent_decl) && DECL_DECLARED_INLINE_P (parent_decl))
1530 const location_t loc1 = DECL_SOURCE_LOCATION (fndecl);
1531 const location_t loc2 = DECL_SOURCE_LOCATION (parent_decl);
1533 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (parent_decl)))
1535 error_at (loc1, "subprogram %q+F not marked Inline_Always", fndecl);
1536 error_at (loc2, "parent subprogram cannot be inlined");
1538 else
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");
1545 DECL_DECLARED_INLINE_P (parent_decl) = 0;
1546 DECL_UNINLINABLE (parent_decl) = 1;
1550 /* Return an expression for the length of TYPE, an integral type, computed in
1551 RESULT_TYPE, another integral type.
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. */
1561 static tree
1562 get_type_length (tree type, tree result_type)
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;
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. */
1586 static tree
1587 Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
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;
1595 /* If the input is a NULL_EXPR, make a new one. */
1596 if (TREE_CODE (gnu_prefix) == NULL_EXPR)
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));
1603 switch (attribute)
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;
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;
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;
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);
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)))
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;
1660 gnu_result_type = get_unpadded_type (Etype (gnat_node));
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)
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);
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++)
1679 if (build_descriptor)
1681 t = build2 (FDESC_EXPR, TREE_TYPE (gnu_field), gnu_prefix,
1682 build_int_cst (NULL_TREE, i));
1683 TREE_CONSTANT (t) = 1;
1685 else
1686 t = build3 (COMPONENT_REF, ptr_void_ftype, gnu_result,
1687 gnu_field, NULL_TREE);
1689 elt->index = gnu_field;
1690 elt->value = t;
1691 elt--;
1694 gnu_result = gnat_build_constructor (gnu_result_type, gnu_vec);
1695 break;
1698 /* ... fall through ... */
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);
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)
1715 gnu_expr = remove_conversions (gnu_result, false);
1717 if (TREE_CODE (gnu_expr) == ADDR_EXPR)
1718 TREE_NO_TRAMPOLINE (gnu_expr) = TREE_CONSTANT (gnu_expr) = 1;
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));
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);
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)
1746 gnu_expr = remove_conversions (gnu_result, false);
1748 if (TREE_CODE (gnu_expr) == ADDR_EXPR
1749 && decl_function_context (TREE_OPERAND (gnu_expr, 0)))
1751 set_expr_location_from_node (gnu_expr, gnat_node);
1753 /* Also check the inlining status. */
1754 check_inlining_for_nested_subprog (TREE_OPERAND (gnu_expr, 0));
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;
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);
1771 break;
1773 case Attr_Pool_Address:
1775 tree gnu_ptr = gnu_prefix;
1776 tree gnu_obj_type;
1778 gnu_result_type = get_unpadded_type (Etype (gnat_node));
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);
1790 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
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)))));
1804 gnu_result = convert (gnu_result_type, gnu_ptr);
1806 break;
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;
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);
1826 gnu_prefix = remove_conversions (gnu_prefix, true);
1827 prefix_unused = true;
1828 gnu_type = TREE_TYPE (gnu_prefix);
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)
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)));
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));
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)
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)
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)));
1867 if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type)
1868 && Present (gnat_actual_subtype))
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);
1880 gnu_result = TYPE_SIZE (gnu_type);
1883 /* Otherwise, the result is the RM size of the type. */
1884 else
1885 gnu_result = rm_size (gnu_type);
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))
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);
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)));
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);
1907 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1908 break;
1910 case Attr_Alignment:
1912 unsigned int align;
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);
1918 gnu_type = TREE_TYPE (gnu_prefix);
1919 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1920 prefix_unused = true;
1922 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1923 align = DECL_ALIGN (TREE_OPERAND (gnu_prefix, 1)) / BITS_PER_UNIT;
1924 else
1926 Entity_Id gnat_type = Etype (gnat_prefix);
1927 unsigned int double_align;
1928 bool is_capped_double, align_clause;
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;
1942 if (is_capped_double
1943 && Nkind (gnat_prefix) == N_Identifier
1944 && Present (Alignment_Clause (Entity (gnat_prefix))))
1945 align_clause = true;
1947 if (is_capped_double && !align_clause)
1948 align = double_align;
1949 else
1950 align = TYPE_ALIGN (gnu_type) / BITS_PER_UNIT;
1953 gnu_result = size_int (align);
1955 break;
1957 case Attr_First:
1958 case Attr_Last:
1959 case Attr_Range_Length:
1960 prefix_unused = true;
1962 if (INTEGRAL_TYPE_P (gnu_type) || TREE_CODE (gnu_type) == REAL_TYPE)
1964 gnu_result_type = get_unpadded_type (Etype (gnat_node));
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;
1975 /* ... fall through ... */
1977 case Attr_Length:
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;
1986 /* Make sure any implicit dereference gets done. */
1987 gnu_prefix = maybe_implicit_deref (gnu_prefix);
1988 gnu_prefix = maybe_unconstrained_array (gnu_prefix);
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))
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;
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)
2007 if (Can_Never_Be_Null (Entity (Prefix (gnat_prefix))))
2008 gnat_param = Entity (Prefix (gnat_prefix));
2010 else
2011 unconstrained_ptr_deref = true;
2012 break;
2014 default:
2015 break;
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);
2032 prefix_unused = true;
2033 gnu_result_type = get_unpadded_type (Etype (gnat_node));
2035 if (TYPE_CONVENTION_FORTRAN_P (gnu_type))
2037 int ndim;
2038 tree gnu_type_temp;
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))
2046 Dimension = ndim + 1 - Dimension;
2049 for (i = 1; i < Dimension; i++)
2050 gnu_type = TREE_TYPE (gnu_type);
2052 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
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))))
2066 FOR_EACH_VEC_SAFE_ELT (f_parm_attr_cache, i, pa)
2067 if (pa->id == gnat_param && pa->dim == Dimension)
2068 break;
2070 if (!pa)
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);
2079 /* Return the cached expression or build a new one. */
2080 if (attribute == Attr_First)
2082 if (pa && pa->first)
2084 gnu_result = pa->first;
2085 break;
2088 gnu_result
2089 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
2092 else if (attribute == Attr_Last)
2094 if (pa && pa->last)
2096 gnu_result = pa->last;
2097 break;
2100 gnu_result
2101 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
2104 else /* attribute == Attr_Range_Length || attribute == Attr_Length */
2106 if (pa && pa->length)
2108 gnu_result = pa->length;
2109 break;
2112 gnu_result
2113 = get_type_length (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)),
2114 gnu_result_type);
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);
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)
2129 gnu_result
2130 = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
2131 switch (attribute)
2133 case Attr_First:
2134 pa->first = gnu_result;
2135 break;
2137 case Attr_Last:
2138 pa->last = gnu_result;
2139 break;
2141 case Attr_Length:
2142 case Attr_Range_Length:
2143 pa->length = gnu_result;
2144 break;
2146 default:
2147 gcc_unreachable ();
2151 /* Otherwise, evaluate it each time it is referenced. */
2152 else
2153 switch (attribute)
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;
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;
2176 default:
2177 gcc_unreachable ();
2180 break;
2183 case Attr_Bit_Position:
2184 case Attr_Position:
2185 case Attr_First_Bit:
2186 case Attr_Last_Bit:
2187 case Attr_Bit:
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;
2198 gnu_result_type = get_unpadded_type (Etype (gnat_node));
2199 gnu_prefix = remove_conversions (gnu_prefix, true);
2200 prefix_unused = true;
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)
2208 gnu_result = integer_zero_node;
2209 break;
2212 else
2213 gcc_assert (TREE_CODE (gnu_prefix) == COMPONENT_REF
2214 || (attribute == Attr_Bit_Position
2215 && TREE_CODE (gnu_prefix) == FIELD_DECL));
2217 get_inner_reference (gnu_prefix, &bitsize, &bitpos, &gnu_offset,
2218 &mode, &unsignedp, &reversep, &volatilep);
2220 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
2222 gnu_field_bitpos = bit_position (TREE_OPERAND (gnu_prefix, 1));
2223 gnu_field_offset = byte_position (TREE_OPERAND (gnu_prefix, 1));
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))
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)));
2238 else if (TREE_CODE (gnu_prefix) == FIELD_DECL)
2240 gnu_field_bitpos = bit_position (gnu_prefix);
2241 gnu_field_offset = byte_position (gnu_prefix);
2243 else
2245 gnu_field_bitpos = bitsize_zero_node;
2246 gnu_field_offset = size_zero_node;
2249 switch (attribute)
2251 case Attr_Position:
2252 gnu_result = gnu_field_offset;
2253 break;
2255 case Attr_First_Bit:
2256 case Attr_Bit:
2257 gnu_result = size_int (bitpos % BITS_PER_UNIT);
2258 break;
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;
2273 case Attr_Bit_Position:
2274 gnu_result = gnu_field_bitpos;
2275 break;
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;
2284 case Attr_Min:
2285 case Attr_Max:
2287 tree gnu_lhs = gnat_to_gnu (First (Expressions (gnat_node)));
2288 tree gnu_rhs = gnat_to_gnu (Next (First (Expressions (gnat_node))));
2290 gnu_result_type = get_unpadded_type (Etype (gnat_node));
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)
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;
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);
2311 lhs_is_nan = fold_build2 (NE_EXPR, boolean_type_node,
2312 build_call_expr (t, 1, gnu_lhs),
2313 integer_zero_node);
2315 rhs_is_nan = fold_build2 (NE_EXPR, boolean_type_node,
2316 build_call_expr (t, 1, gnu_rhs),
2317 integer_zero_node);
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);
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);
2334 if (rhs_side_effects_p)
2335 gnu_result
2336 = build2 (COMPOUND_EXPR, gnu_result_type, gnu_rhs, gnu_result);
2338 else
2339 gnu_result = build_binary_op (attribute == Attr_Min
2340 ? MIN_EXPR : MAX_EXPR,
2341 gnu_result_type, gnu_lhs, gnu_rhs);
2343 break;
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;
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);
2356 gnu_prefix = maybe_implicit_deref (gnu_prefix);
2357 gnu_type = TREE_TYPE (gnu_prefix);
2359 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
2360 gnu_type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_type))));
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);
2366 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
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;
2374 case Attr_Descriptor_Size:
2375 gnu_type = TREE_TYPE (gnu_prefix);
2376 gcc_assert (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE);
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;
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;
2397 case Attr_Mechanism_Code:
2399 Entity_Id gnat_obj = Entity (gnat_prefix);
2400 int code;
2402 prefix_unused = true;
2403 gnu_result_type = get_unpadded_type (Etype (gnat_node));
2404 if (Present (Expressions (gnat_node)))
2406 int i = UI_To_Int (Intval (First (Expressions (gnat_node))));
2408 for (gnat_obj = First_Formal (gnat_obj); i > 1;
2409 i--, gnat_obj = Next_Formal (gnat_obj))
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));
2424 break;
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. */
2430 /* ... fall through ... */
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);
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))
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;
2453 finish_record_type (rec_type, field, 0, false);
2455 rec_val = build_constructor_single (rec_type, field, gnu_result);
2456 rec_val = build1 (SAVE_EXPR, rec_type, rec_val);
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;
2470 gnu_result
2471 = build_compound_expr (gnu_result_type, asm_expr,
2472 build_component_ref (rec_val, field,
2473 false));
2475 break;
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;
2489 default:
2490 /* This abort means that we have an unimplemented attribute. */
2491 gcc_unreachable ();
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);
2504 *gnu_result_type_p = gnu_result_type;
2505 return gnu_result;
2508 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Case_Statement,
2509 to a GCC tree, which is returned. */
2511 static tree
2512 Case_Statement_to_gnu (Node_Id gnat_node)
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;
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);
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 ();
2531 for (gnat_when = First_Non_Pragma (Alternatives (gnat_node));
2532 Present (gnat_when);
2533 gnat_when = Next_Non_Pragma (gnat_when))
2535 bool choices_added_p = false;
2536 Node_Id gnat_choice;
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))
2544 tree gnu_low = NULL_TREE, gnu_high = NULL_TREE;
2545 tree label = create_artificial_label (input_location);
2547 switch (Nkind (gnat_choice))
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;
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;
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)))
2567 tree gnu_type = get_unpadded_type (Entity (gnat_choice));
2569 gnu_low = TYPE_MIN_VALUE (gnu_type);
2570 gnu_high = TYPE_MAX_VALUE (gnu_type);
2571 break;
2574 /* ... fall through ... */
2576 case N_Character_Literal:
2577 case N_Integer_Literal:
2578 gnu_low = gnat_to_gnu (gnat_choice);
2579 break;
2581 case N_Others_Choice:
2582 break;
2584 default:
2585 gcc_unreachable ();
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);
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);
2597 add_stmt_with_node (build_case_label (gnu_low, gnu_high, label),
2598 gnat_choice);
2599 choices_added_p = true;
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)
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)
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;
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 = build2 (SWITCH_EXPR, gnu_type, gnu_expr, end_stmt_group ());
2630 return gnu_result;
2633 /* Return true if we are in the body of a loop. */
2635 static inline bool
2636 inside_loop_p (void)
2638 return !vec_safe_is_empty (gnu_loop_stack);
2641 /* Find out whether EXPR is a simple additive expression based on the iteration
2642 variable of some enclosing loop in the current function. If so, return the
2643 loop and set *DISP to the displacement and *NEG_P to true if this is for a
2644 subtraction; otherwise, return NULL. */
2646 static struct loop_info_d *
2647 find_loop_for (tree expr, tree *disp = NULL, bool *neg_p = NULL)
2649 tree var, add, cst;
2650 bool minus_p;
2651 struct loop_info_d *iter = NULL;
2652 unsigned int i;
2654 if (is_simple_additive_expression (expr, &add, &cst, &minus_p))
2656 var = add;
2657 if (disp)
2658 *disp = cst;
2659 if (neg_p)
2660 *neg_p = minus_p;
2662 else
2664 var = expr;
2665 if (disp)
2666 *disp = NULL_TREE;
2667 if (neg_p)
2668 *neg_p = false;
2671 var = remove_conversions (var, false);
2673 if (TREE_CODE (var) != VAR_DECL)
2674 return NULL;
2676 if (decl_function_context (var) != current_function_decl)
2677 return NULL;
2679 gcc_assert (vec_safe_length (gnu_loop_stack) > 0);
2681 FOR_EACH_VEC_ELT_REVERSE (*gnu_loop_stack, i, iter)
2682 if (var == iter->loop_var)
2683 break;
2685 return iter;
2688 /* Return true if VAL (of type TYPE) can equal the minimum value if MAX is
2689 false, or the maximum value if MAX is true, of TYPE. */
2691 static bool
2692 can_equal_min_or_max_val_p (tree val, tree type, bool max)
2694 tree min_or_max_val = (max ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type));
2696 if (TREE_CODE (min_or_max_val) != INTEGER_CST)
2697 return true;
2699 if (TREE_CODE (val) == NOP_EXPR)
2700 val = (max
2701 ? TYPE_MAX_VALUE (TREE_TYPE (TREE_OPERAND (val, 0)))
2702 : TYPE_MIN_VALUE (TREE_TYPE (TREE_OPERAND (val, 0))));
2704 if (TREE_CODE (val) != INTEGER_CST)
2705 return true;
2707 if (max)
2708 return tree_int_cst_lt (val, min_or_max_val) == 0;
2709 else
2710 return tree_int_cst_lt (min_or_max_val, val) == 0;
2713 /* Return true if VAL (of type TYPE) can equal the minimum value of TYPE.
2714 If REVERSE is true, minimum value is taken as maximum value. */
2716 static inline bool
2717 can_equal_min_val_p (tree val, tree type, bool reverse)
2719 return can_equal_min_or_max_val_p (val, type, reverse);
2722 /* Return true if VAL (of type TYPE) can equal the maximum value of TYPE.
2723 If REVERSE is true, maximum value is taken as minimum value. */
2725 static inline bool
2726 can_equal_max_val_p (tree val, tree type, bool reverse)
2728 return can_equal_min_or_max_val_p (val, type, !reverse);
2731 /* Return true if VAL1 can be lower than VAL2. */
2733 static bool
2734 can_be_lower_p (tree val1, tree val2)
2736 if (TREE_CODE (val1) == NOP_EXPR)
2737 val1 = TYPE_MIN_VALUE (TREE_TYPE (TREE_OPERAND (val1, 0)));
2739 if (TREE_CODE (val1) != INTEGER_CST)
2740 return true;
2742 if (TREE_CODE (val2) == NOP_EXPR)
2743 val2 = TYPE_MAX_VALUE (TREE_TYPE (TREE_OPERAND (val2, 0)));
2745 if (TREE_CODE (val2) != INTEGER_CST)
2746 return true;
2748 return tree_int_cst_lt (val1, val2);
2751 /* Replace EXPR1 and EXPR2 by invariant expressions if possible. Return
2752 true if both expressions have been replaced and false otherwise. */
2754 static bool
2755 make_invariant (tree *expr1, tree *expr2)
2757 tree inv_expr1 = gnat_invariant_expr (*expr1);
2758 tree inv_expr2 = gnat_invariant_expr (*expr2);
2760 if (inv_expr1)
2761 *expr1 = inv_expr1;
2763 if (inv_expr2)
2764 *expr2 = inv_expr2;
2766 return inv_expr1 && inv_expr2;
2769 /* Helper function for walk_tree, used by independent_iterations_p below. */
2771 static tree
2772 scan_rhs_r (tree *tp, int *walk_subtrees, void *data)
2774 bitmap *params = (bitmap *)data;
2775 tree t = *tp;
2777 /* No need to walk into types or decls. */
2778 if (IS_TYPE_OR_DECL_P (t))
2779 *walk_subtrees = 0;
2781 if (TREE_CODE (t) == PARM_DECL && bitmap_bit_p (*params, DECL_UID (t)))
2782 return t;
2784 return NULL_TREE;
2787 /* Return true if STMT_LIST generates independent iterations in a loop. */
2789 static bool
2790 independent_iterations_p (tree stmt_list)
2792 tree_stmt_iterator tsi;
2793 bitmap params = BITMAP_GGC_ALLOC();
2794 auto_vec<tree> rhs;
2795 tree iter;
2796 int i;
2798 if (TREE_CODE (stmt_list) == BIND_EXPR)
2799 stmt_list = BIND_EXPR_BODY (stmt_list);
2801 /* Scan the list and return false on anything that is not either a check
2802 or an assignment to a parameter with restricted aliasing. */
2803 for (tsi = tsi_start (stmt_list); !tsi_end_p (tsi); tsi_next (&tsi))
2805 tree stmt = tsi_stmt (tsi);
2807 switch (TREE_CODE (stmt))
2809 case COND_EXPR:
2811 if (COND_EXPR_ELSE (stmt))
2812 return false;
2813 if (TREE_CODE (COND_EXPR_THEN (stmt)) != CALL_EXPR)
2814 return false;
2815 tree func = get_callee_fndecl (COND_EXPR_THEN (stmt));
2816 if (!(func && TREE_THIS_VOLATILE (func)))
2817 return false;
2818 break;
2821 case MODIFY_EXPR:
2823 tree lhs = TREE_OPERAND (stmt, 0);
2824 while (handled_component_p (lhs))
2825 lhs = TREE_OPERAND (lhs, 0);
2826 if (TREE_CODE (lhs) != INDIRECT_REF)
2827 return false;
2828 lhs = TREE_OPERAND (lhs, 0);
2829 if (!(TREE_CODE (lhs) == PARM_DECL
2830 && DECL_RESTRICTED_ALIASING_P (lhs)))
2831 return false;
2832 bitmap_set_bit (params, DECL_UID (lhs));
2833 rhs.safe_push (TREE_OPERAND (stmt, 1));
2834 break;
2837 default:
2838 return false;
2842 /* At this point we know that the list contains only statements that will
2843 modify parameters with restricted aliasing. Check that the statements
2844 don't at the time read from these parameters. */
2845 FOR_EACH_VEC_ELT (rhs, i, iter)
2846 if (walk_tree_without_duplicates (&iter, scan_rhs_r, &params))
2847 return false;
2849 return true;
2852 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement,
2853 to a GCC tree, which is returned. */
2855 static tree
2856 Loop_Statement_to_gnu (Node_Id gnat_node)
2858 const Node_Id gnat_iter_scheme = Iteration_Scheme (gnat_node);
2859 struct loop_info_d *gnu_loop_info = ggc_cleared_alloc<loop_info_d> ();
2860 tree gnu_loop_stmt = build4 (LOOP_STMT, void_type_node, NULL_TREE,
2861 NULL_TREE, NULL_TREE, NULL_TREE);
2862 tree gnu_loop_label = create_artificial_label (input_location);
2863 tree gnu_cond_expr = NULL_TREE, gnu_low = NULL_TREE, gnu_high = NULL_TREE;
2864 tree gnu_result;
2866 /* Push the loop_info structure associated with the LOOP_STMT. */
2867 vec_safe_push (gnu_loop_stack, gnu_loop_info);
2869 /* Set location information for statement and end label. */
2870 set_expr_location_from_node (gnu_loop_stmt, gnat_node);
2871 Sloc_to_locus (Sloc (End_Label (gnat_node)),
2872 &DECL_SOURCE_LOCATION (gnu_loop_label));
2873 LOOP_STMT_LABEL (gnu_loop_stmt) = gnu_loop_label;
2875 /* Save the statement for later reuse. */
2876 gnu_loop_info->stmt = gnu_loop_stmt;
2877 gnu_loop_info->artificial = !Comes_From_Source (gnat_node);
2879 /* Set the condition under which the loop must keep going.
2880 For the case "LOOP .... END LOOP;" the condition is always true. */
2881 if (No (gnat_iter_scheme))
2884 /* For the case "WHILE condition LOOP ..... END LOOP;" it's immediate. */
2885 else if (Present (Condition (gnat_iter_scheme)))
2886 LOOP_STMT_COND (gnu_loop_stmt)
2887 = gnat_to_gnu (Condition (gnat_iter_scheme));
2889 /* Otherwise we have an iteration scheme and the condition is given by the
2890 bounds of the subtype of the iteration variable. */
2891 else
2893 Node_Id gnat_loop_spec = Loop_Parameter_Specification (gnat_iter_scheme);
2894 Entity_Id gnat_loop_var = Defining_Entity (gnat_loop_spec);
2895 Entity_Id gnat_type = Etype (gnat_loop_var);
2896 tree gnu_type = get_unpadded_type (gnat_type);
2897 tree gnu_base_type = maybe_character_type (get_base_type (gnu_type));
2898 tree gnu_one_node = build_int_cst (gnu_base_type, 1);
2899 tree gnu_loop_var, gnu_loop_iv, gnu_first, gnu_last, gnu_stmt;
2900 enum tree_code update_code, test_code, shift_code;
2901 bool reverse = Reverse_Present (gnat_loop_spec), use_iv = false;
2903 gnu_low = convert (gnu_base_type, TYPE_MIN_VALUE (gnu_type));
2904 gnu_high = convert (gnu_base_type, TYPE_MAX_VALUE (gnu_type));
2906 /* We must disable modulo reduction for the iteration variable, if any,
2907 in order for the loop comparison to be effective. */
2908 if (reverse)
2910 gnu_first = gnu_high;
2911 gnu_last = gnu_low;
2912 update_code = MINUS_NOMOD_EXPR;
2913 test_code = GE_EXPR;
2914 shift_code = PLUS_NOMOD_EXPR;
2916 else
2918 gnu_first = gnu_low;
2919 gnu_last = gnu_high;
2920 update_code = PLUS_NOMOD_EXPR;
2921 test_code = LE_EXPR;
2922 shift_code = MINUS_NOMOD_EXPR;
2925 /* We use two different strategies to translate the loop, depending on
2926 whether optimization is enabled.
2928 If it is, we generate the canonical loop form expected by the loop
2929 optimizer and the loop vectorizer, which is the do-while form:
2931 ENTRY_COND
2932 loop:
2933 TOP_UPDATE
2934 BODY
2935 BOTTOM_COND
2936 GOTO loop
2938 This avoids an implicit dependency on loop header copying and makes
2939 it possible to turn BOTTOM_COND into an inequality test.
2941 If optimization is disabled, loop header copying doesn't come into
2942 play and we try to generate the loop form with the fewer conditional
2943 branches. First, the default form, which is:
2945 loop:
2946 TOP_COND
2947 BODY
2948 BOTTOM_UPDATE
2949 GOTO loop
2951 It should catch most loops with constant ending point. Then, if we
2952 cannot, we try to generate the shifted form:
2954 loop:
2955 TOP_COND
2956 TOP_UPDATE
2957 BODY
2958 GOTO loop
2960 which should catch loops with constant starting point. Otherwise, if
2961 we cannot, we generate the fallback form:
2963 ENTRY_COND
2964 loop:
2965 BODY
2966 BOTTOM_COND
2967 BOTTOM_UPDATE
2968 GOTO loop
2970 which works in all cases. */
2972 if (optimize)
2974 /* We can use the do-while form directly if GNU_FIRST-1 doesn't
2975 overflow. */
2976 if (!can_equal_min_val_p (gnu_first, gnu_base_type, reverse))
2979 /* Otherwise, use the do-while form with the help of a special
2980 induction variable in the unsigned version of the base type
2981 or the unsigned version of the size type, whichever is the
2982 largest, in order to have wrap-around arithmetics for it. */
2983 else
2985 if (TYPE_PRECISION (gnu_base_type)
2986 > TYPE_PRECISION (size_type_node))
2987 gnu_base_type
2988 = gnat_type_for_size (TYPE_PRECISION (gnu_base_type), 1);
2989 else
2990 gnu_base_type = size_type_node;
2992 gnu_first = convert (gnu_base_type, gnu_first);
2993 gnu_last = convert (gnu_base_type, gnu_last);
2994 gnu_one_node = build_int_cst (gnu_base_type, 1);
2995 use_iv = true;
2998 gnu_first
2999 = build_binary_op (shift_code, gnu_base_type, gnu_first,
3000 gnu_one_node);
3001 LOOP_STMT_TOP_UPDATE_P (gnu_loop_stmt) = 1;
3002 LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt) = 1;
3004 else
3006 /* We can use the default form if GNU_LAST+1 doesn't overflow. */
3007 if (!can_equal_max_val_p (gnu_last, gnu_base_type, reverse))
3010 /* Otherwise, we can use the shifted form if neither GNU_FIRST-1 nor
3011 GNU_LAST-1 does. */
3012 else if (!can_equal_min_val_p (gnu_first, gnu_base_type, reverse)
3013 && !can_equal_min_val_p (gnu_last, gnu_base_type, reverse))
3015 gnu_first
3016 = build_binary_op (shift_code, gnu_base_type, gnu_first,
3017 gnu_one_node);
3018 gnu_last
3019 = build_binary_op (shift_code, gnu_base_type, gnu_last,
3020 gnu_one_node);
3021 LOOP_STMT_TOP_UPDATE_P (gnu_loop_stmt) = 1;
3024 /* Otherwise, use the fallback form. */
3025 else
3026 LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt) = 1;
3029 /* If we use the BOTTOM_COND, we can turn the test into an inequality
3030 test but we may have to add ENTRY_COND to protect the empty loop. */
3031 if (LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt))
3033 test_code = NE_EXPR;
3034 if (can_be_lower_p (gnu_high, gnu_low))
3036 gnu_cond_expr
3037 = build3 (COND_EXPR, void_type_node,
3038 build_binary_op (LE_EXPR, boolean_type_node,
3039 gnu_low, gnu_high),
3040 NULL_TREE, alloc_stmt_list ());
3041 set_expr_location_from_node (gnu_cond_expr, gnat_loop_spec);
3045 /* Open a new nesting level that will surround the loop to declare the
3046 iteration variable. */
3047 start_stmt_group ();
3048 gnat_pushlevel ();
3050 /* If we use the special induction variable, create it and set it to
3051 its initial value. Morever, the regular iteration variable cannot
3052 itself be initialized, lest the initial value wrapped around. */
3053 if (use_iv)
3055 gnu_loop_iv
3056 = create_init_temporary ("I", gnu_first, &gnu_stmt, gnat_loop_var);
3057 add_stmt (gnu_stmt);
3058 gnu_first = NULL_TREE;
3060 else
3061 gnu_loop_iv = NULL_TREE;
3063 /* Declare the iteration variable and set it to its initial value. */
3064 gnu_loop_var = gnat_to_gnu_entity (gnat_loop_var, gnu_first, true);
3065 if (DECL_BY_REF_P (gnu_loop_var))
3066 gnu_loop_var = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_loop_var);
3067 else if (use_iv)
3069 gcc_assert (DECL_LOOP_PARM_P (gnu_loop_var));
3070 SET_DECL_INDUCTION_VAR (gnu_loop_var, gnu_loop_iv);
3072 gnu_loop_info->loop_var = gnu_loop_var;
3073 gnu_loop_info->low_bound = gnu_low;
3074 gnu_loop_info->high_bound = gnu_high;
3076 /* Do all the arithmetics in the base type. */
3077 gnu_loop_var = convert (gnu_base_type, gnu_loop_var);
3079 /* Set either the top or bottom exit condition. */
3080 if (use_iv)
3081 LOOP_STMT_COND (gnu_loop_stmt)
3082 = build_binary_op (test_code, boolean_type_node, gnu_loop_iv,
3083 gnu_last);
3084 else
3085 LOOP_STMT_COND (gnu_loop_stmt)
3086 = build_binary_op (test_code, boolean_type_node, gnu_loop_var,
3087 gnu_last);
3089 /* Set either the top or bottom update statement and give it the source
3090 location of the iteration for better coverage info. */
3091 if (use_iv)
3093 gnu_stmt
3094 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_loop_iv,
3095 build_binary_op (update_code, gnu_base_type,
3096 gnu_loop_iv, gnu_one_node));
3097 set_expr_location_from_node (gnu_stmt, gnat_iter_scheme);
3098 append_to_statement_list (gnu_stmt,
3099 &LOOP_STMT_UPDATE (gnu_loop_stmt));
3100 gnu_stmt
3101 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_loop_var,
3102 gnu_loop_iv);
3103 set_expr_location_from_node (gnu_stmt, gnat_iter_scheme);
3104 append_to_statement_list (gnu_stmt,
3105 &LOOP_STMT_UPDATE (gnu_loop_stmt));
3107 else
3109 gnu_stmt
3110 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_loop_var,
3111 build_binary_op (update_code, gnu_base_type,
3112 gnu_loop_var, gnu_one_node));
3113 set_expr_location_from_node (gnu_stmt, gnat_iter_scheme);
3114 LOOP_STMT_UPDATE (gnu_loop_stmt) = gnu_stmt;
3118 /* If the loop was named, have the name point to this loop. In this case,
3119 the association is not a DECL node, but the end label of the loop. */
3120 if (Present (Identifier (gnat_node)))
3121 save_gnu_tree (Entity (Identifier (gnat_node)), gnu_loop_label, true);
3123 /* Make the loop body into its own block, so any allocated storage will be
3124 released every iteration. This is needed for stack allocation. */
3125 LOOP_STMT_BODY (gnu_loop_stmt)
3126 = build_stmt_group (Statements (gnat_node), true);
3127 TREE_SIDE_EFFECTS (gnu_loop_stmt) = 1;
3129 /* If we have an iteration scheme, then we are in a statement group. Add
3130 the LOOP_STMT to it, finish it and make it the "loop". */
3131 if (Present (gnat_iter_scheme) && No (Condition (gnat_iter_scheme)))
3133 /* First, if we have computed invariant conditions for range (or index)
3134 checks applied to the iteration variable, find out whether they can
3135 be evaluated to false at compile time; otherwise, if there are not
3136 too many of them, combine them with the original checks. If loop
3137 unswitching is enabled, do not require the loop bounds to be also
3138 invariant, as their evaluation will still be ahead of the loop. */
3139 if (vec_safe_length (gnu_loop_info->checks) > 0
3140 && (make_invariant (&gnu_low, &gnu_high) || flag_unswitch_loops))
3142 struct range_check_info_d *rci;
3143 unsigned int i, n_remaining_checks = 0;
3145 FOR_EACH_VEC_ELT (*gnu_loop_info->checks, i, rci)
3147 tree low_ok, high_ok;
3149 if (rci->low_bound)
3151 tree gnu_adjusted_low = convert (rci->type, gnu_low);
3152 if (rci->disp)
3153 gnu_adjusted_low
3154 = fold_build2 (rci->neg_p ? MINUS_EXPR : PLUS_EXPR,
3155 rci->type, gnu_adjusted_low, rci->disp);
3156 low_ok
3157 = build_binary_op (GE_EXPR, boolean_type_node,
3158 gnu_adjusted_low, rci->low_bound);
3160 else
3161 low_ok = boolean_true_node;
3163 if (rci->high_bound)
3165 tree gnu_adjusted_high = convert (rci->type, gnu_high);
3166 if (rci->disp)
3167 gnu_adjusted_high
3168 = fold_build2 (rci->neg_p ? MINUS_EXPR : PLUS_EXPR,
3169 rci->type, gnu_adjusted_high, rci->disp);
3170 high_ok
3171 = build_binary_op (LE_EXPR, boolean_type_node,
3172 gnu_adjusted_high, rci->high_bound);
3174 else
3175 high_ok = boolean_true_node;
3177 tree range_ok
3178 = build_binary_op (TRUTH_ANDIF_EXPR, boolean_type_node,
3179 low_ok, high_ok);
3181 rci->invariant_cond
3182 = build_unary_op (TRUTH_NOT_EXPR, boolean_type_node, range_ok);
3184 if (rci->invariant_cond == boolean_false_node)
3185 TREE_OPERAND (rci->inserted_cond, 0) = rci->invariant_cond;
3186 else
3187 n_remaining_checks++;
3190 /* Note that loop unswitching can only be applied a small number of
3191 times to a given loop (PARAM_MAX_UNSWITCH_LEVEL default to 3). */
3192 if (0 < n_remaining_checks && n_remaining_checks <= 3
3193 && optimize > 1 && !optimize_size)
3194 FOR_EACH_VEC_ELT (*gnu_loop_info->checks, i, rci)
3195 if (rci->invariant_cond != boolean_false_node)
3197 TREE_OPERAND (rci->inserted_cond, 0) = rci->invariant_cond;
3199 if (flag_unswitch_loops)
3200 add_stmt_with_node_force (rci->inserted_cond, gnat_node);
3204 /* Second, if loop vectorization is enabled and the iterations of the
3205 loop can easily be proved as independent, mark the loop. */
3206 if (optimize
3207 && flag_tree_loop_vectorize
3208 && independent_iterations_p (LOOP_STMT_BODY (gnu_loop_stmt)))
3209 LOOP_STMT_IVDEP (gnu_loop_stmt) = 1;
3211 add_stmt (gnu_loop_stmt);
3212 gnat_poplevel ();
3213 gnu_loop_stmt = end_stmt_group ();
3216 /* If we have an outer COND_EXPR, that's our result and this loop is its
3217 "true" statement. Otherwise, the result is the LOOP_STMT. */
3218 if (gnu_cond_expr)
3220 COND_EXPR_THEN (gnu_cond_expr) = gnu_loop_stmt;
3221 TREE_SIDE_EFFECTS (gnu_cond_expr) = 1;
3222 gnu_result = gnu_cond_expr;
3224 else
3225 gnu_result = gnu_loop_stmt;
3227 gnu_loop_stack->pop ();
3229 return gnu_result;
3232 /* This page implements a form of Named Return Value optimization modelled
3233 on the C++ optimization of the same name. The main difference is that
3234 we disregard any semantical considerations when applying it here, the
3235 counterpart being that we don't try to apply it to semantically loaded
3236 return types, i.e. types with the TYPE_BY_REFERENCE_P flag set.
3238 We consider a function body of the following GENERIC form:
3240 return_type R1;
3241 [...]
3242 RETURN_EXPR [<retval> = ...]
3243 [...]
3244 RETURN_EXPR [<retval> = R1]
3245 [...]
3246 return_type Ri;
3247 [...]
3248 RETURN_EXPR [<retval> = ...]
3249 [...]
3250 RETURN_EXPR [<retval> = Ri]
3251 [...]
3253 where the Ri are not addressable and we try to fulfill a simple criterion
3254 that would make it possible to replace one or several Ri variables by the
3255 single RESULT_DECL of the function.
3257 The first observation is that RETURN_EXPRs that don't directly reference
3258 any of the Ri variables on the RHS of their assignment are transparent wrt
3259 the optimization. This is because the Ri variables aren't addressable so
3260 any transformation applied to them doesn't affect the RHS; moreover, the
3261 assignment writes the full <retval> object so existing values are entirely
3262 discarded.
3264 This property can be extended to some forms of RETURN_EXPRs that reference
3265 the Ri variables, for example CONSTRUCTORs, but isn't true in the general
3266 case, in particular when function calls are involved.
3268 Therefore the algorithm is as follows:
3270 1. Collect the list of candidates for a Named Return Value (Ri variables
3271 on the RHS of assignments of RETURN_EXPRs) as well as the list of the
3272 other expressions on the RHS of such assignments.
3274 2. Prune the members of the first list (candidates) that are referenced
3275 by a member of the second list (expressions).
3277 3. Extract a set of candidates with non-overlapping live ranges from the
3278 first list. These are the Named Return Values.
3280 4. Adjust the relevant RETURN_EXPRs and replace the occurrences of the
3281 Named Return Values in the function with the RESULT_DECL.
3283 If the function returns an unconstrained type, things are a bit different
3284 because the anonymous return object is allocated on the secondary stack
3285 and RESULT_DECL is only a pointer to it. Each return object can be of a
3286 different size and is allocated separately so we need not care about the
3287 addressability and the aforementioned overlapping issues. Therefore, we
3288 don't collect the other expressions and skip step #2 in the algorithm. */
3290 struct nrv_data
3292 bitmap nrv;
3293 tree result;
3294 Node_Id gnat_ret;
3295 hash_set<tree> *visited;
3298 /* Return true if T is a Named Return Value. */
3300 static inline bool
3301 is_nrv_p (bitmap nrv, tree t)
3303 return TREE_CODE (t) == VAR_DECL && bitmap_bit_p (nrv, DECL_UID (t));
3306 /* Helper function for walk_tree, used by finalize_nrv below. */
3308 static tree
3309 prune_nrv_r (tree *tp, int *walk_subtrees, void *data)
3311 struct nrv_data *dp = (struct nrv_data *)data;
3312 tree t = *tp;
3314 /* No need to walk into types or decls. */
3315 if (IS_TYPE_OR_DECL_P (t))
3316 *walk_subtrees = 0;
3318 if (is_nrv_p (dp->nrv, t))
3319 bitmap_clear_bit (dp->nrv, DECL_UID (t));
3321 return NULL_TREE;
3324 /* Prune Named Return Values in BLOCK and return true if there is still a
3325 Named Return Value in BLOCK or one of its sub-blocks. */
3327 static bool
3328 prune_nrv_in_block (bitmap nrv, tree block)
3330 bool has_nrv = false;
3331 tree t;
3333 /* First recurse on the sub-blocks. */
3334 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
3335 has_nrv |= prune_nrv_in_block (nrv, t);
3337 /* Then make sure to keep at most one NRV per block. */
3338 for (t = BLOCK_VARS (block); t; t = DECL_CHAIN (t))
3339 if (is_nrv_p (nrv, t))
3341 if (has_nrv)
3342 bitmap_clear_bit (nrv, DECL_UID (t));
3343 else
3344 has_nrv = true;
3347 return has_nrv;
3350 /* Helper function for walk_tree, used by finalize_nrv below. */
3352 static tree
3353 finalize_nrv_r (tree *tp, int *walk_subtrees, void *data)
3355 struct nrv_data *dp = (struct nrv_data *)data;
3356 tree t = *tp;
3358 /* No need to walk into types. */
3359 if (TYPE_P (t))
3360 *walk_subtrees = 0;
3362 /* Change RETURN_EXPRs of NRVs to just refer to the RESULT_DECL; this is a
3363 nop, but differs from using NULL_TREE in that it indicates that we care
3364 about the value of the RESULT_DECL. */
3365 else if (TREE_CODE (t) == RETURN_EXPR
3366 && TREE_CODE (TREE_OPERAND (t, 0)) == INIT_EXPR)
3368 tree ret_val = TREE_OPERAND (TREE_OPERAND (t, 0), 1);
3370 /* Strip useless conversions around the return value. */
3371 if (gnat_useless_type_conversion (ret_val))
3372 ret_val = TREE_OPERAND (ret_val, 0);
3374 if (is_nrv_p (dp->nrv, ret_val))
3375 TREE_OPERAND (t, 0) = dp->result;
3378 /* Replace the DECL_EXPR of NRVs with an initialization of the RESULT_DECL,
3379 if needed. */
3380 else if (TREE_CODE (t) == DECL_EXPR
3381 && is_nrv_p (dp->nrv, DECL_EXPR_DECL (t)))
3383 tree var = DECL_EXPR_DECL (t), init;
3385 if (DECL_INITIAL (var))
3387 init = build_binary_op (INIT_EXPR, NULL_TREE, dp->result,
3388 DECL_INITIAL (var));
3389 SET_EXPR_LOCATION (init, EXPR_LOCATION (t));
3390 DECL_INITIAL (var) = NULL_TREE;
3392 else
3393 init = build_empty_stmt (EXPR_LOCATION (t));
3394 *tp = init;
3396 /* Identify the NRV to the RESULT_DECL for debugging purposes. */
3397 SET_DECL_VALUE_EXPR (var, dp->result);
3398 DECL_HAS_VALUE_EXPR_P (var) = 1;
3399 /* ??? Kludge to avoid an assertion failure during inlining. */
3400 DECL_SIZE (var) = bitsize_unit_node;
3401 DECL_SIZE_UNIT (var) = size_one_node;
3404 /* And replace all uses of NRVs with the RESULT_DECL. */
3405 else if (is_nrv_p (dp->nrv, t))
3406 *tp = convert (TREE_TYPE (t), dp->result);
3408 /* Avoid walking into the same tree more than once. Unfortunately, we
3409 can't just use walk_tree_without_duplicates because it would only
3410 call us for the first occurrence of NRVs in the function body. */
3411 if (dp->visited->add (*tp))
3412 *walk_subtrees = 0;
3414 return NULL_TREE;
3417 /* Likewise, but used when the function returns an unconstrained type. */
3419 static tree
3420 finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data)
3422 struct nrv_data *dp = (struct nrv_data *)data;
3423 tree t = *tp;
3425 /* No need to walk into types. */
3426 if (TYPE_P (t))
3427 *walk_subtrees = 0;
3429 /* We need to see the DECL_EXPR of NRVs before any other references so we
3430 walk the body of BIND_EXPR before walking its variables. */
3431 else if (TREE_CODE (t) == BIND_EXPR)
3432 walk_tree (&BIND_EXPR_BODY (t), finalize_nrv_unc_r, data, NULL);
3434 /* Change RETURN_EXPRs of NRVs to assign to the RESULT_DECL only the final
3435 return value built by the allocator instead of the whole construct. */
3436 else if (TREE_CODE (t) == RETURN_EXPR
3437 && TREE_CODE (TREE_OPERAND (t, 0)) == INIT_EXPR)
3439 tree ret_val = TREE_OPERAND (TREE_OPERAND (t, 0), 1);
3441 /* This is the construct returned by the allocator. */
3442 if (TREE_CODE (ret_val) == COMPOUND_EXPR
3443 && TREE_CODE (TREE_OPERAND (ret_val, 0)) == INIT_EXPR)
3445 tree rhs = TREE_OPERAND (TREE_OPERAND (ret_val, 0), 1);
3447 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (ret_val)))
3448 ret_val = CONSTRUCTOR_ELT (rhs, 1)->value;
3449 else
3450 ret_val = rhs;
3453 /* Strip useless conversions around the return value. */
3454 if (gnat_useless_type_conversion (ret_val)
3455 || TREE_CODE (ret_val) == VIEW_CONVERT_EXPR)
3456 ret_val = TREE_OPERAND (ret_val, 0);
3458 /* Strip unpadding around the return value. */
3459 if (TREE_CODE (ret_val) == COMPONENT_REF
3460 && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (ret_val, 0))))
3461 ret_val = TREE_OPERAND (ret_val, 0);
3463 /* Assign the new return value to the RESULT_DECL. */
3464 if (is_nrv_p (dp->nrv, ret_val))
3465 TREE_OPERAND (TREE_OPERAND (t, 0), 1)
3466 = TREE_OPERAND (DECL_INITIAL (ret_val), 0);
3469 /* Adjust the DECL_EXPR of NRVs to call the allocator and save the result
3470 into a new variable. */
3471 else if (TREE_CODE (t) == DECL_EXPR
3472 && is_nrv_p (dp->nrv, DECL_EXPR_DECL (t)))
3474 tree saved_current_function_decl = current_function_decl;
3475 tree var = DECL_EXPR_DECL (t);
3476 tree alloc, p_array, new_var, new_ret;
3477 vec<constructor_elt, va_gc> *v;
3478 vec_alloc (v, 2);
3480 /* Create an artificial context to build the allocation. */
3481 current_function_decl = decl_function_context (var);
3482 start_stmt_group ();
3483 gnat_pushlevel ();
3485 /* This will return a COMPOUND_EXPR with the allocation in the first
3486 arm and the final return value in the second arm. */
3487 alloc = build_allocator (TREE_TYPE (var), DECL_INITIAL (var),
3488 TREE_TYPE (dp->result),
3489 Procedure_To_Call (dp->gnat_ret),
3490 Storage_Pool (dp->gnat_ret),
3491 Empty, false);
3493 /* The new variable is built as a reference to the allocated space. */
3494 new_var
3495 = build_decl (DECL_SOURCE_LOCATION (var), VAR_DECL, DECL_NAME (var),
3496 build_reference_type (TREE_TYPE (var)));
3497 DECL_BY_REFERENCE (new_var) = 1;
3499 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (alloc)))
3501 tree cst = TREE_OPERAND (alloc, 1);
3503 /* The new initial value is a COMPOUND_EXPR with the allocation in
3504 the first arm and the value of P_ARRAY in the second arm. */
3505 DECL_INITIAL (new_var)
3506 = build2 (COMPOUND_EXPR, TREE_TYPE (new_var),
3507 TREE_OPERAND (alloc, 0),
3508 CONSTRUCTOR_ELT (cst, 0)->value);
3510 /* Build a modified CONSTRUCTOR that references NEW_VAR. */
3511 p_array = TYPE_FIELDS (TREE_TYPE (alloc));
3512 CONSTRUCTOR_APPEND_ELT (v, p_array,
3513 fold_convert (TREE_TYPE (p_array), new_var));
3514 CONSTRUCTOR_APPEND_ELT (v, DECL_CHAIN (p_array),
3515 CONSTRUCTOR_ELT (cst, 1)->value);
3516 new_ret = build_constructor (TREE_TYPE (alloc), v);
3518 else
3520 /* The new initial value is just the allocation. */
3521 DECL_INITIAL (new_var) = alloc;
3522 new_ret = fold_convert (TREE_TYPE (alloc), new_var);
3525 gnat_pushdecl (new_var, Empty);
3527 /* Destroy the artificial context and insert the new statements. */
3528 gnat_zaplevel ();
3529 *tp = end_stmt_group ();
3530 current_function_decl = saved_current_function_decl;
3532 /* Chain NEW_VAR immediately after VAR and ignore the latter. */
3533 DECL_CHAIN (new_var) = DECL_CHAIN (var);
3534 DECL_CHAIN (var) = new_var;
3535 DECL_IGNORED_P (var) = 1;
3537 /* Save the new return value and the dereference of NEW_VAR. */
3538 DECL_INITIAL (var)
3539 = build2 (COMPOUND_EXPR, TREE_TYPE (var), new_ret,
3540 build1 (INDIRECT_REF, TREE_TYPE (var), new_var));
3541 /* ??? Kludge to avoid messing up during inlining. */
3542 DECL_CONTEXT (var) = NULL_TREE;
3545 /* And replace all uses of NRVs with the dereference of NEW_VAR. */
3546 else if (is_nrv_p (dp->nrv, t))
3547 *tp = TREE_OPERAND (DECL_INITIAL (t), 1);
3549 /* Avoid walking into the same tree more than once. Unfortunately, we
3550 can't just use walk_tree_without_duplicates because it would only
3551 call us for the first occurrence of NRVs in the function body. */
3552 if (dp->visited->add (*tp))
3553 *walk_subtrees = 0;
3555 return NULL_TREE;
3558 /* Finalize the Named Return Value optimization for FNDECL. The NRV bitmap
3559 contains the candidates for Named Return Value and OTHER is a list of
3560 the other return values. GNAT_RET is a representative return node. */
3562 static void
3563 finalize_nrv (tree fndecl, bitmap nrv, vec<tree, va_gc> *other, Node_Id gnat_ret)
3565 struct cgraph_node *node;
3566 struct nrv_data data;
3567 walk_tree_fn func;
3568 unsigned int i;
3569 tree iter;
3571 /* We shouldn't be applying the optimization to return types that we aren't
3572 allowed to manipulate freely. */
3573 gcc_assert (!TYPE_IS_BY_REFERENCE_P (TREE_TYPE (TREE_TYPE (fndecl))));
3575 /* Prune the candidates that are referenced by other return values. */
3576 data.nrv = nrv;
3577 data.result = NULL_TREE;
3578 data.gnat_ret = Empty;
3579 data.visited = NULL;
3580 FOR_EACH_VEC_SAFE_ELT (other, i, iter)
3581 walk_tree_without_duplicates (&iter, prune_nrv_r, &data);
3582 if (bitmap_empty_p (nrv))
3583 return;
3585 /* Prune also the candidates that are referenced by nested functions. */
3586 node = cgraph_node::get_create (fndecl);
3587 for (node = node->nested; node; node = node->next_nested)
3588 walk_tree_without_duplicates (&DECL_SAVED_TREE (node->decl), prune_nrv_r,
3589 &data);
3590 if (bitmap_empty_p (nrv))
3591 return;
3593 /* Extract a set of NRVs with non-overlapping live ranges. */
3594 if (!prune_nrv_in_block (nrv, DECL_INITIAL (fndecl)))
3595 return;
3597 /* Adjust the relevant RETURN_EXPRs and replace the occurrences of NRVs. */
3598 data.nrv = nrv;
3599 data.result = DECL_RESULT (fndecl);
3600 data.gnat_ret = gnat_ret;
3601 data.visited = new hash_set<tree>;
3602 if (TYPE_RETURN_UNCONSTRAINED_P (TREE_TYPE (fndecl)))
3603 func = finalize_nrv_unc_r;
3604 else
3605 func = finalize_nrv_r;
3606 walk_tree (&DECL_SAVED_TREE (fndecl), func, &data, NULL);
3607 delete data.visited;
3610 /* Return true if RET_VAL can be used as a Named Return Value for the
3611 anonymous return object RET_OBJ. */
3613 static bool
3614 return_value_ok_for_nrv_p (tree ret_obj, tree ret_val)
3616 if (TREE_CODE (ret_val) != VAR_DECL)
3617 return false;
3619 if (TREE_THIS_VOLATILE (ret_val))
3620 return false;
3622 if (DECL_CONTEXT (ret_val) != current_function_decl)
3623 return false;
3625 if (TREE_STATIC (ret_val))
3626 return false;
3628 /* For the constrained case, test for addressability. */
3629 if (ret_obj && TREE_ADDRESSABLE (ret_val))
3630 return false;
3632 /* For the constrained case, test for overalignment. */
3633 if (ret_obj && DECL_ALIGN (ret_val) > DECL_ALIGN (ret_obj))
3634 return false;
3636 /* For the unconstrained case, test for bogus initialization. */
3637 if (!ret_obj
3638 && DECL_INITIAL (ret_val)
3639 && TREE_CODE (DECL_INITIAL (ret_val)) == NULL_EXPR)
3640 return false;
3642 return true;
3645 /* Build a RETURN_EXPR. If RET_VAL is non-null, build a RETURN_EXPR around
3646 the assignment of RET_VAL to RET_OBJ. Otherwise build a bare RETURN_EXPR
3647 around RESULT_OBJ, which may be null in this case. */
3649 static tree
3650 build_return_expr (tree ret_obj, tree ret_val)
3652 tree result_expr;
3654 if (ret_val)
3656 /* The gimplifier explicitly enforces the following invariant:
3658 RETURN_EXPR
3660 INIT_EXPR
3663 RET_OBJ ...
3665 As a consequence, type consistency dictates that we use the type
3666 of the RET_OBJ as the operation type. */
3667 tree operation_type = TREE_TYPE (ret_obj);
3669 /* Convert the right operand to the operation type. Note that this is
3670 the transformation applied in the INIT_EXPR case of build_binary_op,
3671 with the assumption that the type cannot involve a placeholder. */
3672 if (operation_type != TREE_TYPE (ret_val))
3673 ret_val = convert (operation_type, ret_val);
3675 /* We always can use an INIT_EXPR for the return object. */
3676 result_expr = build2 (INIT_EXPR, void_type_node, ret_obj, ret_val);
3678 /* If the function returns an aggregate type, find out whether this is
3679 a candidate for Named Return Value. If so, record it. Otherwise,
3680 if this is an expression of some kind, record it elsewhere. */
3681 if (optimize
3682 && AGGREGATE_TYPE_P (operation_type)
3683 && !TYPE_IS_FAT_POINTER_P (operation_type)
3684 && TYPE_MODE (operation_type) == BLKmode
3685 && aggregate_value_p (operation_type, current_function_decl))
3687 /* Strip useless conversions around the return value. */
3688 if (gnat_useless_type_conversion (ret_val))
3689 ret_val = TREE_OPERAND (ret_val, 0);
3691 /* Now apply the test to the return value. */
3692 if (return_value_ok_for_nrv_p (ret_obj, ret_val))
3694 if (!f_named_ret_val)
3695 f_named_ret_val = BITMAP_GGC_ALLOC ();
3696 bitmap_set_bit (f_named_ret_val, DECL_UID (ret_val));
3699 /* Note that we need not care about CONSTRUCTORs here, as they are
3700 totally transparent given the read-compose-write semantics of
3701 assignments from CONSTRUCTORs. */
3702 else if (EXPR_P (ret_val))
3703 vec_safe_push (f_other_ret_val, ret_val);
3706 else
3707 result_expr = ret_obj;
3709 return build1 (RETURN_EXPR, void_type_node, result_expr);
3712 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Subprogram_Body. We
3713 don't return anything. */
3715 static void
3716 Subprogram_Body_to_gnu (Node_Id gnat_node)
3718 /* Defining identifier of a parameter to the subprogram. */
3719 Entity_Id gnat_param;
3720 /* The defining identifier for the subprogram body. Note that if a
3721 specification has appeared before for this body, then the identifier
3722 occurring in that specification will also be a defining identifier and all
3723 the calls to this subprogram will point to that specification. */
3724 Entity_Id gnat_subprog_id
3725 = (Present (Corresponding_Spec (gnat_node))
3726 ? Corresponding_Spec (gnat_node) : Defining_Entity (gnat_node));
3727 /* The FUNCTION_DECL node corresponding to the subprogram spec. */
3728 tree gnu_subprog_decl;
3729 /* Its RESULT_DECL node. */
3730 tree gnu_result_decl;
3731 /* Its FUNCTION_TYPE node. */
3732 tree gnu_subprog_type;
3733 /* The TYPE_CI_CO_LIST of its FUNCTION_TYPE node, if any. */
3734 tree gnu_cico_list;
3735 /* The entry in the CI_CO_LIST that represents a function return, if any. */
3736 tree gnu_return_var_elmt = NULL_TREE;
3737 tree gnu_result;
3738 location_t locus;
3739 struct language_function *gnu_subprog_language;
3740 vec<parm_attr, va_gc> *cache;
3742 /* If this is a generic object or if it has been eliminated,
3743 ignore it. */
3744 if (Ekind (gnat_subprog_id) == E_Generic_Procedure
3745 || Ekind (gnat_subprog_id) == E_Generic_Function
3746 || Is_Eliminated (gnat_subprog_id))
3747 return;
3749 /* If this subprogram acts as its own spec, define it. Otherwise, just get
3750 the already-elaborated tree node. However, if this subprogram had its
3751 elaboration deferred, we will already have made a tree node for it. So
3752 treat it as not being defined in that case. Such a subprogram cannot
3753 have an address clause or a freeze node, so this test is safe, though it
3754 does disable some otherwise-useful error checking. */
3755 gnu_subprog_decl
3756 = gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE,
3757 Acts_As_Spec (gnat_node)
3758 && !present_gnu_tree (gnat_subprog_id));
3759 DECL_FUNCTION_IS_DEF (gnu_subprog_decl) = true;
3760 gnu_result_decl = DECL_RESULT (gnu_subprog_decl);
3761 gnu_subprog_type = TREE_TYPE (gnu_subprog_decl);
3762 gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
3763 if (gnu_cico_list && TREE_VALUE (gnu_cico_list) == void_type_node)
3764 gnu_return_var_elmt = gnu_cico_list;
3766 /* If the function returns by invisible reference, make it explicit in the
3767 function body. See gnat_to_gnu_entity, E_Subprogram_Type case. */
3768 if (TREE_ADDRESSABLE (gnu_subprog_type))
3770 TREE_TYPE (gnu_result_decl)
3771 = build_reference_type (TREE_TYPE (gnu_result_decl));
3772 relayout_decl (gnu_result_decl);
3775 /* Set the line number in the decl to correspond to that of the body. */
3776 Sloc_to_locus (Sloc (gnat_node), &locus);
3777 DECL_SOURCE_LOCATION (gnu_subprog_decl) = locus;
3779 /* If the body comes from an expression function, arrange it to be inlined
3780 in almost all cases. */
3781 if (Was_Expression_Function (gnat_node))
3782 DECL_DISREGARD_INLINE_LIMITS (gnu_subprog_decl) = 1;
3784 /* Initialize the information structure for the function. */
3785 allocate_struct_function (gnu_subprog_decl, false);
3786 gnu_subprog_language = ggc_cleared_alloc<language_function> ();
3787 DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language = gnu_subprog_language;
3788 DECL_STRUCT_FUNCTION (gnu_subprog_decl)->function_start_locus = locus;
3789 set_cfun (NULL);
3791 begin_subprog_body (gnu_subprog_decl);
3793 /* If there are copy-in/copy-out parameters, we need to ensure that they are
3794 properly copied out by the return statement. We do this by making a new
3795 block and converting any return into a goto to a label at the end of the
3796 block. */
3797 if (gnu_cico_list)
3799 tree gnu_return_var = NULL_TREE;
3801 vec_safe_push (gnu_return_label_stack,
3802 create_artificial_label (input_location));
3804 start_stmt_group ();
3805 gnat_pushlevel ();
3807 /* If this is a function with copy-in/copy-out parameters and which does
3808 not return by invisible reference, we also need a variable for the
3809 return value to be placed. */
3810 if (gnu_return_var_elmt && !TREE_ADDRESSABLE (gnu_subprog_type))
3812 tree gnu_return_type
3813 = TREE_TYPE (TREE_PURPOSE (gnu_return_var_elmt));
3815 gnu_return_var
3816 = create_var_decl (get_identifier ("RETVAL"), NULL_TREE,
3817 gnu_return_type, NULL_TREE,
3818 false, false, false, false, false,
3819 true, false, NULL, gnat_subprog_id);
3820 TREE_VALUE (gnu_return_var_elmt) = gnu_return_var;
3823 vec_safe_push (gnu_return_var_stack, gnu_return_var);
3825 /* See whether there are parameters for which we don't have a GCC tree
3826 yet. These must be Out parameters. Make a VAR_DECL for them and
3827 put it into TYPE_CI_CO_LIST, which must contain an empty entry too.
3828 We can match up the entries because TYPE_CI_CO_LIST is in the order
3829 of the parameters. */
3830 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
3831 Present (gnat_param);
3832 gnat_param = Next_Formal_With_Extras (gnat_param))
3833 if (!present_gnu_tree (gnat_param))
3835 tree gnu_cico_entry = gnu_cico_list;
3836 tree gnu_decl;
3838 /* Skip any entries that have been already filled in; they must
3839 correspond to In Out parameters. */
3840 while (gnu_cico_entry && TREE_VALUE (gnu_cico_entry))
3841 gnu_cico_entry = TREE_CHAIN (gnu_cico_entry);
3843 /* Do any needed dereferences for by-ref objects. */
3844 gnu_decl = gnat_to_gnu_entity (gnat_param, NULL_TREE, true);
3845 gcc_assert (DECL_P (gnu_decl));
3846 if (DECL_BY_REF_P (gnu_decl))
3847 gnu_decl = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_decl);
3849 /* Do any needed references for padded types. */
3850 TREE_VALUE (gnu_cico_entry)
3851 = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_entry)), gnu_decl);
3854 else
3855 vec_safe_push (gnu_return_label_stack, NULL_TREE);
3857 /* Get a tree corresponding to the code for the subprogram. */
3858 start_stmt_group ();
3859 gnat_pushlevel ();
3861 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
3863 /* Generate the code of the subprogram itself. A return statement will be
3864 present and any Out parameters will be handled there. */
3865 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
3866 gnat_poplevel ();
3867 gnu_result = end_stmt_group ();
3869 /* If we populated the parameter attributes cache, we need to make sure that
3870 the cached expressions are evaluated on all the possible paths leading to
3871 their uses. So we force their evaluation on entry of the function. */
3872 cache = gnu_subprog_language->parm_attr_cache;
3873 if (cache)
3875 struct parm_attr_d *pa;
3876 int i;
3878 start_stmt_group ();
3880 FOR_EACH_VEC_ELT (*cache, i, pa)
3882 if (pa->first)
3883 add_stmt_with_node_force (pa->first, gnat_node);
3884 if (pa->last)
3885 add_stmt_with_node_force (pa->last, gnat_node);
3886 if (pa->length)
3887 add_stmt_with_node_force (pa->length, gnat_node);
3890 add_stmt (gnu_result);
3891 gnu_result = end_stmt_group ();
3893 gnu_subprog_language->parm_attr_cache = NULL;
3896 /* If we are dealing with a return from an Ada procedure with parameters
3897 passed by copy-in/copy-out, we need to return a record containing the
3898 final values of these parameters. If the list contains only one entry,
3899 return just that entry though.
3901 For a full description of the copy-in/copy-out parameter mechanism, see
3902 the part of the gnat_to_gnu_entity routine dealing with the translation
3903 of subprograms.
3905 We need to make a block that contains the definition of that label and
3906 the copying of the return value. It first contains the function, then
3907 the label and copy statement. */
3908 if (gnu_cico_list)
3910 const Node_Id gnat_end_label
3911 = End_Label (Handled_Statement_Sequence (gnat_node));
3913 gnu_return_var_stack->pop ();
3915 add_stmt (gnu_result);
3916 add_stmt (build1 (LABEL_EXPR, void_type_node,
3917 gnu_return_label_stack->last ()));
3919 /* If this is a function which returns by invisible reference, the
3920 return value has already been dealt with at the return statements,
3921 so we only need to indirectly copy out the parameters. */
3922 if (TREE_ADDRESSABLE (gnu_subprog_type))
3924 tree gnu_ret_deref
3925 = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result_decl);
3926 tree t;
3928 gcc_assert (TREE_VALUE (gnu_cico_list) == void_type_node);
3930 for (t = TREE_CHAIN (gnu_cico_list); t; t = TREE_CHAIN (t))
3932 tree gnu_field_deref
3933 = build_component_ref (gnu_ret_deref, TREE_PURPOSE (t), true);
3934 gnu_result = build2 (MODIFY_EXPR, void_type_node,
3935 gnu_field_deref, TREE_VALUE (t));
3936 add_stmt_with_node (gnu_result, gnat_end_label);
3940 /* Otherwise, if this is a procedure or a function which does not return
3941 by invisible reference, we can do a direct block-copy out. */
3942 else
3944 tree gnu_retval;
3946 if (list_length (gnu_cico_list) == 1)
3947 gnu_retval = TREE_VALUE (gnu_cico_list);
3948 else
3949 gnu_retval
3950 = build_constructor_from_list (TREE_TYPE (gnu_subprog_type),
3951 gnu_cico_list);
3953 gnu_result = build_return_expr (gnu_result_decl, gnu_retval);
3954 add_stmt_with_node (gnu_result, gnat_end_label);
3957 gnat_poplevel ();
3958 gnu_result = end_stmt_group ();
3961 gnu_return_label_stack->pop ();
3963 /* Attempt setting the end_locus of our GCC body tree, typically a
3964 BIND_EXPR or STATEMENT_LIST, then the end_locus of our GCC subprogram
3965 declaration tree. */
3966 set_end_locus_from_node (gnu_result, gnat_node);
3967 set_end_locus_from_node (gnu_subprog_decl, gnat_node);
3969 /* On SEH targets, install an exception handler around the main entry
3970 point to catch unhandled exceptions. */
3971 if (DECL_NAME (gnu_subprog_decl) == main_identifier_node
3972 && targetm_common.except_unwind_info (&global_options) == UI_SEH)
3974 tree t;
3975 tree etype;
3977 t = build_call_expr (builtin_decl_explicit (BUILT_IN_EH_POINTER),
3978 1, integer_zero_node);
3979 t = build_call_n_expr (unhandled_except_decl, 1, t);
3981 etype = build_unary_op (ADDR_EXPR, NULL_TREE, unhandled_others_decl);
3982 etype = tree_cons (NULL_TREE, etype, NULL_TREE);
3984 t = build2 (CATCH_EXPR, void_type_node, etype, t);
3985 gnu_result = build2 (TRY_CATCH_EXPR, TREE_TYPE (gnu_result),
3986 gnu_result, t);
3989 end_subprog_body (gnu_result);
3991 /* Finally annotate the parameters and disconnect the trees for parameters
3992 that we have turned into variables since they are now unusable. */
3993 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
3994 Present (gnat_param);
3995 gnat_param = Next_Formal_With_Extras (gnat_param))
3997 tree gnu_param = get_gnu_tree (gnat_param);
3998 bool is_var_decl = (TREE_CODE (gnu_param) == VAR_DECL);
4000 annotate_object (gnat_param, TREE_TYPE (gnu_param), NULL_TREE,
4001 DECL_BY_REF_P (gnu_param));
4003 if (is_var_decl)
4004 save_gnu_tree (gnat_param, NULL_TREE, false);
4007 /* Disconnect the variable created for the return value. */
4008 if (gnu_return_var_elmt)
4009 TREE_VALUE (gnu_return_var_elmt) = void_type_node;
4011 /* If the function returns an aggregate type and we have candidates for
4012 a Named Return Value, finalize the optimization. */
4013 if (optimize && gnu_subprog_language->named_ret_val)
4015 finalize_nrv (gnu_subprog_decl,
4016 gnu_subprog_language->named_ret_val,
4017 gnu_subprog_language->other_ret_val,
4018 gnu_subprog_language->gnat_ret);
4019 gnu_subprog_language->named_ret_val = NULL;
4020 gnu_subprog_language->other_ret_val = NULL;
4023 /* If this is an inlined external function that has been marked uninlinable,
4024 drop the body and stop there. Otherwise compile the body. */
4025 if (DECL_EXTERNAL (gnu_subprog_decl) && DECL_UNINLINABLE (gnu_subprog_decl))
4026 DECL_SAVED_TREE (gnu_subprog_decl) = NULL_TREE;
4027 else
4028 rest_of_subprog_body_compilation (gnu_subprog_decl);
4031 /* Return true if GNAT_NODE references an Atomic entity. */
4033 static bool
4034 node_is_atomic (Node_Id gnat_node)
4036 Entity_Id gnat_entity;
4038 switch (Nkind (gnat_node))
4040 case N_Identifier:
4041 case N_Expanded_Name:
4042 gnat_entity = Entity (gnat_node);
4043 if (Ekind (gnat_entity) != E_Variable)
4044 break;
4045 return Is_Atomic (gnat_entity) || Is_Atomic (Etype (gnat_entity));
4047 case N_Selected_Component:
4048 gnat_entity = Entity (Selector_Name (gnat_node));
4049 return Is_Atomic (gnat_entity) || Is_Atomic (Etype (gnat_entity));
4051 case N_Indexed_Component:
4052 if (Has_Atomic_Components (Etype (Prefix (gnat_node))))
4053 return true;
4054 if (Is_Entity_Name (Prefix (gnat_node))
4055 && Has_Atomic_Components (Entity (Prefix (gnat_node))))
4056 return true;
4058 /* ... fall through ... */
4060 case N_Explicit_Dereference:
4061 return Is_Atomic (Etype (gnat_node));
4063 default:
4064 break;
4067 return false;
4070 /* Return true if GNAT_NODE references a Volatile_Full_Access entity. */
4072 static bool
4073 node_has_volatile_full_access (Node_Id gnat_node)
4075 Entity_Id gnat_entity;
4077 switch (Nkind (gnat_node))
4079 case N_Identifier:
4080 case N_Expanded_Name:
4081 gnat_entity = Entity (gnat_node);
4082 return Is_Volatile_Full_Access (gnat_entity)
4083 || Is_Volatile_Full_Access (Etype (gnat_entity));
4085 case N_Selected_Component:
4086 gnat_entity = Entity (Selector_Name (gnat_node));
4087 return Is_Volatile_Full_Access (gnat_entity)
4088 || Is_Volatile_Full_Access (Etype (gnat_entity));
4090 case N_Indexed_Component:
4091 case N_Explicit_Dereference:
4092 return Is_Volatile_Full_Access (Etype (gnat_node));
4094 default:
4095 break;
4098 return false;
4101 /* Strip any type conversion on GNAT_NODE and return the result. */
4103 static Node_Id
4104 gnat_strip_type_conversion (Node_Id gnat_node)
4106 Node_Kind kind = Nkind (gnat_node);
4108 if (kind == N_Type_Conversion || kind == N_Unchecked_Type_Conversion)
4109 gnat_node = Expression (gnat_node);
4111 return gnat_node;
4114 /* Return true if GNAT_NODE requires outer atomic access, i.e. atomic access
4115 of an object of which GNAT_NODE is a component. */
4117 static bool
4118 outer_atomic_access_required_p (Node_Id gnat_node)
4120 gnat_node = gnat_strip_type_conversion (gnat_node);
4122 while (true)
4124 switch (Nkind (gnat_node))
4126 case N_Identifier:
4127 case N_Expanded_Name:
4128 if (No (Renamed_Object (Entity (gnat_node))))
4129 return false;
4130 gnat_node
4131 = gnat_strip_type_conversion (Renamed_Object (Entity (gnat_node)));
4132 break;
4134 case N_Indexed_Component:
4135 case N_Selected_Component:
4136 case N_Slice:
4137 gnat_node = gnat_strip_type_conversion (Prefix (gnat_node));
4138 if (node_has_volatile_full_access (gnat_node))
4139 return true;
4140 break;
4142 default:
4143 return false;
4147 gcc_unreachable ();
4150 /* Return true if GNAT_NODE requires atomic access and set SYNC according to
4151 the associated synchronization setting. */
4153 static bool
4154 atomic_access_required_p (Node_Id gnat_node, bool *sync)
4156 const Node_Id gnat_parent = Parent (gnat_node);
4157 unsigned char attr_id;
4158 bool as_a_whole = true;
4160 /* First, scan the parent to find out cases where the flag is irrelevant. */
4161 switch (Nkind (gnat_parent))
4163 case N_Attribute_Reference:
4164 attr_id = Get_Attribute_Id (Attribute_Name (gnat_parent));
4165 /* Do not mess up machine code insertions. */
4166 if (attr_id == Attr_Asm_Input || attr_id == Attr_Asm_Output)
4167 return false;
4169 /* Nothing to do if we are the prefix of an attribute, since we do not
4170 want an atomic access for things like 'Size. */
4172 /* ... fall through ... */
4174 case N_Reference:
4175 /* The N_Reference node is like an attribute. */
4176 if (Prefix (gnat_parent) == gnat_node)
4177 return false;
4178 break;
4180 case N_Indexed_Component:
4181 case N_Selected_Component:
4182 case N_Slice:
4183 /* If we are the prefix, then the access is only partial. */
4184 if (Prefix (gnat_parent) == gnat_node)
4185 as_a_whole = false;
4186 break;
4188 case N_Object_Renaming_Declaration:
4189 /* Nothing to do for the identifier in an object renaming declaration,
4190 the renaming itself does not need atomic access. */
4191 return false;
4193 default:
4194 break;
4197 /* Then, scan the node to find the atomic object. */
4198 gnat_node = gnat_strip_type_conversion (gnat_node);
4200 /* For Atomic itself, only reads and updates of the object as a whole require
4201 atomic access (RM C.6 (15)). But for Volatile_Full_Access, all reads and
4202 updates require atomic access. */
4203 if (!(as_a_whole && node_is_atomic (gnat_node))
4204 && !node_has_volatile_full_access (gnat_node))
4205 return false;
4207 /* If an outer atomic access will also be required, it cancels this one. */
4208 if (outer_atomic_access_required_p (gnat_node))
4209 return false;
4211 *sync = Atomic_Sync_Required (gnat_node);
4213 return true;
4216 /* Create a temporary variable with PREFIX and TYPE, and return it. */
4218 static tree
4219 create_temporary (const char *prefix, tree type)
4221 tree gnu_temp
4222 = create_var_decl (create_tmp_var_name (prefix), NULL_TREE,
4223 type, NULL_TREE,
4224 false, false, false, false, false,
4225 true, false, NULL, Empty);
4226 return gnu_temp;
4229 /* Create a temporary variable with PREFIX and initialize it with GNU_INIT.
4230 Put the initialization statement into GNU_INIT_STMT and annotate it with
4231 the SLOC of GNAT_NODE. Return the temporary variable. */
4233 static tree
4234 create_init_temporary (const char *prefix, tree gnu_init, tree *gnu_init_stmt,
4235 Node_Id gnat_node)
4237 tree gnu_temp = create_temporary (prefix, TREE_TYPE (gnu_init));
4239 *gnu_init_stmt = build_binary_op (INIT_EXPR, NULL_TREE, gnu_temp, gnu_init);
4240 set_expr_location_from_node (*gnu_init_stmt, gnat_node);
4242 return gnu_temp;
4245 /* Subroutine of gnat_to_gnu to translate gnat_node, either an N_Function_Call
4246 or an N_Procedure_Call_Statement, to a GCC tree, which is returned.
4247 GNU_RESULT_TYPE_P is a pointer to where we should place the result type.
4248 If GNU_TARGET is non-null, this must be a function call on the RHS of a
4249 N_Assignment_Statement and the result is to be placed into that object.
4250 If OUTER_ATOMIC_ACCESS is true, then the assignment to GNU_TARGET must be a
4251 load-modify-store sequence. Otherwise, if ATOMIC_ACCESS is true, then the
4252 assignment to GNU_TARGET must be atomic. If, in addition, ATOMIC_SYNC is
4253 true, then the assignment to GNU_TARGET requires atomic synchronization. */
4255 static tree
4256 Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
4257 bool outer_atomic_access, bool atomic_access, bool atomic_sync)
4259 const bool function_call = (Nkind (gnat_node) == N_Function_Call);
4260 const bool returning_value = (function_call && !gnu_target);
4261 /* The GCC node corresponding to the GNAT subprogram name. This can either
4262 be a FUNCTION_DECL node if we are dealing with a standard subprogram call,
4263 or an indirect reference expression (an INDIRECT_REF node) pointing to a
4264 subprogram. */
4265 tree gnu_subprog = gnat_to_gnu (Name (gnat_node));
4266 /* The FUNCTION_TYPE node giving the GCC type of the subprogram. */
4267 tree gnu_subprog_type = TREE_TYPE (gnu_subprog);
4268 /* The return type of the FUNCTION_TYPE. */
4269 tree gnu_result_type = TREE_TYPE (gnu_subprog_type);
4270 tree gnu_subprog_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_subprog);
4271 vec<tree, va_gc> *gnu_actual_vec = NULL;
4272 tree gnu_name_list = NULL_TREE;
4273 tree gnu_stmt_list = NULL_TREE;
4274 tree gnu_after_list = NULL_TREE;
4275 tree gnu_retval = NULL_TREE;
4276 tree gnu_call, gnu_result;
4277 bool by_descriptor = false;
4278 bool went_into_elab_proc = false;
4279 bool pushed_binding_level = false;
4280 Entity_Id gnat_formal;
4281 Node_Id gnat_actual;
4282 bool sync;
4284 gcc_assert (TREE_CODE (gnu_subprog_type) == FUNCTION_TYPE);
4286 /* If we are calling a stubbed function, raise Program_Error, but Elaborate
4287 all our args first. */
4288 if (TREE_CODE (gnu_subprog) == FUNCTION_DECL && DECL_STUBBED_P (gnu_subprog))
4290 tree call_expr = build_call_raise (PE_Stubbed_Subprogram_Called,
4291 gnat_node, N_Raise_Program_Error);
4293 for (gnat_actual = First_Actual (gnat_node);
4294 Present (gnat_actual);
4295 gnat_actual = Next_Actual (gnat_actual))
4296 add_stmt (gnat_to_gnu (gnat_actual));
4298 if (returning_value)
4300 *gnu_result_type_p = gnu_result_type;
4301 return build1 (NULL_EXPR, gnu_result_type, call_expr);
4304 return call_expr;
4307 /* For a call to a nested function, check the inlining status. */
4308 if (TREE_CODE (gnu_subprog) == FUNCTION_DECL
4309 && decl_function_context (gnu_subprog))
4310 check_inlining_for_nested_subprog (gnu_subprog);
4312 /* The only way we can be making a call via an access type is if Name is an
4313 explicit dereference. In that case, get the list of formal args from the
4314 type the access type is pointing to. Otherwise, get the formals from the
4315 entity being called. */
4316 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
4318 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
4320 /* If the access type doesn't require foreign-compatible representation,
4321 be prepared for descriptors. */
4322 if (targetm.calls.custom_function_descriptors > 0
4323 && Can_Use_Internal_Rep (Etype (Prefix (Name (gnat_node)))))
4324 by_descriptor = true;
4326 else if (Nkind (Name (gnat_node)) == N_Attribute_Reference)
4327 /* Assume here that this must be 'Elab_Body or 'Elab_Spec. */
4328 gnat_formal = Empty;
4329 else
4330 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
4332 /* The lifetime of the temporaries created for the call ends right after the
4333 return value is copied, so we can give them the scope of the elaboration
4334 routine at top level. */
4335 if (!current_function_decl)
4337 current_function_decl = get_elaboration_procedure ();
4338 went_into_elab_proc = true;
4341 /* First, create the temporary for the return value when:
4343 1. There is no target and the function has copy-in/copy-out parameters,
4344 because we need to preserve the return value before copying back the
4345 parameters.
4347 2. There is no target and the call is made for neither an object nor a
4348 renaming declaration, nor a return statement, nor an allocator, and
4349 the return type has variable size because in this case the gimplifier
4350 cannot create the temporary, or more generally is simply an aggregate
4351 type, because the gimplifier would then create the temporary in the
4352 outermost scope instead of locally.
4354 3. There is a target and it is a slice or an array with fixed size,
4355 and the return type has variable size, because the gimplifier
4356 doesn't handle these cases.
4358 4. There is no target and we have misaligned In Out or Out parameters
4359 passed by reference, because we need to preserve the return value
4360 before copying back the parameters. However, in this case, we'll
4361 defer creating the temporary, see below.
4363 This must be done before we push a binding level around the call, since
4364 we will pop it before copying the return value. */
4365 if (function_call
4366 && ((!gnu_target && TYPE_CI_CO_LIST (gnu_subprog_type))
4367 || (!gnu_target
4368 && Nkind (Parent (gnat_node)) != N_Object_Declaration
4369 && Nkind (Parent (gnat_node)) != N_Object_Renaming_Declaration
4370 && Nkind (Parent (gnat_node)) != N_Simple_Return_Statement
4371 && !(Nkind (Parent (gnat_node)) == N_Qualified_Expression
4372 && Nkind (Parent (Parent (gnat_node))) == N_Allocator)
4373 && AGGREGATE_TYPE_P (gnu_result_type)
4374 && !TYPE_IS_FAT_POINTER_P (gnu_result_type))
4375 || (gnu_target
4376 && (TREE_CODE (gnu_target) == ARRAY_RANGE_REF
4377 || (TREE_CODE (TREE_TYPE (gnu_target)) == ARRAY_TYPE
4378 && TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_target)))
4379 == INTEGER_CST))
4380 && TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST)))
4382 gnu_retval = create_temporary ("R", gnu_result_type);
4383 DECL_RETURN_VALUE_P (gnu_retval) = 1;
4386 /* If we don't need a value or have already created it, push a binding level
4387 around the call. This will narrow the lifetime of the temporaries we may
4388 need to make when translating the parameters as much as possible. */
4389 if (!returning_value || gnu_retval)
4391 start_stmt_group ();
4392 gnat_pushlevel ();
4393 pushed_binding_level = true;
4396 /* Create the list of the actual parameters as GCC expects it, namely a
4397 chain of TREE_LIST nodes in which the TREE_VALUE field of each node
4398 is an expression and the TREE_PURPOSE field is null. But skip Out
4399 parameters not passed by reference and that need not be copied in. */
4400 for (gnat_actual = First_Actual (gnat_node);
4401 Present (gnat_actual);
4402 gnat_formal = Next_Formal_With_Extras (gnat_formal),
4403 gnat_actual = Next_Actual (gnat_actual))
4405 Entity_Id gnat_formal_type = Etype (gnat_formal);
4406 tree gnu_formal_type = gnat_to_gnu_type (gnat_formal_type);
4407 tree gnu_formal = present_gnu_tree (gnat_formal)
4408 ? get_gnu_tree (gnat_formal) : NULL_TREE;
4409 const bool is_true_formal_parm
4410 = gnu_formal && TREE_CODE (gnu_formal) == PARM_DECL;
4411 const bool is_by_ref_formal_parm
4412 = is_true_formal_parm
4413 && (DECL_BY_REF_P (gnu_formal)
4414 || DECL_BY_COMPONENT_PTR_P (gnu_formal));
4415 /* In the Out or In Out case, we must suppress conversions that yield
4416 an lvalue but can nevertheless cause the creation of a temporary,
4417 because we need the real object in this case, either to pass its
4418 address if it's passed by reference or as target of the back copy
4419 done after the call if it uses the copy-in/copy-out mechanism.
4420 We do it in the In case too, except for an unchecked conversion
4421 to an elementary type or a constrained composite type because it
4422 alone can cause the actual to be misaligned and the addressability
4423 test is applied to the real object. */
4424 const bool suppress_type_conversion
4425 = ((Nkind (gnat_actual) == N_Unchecked_Type_Conversion
4426 && (Ekind (gnat_formal) != E_In_Parameter
4427 || (Is_Composite_Type (Underlying_Type (gnat_formal_type))
4428 && !Is_Constrained (Underlying_Type (gnat_formal_type)))))
4429 || (Nkind (gnat_actual) == N_Type_Conversion
4430 && Is_Composite_Type (Underlying_Type (gnat_formal_type))));
4431 Node_Id gnat_name = suppress_type_conversion
4432 ? Expression (gnat_actual) : gnat_actual;
4433 tree gnu_name = gnat_to_gnu (gnat_name), gnu_name_type;
4435 /* If it's possible we may need to use this expression twice, make sure
4436 that any side-effects are handled via SAVE_EXPRs; likewise if we need
4437 to force side-effects before the call. */
4438 if (Ekind (gnat_formal) != E_In_Parameter && !is_by_ref_formal_parm)
4440 tree init = NULL_TREE;
4441 gnu_name = gnat_stabilize_reference (gnu_name, true, &init);
4442 if (init)
4443 gnu_name
4444 = build_compound_expr (TREE_TYPE (gnu_name), init, gnu_name);
4447 /* If we are passing a non-addressable parameter by reference, pass the
4448 address of a copy. In the Out or In Out case, set up to copy back
4449 out after the call. */
4450 if (is_by_ref_formal_parm
4451 && (gnu_name_type = gnat_to_gnu_type (Etype (gnat_name)))
4452 && !addressable_p (gnu_name, gnu_name_type))
4454 bool in_param = (Ekind (gnat_formal) == E_In_Parameter);
4455 tree gnu_orig = gnu_name, gnu_temp, gnu_stmt;
4457 /* Do not issue warnings for CONSTRUCTORs since this is not a copy
4458 but sort of an instantiation for them. */
4459 if (TREE_CODE (gnu_name) == CONSTRUCTOR)
4462 /* If the type is passed by reference, a copy is not allowed. */
4463 else if (TYPE_IS_BY_REFERENCE_P (gnu_formal_type))
4464 post_error ("misaligned actual cannot be passed by reference",
4465 gnat_actual);
4467 /* For users of Starlet we issue a warning because the interface
4468 apparently assumes that by-ref parameters outlive the procedure
4469 invocation. The code still will not work as intended, but we
4470 cannot do much better since low-level parts of the back-end
4471 would allocate temporaries at will because of the misalignment
4472 if we did not do so here. */
4473 else if (Is_Valued_Procedure (Entity (Name (gnat_node))))
4475 post_error
4476 ("?possible violation of implicit assumption", gnat_actual);
4477 post_error_ne
4478 ("?made by pragma Import_Valued_Procedure on &", gnat_actual,
4479 Entity (Name (gnat_node)));
4480 post_error_ne ("?because of misalignment of &", gnat_actual,
4481 gnat_formal);
4484 /* If the actual type of the object is already the nominal type,
4485 we have nothing to do, except if the size is self-referential
4486 in which case we'll remove the unpadding below. */
4487 if (TREE_TYPE (gnu_name) == gnu_name_type
4488 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_name_type)))
4491 /* Otherwise remove the unpadding from all the objects. */
4492 else if (TREE_CODE (gnu_name) == COMPONENT_REF
4493 && TYPE_IS_PADDING_P
4494 (TREE_TYPE (TREE_OPERAND (gnu_name, 0))))
4495 gnu_orig = gnu_name = TREE_OPERAND (gnu_name, 0);
4497 /* Otherwise convert to the nominal type of the object if needed.
4498 There are several cases in which we need to make the temporary
4499 using this type instead of the actual type of the object when
4500 they are distinct, because the expectations of the callee would
4501 otherwise not be met:
4502 - if it's a justified modular type,
4503 - if the actual type is a smaller form of it,
4504 - if it's a smaller form of the actual type. */
4505 else if ((TREE_CODE (gnu_name_type) == RECORD_TYPE
4506 && (TYPE_JUSTIFIED_MODULAR_P (gnu_name_type)
4507 || smaller_form_type_p (TREE_TYPE (gnu_name),
4508 gnu_name_type)))
4509 || (INTEGRAL_TYPE_P (gnu_name_type)
4510 && smaller_form_type_p (gnu_name_type,
4511 TREE_TYPE (gnu_name))))
4512 gnu_name = convert (gnu_name_type, gnu_name);
4514 /* If this is an In Out or Out parameter and we're returning a value,
4515 we need to create a temporary for the return value because we must
4516 preserve it before copying back at the very end. */
4517 if (!in_param && returning_value && !gnu_retval)
4519 gnu_retval = create_temporary ("R", gnu_result_type);
4520 DECL_RETURN_VALUE_P (gnu_retval) = 1;
4523 /* If we haven't pushed a binding level, push it now. This will
4524 narrow the lifetime of the temporary we are about to make as
4525 much as possible. */
4526 if (!pushed_binding_level && (!returning_value || gnu_retval))
4528 start_stmt_group ();
4529 gnat_pushlevel ();
4530 pushed_binding_level = true;
4533 /* Create an explicit temporary holding the copy. */
4534 gnu_temp
4535 = create_init_temporary ("A", gnu_name, &gnu_stmt, gnat_actual);
4537 /* But initialize it on the fly like for an implicit temporary as
4538 we aren't necessarily having a statement list. */
4539 gnu_name = build_compound_expr (TREE_TYPE (gnu_name), gnu_stmt,
4540 gnu_temp);
4542 /* Set up to move the copy back to the original if needed. */
4543 if (!in_param)
4545 /* If the original is a COND_EXPR whose first arm isn't meant to
4546 be further used, just deal with the second arm. This is very
4547 likely the conditional expression built for a check. */
4548 if (TREE_CODE (gnu_orig) == COND_EXPR
4549 && TREE_CODE (TREE_OPERAND (gnu_orig, 1)) == COMPOUND_EXPR
4550 && integer_zerop
4551 (TREE_OPERAND (TREE_OPERAND (gnu_orig, 1), 1)))
4552 gnu_orig = TREE_OPERAND (gnu_orig, 2);
4554 gnu_stmt
4555 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_orig, gnu_temp);
4556 set_expr_location_from_node (gnu_stmt, gnat_node);
4558 append_to_statement_list (gnu_stmt, &gnu_after_list);
4562 /* Start from the real object and build the actual. */
4563 tree gnu_actual = gnu_name;
4565 /* If atomic access is required for an In or In Out actual parameter,
4566 build the atomic load. */
4567 if (is_true_formal_parm
4568 && !is_by_ref_formal_parm
4569 && Ekind (gnat_formal) != E_Out_Parameter
4570 && atomic_access_required_p (gnat_actual, &sync))
4571 gnu_actual = build_atomic_load (gnu_actual, sync);
4573 /* If this was a procedure call, we may not have removed any padding.
4574 So do it here for the part we will use as an input, if any. */
4575 if (Ekind (gnat_formal) != E_Out_Parameter
4576 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
4577 gnu_actual
4578 = convert (get_unpadded_type (Etype (gnat_actual)), gnu_actual);
4580 /* Put back the conversion we suppressed above in the computation of the
4581 real object. And even if we didn't suppress any conversion there, we
4582 may have suppressed a conversion to the Etype of the actual earlier,
4583 since the parent is a procedure call, so put it back here. Note that
4584 we might have a dummy type here if the actual is the dereference of a
4585 pointer to it, but that's OK if the formal is passed by reference. */
4586 tree gnu_actual_type = gnat_to_gnu_type (Etype (gnat_actual));
4587 if (TYPE_IS_DUMMY_P (gnu_actual_type))
4588 gcc_assert (is_true_formal_parm && DECL_BY_REF_P (gnu_formal));
4589 else if (suppress_type_conversion
4590 && Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
4591 gnu_actual = unchecked_convert (gnu_actual_type, gnu_actual,
4592 No_Truncation (gnat_actual));
4593 else
4594 gnu_actual = convert (gnu_actual_type, gnu_actual);
4596 /* Make sure that the actual is in range of the formal's type. */
4597 if (Ekind (gnat_formal) != E_Out_Parameter
4598 && Do_Range_Check (gnat_actual))
4599 gnu_actual
4600 = emit_range_check (gnu_actual, gnat_formal_type, gnat_actual);
4602 /* Unless this is an In parameter, we must remove any justified modular
4603 building from GNU_NAME to get an lvalue. */
4604 if (Ekind (gnat_formal) != E_In_Parameter
4605 && TREE_CODE (gnu_name) == CONSTRUCTOR
4606 && TREE_CODE (TREE_TYPE (gnu_name)) == RECORD_TYPE
4607 && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (gnu_name)))
4608 gnu_name
4609 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_name))), gnu_name);
4611 /* First see if the parameter is passed by reference. */
4612 if (is_true_formal_parm && DECL_BY_REF_P (gnu_formal))
4614 if (Ekind (gnat_formal) != E_In_Parameter)
4616 /* In Out or Out parameters passed by reference don't use the
4617 copy-in/copy-out mechanism so the address of the real object
4618 must be passed to the function. */
4619 gnu_actual = gnu_name;
4621 /* If we have a padded type, be sure we've removed padding. */
4622 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
4623 gnu_actual = convert (get_unpadded_type (Etype (gnat_actual)),
4624 gnu_actual);
4626 /* If we have the constructed subtype of an aliased object
4627 with an unconstrained nominal subtype, the type of the
4628 actual includes the template, although it is formally
4629 constrained. So we need to convert it back to the real
4630 constructed subtype to retrieve the constrained part
4631 and takes its address. */
4632 if (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
4633 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_actual))
4634 && Is_Constr_Subt_For_UN_Aliased (Etype (gnat_actual))
4635 && Is_Array_Type (Underlying_Type (Etype (gnat_actual))))
4636 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
4637 gnu_actual);
4640 /* There is no need to convert the actual to the formal's type before
4641 taking its address. The only exception is for unconstrained array
4642 types because of the way we build fat pointers. */
4643 if (TREE_CODE (gnu_formal_type) == UNCONSTRAINED_ARRAY_TYPE)
4645 /* Put back a view conversion for In Out or Out parameters. */
4646 if (Ekind (gnat_formal) != E_In_Parameter)
4647 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
4648 gnu_actual);
4649 gnu_actual = convert (gnu_formal_type, gnu_actual);
4652 /* The symmetry of the paths to the type of an entity is broken here
4653 since arguments don't know that they will be passed by ref. */
4654 gnu_formal_type = TREE_TYPE (gnu_formal);
4655 gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
4658 /* Then see if the parameter is an array passed to a foreign convention
4659 subprogram. */
4660 else if (is_true_formal_parm && DECL_BY_COMPONENT_PTR_P (gnu_formal))
4662 gnu_formal_type = TREE_TYPE (gnu_formal);
4663 gnu_actual = maybe_implicit_deref (gnu_actual);
4664 gnu_actual = maybe_unconstrained_array (gnu_actual);
4666 if (TYPE_IS_PADDING_P (gnu_formal_type))
4668 gnu_formal_type = TREE_TYPE (TYPE_FIELDS (gnu_formal_type));
4669 gnu_actual = convert (gnu_formal_type, gnu_actual);
4672 /* Take the address of the object and convert to the proper pointer
4673 type. We'd like to actually compute the address of the beginning
4674 of the array using an ADDR_EXPR of an ARRAY_REF, but there's a
4675 possibility that the ARRAY_REF might return a constant and we'd be
4676 getting the wrong address. Neither approach is exactly correct,
4677 but this is the most likely to work in all cases. */
4678 gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
4681 /* Otherwise the parameter is passed by copy. */
4682 else
4684 tree gnu_size;
4686 if (Ekind (gnat_formal) != E_In_Parameter)
4687 gnu_name_list = tree_cons (NULL_TREE, gnu_name, gnu_name_list);
4689 /* If we didn't create a PARM_DECL for the formal, this means that
4690 it is an Out parameter not passed by reference and that need not
4691 be copied in. In this case, the value of the actual need not be
4692 read. However, we still need to make sure that its side-effects
4693 are evaluated before the call, so we evaluate its address. */
4694 if (!is_true_formal_parm)
4696 if (TREE_SIDE_EFFECTS (gnu_name))
4698 tree addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_name);
4699 append_to_statement_list (addr, &gnu_stmt_list);
4701 continue;
4704 gnu_actual = convert (gnu_formal_type, gnu_actual);
4706 /* If this is 'Null_Parameter, pass a zero even though we are
4707 dereferencing it. */
4708 if (TREE_CODE (gnu_actual) == INDIRECT_REF
4709 && TREE_PRIVATE (gnu_actual)
4710 && (gnu_size = TYPE_SIZE (TREE_TYPE (gnu_actual)))
4711 && TREE_CODE (gnu_size) == INTEGER_CST
4712 && compare_tree_int (gnu_size, BITS_PER_WORD) <= 0)
4714 tree type_for_size
4715 = gnat_type_for_size (TREE_INT_CST_LOW (gnu_size), 1);
4716 gnu_actual
4717 = unchecked_convert (DECL_ARG_TYPE (gnu_formal),
4718 build_int_cst (type_for_size, 0),
4719 false);
4721 else
4722 gnu_actual = convert (DECL_ARG_TYPE (gnu_formal), gnu_actual);
4725 vec_safe_push (gnu_actual_vec, gnu_actual);
4728 gnu_call
4729 = build_call_vec (gnu_result_type, gnu_subprog_addr, gnu_actual_vec);
4730 CALL_EXPR_BY_DESCRIPTOR (gnu_call) = by_descriptor;
4731 set_expr_location_from_node (gnu_call, gnat_node);
4733 /* If we have created a temporary for the return value, initialize it. */
4734 if (gnu_retval)
4736 tree gnu_stmt
4737 = build_binary_op (INIT_EXPR, NULL_TREE, gnu_retval, gnu_call);
4738 set_expr_location_from_node (gnu_stmt, gnat_node);
4739 append_to_statement_list (gnu_stmt, &gnu_stmt_list);
4740 gnu_call = gnu_retval;
4743 /* If this is a subprogram with copy-in/copy-out parameters, we need to
4744 unpack the valued returned from the function into the In Out or Out
4745 parameters. We deal with the function return (if this is an Ada
4746 function) below. */
4747 if (TYPE_CI_CO_LIST (gnu_subprog_type))
4749 /* List of FIELD_DECLs associated with the PARM_DECLs of the copy-in/
4750 copy-out parameters. */
4751 tree gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
4752 const int length = list_length (gnu_cico_list);
4754 /* The call sequence must contain one and only one call, even though the
4755 function is pure. Save the result into a temporary if needed. */
4756 if (length > 1)
4758 if (!gnu_retval)
4760 tree gnu_stmt;
4761 gnu_call
4762 = create_init_temporary ("P", gnu_call, &gnu_stmt, gnat_node);
4763 append_to_statement_list (gnu_stmt, &gnu_stmt_list);
4766 gnu_name_list = nreverse (gnu_name_list);
4769 /* The first entry is for the actual return value if this is a
4770 function, so skip it. */
4771 if (function_call)
4772 gnu_cico_list = TREE_CHAIN (gnu_cico_list);
4774 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
4775 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
4776 else
4777 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
4779 for (gnat_actual = First_Actual (gnat_node);
4780 Present (gnat_actual);
4781 gnat_formal = Next_Formal_With_Extras (gnat_formal),
4782 gnat_actual = Next_Actual (gnat_actual))
4783 /* If we are dealing with a copy-in/copy-out parameter, we must
4784 retrieve its value from the record returned in the call. */
4785 if (!(present_gnu_tree (gnat_formal)
4786 && TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
4787 && (DECL_BY_REF_P (get_gnu_tree (gnat_formal))
4788 || DECL_BY_COMPONENT_PTR_P (get_gnu_tree (gnat_formal))))
4789 && Ekind (gnat_formal) != E_In_Parameter)
4791 /* Get the value to assign to this Out or In Out parameter. It is
4792 either the result of the function if there is only a single such
4793 parameter or the appropriate field from the record returned. */
4794 tree gnu_result
4795 = length == 1
4796 ? gnu_call
4797 : build_component_ref (gnu_call, TREE_PURPOSE (gnu_cico_list),
4798 false);
4800 /* If the actual is a conversion, get the inner expression, which
4801 will be the real destination, and convert the result to the
4802 type of the actual parameter. */
4803 tree gnu_actual
4804 = maybe_unconstrained_array (TREE_VALUE (gnu_name_list));
4806 /* If the result is a padded type, remove the padding. */
4807 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
4808 gnu_result
4809 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
4810 gnu_result);
4812 /* If the actual is a type conversion, the real target object is
4813 denoted by the inner Expression and we need to convert the
4814 result to the associated type.
4815 We also need to convert our gnu assignment target to this type
4816 if the corresponding GNU_NAME was constructed from the GNAT
4817 conversion node and not from the inner Expression. */
4818 if (Nkind (gnat_actual) == N_Type_Conversion)
4820 gnu_result
4821 = convert_with_check
4822 (Etype (Expression (gnat_actual)), gnu_result,
4823 Do_Overflow_Check (gnat_actual),
4824 Do_Range_Check (Expression (gnat_actual)),
4825 Float_Truncate (gnat_actual), gnat_actual);
4827 if (!Is_Composite_Type (Underlying_Type (Etype (gnat_formal))))
4828 gnu_actual = convert (TREE_TYPE (gnu_result), gnu_actual);
4831 /* Unchecked conversions as actuals for Out parameters are not
4832 allowed in user code because they are not variables, but do
4833 occur in front-end expansions. The associated GNU_NAME is
4834 always obtained from the inner expression in such cases. */
4835 else if (Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
4836 gnu_result = unchecked_convert (TREE_TYPE (gnu_actual),
4837 gnu_result,
4838 No_Truncation (gnat_actual));
4839 else
4841 if (Do_Range_Check (gnat_actual))
4842 gnu_result
4843 = emit_range_check (gnu_result, Etype (gnat_actual),
4844 gnat_actual);
4846 if (!(!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_actual)))
4847 && TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_result)))))
4848 gnu_result = convert (TREE_TYPE (gnu_actual), gnu_result);
4851 /* If an outer atomic access is required for an actual parameter,
4852 build the load-modify-store sequence. */
4853 if (outer_atomic_access_required_p (gnat_actual))
4854 gnu_result
4855 = build_load_modify_store (gnu_actual, gnu_result, gnat_node);
4857 /* Or else, if simple atomic access is required, build the atomic
4858 store. */
4859 else if (atomic_access_required_p (gnat_actual, &sync))
4860 gnu_result = build_atomic_store (gnu_actual, gnu_result, sync);
4862 /* Otherwise build a regular assignment. */
4863 else
4864 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
4865 gnu_actual, gnu_result);
4867 if (EXPR_P (gnu_result))
4868 set_expr_location_from_node (gnu_result, gnat_node);
4869 append_to_statement_list (gnu_result, &gnu_stmt_list);
4870 gnu_cico_list = TREE_CHAIN (gnu_cico_list);
4871 gnu_name_list = TREE_CHAIN (gnu_name_list);
4875 /* If this is a function call, the result is the call expression unless a
4876 target is specified, in which case we copy the result into the target
4877 and return the assignment statement. */
4878 if (function_call)
4880 /* If this is a function with copy-in/copy-out parameters, extract the
4881 return value from it and update the return type. */
4882 if (TYPE_CI_CO_LIST (gnu_subprog_type))
4884 tree gnu_elmt = TYPE_CI_CO_LIST (gnu_subprog_type);
4885 gnu_call
4886 = build_component_ref (gnu_call, TREE_PURPOSE (gnu_elmt), false);
4887 gnu_result_type = TREE_TYPE (gnu_call);
4890 /* If the function returns an unconstrained array or by direct reference,
4891 we have to dereference the pointer. */
4892 if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type)
4893 || TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type))
4894 gnu_call = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_call);
4896 if (gnu_target)
4898 Node_Id gnat_parent = Parent (gnat_node);
4899 enum tree_code op_code;
4901 /* If range check is needed, emit code to generate it. */
4902 if (Do_Range_Check (gnat_node))
4903 gnu_call
4904 = emit_range_check (gnu_call, Etype (Name (gnat_parent)),
4905 gnat_parent);
4907 /* ??? If the return type has variable size, then force the return
4908 slot optimization as we would not be able to create a temporary.
4909 That's what has been done historically. */
4910 if (return_type_with_variable_size_p (gnu_result_type))
4911 op_code = INIT_EXPR;
4912 else
4913 op_code = MODIFY_EXPR;
4915 /* Use the required method to move the result to the target. */
4916 if (outer_atomic_access)
4917 gnu_call
4918 = build_load_modify_store (gnu_target, gnu_call, gnat_node);
4919 else if (atomic_access)
4920 gnu_call = build_atomic_store (gnu_target, gnu_call, atomic_sync);
4921 else
4922 gnu_call
4923 = build_binary_op (op_code, NULL_TREE, gnu_target, gnu_call);
4925 if (EXPR_P (gnu_call))
4926 set_expr_location_from_node (gnu_call, gnat_parent);
4927 append_to_statement_list (gnu_call, &gnu_stmt_list);
4929 else
4930 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
4933 /* Otherwise, if this is a procedure call statement without copy-in/copy-out
4934 parameters, the result is just the call statement. */
4935 else if (!TYPE_CI_CO_LIST (gnu_subprog_type))
4936 append_to_statement_list (gnu_call, &gnu_stmt_list);
4938 /* Finally, add the copy back statements, if any. */
4939 append_to_statement_list (gnu_after_list, &gnu_stmt_list);
4941 if (went_into_elab_proc)
4942 current_function_decl = NULL_TREE;
4944 /* If we have pushed a binding level, pop it and finish up the enclosing
4945 statement group. */
4946 if (pushed_binding_level)
4948 add_stmt (gnu_stmt_list);
4949 gnat_poplevel ();
4950 gnu_result = end_stmt_group ();
4953 /* Otherwise, retrieve the statement list, if any. */
4954 else if (gnu_stmt_list)
4955 gnu_result = gnu_stmt_list;
4957 /* Otherwise, just return the call expression. */
4958 else
4959 return gnu_call;
4961 /* If we nevertheless need a value, make a COMPOUND_EXPR to return it.
4962 But first simplify if we have only one statement in the list. */
4963 if (returning_value)
4965 tree first = expr_first (gnu_result), last = expr_last (gnu_result);
4966 if (first == last)
4967 gnu_result = first;
4968 gnu_result
4969 = build_compound_expr (TREE_TYPE (gnu_call), gnu_result, gnu_call);
4972 return gnu_result;
4975 /* Subroutine of gnat_to_gnu to translate gnat_node, an
4976 N_Handled_Sequence_Of_Statements, to a GCC tree, which is returned. */
4978 static tree
4979 Handled_Sequence_Of_Statements_to_gnu (Node_Id gnat_node)
4981 tree gnu_jmpsave_decl = NULL_TREE;
4982 tree gnu_jmpbuf_decl = NULL_TREE;
4983 /* If just annotating, ignore all EH and cleanups. */
4984 bool gcc_eh = (!type_annotate_only
4985 && Present (Exception_Handlers (gnat_node))
4986 && Back_End_Exceptions ());
4987 bool fe_sjlj
4988 = (!type_annotate_only && Present (Exception_Handlers (gnat_node))
4989 && Exception_Mechanism == Front_End_SJLJ);
4990 bool at_end = !type_annotate_only && Present (At_End_Proc (gnat_node));
4991 bool binding_for_block = (at_end || gcc_eh || fe_sjlj);
4992 tree gnu_inner_block; /* The statement(s) for the block itself. */
4993 tree gnu_result;
4994 tree gnu_expr;
4995 Node_Id gnat_temp;
4997 /* The GCC exception handling mechanism can handle both ZCX and SJLJ schemes
4998 and we have our own SJLJ mechanism. To call the GCC mechanism, we call
4999 add_cleanup, and when we leave the binding, end_stmt_group will create
5000 the TRY_FINALLY_EXPR.
5002 ??? The region level calls down there have been specifically put in place
5003 for a ZCX context and currently the order in which things are emitted
5004 (region/handlers) is different from the SJLJ case. Instead of putting
5005 other calls with different conditions at other places for the SJLJ case,
5006 it seems cleaner to reorder things for the SJLJ case and generalize the
5007 condition to make it not ZCX specific.
5009 If there are any exceptions or cleanup processing involved, we need an
5010 outer statement group (for Fe_Sjlj) and binding level. */
5011 if (binding_for_block)
5013 start_stmt_group ();
5014 gnat_pushlevel ();
5017 /* If using fe_sjlj, make the variables for the setjmp buffer and save
5018 area for address of previous buffer. Do this first since we need to have
5019 the setjmp buf known for any decls in this block. */
5020 if (fe_sjlj)
5022 gnu_jmpsave_decl
5023 = create_var_decl (get_identifier ("JMPBUF_SAVE"), NULL_TREE,
5024 jmpbuf_ptr_type,
5025 build_call_n_expr (get_jmpbuf_decl, 0),
5026 false, false, false, false, false, true, false,
5027 NULL, gnat_node);
5029 /* The __builtin_setjmp receivers will immediately reinstall it. Now
5030 because of the unstructured form of EH used by fe_sjlj, there
5031 might be forward edges going to __builtin_setjmp receivers on which
5032 it is uninitialized, although they will never be actually taken. */
5033 TREE_NO_WARNING (gnu_jmpsave_decl) = 1;
5034 gnu_jmpbuf_decl
5035 = create_var_decl (get_identifier ("JMP_BUF"), NULL_TREE,
5036 jmpbuf_type,
5037 NULL_TREE,
5038 false, false, false, false, false, true, false,
5039 NULL, gnat_node);
5041 set_block_jmpbuf_decl (gnu_jmpbuf_decl);
5043 /* When we exit this block, restore the saved value. */
5044 add_cleanup (build_call_n_expr (set_jmpbuf_decl, 1, gnu_jmpsave_decl),
5045 Present (End_Label (gnat_node))
5046 ? End_Label (gnat_node) : gnat_node);
5049 /* If we are to call a function when exiting this block, add a cleanup
5050 to the binding level we made above. Note that add_cleanup is FIFO
5051 so we must register this cleanup after the EH cleanup just above. */
5052 if (at_end)
5054 tree proc_decl = gnat_to_gnu (At_End_Proc (gnat_node));
5056 /* When not optimizing, disable inlining of finalizers as this can
5057 create a more complex CFG in the parent function. */
5058 if (!optimize)
5059 DECL_DECLARED_INLINE_P (proc_decl) = 0;
5061 /* If there is no end label attached, we use the location of the At_End
5062 procedure because Expand_Cleanup_Actions might reset the location of
5063 the enclosing construct to that of an inner statement. */
5064 add_cleanup (build_call_n_expr (proc_decl, 0),
5065 Present (End_Label (gnat_node))
5066 ? End_Label (gnat_node) : At_End_Proc (gnat_node));
5069 /* Now build the tree for the declarations and statements inside this block.
5070 If this is SJLJ, set our jmp_buf as the current buffer. */
5071 start_stmt_group ();
5073 if (fe_sjlj)
5075 gnu_expr = build_call_n_expr (set_jmpbuf_decl, 1,
5076 build_unary_op (ADDR_EXPR, NULL_TREE,
5077 gnu_jmpbuf_decl));
5078 set_expr_location_from_node (gnu_expr, gnat_node);
5079 add_stmt (gnu_expr);
5082 if (Present (First_Real_Statement (gnat_node)))
5083 process_decls (Statements (gnat_node), Empty,
5084 First_Real_Statement (gnat_node), true, true);
5086 /* Generate code for each statement in the block. */
5087 for (gnat_temp = (Present (First_Real_Statement (gnat_node))
5088 ? First_Real_Statement (gnat_node)
5089 : First (Statements (gnat_node)));
5090 Present (gnat_temp); gnat_temp = Next (gnat_temp))
5091 add_stmt (gnat_to_gnu (gnat_temp));
5092 gnu_inner_block = end_stmt_group ();
5094 /* Now generate code for the two exception models, if either is relevant for
5095 this block. */
5096 if (fe_sjlj)
5098 tree *gnu_else_ptr = 0;
5099 tree gnu_handler;
5101 /* Make a binding level for the exception handling declarations and code
5102 and set up gnu_except_ptr_stack for the handlers to use. */
5103 start_stmt_group ();
5104 gnat_pushlevel ();
5106 vec_safe_push (gnu_except_ptr_stack,
5107 create_var_decl (get_identifier ("EXCEPT_PTR"), NULL_TREE,
5108 build_pointer_type (except_type_node),
5109 build_call_n_expr (get_excptr_decl, 0),
5110 false, false, false, false, false,
5111 true, false, NULL, gnat_node));
5113 /* Generate code for each handler. The N_Exception_Handler case does the
5114 real work and returns a COND_EXPR for each handler, which we chain
5115 together here. */
5116 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
5117 Present (gnat_temp); gnat_temp = Next_Non_Pragma (gnat_temp))
5119 gnu_expr = gnat_to_gnu (gnat_temp);
5121 /* If this is the first one, set it as the outer one. Otherwise,
5122 point the "else" part of the previous handler to us. Then point
5123 to our "else" part. */
5124 if (!gnu_else_ptr)
5125 add_stmt (gnu_expr);
5126 else
5127 *gnu_else_ptr = gnu_expr;
5129 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
5132 /* If none of the exception handlers did anything, re-raise but do not
5133 defer abortion. */
5134 gnu_expr = build_call_n_expr (raise_nodefer_decl, 1,
5135 gnu_except_ptr_stack->last ());
5136 set_expr_location_from_node
5137 (gnu_expr,
5138 Present (End_Label (gnat_node)) ? End_Label (gnat_node) : gnat_node);
5140 if (gnu_else_ptr)
5141 *gnu_else_ptr = gnu_expr;
5142 else
5143 add_stmt (gnu_expr);
5145 /* End the binding level dedicated to the exception handlers and get the
5146 whole statement group. */
5147 gnu_except_ptr_stack->pop ();
5148 gnat_poplevel ();
5149 gnu_handler = end_stmt_group ();
5151 /* If the setjmp returns 1, we restore our incoming longjmp value and
5152 then check the handlers. */
5153 start_stmt_group ();
5154 add_stmt_with_node (build_call_n_expr (set_jmpbuf_decl, 1,
5155 gnu_jmpsave_decl),
5156 gnat_node);
5157 add_stmt (gnu_handler);
5158 gnu_handler = end_stmt_group ();
5160 /* This block is now "if (setjmp) ... <handlers> else <block>". */
5161 gnu_result = build3 (COND_EXPR, void_type_node,
5162 (build_call_n_expr
5163 (setjmp_decl, 1,
5164 build_unary_op (ADDR_EXPR, NULL_TREE,
5165 gnu_jmpbuf_decl))),
5166 gnu_handler, gnu_inner_block);
5168 else if (gcc_eh)
5170 tree gnu_handlers;
5171 location_t locus;
5173 /* First make a block containing the handlers. */
5174 start_stmt_group ();
5175 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
5176 Present (gnat_temp);
5177 gnat_temp = Next_Non_Pragma (gnat_temp))
5178 add_stmt (gnat_to_gnu (gnat_temp));
5179 gnu_handlers = end_stmt_group ();
5181 /* Now make the TRY_CATCH_EXPR for the block. */
5182 gnu_result = build2 (TRY_CATCH_EXPR, void_type_node,
5183 gnu_inner_block, gnu_handlers);
5184 /* Set a location. We need to find a unique location for the dispatching
5185 code, otherwise we can get coverage or debugging issues. Try with
5186 the location of the end label. */
5187 if (Present (End_Label (gnat_node))
5188 && Sloc_to_locus (Sloc (End_Label (gnat_node)), &locus))
5189 SET_EXPR_LOCATION (gnu_result, locus);
5190 else
5191 /* Clear column information so that the exception handler of an
5192 implicit transient block does not incorrectly inherit the slocs
5193 of a decision, which would otherwise confuse control flow based
5194 coverage analysis tools. */
5195 set_expr_location_from_node (gnu_result, gnat_node, true);
5197 else
5198 gnu_result = gnu_inner_block;
5200 /* Now close our outer block, if we had to make one. */
5201 if (binding_for_block)
5203 add_stmt (gnu_result);
5204 gnat_poplevel ();
5205 gnu_result = end_stmt_group ();
5208 return gnu_result;
5211 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
5212 to a GCC tree, which is returned. This is the variant for front-end sjlj
5213 exception handling. */
5215 static tree
5216 Exception_Handler_to_gnu_fe_sjlj (Node_Id gnat_node)
5218 /* Unless this is "Others" or the special "Non-Ada" exception for Ada, make
5219 an "if" statement to select the proper exceptions. For "Others", exclude
5220 exceptions where Handled_By_Others is nonzero unless the All_Others flag
5221 is set. For "Non-ada", accept an exception if "Lang" is 'V'. */
5222 tree gnu_choice = boolean_false_node;
5223 tree gnu_body = build_stmt_group (Statements (gnat_node), false);
5224 Node_Id gnat_temp;
5226 for (gnat_temp = First (Exception_Choices (gnat_node));
5227 gnat_temp; gnat_temp = Next (gnat_temp))
5229 tree this_choice;
5231 if (Nkind (gnat_temp) == N_Others_Choice)
5233 if (All_Others (gnat_temp))
5234 this_choice = boolean_true_node;
5235 else
5236 this_choice
5237 = build_binary_op
5238 (EQ_EXPR, boolean_type_node,
5239 convert
5240 (integer_type_node,
5241 build_component_ref
5242 (build_unary_op
5243 (INDIRECT_REF, NULL_TREE,
5244 gnu_except_ptr_stack->last ()),
5245 not_handled_by_others_decl,
5246 false)),
5247 integer_zero_node);
5250 else if (Nkind (gnat_temp) == N_Identifier
5251 || Nkind (gnat_temp) == N_Expanded_Name)
5253 Entity_Id gnat_ex_id = Entity (gnat_temp);
5254 tree gnu_expr;
5256 /* Exception may be a renaming. Recover original exception which is
5257 the one elaborated and registered. */
5258 if (Present (Renamed_Object (gnat_ex_id)))
5259 gnat_ex_id = Renamed_Object (gnat_ex_id);
5261 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, false);
5263 this_choice
5264 = build_binary_op
5265 (EQ_EXPR, boolean_type_node,
5266 gnu_except_ptr_stack->last (),
5267 convert (TREE_TYPE (gnu_except_ptr_stack->last ()),
5268 build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr)));
5270 else
5271 gcc_unreachable ();
5273 gnu_choice = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
5274 gnu_choice, this_choice);
5277 return build3 (COND_EXPR, void_type_node, gnu_choice, gnu_body, NULL_TREE);
5280 /* Return true if no statement in GNAT_LIST can alter the control flow. */
5282 static bool
5283 stmt_list_cannot_alter_control_flow_p (List_Id gnat_list)
5285 if (No (gnat_list))
5286 return true;
5288 /* This is very conservative, we reject everything except for simple
5289 assignments between identifiers or literals. */
5290 for (Node_Id gnat_node = First (gnat_list);
5291 Present (gnat_node);
5292 gnat_node = Next (gnat_node))
5294 if (Nkind (gnat_node) != N_Assignment_Statement)
5295 return false;
5297 if (Nkind (Name (gnat_node)) != N_Identifier)
5298 return false;
5300 Node_Kind nkind = Nkind (Expression (gnat_node));
5301 if (nkind != N_Identifier
5302 && nkind != N_Integer_Literal
5303 && nkind != N_Real_Literal)
5304 return false;
5307 return true;
5310 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
5311 to a GCC tree, which is returned. This is the variant for GCC exception
5312 schemes. */
5314 static tree
5315 Exception_Handler_to_gnu_gcc (Node_Id gnat_node)
5317 tree gnu_etypes_list = NULL_TREE;
5319 /* We build a TREE_LIST of nodes representing what exception types this
5320 handler can catch, with special cases for others and all others cases.
5322 Each exception type is actually identified by a pointer to the exception
5323 id, or to a dummy object for "others" and "all others". */
5324 for (Node_Id gnat_temp = First (Exception_Choices (gnat_node));
5325 gnat_temp;
5326 gnat_temp = Next (gnat_temp))
5328 tree gnu_expr, gnu_etype;
5330 if (Nkind (gnat_temp) == N_Others_Choice)
5332 gnu_expr = All_Others (gnat_temp) ? all_others_decl : others_decl;
5333 gnu_etype = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
5335 else if (Nkind (gnat_temp) == N_Identifier
5336 || Nkind (gnat_temp) == N_Expanded_Name)
5338 Entity_Id gnat_ex_id = Entity (gnat_temp);
5340 /* Exception may be a renaming. Recover original exception which is
5341 the one elaborated and registered. */
5342 if (Present (Renamed_Object (gnat_ex_id)))
5343 gnat_ex_id = Renamed_Object (gnat_ex_id);
5345 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, false);
5346 gnu_etype = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
5348 else
5349 gcc_unreachable ();
5351 /* The GCC interface expects NULL to be passed for catch all handlers, so
5352 it would be quite tempting to set gnu_etypes_list to NULL if gnu_etype
5353 is integer_zero_node. It would not work, however, because GCC's
5354 notion of "catch all" is stronger than our notion of "others". Until
5355 we correctly use the cleanup interface as well, doing that would
5356 prevent the "all others" handlers from being seen, because nothing
5357 can be caught beyond a catch all from GCC's point of view. */
5358 gnu_etypes_list = tree_cons (NULL_TREE, gnu_etype, gnu_etypes_list);
5361 start_stmt_group ();
5362 gnat_pushlevel ();
5364 /* Expand a call to the begin_handler hook at the beginning of the handler,
5365 and arrange for a call to the end_handler hook to occur on every possible
5366 exit path.
5368 The hooks expect a pointer to the low level occurrence. This is required
5369 for our stack management scheme because a raise inside the handler pushes
5370 a new occurrence on top of the stack, which means that this top does not
5371 necessarily match the occurrence this handler was dealing with.
5373 __builtin_eh_pointer references the exception occurrence being
5374 propagated. Upon handler entry, this is the exception for which the
5375 handler is triggered. This might not be the case upon handler exit,
5376 however, as we might have a new occurrence propagated by the handler's
5377 body, and the end_handler hook called as a cleanup in this context.
5379 We use a local variable to retrieve the incoming value at handler entry
5380 time, and reuse it to feed the end_handler hook's argument at exit. */
5382 tree gnu_current_exc_ptr
5383 = build_call_expr (builtin_decl_explicit (BUILT_IN_EH_POINTER),
5384 1, integer_zero_node);
5385 tree prev_gnu_incoming_exc_ptr = gnu_incoming_exc_ptr;
5386 gnu_incoming_exc_ptr
5387 = create_var_decl (get_identifier ("EXPTR"), NULL_TREE,
5388 ptr_type_node, gnu_current_exc_ptr,
5389 false, false, false, false, false, true, true,
5390 NULL, gnat_node);
5392 add_stmt_with_node (build_call_n_expr (begin_handler_decl, 1,
5393 gnu_incoming_exc_ptr),
5394 gnat_node);
5396 /* Declare and initialize the choice parameter, if present. */
5397 if (Present (Choice_Parameter (gnat_node)))
5399 tree gnu_param
5400 = gnat_to_gnu_entity (Choice_Parameter (gnat_node), NULL_TREE, true);
5402 add_stmt (build_call_n_expr
5403 (set_exception_parameter_decl, 2,
5404 build_unary_op (ADDR_EXPR, NULL_TREE, gnu_param),
5405 gnu_incoming_exc_ptr));
5408 add_stmt_list (Statements (gnat_node));
5410 /* We don't have an End_Label at hand to set the location of the cleanup
5411 actions, so we use that of the exception handler itself instead. */
5412 tree stmt = build_call_n_expr (end_handler_decl, 1, gnu_incoming_exc_ptr);
5413 if (stmt_list_cannot_alter_control_flow_p (Statements (gnat_node)))
5414 add_stmt_with_node (stmt, gnat_node);
5415 else
5416 add_cleanup (stmt, gnat_node);
5418 gnat_poplevel ();
5420 gnu_incoming_exc_ptr = prev_gnu_incoming_exc_ptr;
5422 return
5423 build2 (CATCH_EXPR, void_type_node, gnu_etypes_list, end_stmt_group ());
5426 /* Subroutine of gnat_to_gnu to generate code for an N_Compilation unit. */
5428 static void
5429 Compilation_Unit_to_gnu (Node_Id gnat_node)
5431 const Node_Id gnat_unit = Unit (gnat_node);
5432 const bool body_p = (Nkind (gnat_unit) == N_Package_Body
5433 || Nkind (gnat_unit) == N_Subprogram_Body);
5434 const Entity_Id gnat_unit_entity = Defining_Entity (gnat_unit);
5435 Entity_Id gnat_entity;
5436 Node_Id gnat_pragma;
5437 /* Make the decl for the elaboration procedure. Emit debug info for it, so
5438 that users can break into their elaboration code in debuggers. Kludge:
5439 don't consider it as a definition so that we have a line map for its body,
5440 but no subprogram description in debug info. */
5441 tree gnu_elab_proc_decl
5442 = create_subprog_decl
5443 (create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
5444 NULL_TREE, void_ftype, NULL_TREE,
5445 is_disabled, true, false, true, true, false, NULL, gnat_unit);
5446 struct elab_info *info;
5448 vec_safe_push (gnu_elab_proc_stack, gnu_elab_proc_decl);
5449 DECL_ELABORATION_PROC_P (gnu_elab_proc_decl) = 1;
5451 /* Initialize the information structure for the function. */
5452 allocate_struct_function (gnu_elab_proc_decl, false);
5453 set_cfun (NULL);
5455 current_function_decl = NULL_TREE;
5457 start_stmt_group ();
5458 gnat_pushlevel ();
5460 /* For a body, first process the spec if there is one. */
5461 if (Nkind (gnat_unit) == N_Package_Body
5462 || (Nkind (gnat_unit) == N_Subprogram_Body && !Acts_As_Spec (gnat_node)))
5463 add_stmt (gnat_to_gnu (Library_Unit (gnat_node)));
5465 if (type_annotate_only && gnat_node == Cunit (Main_Unit))
5467 elaborate_all_entities (gnat_node);
5469 if (Nkind (gnat_unit) == N_Subprogram_Declaration
5470 || Nkind (gnat_unit) == N_Generic_Package_Declaration
5471 || Nkind (gnat_unit) == N_Generic_Subprogram_Declaration)
5472 return;
5475 /* Then process any pragmas and declarations preceding the unit. */
5476 for (gnat_pragma = First (Context_Items (gnat_node));
5477 Present (gnat_pragma);
5478 gnat_pragma = Next (gnat_pragma))
5479 if (Nkind (gnat_pragma) == N_Pragma)
5480 add_stmt (gnat_to_gnu (gnat_pragma));
5481 process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty,
5482 true, true);
5484 /* Process the unit itself. */
5485 add_stmt (gnat_to_gnu (gnat_unit));
5487 /* Generate code for all the inlined subprograms. */
5488 for (gnat_entity = First_Inlined_Subprogram (gnat_node);
5489 Present (gnat_entity);
5490 gnat_entity = Next_Inlined_Subprogram (gnat_entity))
5492 Node_Id gnat_body;
5494 /* Without optimization, process only the required subprograms. */
5495 if (!optimize && !Has_Pragma_Inline_Always (gnat_entity))
5496 continue;
5498 /* The set of inlined subprograms is computed from data recorded early
5499 during expansion and it can be a strict superset of the final set
5500 computed after semantic analysis, for example if a call to such a
5501 subprogram occurs in a pragma Assert and assertions are disabled.
5502 In that case, semantic analysis resets Is_Public to false but the
5503 entry for the subprogram in the inlining tables is stalled. */
5504 if (!Is_Public (gnat_entity))
5505 continue;
5507 gnat_body = Parent (Declaration_Node (gnat_entity));
5508 if (Nkind (gnat_body) != N_Subprogram_Body)
5510 /* ??? This happens when only the spec of a package is provided. */
5511 if (No (Corresponding_Body (gnat_body)))
5512 continue;
5514 gnat_body
5515 = Parent (Declaration_Node (Corresponding_Body (gnat_body)));
5518 /* Define the entity first so we set DECL_EXTERNAL. */
5519 gnat_to_gnu_entity (gnat_entity, NULL_TREE, false);
5520 add_stmt (gnat_to_gnu (gnat_body));
5523 /* Process any pragmas and actions following the unit. */
5524 add_stmt_list (Pragmas_After (Aux_Decls_Node (gnat_node)));
5525 add_stmt_list (Actions (Aux_Decls_Node (gnat_node)));
5526 finalize_from_limited_with ();
5528 /* Save away what we've made so far and finish it up. */
5529 set_current_block_context (gnu_elab_proc_decl);
5530 gnat_poplevel ();
5531 DECL_SAVED_TREE (gnu_elab_proc_decl) = end_stmt_group ();
5532 set_end_locus_from_node (gnu_elab_proc_decl, gnat_unit);
5533 gnu_elab_proc_stack->pop ();
5535 /* Record this potential elaboration procedure for later processing. */
5536 info = ggc_alloc<elab_info> ();
5537 info->next = elab_info_list;
5538 info->elab_proc = gnu_elab_proc_decl;
5539 info->gnat_node = gnat_node;
5540 elab_info_list = info;
5542 /* Force the processing for all nodes that remain in the queue. */
5543 process_deferred_decl_context (true);
5546 /* Mark COND, a boolean expression, as predicating a call to a noreturn
5547 function, i.e. predict that it is very likely false, and return it.
5549 The compiler will automatically predict the last edge leading to a call
5550 to a noreturn function as very unlikely taken. This function makes it
5551 possible to expand the prediction to predecessors in case the condition
5552 is made up of several short-circuit operators. */
5554 static tree
5555 build_noreturn_cond (tree cond)
5557 tree fn = builtin_decl_explicit (BUILT_IN_EXPECT);
5558 tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
5559 tree pred_type = TREE_VALUE (arg_types);
5560 tree expected_type = TREE_VALUE (TREE_CHAIN (arg_types));
5562 tree t = build_call_expr (fn, 3,
5563 fold_convert (pred_type, cond),
5564 build_int_cst (expected_type, 0),
5565 build_int_cst (integer_type_node,
5566 PRED_NORETURN));
5568 return build1 (NOP_EXPR, boolean_type_node, t);
5571 /* Subroutine of gnat_to_gnu to translate GNAT_RANGE, a node representing a
5572 range of values, into GNU_LOW and GNU_HIGH bounds. */
5574 static void
5575 Range_to_gnu (Node_Id gnat_range, tree *gnu_low, tree *gnu_high)
5577 /* GNAT_RANGE is either an N_Range or an identifier denoting a subtype. */
5578 switch (Nkind (gnat_range))
5580 case N_Range:
5581 *gnu_low = gnat_to_gnu (Low_Bound (gnat_range));
5582 *gnu_high = gnat_to_gnu (High_Bound (gnat_range));
5583 break;
5585 case N_Expanded_Name:
5586 case N_Identifier:
5588 tree gnu_range_type = get_unpadded_type (Entity (gnat_range));
5589 tree gnu_range_base_type = get_base_type (gnu_range_type);
5591 *gnu_low
5592 = convert (gnu_range_base_type, TYPE_MIN_VALUE (gnu_range_type));
5593 *gnu_high
5594 = convert (gnu_range_base_type, TYPE_MAX_VALUE (gnu_range_type));
5596 break;
5598 default:
5599 gcc_unreachable ();
5603 /* Subroutine of gnat_to_gnu to translate GNAT_NODE, an N_Raise_xxx_Error,
5604 to a GCC tree and return it. GNU_RESULT_TYPE_P is a pointer to where
5605 we should place the result type. */
5607 static tree
5608 Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
5610 const Node_Kind kind = Nkind (gnat_node);
5611 const int reason = UI_To_Int (Reason (gnat_node));
5612 const Node_Id gnat_cond = Condition (gnat_node);
5613 const bool with_extra_info
5614 = Exception_Extra_Info
5615 && !No_Exception_Handlers_Set ()
5616 && No (get_exception_label (kind));
5617 tree gnu_result = NULL_TREE, gnu_cond = NULL_TREE;
5619 /* The following processing is not required for correctness. Its purpose is
5620 to give more precise error messages and to record some information. */
5621 switch (reason)
5623 case CE_Access_Check_Failed:
5624 if (with_extra_info)
5625 gnu_result = build_call_raise_column (reason, gnat_node, kind);
5626 break;
5628 case CE_Index_Check_Failed:
5629 case CE_Range_Check_Failed:
5630 case CE_Invalid_Data:
5631 if (Present (gnat_cond) && Nkind (gnat_cond) == N_Op_Not)
5633 Node_Id gnat_index, gnat_type;
5634 tree gnu_type, gnu_index, gnu_low_bound, gnu_high_bound, disp;
5635 bool neg_p;
5636 struct loop_info_d *loop;
5638 switch (Nkind (Right_Opnd (gnat_cond)))
5640 case N_In:
5641 Range_to_gnu (Right_Opnd (Right_Opnd (gnat_cond)),
5642 &gnu_low_bound, &gnu_high_bound);
5643 break;
5645 case N_Op_Ge:
5646 gnu_low_bound = gnat_to_gnu (Right_Opnd (Right_Opnd (gnat_cond)));
5647 gnu_high_bound = NULL_TREE;
5648 break;
5650 case N_Op_Le:
5651 gnu_low_bound = NULL_TREE;
5652 gnu_high_bound = gnat_to_gnu (Right_Opnd (Right_Opnd (gnat_cond)));
5653 break;
5655 default:
5656 goto common;
5659 gnat_index = Left_Opnd (Right_Opnd (gnat_cond));
5660 gnat_type = Etype (gnat_index);
5661 gnu_type = maybe_character_type (get_unpadded_type (gnat_type));
5662 gnu_index = gnat_to_gnu (gnat_index);
5664 if (TREE_TYPE (gnu_index) != gnu_type)
5666 if (gnu_low_bound)
5667 gnu_low_bound = convert (gnu_type, gnu_low_bound);
5668 if (gnu_high_bound)
5669 gnu_high_bound = convert (gnu_type, gnu_high_bound);
5670 gnu_index = convert (gnu_type, gnu_index);
5673 if (with_extra_info
5674 && gnu_low_bound
5675 && gnu_high_bound
5676 && Known_Esize (gnat_type)
5677 && UI_To_Int (Esize (gnat_type)) <= 32)
5678 gnu_result
5679 = build_call_raise_range (reason, gnat_node, kind, gnu_index,
5680 gnu_low_bound, gnu_high_bound);
5682 /* If optimization is enabled and we are inside a loop, we try to
5683 compute invariant conditions for checks applied to the iteration
5684 variable, i.e. conditions that are independent of the variable
5685 and necessary in order for the checks to fail in the course of
5686 some iteration. If we succeed, we consider an alternative:
5688 1. If loop unswitching is enabled, we prepend these conditions
5689 to the original conditions of the checks. This will make it
5690 possible for the loop unswitching pass to replace the loop
5691 with two loops, one of which has the checks eliminated and
5692 the other has the original checks reinstated, and a prologue
5693 implementing a run-time selection. The former loop will be
5694 for example suitable for vectorization.
5696 2. Otherwise, we instead append the conditions to the original
5697 conditions of the checks. At worse, if the conditions cannot
5698 be evaluated at compile time, they will be evaluated as true
5699 at run time only when the checks have already failed, thus
5700 contributing negatively only to the size of the executable.
5701 But the hope is that these invariant conditions be evaluated
5702 at compile time to false, thus taking away the entire checks
5703 with them. */
5704 if (optimize
5705 && inside_loop_p ()
5706 && (!gnu_low_bound
5707 || (gnu_low_bound = gnat_invariant_expr (gnu_low_bound)))
5708 && (!gnu_high_bound
5709 || (gnu_high_bound = gnat_invariant_expr (gnu_high_bound)))
5710 && (loop = find_loop_for (gnu_index, &disp, &neg_p)))
5712 struct range_check_info_d *rci = ggc_alloc<range_check_info_d> ();
5713 rci->low_bound = gnu_low_bound;
5714 rci->high_bound = gnu_high_bound;
5715 rci->disp = disp;
5716 rci->neg_p = neg_p;
5717 rci->type = gnu_type;
5718 rci->inserted_cond
5719 = build1 (SAVE_EXPR, boolean_type_node, boolean_true_node);
5720 vec_safe_push (loop->checks, rci);
5721 loop->has_checks = true;
5722 gnu_cond = build_noreturn_cond (gnat_to_gnu (gnat_cond));
5723 if (flag_unswitch_loops)
5724 gnu_cond = build_binary_op (TRUTH_ANDIF_EXPR,
5725 boolean_type_node,
5726 rci->inserted_cond,
5727 gnu_cond);
5728 else
5729 gnu_cond = build_binary_op (TRUTH_ANDIF_EXPR,
5730 boolean_type_node,
5731 gnu_cond,
5732 rci->inserted_cond);
5735 /* Or else, if aggressive loop optimizations are enabled, we just
5736 record that there are checks applied to iteration variables. */
5737 else if (optimize
5738 && flag_aggressive_loop_optimizations
5739 && inside_loop_p ()
5740 && (loop = find_loop_for (gnu_index)))
5741 loop->has_checks = true;
5743 break;
5745 default:
5746 break;
5749 /* The following processing does the common work. */
5750 common:
5751 if (!gnu_result)
5752 gnu_result = build_call_raise (reason, gnat_node, kind);
5753 set_expr_location_from_node (gnu_result, gnat_node);
5755 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
5757 /* If the type is VOID, this is a statement, so we need to generate the code
5758 for the call. Handle a condition, if there is one. */
5759 if (VOID_TYPE_P (*gnu_result_type_p))
5761 if (Present (gnat_cond))
5763 if (!gnu_cond)
5764 gnu_cond = gnat_to_gnu (gnat_cond);
5765 gnu_result = build3 (COND_EXPR, void_type_node, gnu_cond, gnu_result,
5766 alloc_stmt_list ());
5769 else
5770 gnu_result = build1 (NULL_EXPR, *gnu_result_type_p, gnu_result);
5772 return gnu_result;
5775 /* Return true if GNAT_NODE is on the LHS of an assignment or an actual
5776 parameter of a call. */
5778 static bool
5779 lhs_or_actual_p (Node_Id gnat_node)
5781 Node_Id gnat_parent = Parent (gnat_node);
5782 Node_Kind kind = Nkind (gnat_parent);
5784 if (kind == N_Assignment_Statement && Name (gnat_parent) == gnat_node)
5785 return true;
5787 if ((kind == N_Procedure_Call_Statement || kind == N_Function_Call)
5788 && Name (gnat_parent) != gnat_node)
5789 return true;
5791 if (kind == N_Parameter_Association)
5792 return true;
5794 return false;
5797 /* Return true if either GNAT_NODE or a view of GNAT_NODE is on the LHS
5798 of an assignment or an actual parameter of a call. */
5800 static bool
5801 present_in_lhs_or_actual_p (Node_Id gnat_node)
5803 Node_Kind kind;
5805 if (lhs_or_actual_p (gnat_node))
5806 return true;
5808 kind = Nkind (Parent (gnat_node));
5810 if ((kind == N_Type_Conversion || kind == N_Unchecked_Type_Conversion)
5811 && lhs_or_actual_p (Parent (gnat_node)))
5812 return true;
5814 return false;
5817 /* Return true if GNAT_NODE, an unchecked type conversion, is a no-op as far
5818 as gigi is concerned. This is used to avoid conversions on the LHS. */
5820 static bool
5821 unchecked_conversion_nop (Node_Id gnat_node)
5823 Entity_Id from_type, to_type;
5825 /* The conversion must be on the LHS of an assignment or an actual parameter
5826 of a call. Otherwise, even if the conversion was essentially a no-op, it
5827 could de facto ensure type consistency and this should be preserved. */
5828 if (!lhs_or_actual_p (gnat_node))
5829 return false;
5831 from_type = Etype (Expression (gnat_node));
5833 /* We're interested in artificial conversions generated by the front-end
5834 to make private types explicit, e.g. in Expand_Assign_Array. */
5835 if (!Is_Private_Type (from_type))
5836 return false;
5838 from_type = Underlying_Type (from_type);
5839 to_type = Etype (gnat_node);
5841 /* The direct conversion to the underlying type is a no-op. */
5842 if (to_type == from_type)
5843 return true;
5845 /* For an array subtype, the conversion to the PAIT is a no-op. */
5846 if (Ekind (from_type) == E_Array_Subtype
5847 && to_type == Packed_Array_Impl_Type (from_type))
5848 return true;
5850 /* For a record subtype, the conversion to the type is a no-op. */
5851 if (Ekind (from_type) == E_Record_Subtype
5852 && to_type == Etype (from_type))
5853 return true;
5855 return false;
5858 /* Return true if GNAT_NODE represents a statement. */
5860 static bool
5861 statement_node_p (Node_Id gnat_node)
5863 const Node_Kind kind = Nkind (gnat_node);
5865 if (kind == N_Label)
5866 return true;
5868 if (IN (kind, N_Statement_Other_Than_Procedure_Call))
5869 return true;
5871 if (kind == N_Procedure_Call_Statement)
5872 return true;
5874 if (IN (kind, N_Raise_xxx_Error) && Ekind (Etype (gnat_node)) == E_Void)
5875 return true;
5877 return false;
5880 /* This function is the driver of the GNAT to GCC tree transformation process.
5881 It is the entry point of the tree transformer. GNAT_NODE is the root of
5882 some GNAT tree. Return the root of the corresponding GCC tree. If this
5883 is an expression, return the GCC equivalent of the expression. If this
5884 is a statement, return the statement or add it to the current statement
5885 group, in which case anything returned is to be interpreted as occurring
5886 after anything added. */
5888 tree
5889 gnat_to_gnu (Node_Id gnat_node)
5891 const Node_Kind kind = Nkind (gnat_node);
5892 bool went_into_elab_proc = false;
5893 tree gnu_result = error_mark_node; /* Default to no value. */
5894 tree gnu_result_type = void_type_node;
5895 tree gnu_expr, gnu_lhs, gnu_rhs;
5896 Node_Id gnat_temp;
5897 bool sync = false;
5899 /* Save node number for error message and set location information. */
5900 error_gnat_node = gnat_node;
5901 Sloc_to_locus (Sloc (gnat_node), &input_location);
5903 /* If we are only annotating types and this node is a statement, return
5904 an empty statement list. */
5905 if (type_annotate_only && statement_node_p (gnat_node))
5906 return alloc_stmt_list ();
5908 /* If we are only annotating types and this node is a subexpression, return
5909 a NULL_EXPR, but filter out nodes appearing in the expressions attached
5910 to packed array implementation types. */
5911 if (type_annotate_only
5912 && IN (kind, N_Subexpr)
5913 && !(((IN (kind, N_Op) && kind != N_Op_Expon)
5914 || kind == N_Type_Conversion)
5915 && Is_Integer_Type (Etype (gnat_node)))
5916 && !(kind == N_Attribute_Reference
5917 && Get_Attribute_Id (Attribute_Name (gnat_node)) == Attr_Length
5918 && Ekind (Etype (Prefix (gnat_node))) == E_Array_Subtype
5919 && !Is_Constr_Subt_For_U_Nominal (Etype (Prefix (gnat_node))))
5920 && kind != N_Expanded_Name
5921 && kind != N_Identifier
5922 && !Compile_Time_Known_Value (gnat_node))
5923 return build1 (NULL_EXPR, get_unpadded_type (Etype (gnat_node)),
5924 build_call_raise (CE_Range_Check_Failed, gnat_node,
5925 N_Raise_Constraint_Error));
5927 if ((statement_node_p (gnat_node) && kind != N_Null_Statement)
5928 || kind == N_Handled_Sequence_Of_Statements
5929 || kind == N_Implicit_Label_Declaration)
5931 tree current_elab_proc = get_elaboration_procedure ();
5933 /* If this is a statement and we are at top level, it must be part of
5934 the elaboration procedure, so mark us as being in that procedure. */
5935 if (!current_function_decl)
5937 current_function_decl = current_elab_proc;
5938 went_into_elab_proc = true;
5941 /* If we are in the elaboration procedure, check if we are violating a
5942 No_Elaboration_Code restriction by having a statement there. Don't
5943 check for a possible No_Elaboration_Code restriction violation on
5944 N_Handled_Sequence_Of_Statements, as we want to signal an error on
5945 every nested real statement instead. This also avoids triggering
5946 spurious errors on dummy (empty) sequences created by the front-end
5947 for package bodies in some cases. */
5948 if (current_function_decl == current_elab_proc
5949 && kind != N_Handled_Sequence_Of_Statements
5950 && kind != N_Implicit_Label_Declaration)
5951 Check_Elaboration_Code_Allowed (gnat_node);
5954 switch (kind)
5956 /********************************/
5957 /* Chapter 2: Lexical Elements */
5958 /********************************/
5960 case N_Identifier:
5961 case N_Expanded_Name:
5962 case N_Operator_Symbol:
5963 case N_Defining_Identifier:
5964 case N_Defining_Operator_Symbol:
5965 gnu_result = Identifier_to_gnu (gnat_node, &gnu_result_type);
5967 /* If atomic access is required on the RHS, build the atomic load. */
5968 if (atomic_access_required_p (gnat_node, &sync)
5969 && !present_in_lhs_or_actual_p (gnat_node))
5970 gnu_result = build_atomic_load (gnu_result, sync);
5971 break;
5973 case N_Integer_Literal:
5975 tree gnu_type;
5977 /* Get the type of the result, looking inside any padding and
5978 justified modular types. Then get the value in that type. */
5979 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
5981 if (TREE_CODE (gnu_type) == RECORD_TYPE
5982 && TYPE_JUSTIFIED_MODULAR_P (gnu_type))
5983 gnu_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
5985 gnu_result = UI_To_gnu (Intval (gnat_node), gnu_type);
5987 /* If the result overflows (meaning it doesn't fit in its base type),
5988 abort. We would like to check that the value is within the range
5989 of the subtype, but that causes problems with subtypes whose usage
5990 will raise Constraint_Error and with biased representation, so
5991 we don't. */
5992 gcc_assert (!TREE_OVERFLOW (gnu_result));
5994 break;
5996 case N_Character_Literal:
5997 /* If a Entity is present, it means that this was one of the
5998 literals in a user-defined character type. In that case,
5999 just return the value in the CONST_DECL. Otherwise, use the
6000 character code. In that case, the base type should be an
6001 INTEGER_TYPE, but we won't bother checking for that. */
6002 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6003 if (Present (Entity (gnat_node)))
6004 gnu_result = DECL_INITIAL (get_gnu_tree (Entity (gnat_node)));
6005 else
6006 gnu_result
6007 = build_int_cst (gnu_result_type,
6008 UI_To_CC (Char_Literal_Value (gnat_node)));
6009 break;
6011 case N_Real_Literal:
6012 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6014 /* If this is of a fixed-point type, the value we want is the value of
6015 the corresponding integer. */
6016 if (Is_Fixed_Point_Type (Underlying_Type (Etype (gnat_node))))
6018 gnu_result = UI_To_gnu (Corresponding_Integer_Value (gnat_node),
6019 gnu_result_type);
6020 gcc_assert (!TREE_OVERFLOW (gnu_result));
6023 else
6025 Ureal ur_realval = Realval (gnat_node);
6027 /* First convert the value to a machine number if it isn't already.
6028 That will force the base to 2 for non-zero values and simplify
6029 the rest of the logic. */
6030 if (!Is_Machine_Number (gnat_node))
6031 ur_realval
6032 = Machine (Base_Type (Underlying_Type (Etype (gnat_node))),
6033 ur_realval, Round_Even, gnat_node);
6035 if (UR_Is_Zero (ur_realval))
6036 gnu_result = build_real (gnu_result_type, dconst0);
6037 else
6039 REAL_VALUE_TYPE tmp;
6041 gnu_result = UI_To_gnu (Numerator (ur_realval), gnu_result_type);
6043 /* The base must be 2 as Machine guarantees this, so we scale
6044 the value, which we know can fit in the mantissa of the type
6045 (hence the use of that type above). */
6046 gcc_assert (Rbase (ur_realval) == 2);
6047 real_ldexp (&tmp, &TREE_REAL_CST (gnu_result),
6048 - UI_To_Int (Denominator (ur_realval)));
6049 gnu_result = build_real (gnu_result_type, tmp);
6052 /* Now see if we need to negate the result. Do it this way to
6053 properly handle -0. */
6054 if (UR_Is_Negative (Realval (gnat_node)))
6055 gnu_result
6056 = build_unary_op (NEGATE_EXPR, get_base_type (gnu_result_type),
6057 gnu_result);
6060 break;
6062 case N_String_Literal:
6063 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6064 if (TYPE_PRECISION (TREE_TYPE (gnu_result_type)) == HOST_BITS_PER_CHAR)
6066 String_Id gnat_string = Strval (gnat_node);
6067 int length = String_Length (gnat_string);
6068 int i;
6069 char *string;
6070 if (length >= ALLOCA_THRESHOLD)
6071 string = XNEWVEC (char, length + 1);
6072 else
6073 string = (char *) alloca (length + 1);
6075 /* Build the string with the characters in the literal. Note
6076 that Ada strings are 1-origin. */
6077 for (i = 0; i < length; i++)
6078 string[i] = Get_String_Char (gnat_string, i + 1);
6080 /* Put a null at the end of the string in case it's in a context
6081 where GCC will want to treat it as a C string. */
6082 string[i] = 0;
6084 gnu_result = build_string (length, string);
6086 /* Strings in GCC don't normally have types, but we want
6087 this to not be converted to the array type. */
6088 TREE_TYPE (gnu_result) = gnu_result_type;
6090 if (length >= ALLOCA_THRESHOLD)
6091 free (string);
6093 else
6095 /* Build a list consisting of each character, then make
6096 the aggregate. */
6097 String_Id gnat_string = Strval (gnat_node);
6098 int length = String_Length (gnat_string);
6099 int i;
6100 tree gnu_idx = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
6101 tree gnu_one_node = convert (TREE_TYPE (gnu_idx), integer_one_node);
6102 vec<constructor_elt, va_gc> *gnu_vec;
6103 vec_alloc (gnu_vec, length);
6105 for (i = 0; i < length; i++)
6107 tree t = build_int_cst (TREE_TYPE (gnu_result_type),
6108 Get_String_Char (gnat_string, i + 1));
6110 CONSTRUCTOR_APPEND_ELT (gnu_vec, gnu_idx, t);
6111 gnu_idx = int_const_binop (PLUS_EXPR, gnu_idx, gnu_one_node);
6114 gnu_result = gnat_build_constructor (gnu_result_type, gnu_vec);
6116 break;
6118 case N_Pragma:
6119 gnu_result = Pragma_to_gnu (gnat_node);
6120 break;
6122 /**************************************/
6123 /* Chapter 3: Declarations and Types */
6124 /**************************************/
6126 case N_Subtype_Declaration:
6127 case N_Full_Type_Declaration:
6128 case N_Incomplete_Type_Declaration:
6129 case N_Private_Type_Declaration:
6130 case N_Private_Extension_Declaration:
6131 case N_Task_Type_Declaration:
6132 process_type (Defining_Entity (gnat_node));
6133 gnu_result = alloc_stmt_list ();
6134 break;
6136 case N_Object_Declaration:
6137 case N_Exception_Declaration:
6138 gnat_temp = Defining_Entity (gnat_node);
6139 gnu_result = alloc_stmt_list ();
6141 /* If we are just annotating types and this object has an unconstrained
6142 or task type, don't elaborate it. */
6143 if (type_annotate_only
6144 && (((Is_Array_Type (Etype (gnat_temp))
6145 || Is_Record_Type (Etype (gnat_temp)))
6146 && !Is_Constrained (Etype (gnat_temp)))
6147 || Is_Concurrent_Type (Etype (gnat_temp))))
6148 break;
6150 if (Present (Expression (gnat_node))
6151 && !(kind == N_Object_Declaration && No_Initialization (gnat_node))
6152 && (!type_annotate_only
6153 || Compile_Time_Known_Value (Expression (gnat_node))))
6155 gnu_expr = gnat_to_gnu (Expression (gnat_node));
6156 if (Do_Range_Check (Expression (gnat_node)))
6157 gnu_expr
6158 = emit_range_check (gnu_expr, Etype (gnat_temp), gnat_node);
6160 if (type_annotate_only && TREE_CODE (gnu_expr) == ERROR_MARK)
6161 gnu_expr = NULL_TREE;
6163 else
6164 gnu_expr = NULL_TREE;
6166 /* If this is a deferred constant with an address clause, we ignore the
6167 full view since the clause is on the partial view and we cannot have
6168 2 different GCC trees for the object. The only bits of the full view
6169 we will use is the initializer, but it will be directly fetched. */
6170 if (Ekind (gnat_temp) == E_Constant
6171 && Present (Address_Clause (gnat_temp))
6172 && Present (Full_View (gnat_temp)))
6173 save_gnu_tree (Full_View (gnat_temp), error_mark_node, true);
6175 /* If this object has its elaboration delayed, we must force evaluation
6176 of GNU_EXPR now and save it for the freeze point. Note that we need
6177 not do anything special at the global level since the lifetime of the
6178 temporary is fully contained within the elaboration routine. */
6179 if (Present (Freeze_Node (gnat_temp)))
6181 if (gnu_expr)
6183 gnu_result = gnat_save_expr (gnu_expr);
6184 save_gnu_tree (gnat_node, gnu_result, true);
6187 else
6188 gnat_to_gnu_entity (gnat_temp, gnu_expr, true);
6189 break;
6191 case N_Object_Renaming_Declaration:
6192 gnat_temp = Defining_Entity (gnat_node);
6193 gnu_result = alloc_stmt_list ();
6195 /* Don't do anything if this renaming is handled by the front end and it
6196 does not need debug info. Note that we consider renamings don't need
6197 debug info when optimizing: our way to describe them has a
6198 memory/elaboration footprint.
6200 Don't do anything neither if we are just annotating types and this
6201 object has a composite or task type, don't elaborate it. */
6202 if ((!Is_Renaming_Of_Object (gnat_temp)
6203 || (Needs_Debug_Info (gnat_temp)
6204 && !optimize
6205 && can_materialize_object_renaming_p
6206 (Renamed_Object (gnat_temp))))
6207 && ! (type_annotate_only
6208 && (Is_Array_Type (Etype (gnat_temp))
6209 || Is_Record_Type (Etype (gnat_temp))
6210 || Is_Concurrent_Type (Etype (gnat_temp)))))
6212 tree gnu_temp
6213 = gnat_to_gnu_entity (gnat_temp,
6214 gnat_to_gnu (Renamed_Object (gnat_temp)),
6215 true);
6216 /* See case 2 of renaming in gnat_to_gnu_entity. */
6217 if (TREE_SIDE_EFFECTS (gnu_temp))
6218 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_temp);
6220 break;
6222 case N_Exception_Renaming_Declaration:
6223 gnat_temp = Defining_Entity (gnat_node);
6224 gnu_result = alloc_stmt_list ();
6226 /* See the above case for the rationale. */
6227 if (Present (Renamed_Entity (gnat_temp)))
6229 tree gnu_temp
6230 = gnat_to_gnu_entity (gnat_temp,
6231 gnat_to_gnu (Renamed_Entity (gnat_temp)),
6232 true);
6233 if (TREE_SIDE_EFFECTS (gnu_temp))
6234 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_temp);
6236 break;
6238 case N_Subprogram_Renaming_Declaration:
6240 const Node_Id gnat_renaming = Defining_Entity (gnat_node);
6241 const Node_Id gnat_renamed = Renamed_Entity (gnat_renaming);
6243 gnu_result = alloc_stmt_list ();
6245 /* Materializing renamed subprograms will only benefit the debugging
6246 information as they aren't referenced in the generated code. So
6247 skip them when they aren't needed. Avoid doing this if:
6249 - there is a freeze node: in this case the renamed entity is not
6250 elaborated yet,
6251 - the renamed subprogram is intrinsic: it will not be available in
6252 the debugging information (note that both or only one of the
6253 renaming and the renamed subprograms can be intrinsic). */
6254 if (!type_annotate_only
6255 && Needs_Debug_Info (gnat_renaming)
6256 && No (Freeze_Node (gnat_renaming))
6257 && Present (gnat_renamed)
6258 && (Ekind (gnat_renamed) == E_Function
6259 || Ekind (gnat_renamed) == E_Procedure)
6260 && !Is_Intrinsic_Subprogram (gnat_renaming)
6261 && !Is_Intrinsic_Subprogram (gnat_renamed))
6262 gnat_to_gnu_entity (gnat_renaming, gnat_to_gnu (gnat_renamed), true);
6263 break;
6266 case N_Implicit_Label_Declaration:
6267 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, true);
6268 gnu_result = alloc_stmt_list ();
6269 break;
6271 case N_Number_Declaration:
6272 case N_Package_Renaming_Declaration:
6273 /* These are fully handled in the front end. */
6274 /* ??? For package renamings, find a way to use GENERIC namespaces so
6275 that we get proper debug information for them. */
6276 gnu_result = alloc_stmt_list ();
6277 break;
6279 /*************************************/
6280 /* Chapter 4: Names and Expressions */
6281 /*************************************/
6283 case N_Explicit_Dereference:
6284 /* Make sure the designated type is complete before dereferencing. */
6285 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6286 gnu_result = gnat_to_gnu (Prefix (gnat_node));
6287 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
6289 /* If atomic access is required on the RHS, build the atomic load. */
6290 if (atomic_access_required_p (gnat_node, &sync)
6291 && !present_in_lhs_or_actual_p (gnat_node))
6292 gnu_result = build_atomic_load (gnu_result, sync);
6293 break;
6295 case N_Indexed_Component:
6297 tree gnu_array_object
6298 = gnat_to_gnu (adjust_for_implicit_deref (Prefix (gnat_node)));
6299 tree gnu_type;
6300 int ndim;
6301 int i;
6302 Node_Id *gnat_expr_array;
6304 gnu_array_object = maybe_implicit_deref (gnu_array_object);
6306 /* Convert vector inputs to their representative array type, to fit
6307 what the code below expects. */
6308 if (VECTOR_TYPE_P (TREE_TYPE (gnu_array_object)))
6310 if (present_in_lhs_or_actual_p (gnat_node))
6311 gnat_mark_addressable (gnu_array_object);
6312 gnu_array_object = maybe_vector_array (gnu_array_object);
6315 gnu_array_object = maybe_unconstrained_array (gnu_array_object);
6317 /* If we got a padded type, remove it too. */
6318 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_array_object)))
6319 gnu_array_object
6320 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_array_object))),
6321 gnu_array_object);
6323 /* The failure of this assertion will very likely come from a missing
6324 expansion for a packed array access. */
6325 gcc_assert (TREE_CODE (TREE_TYPE (gnu_array_object)) == ARRAY_TYPE);
6327 /* First compute the number of dimensions of the array, then
6328 fill the expression array, the order depending on whether
6329 this is a Convention_Fortran array or not. */
6330 for (ndim = 1, gnu_type = TREE_TYPE (gnu_array_object);
6331 TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
6332 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type));
6333 ndim++, gnu_type = TREE_TYPE (gnu_type))
6336 gnat_expr_array = XALLOCAVEC (Node_Id, ndim);
6338 if (TYPE_CONVENTION_FORTRAN_P (TREE_TYPE (gnu_array_object)))
6339 for (i = ndim - 1, gnat_temp = First (Expressions (gnat_node));
6340 i >= 0;
6341 i--, gnat_temp = Next (gnat_temp))
6342 gnat_expr_array[i] = gnat_temp;
6343 else
6344 for (i = 0, gnat_temp = First (Expressions (gnat_node));
6345 i < ndim;
6346 i++, gnat_temp = Next (gnat_temp))
6347 gnat_expr_array[i] = gnat_temp;
6349 /* Start with the prefix and build the successive references. */
6350 gnu_result = gnu_array_object;
6352 for (i = 0, gnu_type = TREE_TYPE (gnu_array_object);
6353 i < ndim;
6354 i++, gnu_type = TREE_TYPE (gnu_type))
6356 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
6357 gnat_temp = gnat_expr_array[i];
6358 gnu_expr = maybe_character_value (gnat_to_gnu (gnat_temp));
6359 struct loop_info_d *loop;
6361 gnu_result
6362 = build_binary_op (ARRAY_REF, NULL_TREE, gnu_result, gnu_expr);
6364 /* Array accesses are bound-checked so they cannot trap, but this
6365 is valid only if they are not hoisted ahead of the check. We
6366 need to mark them as no-trap to get decent loop optimizations
6367 in the presence of -fnon-call-exceptions, so we do it when we
6368 know that the original expression had no side-effects. */
6369 if (TREE_CODE (gnu_result) == ARRAY_REF
6370 && !(Nkind (gnat_temp) == N_Identifier
6371 && Ekind (Entity (gnat_temp)) == E_Constant))
6372 TREE_THIS_NOTRAP (gnu_result) = 1;
6374 /* If aggressive loop optimizations are enabled, we warn for loops
6375 overrunning a simple array of size 1 not at the end of a record.
6376 This is aimed to catch misuses of the trailing array idiom. */
6377 if (optimize
6378 && flag_aggressive_loop_optimizations
6379 && inside_loop_p ()
6380 && TREE_CODE (TREE_TYPE (gnu_type)) != ARRAY_TYPE
6381 && TREE_CODE (gnu_array_object) != ARRAY_REF
6382 && tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_type)),
6383 TYPE_MAX_VALUE (TYPE_DOMAIN (gnu_type)))
6384 && !array_at_struct_end_p (gnu_result)
6385 && (loop = find_loop_for (gnu_expr))
6386 && !loop->artificial
6387 && !loop->has_checks
6388 && tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_type)),
6389 loop->low_bound)
6390 && can_be_lower_p (loop->low_bound, loop->high_bound)
6391 && !loop->warned_aggressive_loop_optimizations
6392 && warning (OPT_Waggressive_loop_optimizations,
6393 "out-of-bounds access may be optimized away"))
6395 inform (EXPR_LOCATION (loop->stmt), "containing loop");
6396 loop->warned_aggressive_loop_optimizations = true;
6400 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6402 /* If atomic access is required on the RHS, build the atomic load. */
6403 if (atomic_access_required_p (gnat_node, &sync)
6404 && !present_in_lhs_or_actual_p (gnat_node))
6405 gnu_result = build_atomic_load (gnu_result, sync);
6407 break;
6409 case N_Slice:
6411 tree gnu_array_object
6412 = gnat_to_gnu (adjust_for_implicit_deref (Prefix (gnat_node)));
6414 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6416 gnu_array_object = maybe_implicit_deref (gnu_array_object);
6417 gnu_array_object = maybe_unconstrained_array (gnu_array_object);
6419 gnu_expr = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
6420 gnu_expr = maybe_character_value (gnu_expr);
6422 /* If this is a slice with non-constant size of an array with constant
6423 size, set the maximum size for the allocation of temporaries. */
6424 if (!TREE_CONSTANT (TYPE_SIZE_UNIT (gnu_result_type))
6425 && TREE_CONSTANT (TYPE_SIZE_UNIT (TREE_TYPE (gnu_array_object))))
6426 TYPE_ARRAY_MAX_SIZE (gnu_result_type)
6427 = TYPE_SIZE_UNIT (TREE_TYPE (gnu_array_object));
6429 gnu_result = build_binary_op (ARRAY_RANGE_REF, gnu_result_type,
6430 gnu_array_object, gnu_expr);
6432 break;
6434 case N_Selected_Component:
6436 Entity_Id gnat_prefix
6437 = adjust_for_implicit_deref (Prefix (gnat_node));
6438 Entity_Id gnat_field = Entity (Selector_Name (gnat_node));
6439 tree gnu_prefix = gnat_to_gnu (gnat_prefix);
6441 gnu_prefix = maybe_implicit_deref (gnu_prefix);
6443 /* gnat_to_gnu_entity does not save the GNU tree made for renamed
6444 discriminants so avoid making recursive calls on each reference
6445 to them by following the appropriate link directly here. */
6446 if (Ekind (gnat_field) == E_Discriminant)
6448 /* For discriminant references in tagged types always substitute
6449 the corresponding discriminant as the actual component. */
6450 if (Is_Tagged_Type (Underlying_Type (Etype (gnat_prefix))))
6451 while (Present (Corresponding_Discriminant (gnat_field)))
6452 gnat_field = Corresponding_Discriminant (gnat_field);
6454 /* For discriminant references in untagged types always substitute
6455 the corresponding stored discriminant. */
6456 else if (Present (Corresponding_Discriminant (gnat_field)))
6457 gnat_field = Original_Record_Component (gnat_field);
6460 /* Handle extracting the real or imaginary part of a complex.
6461 The real part is the first field and the imaginary the last. */
6462 if (TREE_CODE (TREE_TYPE (gnu_prefix)) == COMPLEX_TYPE)
6463 gnu_result = build_unary_op (Present (Next_Entity (gnat_field))
6464 ? REALPART_EXPR : IMAGPART_EXPR,
6465 NULL_TREE, gnu_prefix);
6466 else
6468 tree gnu_field = gnat_to_gnu_field_decl (gnat_field);
6470 gnu_result
6471 = build_component_ref (gnu_prefix, gnu_field,
6472 (Nkind (Parent (gnat_node))
6473 == N_Attribute_Reference)
6474 && lvalue_required_for_attribute_p
6475 (Parent (gnat_node)));
6478 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6480 /* If atomic access is required on the RHS, build the atomic load. */
6481 if (atomic_access_required_p (gnat_node, &sync)
6482 && !present_in_lhs_or_actual_p (gnat_node))
6483 gnu_result = build_atomic_load (gnu_result, sync);
6485 break;
6487 case N_Attribute_Reference:
6489 /* The attribute designator. */
6490 const int attr = Get_Attribute_Id (Attribute_Name (gnat_node));
6492 /* The Elab_Spec and Elab_Body attributes are special in that Prefix
6493 is a unit, not an object with a GCC equivalent. */
6494 if (attr == Attr_Elab_Spec || attr == Attr_Elab_Body)
6495 return
6496 create_subprog_decl (create_concat_name
6497 (Entity (Prefix (gnat_node)),
6498 attr == Attr_Elab_Body ? "elabb" : "elabs"),
6499 NULL_TREE, void_ftype, NULL_TREE, is_disabled,
6500 true, true, true, true, false, NULL,
6501 gnat_node);
6503 gnu_result = Attribute_to_gnu (gnat_node, &gnu_result_type, attr);
6505 break;
6507 case N_Reference:
6508 /* Like 'Access as far as we are concerned. */
6509 gnu_result = gnat_to_gnu (Prefix (gnat_node));
6510 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_result);
6511 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6512 break;
6514 case N_Aggregate:
6515 case N_Extension_Aggregate:
6517 tree gnu_aggr_type;
6519 /* ??? It is wrong to evaluate the type now, but there doesn't
6520 seem to be any other practical way of doing it. */
6522 gcc_assert (!Expansion_Delayed (gnat_node));
6524 gnu_aggr_type = gnu_result_type
6525 = get_unpadded_type (Etype (gnat_node));
6527 if (TREE_CODE (gnu_result_type) == RECORD_TYPE
6528 && TYPE_CONTAINS_TEMPLATE_P (gnu_result_type))
6529 gnu_aggr_type
6530 = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (gnu_result_type)));
6531 else if (TREE_CODE (gnu_result_type) == VECTOR_TYPE)
6532 gnu_aggr_type = TYPE_REPRESENTATIVE_ARRAY (gnu_result_type);
6534 if (Null_Record_Present (gnat_node))
6535 gnu_result = gnat_build_constructor (gnu_aggr_type, NULL);
6537 else if (TREE_CODE (gnu_aggr_type) == RECORD_TYPE
6538 || TREE_CODE (gnu_aggr_type) == UNION_TYPE)
6539 gnu_result
6540 = assoc_to_constructor (Etype (gnat_node),
6541 First (Component_Associations (gnat_node)),
6542 gnu_aggr_type);
6543 else if (TREE_CODE (gnu_aggr_type) == ARRAY_TYPE)
6544 gnu_result = pos_to_constructor (First (Expressions (gnat_node)),
6545 gnu_aggr_type,
6546 Component_Type (Etype (gnat_node)));
6547 else if (TREE_CODE (gnu_aggr_type) == COMPLEX_TYPE)
6548 gnu_result
6549 = build_binary_op
6550 (COMPLEX_EXPR, gnu_aggr_type,
6551 gnat_to_gnu (Expression (First
6552 (Component_Associations (gnat_node)))),
6553 gnat_to_gnu (Expression
6554 (Next
6555 (First (Component_Associations (gnat_node))))));
6556 else
6557 gcc_unreachable ();
6559 gnu_result = convert (gnu_result_type, gnu_result);
6561 break;
6563 case N_Null:
6564 if (TARGET_VTABLE_USES_DESCRIPTORS
6565 && Ekind (Etype (gnat_node)) == E_Access_Subprogram_Type
6566 && Is_Dispatch_Table_Entity (Etype (gnat_node)))
6567 gnu_result = null_fdesc_node;
6568 else
6569 gnu_result = null_pointer_node;
6570 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6571 break;
6573 case N_Type_Conversion:
6574 case N_Qualified_Expression:
6575 gnu_expr = maybe_character_value (gnat_to_gnu (Expression (gnat_node)));
6576 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6578 /* If this is a qualified expression for a tagged type, we mark the type
6579 as used. Because of polymorphism, this might be the only reference to
6580 the tagged type in the program while objects have it as dynamic type.
6581 The debugger needs to see it to display these objects properly. */
6582 if (kind == N_Qualified_Expression && Is_Tagged_Type (Etype (gnat_node)))
6583 used_types_insert (gnu_result_type);
6585 gnu_result
6586 = convert_with_check (Etype (gnat_node), gnu_expr,
6587 Do_Overflow_Check (gnat_node),
6588 Do_Range_Check (Expression (gnat_node)),
6589 kind == N_Type_Conversion
6590 && Float_Truncate (gnat_node), gnat_node);
6591 break;
6593 case N_Unchecked_Type_Conversion:
6594 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6595 gnu_expr = maybe_character_value (gnat_to_gnu (Expression (gnat_node)));
6597 /* Skip further processing if the conversion is deemed a no-op. */
6598 if (unchecked_conversion_nop (gnat_node))
6600 gnu_result = gnu_expr;
6601 gnu_result_type = TREE_TYPE (gnu_result);
6602 break;
6605 /* If the result is a pointer type, see if we are improperly
6606 converting to a stricter alignment. */
6607 if (STRICT_ALIGNMENT && POINTER_TYPE_P (gnu_result_type)
6608 && Is_Access_Type (Etype (gnat_node)))
6610 unsigned int align = known_alignment (gnu_expr);
6611 tree gnu_obj_type = TREE_TYPE (gnu_result_type);
6612 unsigned int oalign = TYPE_ALIGN (gnu_obj_type);
6614 if (align != 0 && align < oalign && !TYPE_ALIGN_OK (gnu_obj_type))
6615 post_error_ne_tree_2
6616 ("?source alignment (^) '< alignment of & (^)",
6617 gnat_node, Designated_Type (Etype (gnat_node)),
6618 size_int (align / BITS_PER_UNIT), oalign / BITS_PER_UNIT);
6621 /* If we are converting a descriptor to a function pointer, first
6622 build the pointer. */
6623 if (TARGET_VTABLE_USES_DESCRIPTORS
6624 && TREE_TYPE (gnu_expr) == fdesc_type_node
6625 && POINTER_TYPE_P (gnu_result_type))
6626 gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
6628 gnu_result = unchecked_convert (gnu_result_type, gnu_expr,
6629 No_Truncation (gnat_node));
6630 break;
6632 case N_In:
6633 case N_Not_In:
6635 tree gnu_obj = gnat_to_gnu (Left_Opnd (gnat_node));
6636 tree gnu_low, gnu_high;
6638 Range_to_gnu (Right_Opnd (gnat_node), &gnu_low, &gnu_high);
6639 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6641 tree gnu_op_type = maybe_character_type (TREE_TYPE (gnu_obj));
6642 if (TREE_TYPE (gnu_obj) != gnu_op_type)
6644 gnu_obj = convert (gnu_op_type, gnu_obj);
6645 gnu_low = convert (gnu_op_type, gnu_low);
6646 gnu_high = convert (gnu_op_type, gnu_high);
6649 /* If LOW and HIGH are identical, perform an equality test. Otherwise,
6650 ensure that GNU_OBJ is evaluated only once and perform a full range
6651 test. */
6652 if (operand_equal_p (gnu_low, gnu_high, 0))
6653 gnu_result
6654 = build_binary_op (EQ_EXPR, gnu_result_type, gnu_obj, gnu_low);
6655 else
6657 tree t1, t2;
6658 gnu_obj = gnat_protect_expr (gnu_obj);
6659 t1 = build_binary_op (GE_EXPR, gnu_result_type, gnu_obj, gnu_low);
6660 if (EXPR_P (t1))
6661 set_expr_location_from_node (t1, gnat_node);
6662 t2 = build_binary_op (LE_EXPR, gnu_result_type, gnu_obj, gnu_high);
6663 if (EXPR_P (t2))
6664 set_expr_location_from_node (t2, gnat_node);
6665 gnu_result
6666 = build_binary_op (TRUTH_ANDIF_EXPR, gnu_result_type, t1, t2);
6669 if (kind == N_Not_In)
6670 gnu_result
6671 = invert_truthvalue_loc (EXPR_LOCATION (gnu_result), gnu_result);
6673 break;
6675 case N_Op_Divide:
6676 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
6677 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
6678 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6679 gnu_result = build_binary_op (FLOAT_TYPE_P (gnu_result_type)
6680 ? RDIV_EXPR
6681 : (Rounded_Result (gnat_node)
6682 ? ROUND_DIV_EXPR : TRUNC_DIV_EXPR),
6683 gnu_result_type, gnu_lhs, gnu_rhs);
6684 break;
6686 case N_Op_And:
6687 case N_Op_Or:
6688 case N_Op_Xor:
6689 /* These can either be operations on booleans or on modular types.
6690 Fall through for boolean types since that's the way GNU_CODES is
6691 set up. */
6692 if (Is_Modular_Integer_Type (Underlying_Type (Etype (gnat_node))))
6694 enum tree_code code
6695 = (kind == N_Op_Or ? BIT_IOR_EXPR
6696 : kind == N_Op_And ? BIT_AND_EXPR
6697 : BIT_XOR_EXPR);
6699 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
6700 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
6701 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6702 gnu_result = build_binary_op (code, gnu_result_type,
6703 gnu_lhs, gnu_rhs);
6704 break;
6707 /* ... fall through ... */
6709 case N_Op_Eq:
6710 case N_Op_Ne:
6711 case N_Op_Lt:
6712 case N_Op_Le:
6713 case N_Op_Gt:
6714 case N_Op_Ge:
6715 case N_Op_Add:
6716 case N_Op_Subtract:
6717 case N_Op_Multiply:
6718 case N_Op_Mod:
6719 case N_Op_Rem:
6720 case N_Op_Rotate_Left:
6721 case N_Op_Rotate_Right:
6722 case N_Op_Shift_Left:
6723 case N_Op_Shift_Right:
6724 case N_Op_Shift_Right_Arithmetic:
6725 case N_And_Then:
6726 case N_Or_Else:
6728 enum tree_code code = gnu_codes[kind];
6729 bool ignore_lhs_overflow = false;
6730 location_t saved_location = input_location;
6731 tree gnu_type;
6733 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
6734 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
6735 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
6737 /* Pending generic support for efficient vector logical operations in
6738 GCC, convert vectors to their representative array type view and
6739 fallthrough. */
6740 gnu_lhs = maybe_vector_array (gnu_lhs);
6741 gnu_rhs = maybe_vector_array (gnu_rhs);
6743 /* If this is a comparison operator, convert any references to an
6744 unconstrained array value into a reference to the actual array. */
6745 if (TREE_CODE_CLASS (code) == tcc_comparison)
6747 gnu_lhs = maybe_unconstrained_array (gnu_lhs);
6748 gnu_rhs = maybe_unconstrained_array (gnu_rhs);
6750 tree gnu_op_type = maybe_character_type (TREE_TYPE (gnu_lhs));
6751 if (TREE_TYPE (gnu_lhs) != gnu_op_type)
6753 gnu_lhs = convert (gnu_op_type, gnu_lhs);
6754 gnu_rhs = convert (gnu_op_type, gnu_rhs);
6758 /* If this is a shift whose count is not guaranteed to be correct,
6759 we need to adjust the shift count. */
6760 if (IN (kind, N_Op_Shift) && !Shift_Count_OK (gnat_node))
6762 tree gnu_count_type = get_base_type (TREE_TYPE (gnu_rhs));
6763 tree gnu_max_shift
6764 = convert (gnu_count_type, TYPE_SIZE (gnu_type));
6766 if (kind == N_Op_Rotate_Left || kind == N_Op_Rotate_Right)
6767 gnu_rhs = build_binary_op (TRUNC_MOD_EXPR, gnu_count_type,
6768 gnu_rhs, gnu_max_shift);
6769 else if (kind == N_Op_Shift_Right_Arithmetic)
6770 gnu_rhs
6771 = build_binary_op
6772 (MIN_EXPR, gnu_count_type,
6773 build_binary_op (MINUS_EXPR,
6774 gnu_count_type,
6775 gnu_max_shift,
6776 build_int_cst (gnu_count_type, 1)),
6777 gnu_rhs);
6780 /* For right shifts, the type says what kind of shift to do,
6781 so we may need to choose a different type. In this case,
6782 we have to ignore integer overflow lest it propagates all
6783 the way down and causes a CE to be explicitly raised. */
6784 if (kind == N_Op_Shift_Right && !TYPE_UNSIGNED (gnu_type))
6786 gnu_type = gnat_unsigned_type_for (gnu_type);
6787 ignore_lhs_overflow = true;
6789 else if (kind == N_Op_Shift_Right_Arithmetic
6790 && TYPE_UNSIGNED (gnu_type))
6792 gnu_type = gnat_signed_type_for (gnu_type);
6793 ignore_lhs_overflow = true;
6796 if (gnu_type != gnu_result_type)
6798 tree gnu_old_lhs = gnu_lhs;
6799 gnu_lhs = convert (gnu_type, gnu_lhs);
6800 if (TREE_CODE (gnu_lhs) == INTEGER_CST && ignore_lhs_overflow)
6801 TREE_OVERFLOW (gnu_lhs) = TREE_OVERFLOW (gnu_old_lhs);
6802 gnu_rhs = convert (gnu_type, gnu_rhs);
6805 /* Instead of expanding overflow checks for addition, subtraction
6806 and multiplication itself, the front end will leave this to
6807 the back end when Backend_Overflow_Checks_On_Target is set. */
6808 if (Do_Overflow_Check (gnat_node)
6809 && Backend_Overflow_Checks_On_Target
6810 && (code == PLUS_EXPR || code == MINUS_EXPR || code == MULT_EXPR)
6811 && !TYPE_UNSIGNED (gnu_type)
6812 && !FLOAT_TYPE_P (gnu_type))
6813 gnu_result = build_binary_op_trapv (code, gnu_type,
6814 gnu_lhs, gnu_rhs, gnat_node);
6815 else
6817 /* Some operations, e.g. comparisons of arrays, generate complex
6818 trees that need to be annotated while they are being built. */
6819 input_location = saved_location;
6820 gnu_result = build_binary_op (code, gnu_type, gnu_lhs, gnu_rhs);
6823 /* If this is a logical shift with the shift count not verified,
6824 we must return zero if it is too large. We cannot compensate
6825 above in this case. */
6826 if ((kind == N_Op_Shift_Left || kind == N_Op_Shift_Right)
6827 && !Shift_Count_OK (gnat_node))
6828 gnu_result
6829 = build_cond_expr
6830 (gnu_type,
6831 build_binary_op (GE_EXPR, boolean_type_node,
6832 gnu_rhs,
6833 convert (TREE_TYPE (gnu_rhs),
6834 TYPE_SIZE (gnu_type))),
6835 build_int_cst (gnu_type, 0),
6836 gnu_result);
6838 break;
6840 case N_If_Expression:
6842 tree gnu_cond = gnat_to_gnu (First (Expressions (gnat_node)));
6843 tree gnu_true = gnat_to_gnu (Next (First (Expressions (gnat_node))));
6844 tree gnu_false
6845 = gnat_to_gnu (Next (Next (First (Expressions (gnat_node)))));
6847 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6848 gnu_result
6849 = build_cond_expr (gnu_result_type, gnu_cond, gnu_true, gnu_false);
6851 break;
6853 case N_Op_Plus:
6854 gnu_result = gnat_to_gnu (Right_Opnd (gnat_node));
6855 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6856 break;
6858 case N_Op_Not:
6859 /* This case can apply to a boolean or a modular type.
6860 Fall through for a boolean operand since GNU_CODES is set
6861 up to handle this. */
6862 if (Is_Modular_Integer_Type (Underlying_Type (Etype (gnat_node))))
6864 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
6865 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6866 gnu_result = build_unary_op (BIT_NOT_EXPR, gnu_result_type,
6867 gnu_expr);
6868 break;
6871 /* ... fall through ... */
6873 case N_Op_Minus:
6874 case N_Op_Abs:
6875 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
6876 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6878 /* Instead of expanding overflow checks for negation and absolute
6879 value itself, the front end will leave this to the back end
6880 when Backend_Overflow_Checks_On_Target is set. */
6881 if (Do_Overflow_Check (gnat_node)
6882 && Backend_Overflow_Checks_On_Target
6883 && !TYPE_UNSIGNED (gnu_result_type)
6884 && !FLOAT_TYPE_P (gnu_result_type))
6885 gnu_result
6886 = build_unary_op_trapv (gnu_codes[kind],
6887 gnu_result_type, gnu_expr, gnat_node);
6888 else
6889 gnu_result = build_unary_op (gnu_codes[kind],
6890 gnu_result_type, gnu_expr);
6891 break;
6893 case N_Allocator:
6895 tree gnu_init = NULL_TREE;
6896 tree gnu_type;
6897 bool ignore_init_type = false;
6899 gnat_temp = Expression (gnat_node);
6901 /* The Expression operand can either be an N_Identifier or
6902 Expanded_Name, which must represent a type, or a
6903 N_Qualified_Expression, which contains both the object type and an
6904 initial value for the object. */
6905 if (Nkind (gnat_temp) == N_Identifier
6906 || Nkind (gnat_temp) == N_Expanded_Name)
6907 gnu_type = gnat_to_gnu_type (Entity (gnat_temp));
6908 else if (Nkind (gnat_temp) == N_Qualified_Expression)
6910 Entity_Id gnat_desig_type
6911 = Designated_Type (Underlying_Type (Etype (gnat_node)));
6913 ignore_init_type = Has_Constrained_Partial_View (gnat_desig_type);
6914 gnu_init = gnat_to_gnu (Expression (gnat_temp));
6916 gnu_init = maybe_unconstrained_array (gnu_init);
6917 if (Do_Range_Check (Expression (gnat_temp)))
6918 gnu_init
6919 = emit_range_check (gnu_init, gnat_desig_type, gnat_temp);
6921 if (Is_Elementary_Type (gnat_desig_type)
6922 || Is_Constrained (gnat_desig_type))
6923 gnu_type = gnat_to_gnu_type (gnat_desig_type);
6924 else
6926 gnu_type = gnat_to_gnu_type (Etype (Expression (gnat_temp)));
6927 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
6928 gnu_type = TREE_TYPE (gnu_init);
6931 /* See the N_Qualified_Expression case for the rationale. */
6932 if (Is_Tagged_Type (gnat_desig_type))
6933 used_types_insert (gnu_type);
6935 gnu_init = convert (gnu_type, gnu_init);
6937 else
6938 gcc_unreachable ();
6940 gnu_result_type = get_unpadded_type (Etype (gnat_node));
6941 return build_allocator (gnu_type, gnu_init, gnu_result_type,
6942 Procedure_To_Call (gnat_node),
6943 Storage_Pool (gnat_node), gnat_node,
6944 ignore_init_type);
6946 break;
6948 /**************************/
6949 /* Chapter 5: Statements */
6950 /**************************/
6952 case N_Label:
6953 gnu_result = build1 (LABEL_EXPR, void_type_node,
6954 gnat_to_gnu (Identifier (gnat_node)));
6955 break;
6957 case N_Null_Statement:
6958 /* When not optimizing, turn null statements from source into gotos to
6959 the next statement that the middle-end knows how to preserve. */
6960 if (!optimize && Comes_From_Source (gnat_node))
6962 tree stmt, label = create_label_decl (NULL_TREE, gnat_node);
6963 DECL_IGNORED_P (label) = 1;
6964 start_stmt_group ();
6965 stmt = build1 (GOTO_EXPR, void_type_node, label);
6966 set_expr_location_from_node (stmt, gnat_node);
6967 add_stmt (stmt);
6968 stmt = build1 (LABEL_EXPR, void_type_node, label);
6969 set_expr_location_from_node (stmt, gnat_node);
6970 add_stmt (stmt);
6971 gnu_result = end_stmt_group ();
6973 else
6974 gnu_result = alloc_stmt_list ();
6975 break;
6977 case N_Assignment_Statement:
6978 /* Get the LHS and RHS of the statement and convert any reference to an
6979 unconstrained array into a reference to the underlying array. */
6980 gnu_lhs = maybe_unconstrained_array (gnat_to_gnu (Name (gnat_node)));
6982 /* If the type has a size that overflows, convert this into raise of
6983 Storage_Error: execution shouldn't have gotten here anyway. */
6984 if (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))) == INTEGER_CST
6985 && !valid_constant_size_p (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))))
6986 gnu_result = build_call_raise (SE_Object_Too_Large, gnat_node,
6987 N_Raise_Storage_Error);
6988 else if (Nkind (Expression (gnat_node)) == N_Function_Call)
6990 bool outer_atomic_access
6991 = outer_atomic_access_required_p (Name (gnat_node));
6992 bool atomic_access
6993 = !outer_atomic_access
6994 && atomic_access_required_p (Name (gnat_node), &sync);
6995 gnu_result
6996 = Call_to_gnu (Expression (gnat_node), &gnu_result_type, gnu_lhs,
6997 outer_atomic_access, atomic_access, sync);
6999 else
7001 const Node_Id gnat_expr = Expression (gnat_node);
7002 const Entity_Id gnat_type
7003 = Underlying_Type (Etype (Name (gnat_node)));
7004 const bool regular_array_type_p
7005 = (Is_Array_Type (gnat_type) && !Is_Bit_Packed_Array (gnat_type));
7006 const bool use_memset_p
7007 = (regular_array_type_p
7008 && Nkind (gnat_expr) == N_Aggregate
7009 && Is_Others_Aggregate (gnat_expr));
7011 /* If we'll use memset, we need to find the inner expression. */
7012 if (use_memset_p)
7014 Node_Id gnat_inner
7015 = Expression (First (Component_Associations (gnat_expr)));
7016 while (Nkind (gnat_inner) == N_Aggregate
7017 && Is_Others_Aggregate (gnat_inner))
7018 gnat_inner
7019 = Expression (First (Component_Associations (gnat_inner)));
7020 gnu_rhs = gnat_to_gnu (gnat_inner);
7022 else
7023 gnu_rhs = maybe_unconstrained_array (gnat_to_gnu (gnat_expr));
7025 /* If range check is needed, emit code to generate it. */
7026 if (Do_Range_Check (gnat_expr))
7027 gnu_rhs = emit_range_check (gnu_rhs, Etype (Name (gnat_node)),
7028 gnat_node);
7030 /* If an outer atomic access is required on the LHS, build the load-
7031 modify-store sequence. */
7032 if (outer_atomic_access_required_p (Name (gnat_node)))
7033 gnu_result = build_load_modify_store (gnu_lhs, gnu_rhs, gnat_node);
7035 /* Or else, if atomic access is required, build the atomic store. */
7036 else if (atomic_access_required_p (Name (gnat_node), &sync))
7037 gnu_result = build_atomic_store (gnu_lhs, gnu_rhs, sync);
7039 /* Or else, use memset when the conditions are met. */
7040 else if (use_memset_p)
7042 tree value
7043 = real_zerop (gnu_rhs)
7044 ? integer_zero_node
7045 : fold_convert (integer_type_node, gnu_rhs);
7046 tree to = gnu_lhs;
7047 tree type = TREE_TYPE (to);
7048 tree size
7049 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (type), to);
7050 tree to_ptr = build_fold_addr_expr (to);
7051 tree t = builtin_decl_explicit (BUILT_IN_MEMSET);
7052 if (TREE_CODE (value) == INTEGER_CST && !integer_zerop (value))
7054 tree mask
7055 = build_int_cst (integer_type_node,
7056 ((HOST_WIDE_INT) 1 << BITS_PER_UNIT) - 1);
7057 value = int_const_binop (BIT_AND_EXPR, value, mask);
7059 gnu_result = build_call_expr (t, 3, to_ptr, value, size);
7062 /* Otherwise build a regular assignment. */
7063 else
7064 gnu_result
7065 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_lhs, gnu_rhs);
7067 /* If the assignment type is a regular array and the two sides are
7068 not completely disjoint, play safe and use memmove. But don't do
7069 it for a bit-packed array as it might not be byte-aligned. */
7070 if (TREE_CODE (gnu_result) == MODIFY_EXPR
7071 && regular_array_type_p
7072 && !(Forwards_OK (gnat_node) && Backwards_OK (gnat_node)))
7074 tree to = TREE_OPERAND (gnu_result, 0);
7075 tree from = TREE_OPERAND (gnu_result, 1);
7076 tree type = TREE_TYPE (from);
7077 tree size
7078 = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (type), from);
7079 tree to_ptr = build_fold_addr_expr (to);
7080 tree from_ptr = build_fold_addr_expr (from);
7081 tree t = builtin_decl_explicit (BUILT_IN_MEMMOVE);
7082 gnu_result = build_call_expr (t, 3, to_ptr, from_ptr, size);
7085 break;
7087 case N_If_Statement:
7089 tree *gnu_else_ptr; /* Point to put next "else if" or "else". */
7091 /* Make the outer COND_EXPR. Avoid non-determinism. */
7092 gnu_result = build3 (COND_EXPR, void_type_node,
7093 gnat_to_gnu (Condition (gnat_node)),
7094 NULL_TREE, NULL_TREE);
7095 COND_EXPR_THEN (gnu_result)
7096 = build_stmt_group (Then_Statements (gnat_node), false);
7097 TREE_SIDE_EFFECTS (gnu_result) = 1;
7098 gnu_else_ptr = &COND_EXPR_ELSE (gnu_result);
7100 /* Now make a COND_EXPR for each of the "else if" parts. Put each
7101 into the previous "else" part and point to where to put any
7102 outer "else". Also avoid non-determinism. */
7103 if (Present (Elsif_Parts (gnat_node)))
7104 for (gnat_temp = First (Elsif_Parts (gnat_node));
7105 Present (gnat_temp); gnat_temp = Next (gnat_temp))
7107 gnu_expr = build3 (COND_EXPR, void_type_node,
7108 gnat_to_gnu (Condition (gnat_temp)),
7109 NULL_TREE, NULL_TREE);
7110 COND_EXPR_THEN (gnu_expr)
7111 = build_stmt_group (Then_Statements (gnat_temp), false);
7112 TREE_SIDE_EFFECTS (gnu_expr) = 1;
7113 set_expr_location_from_node (gnu_expr, gnat_temp);
7114 *gnu_else_ptr = gnu_expr;
7115 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
7118 *gnu_else_ptr = build_stmt_group (Else_Statements (gnat_node), false);
7120 break;
7122 case N_Case_Statement:
7123 gnu_result = Case_Statement_to_gnu (gnat_node);
7124 break;
7126 case N_Loop_Statement:
7127 gnu_result = Loop_Statement_to_gnu (gnat_node);
7128 break;
7130 case N_Block_Statement:
7131 /* The only way to enter the block is to fall through to it. */
7132 if (stmt_group_may_fallthru ())
7134 start_stmt_group ();
7135 gnat_pushlevel ();
7136 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
7137 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
7138 gnat_poplevel ();
7139 gnu_result = end_stmt_group ();
7141 else
7142 gnu_result = alloc_stmt_list ();
7143 break;
7145 case N_Exit_Statement:
7146 gnu_result
7147 = build2 (EXIT_STMT, void_type_node,
7148 (Present (Condition (gnat_node))
7149 ? gnat_to_gnu (Condition (gnat_node)) : NULL_TREE),
7150 (Present (Name (gnat_node))
7151 ? get_gnu_tree (Entity (Name (gnat_node)))
7152 : LOOP_STMT_LABEL (gnu_loop_stack->last ()->stmt)));
7153 break;
7155 case N_Simple_Return_Statement:
7157 tree gnu_ret_obj, gnu_ret_val;
7159 /* If the subprogram is a function, we must return the expression. */
7160 if (Present (Expression (gnat_node)))
7162 tree gnu_subprog_type = TREE_TYPE (current_function_decl);
7164 /* If this function has copy-in/copy-out parameters parameters and
7165 doesn't return by invisible reference, get the real object for
7166 the return. See Subprogram_Body_to_gnu. */
7167 if (TYPE_CI_CO_LIST (gnu_subprog_type)
7168 && !TREE_ADDRESSABLE (gnu_subprog_type))
7169 gnu_ret_obj = gnu_return_var_stack->last ();
7170 else
7171 gnu_ret_obj = DECL_RESULT (current_function_decl);
7173 /* Get the GCC tree for the expression to be returned. */
7174 gnu_ret_val = gnat_to_gnu (Expression (gnat_node));
7176 /* Do not remove the padding from GNU_RET_VAL if the inner type is
7177 self-referential since we want to allocate the fixed size. */
7178 if (TREE_CODE (gnu_ret_val) == COMPONENT_REF
7179 && type_is_padding_self_referential
7180 (TREE_TYPE (TREE_OPERAND (gnu_ret_val, 0))))
7181 gnu_ret_val = TREE_OPERAND (gnu_ret_val, 0);
7183 /* If the function returns by direct reference, return a pointer
7184 to the return value. */
7185 if (TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type)
7186 || By_Ref (gnat_node))
7187 gnu_ret_val = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_ret_val);
7189 /* Otherwise, if it returns an unconstrained array, we have to
7190 allocate a new version of the result and return it. */
7191 else if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type))
7193 gnu_ret_val = maybe_unconstrained_array (gnu_ret_val);
7195 /* And find out whether this is a candidate for Named Return
7196 Value. If so, record it. */
7197 if (!TYPE_CI_CO_LIST (gnu_subprog_type) && optimize)
7199 tree ret_val = gnu_ret_val;
7201 /* Strip useless conversions around the return value. */
7202 if (gnat_useless_type_conversion (ret_val))
7203 ret_val = TREE_OPERAND (ret_val, 0);
7205 /* Strip unpadding around the return value. */
7206 if (TREE_CODE (ret_val) == COMPONENT_REF
7207 && TYPE_IS_PADDING_P
7208 (TREE_TYPE (TREE_OPERAND (ret_val, 0))))
7209 ret_val = TREE_OPERAND (ret_val, 0);
7211 /* Now apply the test to the return value. */
7212 if (return_value_ok_for_nrv_p (NULL_TREE, ret_val))
7214 if (!f_named_ret_val)
7215 f_named_ret_val = BITMAP_GGC_ALLOC ();
7216 bitmap_set_bit (f_named_ret_val, DECL_UID (ret_val));
7217 if (!f_gnat_ret)
7218 f_gnat_ret = gnat_node;
7222 gnu_ret_val = build_allocator (TREE_TYPE (gnu_ret_val),
7223 gnu_ret_val,
7224 TREE_TYPE (gnu_ret_obj),
7225 Procedure_To_Call (gnat_node),
7226 Storage_Pool (gnat_node),
7227 gnat_node, false);
7230 /* Otherwise, if it returns by invisible reference, dereference
7231 the pointer it is passed using the type of the return value
7232 and build the copy operation manually. This ensures that we
7233 don't copy too much data, for example if the return type is
7234 unconstrained with a maximum size. */
7235 else if (TREE_ADDRESSABLE (gnu_subprog_type))
7237 tree gnu_ret_deref
7238 = build_unary_op (INDIRECT_REF, TREE_TYPE (gnu_ret_val),
7239 gnu_ret_obj);
7240 gnu_result = build2 (INIT_EXPR, void_type_node,
7241 gnu_ret_deref, gnu_ret_val);
7242 add_stmt_with_node (gnu_result, gnat_node);
7243 gnu_ret_val = NULL_TREE;
7247 else
7248 gnu_ret_obj = gnu_ret_val = NULL_TREE;
7250 /* If we have a return label defined, convert this into a branch to
7251 that label. The return proper will be handled elsewhere. */
7252 if (gnu_return_label_stack->last ())
7254 if (gnu_ret_val)
7255 add_stmt (build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_ret_obj,
7256 gnu_ret_val));
7258 gnu_result = build1 (GOTO_EXPR, void_type_node,
7259 gnu_return_label_stack->last ());
7261 /* When not optimizing, make sure the return is preserved. */
7262 if (!optimize && Comes_From_Source (gnat_node))
7263 DECL_ARTIFICIAL (gnu_return_label_stack->last ()) = 0;
7266 /* Otherwise, build a regular return. */
7267 else
7268 gnu_result = build_return_expr (gnu_ret_obj, gnu_ret_val);
7270 break;
7272 case N_Goto_Statement:
7273 gnu_expr = gnat_to_gnu (Name (gnat_node));
7274 gnu_result = build1 (GOTO_EXPR, void_type_node, gnu_expr);
7275 TREE_USED (gnu_expr) = 1;
7276 break;
7278 /***************************/
7279 /* Chapter 6: Subprograms */
7280 /***************************/
7282 case N_Subprogram_Declaration:
7283 /* Unless there is a freeze node, declare the entity. We consider
7284 this a definition even though we're not generating code for the
7285 subprogram because we will be making the corresponding GCC node.
7286 When there is a freeze node, it is considered the definition of
7287 the subprogram and we do nothing until after it is encountered.
7288 That's an efficiency issue: the types involved in the profile
7289 are far more likely to be frozen between the declaration and
7290 the freeze node than before the declaration, so we save some
7291 updates of the GCC node by waiting until the freeze node.
7292 The counterpart is that we assume that there is no reference
7293 to the subprogram between the declaration and the freeze node
7294 in the expanded code; otherwise, it will be interpreted as an
7295 external reference and very likely give rise to a link failure. */
7296 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node)))))
7297 gnat_to_gnu_entity (Defining_Entity (Specification (gnat_node)),
7298 NULL_TREE, true);
7299 gnu_result = alloc_stmt_list ();
7300 break;
7302 case N_Abstract_Subprogram_Declaration:
7303 /* This subprogram doesn't exist for code generation purposes, but we
7304 have to elaborate the types of any parameters and result, unless
7305 they are imported types (nothing to generate in this case).
7307 The parameter list may contain types with freeze nodes, e.g. not null
7308 subtypes, so the subprogram itself may carry a freeze node, in which
7309 case its elaboration must be deferred. */
7311 /* Process the parameter types first. */
7312 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node)))))
7313 for (gnat_temp
7314 = First_Formal_With_Extras
7315 (Defining_Entity (Specification (gnat_node)));
7316 Present (gnat_temp);
7317 gnat_temp = Next_Formal_With_Extras (gnat_temp))
7318 if (Is_Itype (Etype (gnat_temp))
7319 && !From_Limited_With (Etype (gnat_temp)))
7320 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, false);
7322 /* Then the result type, set to Standard_Void_Type for procedures. */
7324 Entity_Id gnat_temp_type
7325 = Etype (Defining_Entity (Specification (gnat_node)));
7327 if (Is_Itype (gnat_temp_type) && !From_Limited_With (gnat_temp_type))
7328 gnat_to_gnu_entity (Etype (gnat_temp_type), NULL_TREE, false);
7331 gnu_result = alloc_stmt_list ();
7332 break;
7334 case N_Defining_Program_Unit_Name:
7335 /* For a child unit identifier go up a level to get the specification.
7336 We get this when we try to find the spec of a child unit package
7337 that is the compilation unit being compiled. */
7338 gnu_result = gnat_to_gnu (Parent (gnat_node));
7339 break;
7341 case N_Subprogram_Body:
7342 Subprogram_Body_to_gnu (gnat_node);
7343 gnu_result = alloc_stmt_list ();
7344 break;
7346 case N_Function_Call:
7347 case N_Procedure_Call_Statement:
7348 gnu_result = Call_to_gnu (gnat_node, &gnu_result_type, NULL_TREE,
7349 false, false, false);
7350 break;
7352 /************************/
7353 /* Chapter 7: Packages */
7354 /************************/
7356 case N_Package_Declaration:
7357 gnu_result = gnat_to_gnu (Specification (gnat_node));
7358 break;
7360 case N_Package_Specification:
7362 start_stmt_group ();
7363 process_decls (Visible_Declarations (gnat_node),
7364 Private_Declarations (gnat_node), Empty, true, true);
7365 gnu_result = end_stmt_group ();
7366 break;
7368 case N_Package_Body:
7370 /* If this is the body of a generic package - do nothing. */
7371 if (Ekind (Corresponding_Spec (gnat_node)) == E_Generic_Package)
7373 gnu_result = alloc_stmt_list ();
7374 break;
7377 start_stmt_group ();
7378 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
7380 if (Present (Handled_Statement_Sequence (gnat_node)))
7381 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
7383 gnu_result = end_stmt_group ();
7384 break;
7386 /********************************/
7387 /* Chapter 8: Visibility Rules */
7388 /********************************/
7390 case N_Use_Package_Clause:
7391 case N_Use_Type_Clause:
7392 /* Nothing to do here - but these may appear in list of declarations. */
7393 gnu_result = alloc_stmt_list ();
7394 break;
7396 /*********************/
7397 /* Chapter 9: Tasks */
7398 /*********************/
7400 case N_Protected_Type_Declaration:
7401 gnu_result = alloc_stmt_list ();
7402 break;
7404 case N_Single_Task_Declaration:
7405 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, true);
7406 gnu_result = alloc_stmt_list ();
7407 break;
7409 /*********************************************************/
7410 /* Chapter 10: Program Structure and Compilation Issues */
7411 /*********************************************************/
7413 case N_Compilation_Unit:
7414 /* This is not called for the main unit on which gigi is invoked. */
7415 Compilation_Unit_to_gnu (gnat_node);
7416 gnu_result = alloc_stmt_list ();
7417 break;
7419 case N_Subunit:
7420 gnu_result = gnat_to_gnu (Proper_Body (gnat_node));
7421 break;
7423 case N_Entry_Body:
7424 case N_Protected_Body:
7425 case N_Task_Body:
7426 /* These nodes should only be present when annotating types. */
7427 gcc_assert (type_annotate_only);
7428 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
7429 gnu_result = alloc_stmt_list ();
7430 break;
7432 case N_Subprogram_Body_Stub:
7433 case N_Package_Body_Stub:
7434 case N_Protected_Body_Stub:
7435 case N_Task_Body_Stub:
7436 /* Simply process whatever unit is being inserted. */
7437 if (Present (Library_Unit (gnat_node)))
7438 gnu_result = gnat_to_gnu (Unit (Library_Unit (gnat_node)));
7439 else
7441 gcc_assert (type_annotate_only);
7442 gnu_result = alloc_stmt_list ();
7444 break;
7446 /***************************/
7447 /* Chapter 11: Exceptions */
7448 /***************************/
7450 case N_Handled_Sequence_Of_Statements:
7451 /* If there is an At_End procedure attached to this node, and the EH
7452 mechanism is front-end, we must have at least a corresponding At_End
7453 handler, unless the No_Exception_Handlers restriction is set. */
7454 gcc_assert (type_annotate_only
7455 || !Front_End_Exceptions ()
7456 || No (At_End_Proc (gnat_node))
7457 || Present (Exception_Handlers (gnat_node))
7458 || No_Exception_Handlers_Set ());
7460 gnu_result = Handled_Sequence_Of_Statements_to_gnu (gnat_node);
7461 break;
7463 case N_Exception_Handler:
7464 if (Exception_Mechanism == Front_End_SJLJ)
7465 gnu_result = Exception_Handler_to_gnu_fe_sjlj (gnat_node);
7466 else if (Back_End_Exceptions ())
7467 gnu_result = Exception_Handler_to_gnu_gcc (gnat_node);
7468 else
7469 gcc_unreachable ();
7470 break;
7472 case N_Raise_Statement:
7473 /* Only for reraise in back-end exceptions mode. */
7474 gcc_assert (No (Name (gnat_node))
7475 && Back_End_Exceptions ());
7477 start_stmt_group ();
7478 gnat_pushlevel ();
7480 /* Clear the current exception pointer so that the occurrence won't be
7481 deallocated. */
7482 gnu_expr = create_var_decl (get_identifier ("SAVED_EXPTR"), NULL_TREE,
7483 ptr_type_node, gnu_incoming_exc_ptr,
7484 false, false, false, false, false,
7485 true, true, NULL, gnat_node);
7487 add_stmt (build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_incoming_exc_ptr,
7488 build_int_cst (ptr_type_node, 0)));
7489 add_stmt (build_call_n_expr (reraise_zcx_decl, 1, gnu_expr));
7490 gnat_poplevel ();
7491 gnu_result = end_stmt_group ();
7492 break;
7494 case N_Push_Constraint_Error_Label:
7495 gnu_constraint_error_label_stack.safe_push (Exception_Label (gnat_node));
7496 break;
7498 case N_Push_Storage_Error_Label:
7499 gnu_storage_error_label_stack.safe_push (Exception_Label (gnat_node));
7500 break;
7502 case N_Push_Program_Error_Label:
7503 gnu_program_error_label_stack.safe_push (Exception_Label (gnat_node));
7504 break;
7506 case N_Pop_Constraint_Error_Label:
7507 gnat_temp = gnu_constraint_error_label_stack.pop ();
7508 if (Present (gnat_temp)
7509 && !TREE_USED (gnat_to_gnu_entity (gnat_temp, NULL_TREE, false)))
7510 Warn_If_No_Local_Raise (gnat_temp);
7511 break;
7513 case N_Pop_Storage_Error_Label:
7514 gnat_temp = gnu_storage_error_label_stack.pop ();
7515 if (Present (gnat_temp)
7516 && !TREE_USED (gnat_to_gnu_entity (gnat_temp, NULL_TREE, false)))
7517 Warn_If_No_Local_Raise (gnat_temp);
7518 break;
7520 case N_Pop_Program_Error_Label:
7521 gnat_temp = gnu_program_error_label_stack.pop ();
7522 if (Present (gnat_temp)
7523 && !TREE_USED (gnat_to_gnu_entity (gnat_temp, NULL_TREE, false)))
7524 Warn_If_No_Local_Raise (gnat_temp);
7525 break;
7527 /******************************/
7528 /* Chapter 12: Generic Units */
7529 /******************************/
7531 case N_Generic_Function_Renaming_Declaration:
7532 case N_Generic_Package_Renaming_Declaration:
7533 case N_Generic_Procedure_Renaming_Declaration:
7534 case N_Generic_Package_Declaration:
7535 case N_Generic_Subprogram_Declaration:
7536 case N_Package_Instantiation:
7537 case N_Procedure_Instantiation:
7538 case N_Function_Instantiation:
7539 /* These nodes can appear on a declaration list but there is nothing to
7540 to be done with them. */
7541 gnu_result = alloc_stmt_list ();
7542 break;
7544 /**************************************************/
7545 /* Chapter 13: Representation Clauses and */
7546 /* Implementation-Dependent Features */
7547 /**************************************************/
7549 case N_Attribute_Definition_Clause:
7550 gnu_result = alloc_stmt_list ();
7552 /* The only one we need to deal with is 'Address since, for the others,
7553 the front-end puts the information elsewhere. */
7554 if (Get_Attribute_Id (Chars (gnat_node)) != Attr_Address)
7555 break;
7557 /* And we only deal with 'Address if the object has a Freeze node. */
7558 gnat_temp = Entity (Name (gnat_node));
7559 if (No (Freeze_Node (gnat_temp)))
7560 break;
7562 /* Get the value to use as the address and save it as the equivalent
7563 for the object. When it is frozen, gnat_to_gnu_entity will do the
7564 right thing. */
7565 save_gnu_tree (gnat_temp, gnat_to_gnu (Expression (gnat_node)), true);
7566 break;
7568 case N_Enumeration_Representation_Clause:
7569 case N_Record_Representation_Clause:
7570 case N_At_Clause:
7571 /* We do nothing with these. SEM puts the information elsewhere. */
7572 gnu_result = alloc_stmt_list ();
7573 break;
7575 case N_Code_Statement:
7576 if (!type_annotate_only)
7578 tree gnu_template = gnat_to_gnu (Asm_Template (gnat_node));
7579 tree gnu_inputs = NULL_TREE, gnu_outputs = NULL_TREE;
7580 tree gnu_clobbers = NULL_TREE, tail;
7581 bool allows_mem, allows_reg, fake;
7582 int ninputs, noutputs, i;
7583 const char **oconstraints;
7584 const char *constraint;
7585 char *clobber;
7587 /* First retrieve the 3 operand lists built by the front-end. */
7588 Setup_Asm_Outputs (gnat_node);
7589 while (Present (gnat_temp = Asm_Output_Variable ()))
7591 tree gnu_value = gnat_to_gnu (gnat_temp);
7592 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
7593 (Asm_Output_Constraint ()));
7595 gnu_outputs = tree_cons (gnu_constr, gnu_value, gnu_outputs);
7596 Next_Asm_Output ();
7599 Setup_Asm_Inputs (gnat_node);
7600 while (Present (gnat_temp = Asm_Input_Value ()))
7602 tree gnu_value = gnat_to_gnu (gnat_temp);
7603 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
7604 (Asm_Input_Constraint ()));
7606 gnu_inputs = tree_cons (gnu_constr, gnu_value, gnu_inputs);
7607 Next_Asm_Input ();
7610 Clobber_Setup (gnat_node);
7611 while ((clobber = Clobber_Get_Next ()))
7612 gnu_clobbers
7613 = tree_cons (NULL_TREE,
7614 build_string (strlen (clobber) + 1, clobber),
7615 gnu_clobbers);
7617 /* Then perform some standard checking and processing on the
7618 operands. In particular, mark them addressable if needed. */
7619 gnu_outputs = nreverse (gnu_outputs);
7620 noutputs = list_length (gnu_outputs);
7621 gnu_inputs = nreverse (gnu_inputs);
7622 ninputs = list_length (gnu_inputs);
7623 oconstraints = XALLOCAVEC (const char *, noutputs);
7625 for (i = 0, tail = gnu_outputs; tail; ++i, tail = TREE_CHAIN (tail))
7627 tree output = TREE_VALUE (tail);
7628 constraint
7629 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
7630 oconstraints[i] = constraint;
7632 if (parse_output_constraint (&constraint, i, ninputs, noutputs,
7633 &allows_mem, &allows_reg, &fake))
7635 /* If the operand is going to end up in memory,
7636 mark it addressable. Note that we don't test
7637 allows_mem like in the input case below; this
7638 is modelled on the C front-end. */
7639 if (!allows_reg)
7641 output = remove_conversions (output, false);
7642 if (TREE_CODE (output) == CONST_DECL
7643 && DECL_CONST_CORRESPONDING_VAR (output))
7644 output = DECL_CONST_CORRESPONDING_VAR (output);
7645 if (!gnat_mark_addressable (output))
7646 output = error_mark_node;
7649 else
7650 output = error_mark_node;
7652 TREE_VALUE (tail) = output;
7655 for (i = 0, tail = gnu_inputs; tail; ++i, tail = TREE_CHAIN (tail))
7657 tree input = TREE_VALUE (tail);
7658 constraint
7659 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
7661 if (parse_input_constraint (&constraint, i, ninputs, noutputs,
7662 0, oconstraints,
7663 &allows_mem, &allows_reg))
7665 /* If the operand is going to end up in memory,
7666 mark it addressable. */
7667 if (!allows_reg && allows_mem)
7669 input = remove_conversions (input, false);
7670 if (TREE_CODE (input) == CONST_DECL
7671 && DECL_CONST_CORRESPONDING_VAR (input))
7672 input = DECL_CONST_CORRESPONDING_VAR (input);
7673 if (!gnat_mark_addressable (input))
7674 input = error_mark_node;
7677 else
7678 input = error_mark_node;
7680 TREE_VALUE (tail) = input;
7683 gnu_result = build5 (ASM_EXPR, void_type_node,
7684 gnu_template, gnu_outputs,
7685 gnu_inputs, gnu_clobbers, NULL_TREE);
7686 ASM_VOLATILE_P (gnu_result) = Is_Asm_Volatile (gnat_node);
7688 else
7689 gnu_result = alloc_stmt_list ();
7691 break;
7693 /****************/
7694 /* Added Nodes */
7695 /****************/
7697 /* Markers are created by the ABE mechanism to capture information which
7698 is either unavailable of expensive to recompute. Markers do not have
7699 and runtime semantics, and should be ignored. */
7701 case N_Call_Marker:
7702 case N_Variable_Reference_Marker:
7703 gnu_result = alloc_stmt_list ();
7704 break;
7706 case N_Expression_With_Actions:
7707 /* This construct doesn't define a scope so we don't push a binding
7708 level around the statement list, but we wrap it in a SAVE_EXPR to
7709 protect it from unsharing. Elaborate the expression as part of the
7710 same statement group as the actions so that the type declaration
7711 gets inserted there as well. This ensures that the type elaboration
7712 code is issued past the actions computing values on which it might
7713 depend. */
7714 start_stmt_group ();
7715 add_stmt_list (Actions (gnat_node));
7716 gnu_expr = gnat_to_gnu (Expression (gnat_node));
7717 gnu_result = end_stmt_group ();
7719 gnu_result = build1 (SAVE_EXPR, void_type_node, gnu_result);
7720 TREE_SIDE_EFFECTS (gnu_result) = 1;
7722 gnu_result
7723 = build_compound_expr (TREE_TYPE (gnu_expr), gnu_result, gnu_expr);
7724 gnu_result_type = get_unpadded_type (Etype (gnat_node));
7725 break;
7727 case N_Freeze_Entity:
7728 start_stmt_group ();
7729 process_freeze_entity (gnat_node);
7730 process_decls (Actions (gnat_node), Empty, Empty, true, true);
7731 gnu_result = end_stmt_group ();
7732 break;
7734 case N_Freeze_Generic_Entity:
7735 gnu_result = alloc_stmt_list ();
7736 break;
7738 case N_Itype_Reference:
7739 if (!present_gnu_tree (Itype (gnat_node)))
7740 process_type (Itype (gnat_node));
7741 gnu_result = alloc_stmt_list ();
7742 break;
7744 case N_Free_Statement:
7745 if (!type_annotate_only)
7747 tree gnu_ptr
7748 = gnat_to_gnu (adjust_for_implicit_deref (Expression (gnat_node)));
7749 tree gnu_ptr_type = TREE_TYPE (gnu_ptr);
7750 tree gnu_obj_type, gnu_actual_obj_type;
7752 /* If this is a thin pointer, we must first dereference it to create
7753 a fat pointer, then go back below to a thin pointer. The reason
7754 for this is that we need to have a fat pointer someplace in order
7755 to properly compute the size. */
7756 if (TYPE_IS_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
7757 gnu_ptr = build_unary_op (ADDR_EXPR, NULL_TREE,
7758 build_unary_op (INDIRECT_REF, NULL_TREE,
7759 gnu_ptr));
7761 /* If this is a fat pointer, the object must have been allocated with
7762 the template in front of the array. So pass the template address,
7763 and get the total size; do it by converting to a thin pointer. */
7764 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
7765 gnu_ptr
7766 = convert (build_pointer_type
7767 (TYPE_OBJECT_RECORD_TYPE
7768 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
7769 gnu_ptr);
7771 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
7773 /* If this is a thin pointer, the object must have been allocated with
7774 the template in front of the array. So pass the template address,
7775 and get the total size. */
7776 if (TYPE_IS_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
7777 gnu_ptr
7778 = build_binary_op (POINTER_PLUS_EXPR, TREE_TYPE (gnu_ptr),
7779 gnu_ptr,
7780 fold_build1 (NEGATE_EXPR, sizetype,
7781 byte_position
7782 (DECL_CHAIN
7783 TYPE_FIELDS ((gnu_obj_type)))));
7785 /* If we have a special dynamic constrained subtype on the node, use
7786 it to compute the size; otherwise, use the designated subtype. */
7787 if (Present (Actual_Designated_Subtype (gnat_node)))
7789 gnu_actual_obj_type
7790 = gnat_to_gnu_type (Actual_Designated_Subtype (gnat_node));
7792 if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type))
7793 gnu_actual_obj_type
7794 = build_unc_object_type_from_ptr (gnu_ptr_type,
7795 gnu_actual_obj_type,
7796 get_identifier ("DEALLOC"),
7797 false);
7799 else
7800 gnu_actual_obj_type = gnu_obj_type;
7802 tree gnu_size = TYPE_SIZE_UNIT (gnu_actual_obj_type);
7803 gnu_size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_size, gnu_ptr);
7805 gnu_result
7806 = build_call_alloc_dealloc (gnu_ptr, gnu_size, gnu_obj_type,
7807 Procedure_To_Call (gnat_node),
7808 Storage_Pool (gnat_node),
7809 gnat_node);
7811 break;
7813 case N_Raise_Constraint_Error:
7814 case N_Raise_Program_Error:
7815 case N_Raise_Storage_Error:
7816 if (type_annotate_only)
7817 gnu_result = alloc_stmt_list ();
7818 else
7819 gnu_result = Raise_Error_to_gnu (gnat_node, &gnu_result_type);
7820 break;
7822 case N_Validate_Unchecked_Conversion:
7823 /* The only validation we currently do on an unchecked conversion is
7824 that of aliasing assumptions. */
7825 if (flag_strict_aliasing)
7826 gnat_validate_uc_list.safe_push (gnat_node);
7827 gnu_result = alloc_stmt_list ();
7828 break;
7830 case N_Function_Specification:
7831 case N_Procedure_Specification:
7832 case N_Op_Concat:
7833 case N_Component_Association:
7834 /* These nodes should only be present when annotating types. */
7835 gcc_assert (type_annotate_only);
7836 gnu_result = alloc_stmt_list ();
7837 break;
7839 default:
7840 /* Other nodes are not supposed to reach here. */
7841 gcc_unreachable ();
7844 /* If we pushed the processing of the elaboration routine, pop it back. */
7845 if (went_into_elab_proc)
7846 current_function_decl = NULL_TREE;
7848 /* When not optimizing, turn boolean rvalues B into B != false tests
7849 so that we can put the location information of the reference to B on
7850 the inequality operator for better debug info. */
7851 if (!optimize
7852 && TREE_CODE (gnu_result) != INTEGER_CST
7853 && TREE_CODE (gnu_result) != TYPE_DECL
7854 && (kind == N_Identifier
7855 || kind == N_Expanded_Name
7856 || kind == N_Explicit_Dereference
7857 || kind == N_Indexed_Component
7858 || kind == N_Selected_Component)
7859 && TREE_CODE (get_base_type (gnu_result_type)) == BOOLEAN_TYPE
7860 && !lvalue_required_p (gnat_node, gnu_result_type, false, false, false))
7862 gnu_result
7863 = build_binary_op (NE_EXPR, gnu_result_type,
7864 convert (gnu_result_type, gnu_result),
7865 convert (gnu_result_type, boolean_false_node));
7866 if (TREE_CODE (gnu_result) != INTEGER_CST)
7867 set_gnu_expr_location_from_node (gnu_result, gnat_node);
7870 /* Set the location information on the result if it's not a simple name.
7871 Note that we may have no result if we tried to build a CALL_EXPR node
7872 to a procedure with no side-effects and optimization is enabled. */
7873 else if (kind != N_Identifier && gnu_result && EXPR_P (gnu_result))
7874 set_gnu_expr_location_from_node (gnu_result, gnat_node);
7876 /* If we're supposed to return something of void_type, it means we have
7877 something we're elaborating for effect, so just return. */
7878 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
7879 return gnu_result;
7881 /* If the result is a constant that overflowed, raise Constraint_Error. */
7882 if (TREE_CODE (gnu_result) == INTEGER_CST && TREE_OVERFLOW (gnu_result))
7884 post_error ("?`Constraint_Error` will be raised at run time", gnat_node);
7885 gnu_result
7886 = build1 (NULL_EXPR, gnu_result_type,
7887 build_call_raise (CE_Overflow_Check_Failed, gnat_node,
7888 N_Raise_Constraint_Error));
7891 /* If the result has side-effects and is of an unconstrained type, protect
7892 the expression in case it will be referenced multiple times, i.e. for
7893 its value and to compute the size of an object. But do it neither for
7894 an object nor a renaming declaration, nor a return statement of a call
7895 to a function that returns an unconstrained record type with default
7896 discriminant, because there is no size to be computed in these cases
7897 and this will create a useless temporary. We must do this before any
7898 conversions. */
7899 if (TREE_SIDE_EFFECTS (gnu_result)
7900 && (TREE_CODE (gnu_result_type) == UNCONSTRAINED_ARRAY_TYPE
7901 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type)))
7902 && !(TREE_CODE (gnu_result) == CALL_EXPR
7903 && type_is_padding_self_referential (TREE_TYPE (gnu_result))
7904 && (Nkind (Parent (gnat_node)) == N_Object_Declaration
7905 || Nkind (Parent (gnat_node)) == N_Object_Renaming_Declaration
7906 || Nkind (Parent (gnat_node)) == N_Simple_Return_Statement)))
7907 gnu_result = gnat_protect_expr (gnu_result);
7909 /* Now convert the result to the result type, unless we are in one of the
7910 following cases:
7912 1. If this is the LHS of an assignment or an actual parameter of a
7913 call, return the result almost unmodified since the RHS will have
7914 to be converted to our type in that case, unless the result type
7915 has a simpler size. Likewise if there is just a no-op unchecked
7916 conversion in-between. Similarly, don't convert integral types
7917 that are the operands of an unchecked conversion since we need
7918 to ignore those conversions (for 'Valid).
7920 2. If we have a label (which doesn't have any well-defined type), a
7921 field or an error, return the result almost unmodified. Similarly,
7922 if the two types are record types with the same name, don't convert.
7923 This will be the case when we are converting from a packable version
7924 of a type to its original type and we need those conversions to be
7925 NOPs in order for assignments into these types to work properly.
7927 3. If the type is void or if we have no result, return error_mark_node
7928 to show we have no result.
7930 4. If this is a call to a function that returns with variable size and
7931 the call is used as the expression in either an object or a renaming
7932 declaration, return the result unmodified because we want to use the
7933 return slot optimization in this case.
7935 5. Finally, if the type of the result is already correct. */
7937 if (Present (Parent (gnat_node))
7938 && (lhs_or_actual_p (gnat_node)
7939 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
7940 && unchecked_conversion_nop (Parent (gnat_node)))
7941 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
7942 && !AGGREGATE_TYPE_P (gnu_result_type)
7943 && !AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))))
7944 && !(TYPE_SIZE (gnu_result_type)
7945 && TYPE_SIZE (TREE_TYPE (gnu_result))
7946 && (AGGREGATE_TYPE_P (gnu_result_type)
7947 == AGGREGATE_TYPE_P (TREE_TYPE (gnu_result)))
7948 && ((TREE_CODE (TYPE_SIZE (gnu_result_type)) == INTEGER_CST
7949 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_result)))
7950 != INTEGER_CST))
7951 || (TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
7952 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))
7953 && (CONTAINS_PLACEHOLDER_P
7954 (TYPE_SIZE (TREE_TYPE (gnu_result))))))
7955 && !(TREE_CODE (gnu_result_type) == RECORD_TYPE
7956 && TYPE_JUSTIFIED_MODULAR_P (gnu_result_type))))
7958 /* Remove padding only if the inner object is of self-referential
7959 size: in that case it must be an object of unconstrained type
7960 with a default discriminant and we want to avoid copying too
7961 much data. */
7962 if (type_is_padding_self_referential (TREE_TYPE (gnu_result)))
7963 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
7964 gnu_result);
7967 else if (TREE_CODE (gnu_result) == LABEL_DECL
7968 || TREE_CODE (gnu_result) == FIELD_DECL
7969 || TREE_CODE (gnu_result) == ERROR_MARK
7970 || (TYPE_NAME (gnu_result_type)
7971 == TYPE_NAME (TREE_TYPE (gnu_result))
7972 && TREE_CODE (gnu_result_type) == RECORD_TYPE
7973 && TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE))
7975 /* Remove any padding. */
7976 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
7977 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
7978 gnu_result);
7981 else if (gnu_result == error_mark_node || gnu_result_type == void_type_node)
7982 gnu_result = error_mark_node;
7984 else if (Present (Parent (gnat_node))
7985 && (Nkind (Parent (gnat_node)) == N_Object_Declaration
7986 || Nkind (Parent (gnat_node)) == N_Object_Renaming_Declaration)
7987 && TREE_CODE (gnu_result) == CALL_EXPR
7988 && return_type_with_variable_size_p (TREE_TYPE (gnu_result)))
7991 else if (TREE_TYPE (gnu_result) != gnu_result_type)
7992 gnu_result = convert (gnu_result_type, gnu_result);
7994 /* We don't need any NOP_EXPR or NON_LVALUE_EXPR on the result. */
7995 while ((TREE_CODE (gnu_result) == NOP_EXPR
7996 || TREE_CODE (gnu_result) == NON_LVALUE_EXPR)
7997 && TREE_TYPE (TREE_OPERAND (gnu_result, 0)) == TREE_TYPE (gnu_result))
7998 gnu_result = TREE_OPERAND (gnu_result, 0);
8000 return gnu_result;
8003 /* Similar to gnat_to_gnu, but discard any object that might be created in
8004 the course of the translation of GNAT_NODE, which must be an "external"
8005 expression in the sense that it will be elaborated elsewhere. */
8007 tree
8008 gnat_to_gnu_external (Node_Id gnat_node)
8010 const int save_force_global = force_global;
8011 bool went_into_elab_proc = false;
8013 /* Force the local context and create a fake scope that we zap
8014 at the end so declarations will not be stuck either in the
8015 global varpool or in the current scope. */
8016 if (!current_function_decl)
8018 current_function_decl = get_elaboration_procedure ();
8019 went_into_elab_proc = true;
8021 force_global = 0;
8022 gnat_pushlevel ();
8024 tree gnu_result = gnat_to_gnu (gnat_node);
8026 gnat_zaplevel ();
8027 force_global = save_force_global;
8028 if (went_into_elab_proc)
8029 current_function_decl = NULL_TREE;
8031 /* Do not import locations from external units. */
8032 if (gnu_result && EXPR_P (gnu_result))
8033 SET_EXPR_LOCATION (gnu_result, UNKNOWN_LOCATION);
8035 return gnu_result;
8038 /* Return true if the statement list STMT_LIST is empty. */
8040 static bool
8041 empty_stmt_list_p (tree stmt_list)
8043 tree_stmt_iterator tsi;
8045 for (tsi = tsi_start (stmt_list); !tsi_end_p (tsi); tsi_next (&tsi))
8047 tree stmt = tsi_stmt (tsi);
8049 /* Anything else than an empty STMT_STMT counts as something. */
8050 if (TREE_CODE (stmt) != STMT_STMT || STMT_STMT_STMT (stmt))
8051 return false;
8054 return true;
8057 /* Record the current code position in GNAT_NODE. */
8059 static void
8060 record_code_position (Node_Id gnat_node)
8062 tree stmt_stmt = build1 (STMT_STMT, void_type_node, NULL_TREE);
8064 add_stmt_with_node (stmt_stmt, gnat_node);
8065 save_gnu_tree (gnat_node, stmt_stmt, true);
8068 /* Insert the code for GNAT_NODE at the position saved for that node. */
8070 static void
8071 insert_code_for (Node_Id gnat_node)
8073 tree code = gnat_to_gnu (gnat_node);
8075 /* It's too late to remove the STMT_STMT itself at this point. */
8076 if (!empty_stmt_list_p (code))
8077 STMT_STMT_STMT (get_gnu_tree (gnat_node)) = code;
8079 save_gnu_tree (gnat_node, NULL_TREE, true);
8082 /* Start a new statement group chained to the previous group. */
8084 void
8085 start_stmt_group (void)
8087 struct stmt_group *group = stmt_group_free_list;
8089 /* First see if we can get one from the free list. */
8090 if (group)
8091 stmt_group_free_list = group->previous;
8092 else
8093 group = ggc_alloc<stmt_group> ();
8095 group->previous = current_stmt_group;
8096 group->stmt_list = group->block = group->cleanups = NULL_TREE;
8097 current_stmt_group = group;
8100 /* Add GNU_STMT to the current statement group. If it is an expression with
8101 no effects, it is ignored. */
8103 void
8104 add_stmt (tree gnu_stmt)
8106 append_to_statement_list (gnu_stmt, &current_stmt_group->stmt_list);
8109 /* Similar, but the statement is always added, regardless of side-effects. */
8111 void
8112 add_stmt_force (tree gnu_stmt)
8114 append_to_statement_list_force (gnu_stmt, &current_stmt_group->stmt_list);
8117 /* Like add_stmt, but set the location of GNU_STMT to that of GNAT_NODE. */
8119 void
8120 add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node)
8122 /* Do not emit a location for renamings that come from generic instantiation,
8123 they are likely to disturb debugging. */
8124 if (Present (gnat_node) && !renaming_from_instantiation_p (gnat_node))
8125 set_expr_location_from_node (gnu_stmt, gnat_node);
8126 add_stmt (gnu_stmt);
8129 /* Similar, but the statement is always added, regardless of side-effects. */
8131 void
8132 add_stmt_with_node_force (tree gnu_stmt, Node_Id gnat_node)
8134 if (Present (gnat_node))
8135 set_expr_location_from_node (gnu_stmt, gnat_node);
8136 add_stmt_force (gnu_stmt);
8139 /* Add a declaration statement for GNU_DECL to the current statement group.
8140 Get SLOC from Entity_Id. */
8142 void
8143 add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
8145 tree type = TREE_TYPE (gnu_decl);
8146 tree gnu_stmt, gnu_init;
8148 /* If this is a variable that Gigi is to ignore, we may have been given
8149 an ERROR_MARK. So test for it. We also might have been given a
8150 reference for a renaming. So only do something for a decl. Also
8151 ignore a TYPE_DECL for an UNCONSTRAINED_ARRAY_TYPE. */
8152 if (!DECL_P (gnu_decl)
8153 || (TREE_CODE (gnu_decl) == TYPE_DECL
8154 && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE))
8155 return;
8157 gnu_stmt = build1 (DECL_EXPR, void_type_node, gnu_decl);
8159 /* If we are external or global, we don't want to output the DECL_EXPR for
8160 this DECL node since we already have evaluated the expressions in the
8161 sizes and positions as globals and doing it again would be wrong. */
8162 if (DECL_EXTERNAL (gnu_decl) || global_bindings_p ())
8164 /* Mark everything as used to prevent node sharing with subprograms.
8165 Note that walk_tree knows how to deal with TYPE_DECL, but neither
8166 VAR_DECL nor CONST_DECL. This appears to be somewhat arbitrary. */
8167 MARK_VISITED (gnu_stmt);
8168 if (TREE_CODE (gnu_decl) == VAR_DECL
8169 || TREE_CODE (gnu_decl) == CONST_DECL)
8171 MARK_VISITED (DECL_SIZE (gnu_decl));
8172 MARK_VISITED (DECL_SIZE_UNIT (gnu_decl));
8173 MARK_VISITED (DECL_INITIAL (gnu_decl));
8175 /* In any case, we have to deal with our own TYPE_ADA_SIZE field. */
8176 else if (TREE_CODE (gnu_decl) == TYPE_DECL
8177 && RECORD_OR_UNION_TYPE_P (type)
8178 && !TYPE_FAT_POINTER_P (type))
8179 MARK_VISITED (TYPE_ADA_SIZE (type));
8181 else
8182 add_stmt_with_node (gnu_stmt, gnat_entity);
8184 /* If this is a variable and an initializer is attached to it, it must be
8185 valid for the context. Similar to init_const in create_var_decl. */
8186 if (TREE_CODE (gnu_decl) == VAR_DECL
8187 && (gnu_init = DECL_INITIAL (gnu_decl))
8188 && (!gnat_types_compatible_p (type, TREE_TYPE (gnu_init))
8189 || (TREE_STATIC (gnu_decl)
8190 && !initializer_constant_valid_p (gnu_init,
8191 TREE_TYPE (gnu_init)))))
8193 DECL_INITIAL (gnu_decl) = NULL_TREE;
8194 if (TREE_READONLY (gnu_decl))
8196 TREE_READONLY (gnu_decl) = 0;
8197 DECL_READONLY_ONCE_ELAB (gnu_decl) = 1;
8200 /* If GNU_DECL has a padded type, convert it to the unpadded
8201 type so the assignment is done properly. */
8202 if (TYPE_IS_PADDING_P (type))
8203 gnu_decl = convert (TREE_TYPE (TYPE_FIELDS (type)), gnu_decl);
8205 gnu_stmt = build_binary_op (INIT_EXPR, NULL_TREE, gnu_decl, gnu_init);
8206 add_stmt_with_node (gnu_stmt, gnat_entity);
8210 /* Callback for walk_tree to mark the visited trees rooted at *TP. */
8212 static tree
8213 mark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
8215 tree t = *tp;
8217 if (TREE_VISITED (t))
8218 *walk_subtrees = 0;
8220 /* Don't mark a dummy type as visited because we want to mark its sizes
8221 and fields once it's filled in. */
8222 else if (!TYPE_IS_DUMMY_P (t))
8223 TREE_VISITED (t) = 1;
8225 if (TYPE_P (t))
8226 TYPE_SIZES_GIMPLIFIED (t) = 1;
8228 return NULL_TREE;
8231 /* Mark nodes rooted at T with TREE_VISITED and types as having their
8232 sized gimplified. We use this to indicate all variable sizes and
8233 positions in global types may not be shared by any subprogram. */
8235 void
8236 mark_visited (tree t)
8238 walk_tree (&t, mark_visited_r, NULL, NULL);
8241 /* Add GNU_CLEANUP, a cleanup action, to the current code group and
8242 set its location to that of GNAT_NODE if present, but with column info
8243 cleared so that conditional branches generated as part of the cleanup
8244 code do not interfere with coverage analysis tools. */
8246 static void
8247 add_cleanup (tree gnu_cleanup, Node_Id gnat_node)
8249 if (Present (gnat_node))
8250 set_expr_location_from_node (gnu_cleanup, gnat_node, true);
8251 append_to_statement_list (gnu_cleanup, &current_stmt_group->cleanups);
8254 /* Set the BLOCK node corresponding to the current code group to GNU_BLOCK. */
8256 void
8257 set_block_for_group (tree gnu_block)
8259 gcc_assert (!current_stmt_group->block);
8260 current_stmt_group->block = gnu_block;
8263 /* Return code corresponding to the current code group. It is normally
8264 a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
8265 BLOCK or cleanups were set. */
8267 tree
8268 end_stmt_group (void)
8270 struct stmt_group *group = current_stmt_group;
8271 tree gnu_retval = group->stmt_list;
8273 /* If this is a null list, allocate a new STATEMENT_LIST. Then, if there
8274 are cleanups, make a TRY_FINALLY_EXPR. Last, if there is a BLOCK,
8275 make a BIND_EXPR. Note that we nest in that because the cleanup may
8276 reference variables in the block. */
8277 if (!gnu_retval)
8278 gnu_retval = alloc_stmt_list ();
8280 if (group->cleanups)
8281 gnu_retval = build2 (TRY_FINALLY_EXPR, void_type_node, gnu_retval,
8282 group->cleanups);
8284 if (current_stmt_group->block)
8285 gnu_retval = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (group->block),
8286 gnu_retval, group->block);
8288 /* Remove this group from the stack and add it to the free list. */
8289 current_stmt_group = group->previous;
8290 group->previous = stmt_group_free_list;
8291 stmt_group_free_list = group;
8293 return gnu_retval;
8296 /* Return whether the current statement group may fall through. */
8298 static inline bool
8299 stmt_group_may_fallthru (void)
8301 if (current_stmt_group->stmt_list)
8302 return block_may_fallthru (current_stmt_group->stmt_list);
8303 else
8304 return true;
8307 /* Add a list of statements from GNAT_LIST, a possibly-empty list of
8308 statements.*/
8310 static void
8311 add_stmt_list (List_Id gnat_list)
8313 Node_Id gnat_node;
8315 if (Present (gnat_list))
8316 for (gnat_node = First (gnat_list); Present (gnat_node);
8317 gnat_node = Next (gnat_node))
8318 add_stmt (gnat_to_gnu (gnat_node));
8321 /* Build a tree from GNAT_LIST, a possibly-empty list of statements.
8322 If BINDING_P is true, push and pop a binding level around the list. */
8324 static tree
8325 build_stmt_group (List_Id gnat_list, bool binding_p)
8327 start_stmt_group ();
8329 if (binding_p)
8330 gnat_pushlevel ();
8332 add_stmt_list (gnat_list);
8334 if (binding_p)
8335 gnat_poplevel ();
8337 return end_stmt_group ();
8340 /* Generate GIMPLE in place for the expression at *EXPR_P. */
8343 gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
8344 gimple_seq *post_p ATTRIBUTE_UNUSED)
8346 tree expr = *expr_p;
8347 tree type = TREE_TYPE (expr);
8348 tree op;
8350 if (IS_ADA_STMT (expr))
8351 return gnat_gimplify_stmt (expr_p);
8353 switch (TREE_CODE (expr))
8355 case NULL_EXPR:
8356 /* If this is an aggregate type, build a null pointer of the appropriate
8357 type and dereference it. */
8358 if (AGGREGATE_TYPE_P (type)
8359 || TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
8360 *expr_p = build_unary_op (INDIRECT_REF, NULL_TREE,
8361 convert (build_pointer_type (type),
8362 integer_zero_node));
8363 /* Otherwise, just make a VAR_DECL. */
8364 else
8366 *expr_p = create_tmp_var (type, NULL);
8367 TREE_NO_WARNING (*expr_p) = 1;
8370 gimplify_and_add (TREE_OPERAND (expr, 0), pre_p);
8371 return GS_OK;
8373 case UNCONSTRAINED_ARRAY_REF:
8374 /* We should only do this if we are just elaborating for side-effects,
8375 but we can't know that yet. */
8376 *expr_p = TREE_OPERAND (*expr_p, 0);
8377 return GS_OK;
8379 case ADDR_EXPR:
8380 op = TREE_OPERAND (expr, 0);
8382 /* If we are taking the address of a constant CONSTRUCTOR, make sure it
8383 is put into static memory. We know that it's going to be read-only
8384 given the semantics we have and it must be in static memory when the
8385 reference is in an elaboration procedure. */
8386 if (TREE_CODE (op) == CONSTRUCTOR && TREE_CONSTANT (op))
8388 tree addr = build_fold_addr_expr (tree_output_constant_def (op));
8389 *expr_p = fold_convert (type, addr);
8390 return GS_ALL_DONE;
8393 /* Replace atomic loads with their first argument. That's necessary
8394 because the gimplifier would create a temporary otherwise. */
8395 if (TREE_SIDE_EFFECTS (op))
8396 while (handled_component_p (op) || CONVERT_EXPR_P (op))
8398 tree inner = TREE_OPERAND (op, 0);
8399 if (TREE_CODE (inner) == CALL_EXPR && call_is_atomic_load (inner))
8401 tree t = CALL_EXPR_ARG (inner, 0);
8402 if (TREE_CODE (t) == NOP_EXPR)
8403 t = TREE_OPERAND (t, 0);
8404 if (TREE_CODE (t) == ADDR_EXPR)
8405 TREE_OPERAND (op, 0) = TREE_OPERAND (t, 0);
8406 else
8407 TREE_OPERAND (op, 0) = build_fold_indirect_ref (t);
8409 else
8410 op = inner;
8413 return GS_UNHANDLED;
8415 case VIEW_CONVERT_EXPR:
8416 op = TREE_OPERAND (expr, 0);
8418 /* If we are view-converting a CONSTRUCTOR or a call from an aggregate
8419 type to a scalar one, explicitly create the local temporary. That's
8420 required if the type is passed by reference. */
8421 if ((TREE_CODE (op) == CONSTRUCTOR || TREE_CODE (op) == CALL_EXPR)
8422 && AGGREGATE_TYPE_P (TREE_TYPE (op))
8423 && !AGGREGATE_TYPE_P (type))
8425 tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
8426 gimple_add_tmp_var (new_var);
8428 mod = build2 (INIT_EXPR, TREE_TYPE (new_var), new_var, op);
8429 gimplify_and_add (mod, pre_p);
8431 TREE_OPERAND (expr, 0) = new_var;
8432 return GS_OK;
8435 return GS_UNHANDLED;
8437 case DECL_EXPR:
8438 op = DECL_EXPR_DECL (expr);
8440 /* The expressions for the RM bounds must be gimplified to ensure that
8441 they are properly elaborated. See gimplify_decl_expr. */
8442 if ((TREE_CODE (op) == TYPE_DECL || TREE_CODE (op) == VAR_DECL)
8443 && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (op)))
8444 switch (TREE_CODE (TREE_TYPE (op)))
8446 case INTEGER_TYPE:
8447 case ENUMERAL_TYPE:
8448 case BOOLEAN_TYPE:
8449 case REAL_TYPE:
8451 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (op)), t, val;
8453 val = TYPE_RM_MIN_VALUE (type);
8454 if (val)
8456 gimplify_one_sizepos (&val, pre_p);
8457 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
8458 SET_TYPE_RM_MIN_VALUE (t, val);
8461 val = TYPE_RM_MAX_VALUE (type);
8462 if (val)
8464 gimplify_one_sizepos (&val, pre_p);
8465 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
8466 SET_TYPE_RM_MAX_VALUE (t, val);
8470 break;
8472 default:
8473 break;
8476 /* ... fall through ... */
8478 default:
8479 return GS_UNHANDLED;
8483 /* Generate GIMPLE in place for the statement at *STMT_P. */
8485 static enum gimplify_status
8486 gnat_gimplify_stmt (tree *stmt_p)
8488 tree stmt = *stmt_p;
8490 switch (TREE_CODE (stmt))
8492 case STMT_STMT:
8493 *stmt_p = STMT_STMT_STMT (stmt);
8494 return GS_OK;
8496 case LOOP_STMT:
8498 tree gnu_start_label = create_artificial_label (input_location);
8499 tree gnu_cond = LOOP_STMT_COND (stmt);
8500 tree gnu_update = LOOP_STMT_UPDATE (stmt);
8501 tree gnu_end_label = LOOP_STMT_LABEL (stmt);
8503 /* Build the condition expression from the test, if any. */
8504 if (gnu_cond)
8506 /* Deal with the optimization hints. */
8507 if (LOOP_STMT_IVDEP (stmt))
8508 gnu_cond = build3 (ANNOTATE_EXPR, TREE_TYPE (gnu_cond), gnu_cond,
8509 build_int_cst (integer_type_node,
8510 annot_expr_ivdep_kind),
8511 integer_zero_node);
8512 if (LOOP_STMT_NO_UNROLL (stmt))
8513 gnu_cond = build3 (ANNOTATE_EXPR, TREE_TYPE (gnu_cond), gnu_cond,
8514 build_int_cst (integer_type_node,
8515 annot_expr_unroll_kind),
8516 integer_one_node);
8517 if (LOOP_STMT_UNROLL (stmt))
8518 gnu_cond = build3 (ANNOTATE_EXPR, TREE_TYPE (gnu_cond), gnu_cond,
8519 build_int_cst (integer_type_node,
8520 annot_expr_unroll_kind),
8521 build_int_cst (NULL_TREE, USHRT_MAX));
8522 if (LOOP_STMT_NO_VECTOR (stmt))
8523 gnu_cond = build3 (ANNOTATE_EXPR, TREE_TYPE (gnu_cond), gnu_cond,
8524 build_int_cst (integer_type_node,
8525 annot_expr_no_vector_kind),
8526 integer_zero_node);
8527 if (LOOP_STMT_VECTOR (stmt))
8528 gnu_cond = build3 (ANNOTATE_EXPR, TREE_TYPE (gnu_cond), gnu_cond,
8529 build_int_cst (integer_type_node,
8530 annot_expr_vector_kind),
8531 integer_zero_node);
8533 gnu_cond
8534 = build3 (COND_EXPR, void_type_node, gnu_cond, NULL_TREE,
8535 build1 (GOTO_EXPR, void_type_node, gnu_end_label));
8538 /* Set to emit the statements of the loop. */
8539 *stmt_p = NULL_TREE;
8541 /* We first emit the start label and then a conditional jump to the
8542 end label if there's a top condition, then the update if it's at
8543 the top, then the body of the loop, then a conditional jump to
8544 the end label if there's a bottom condition, then the update if
8545 it's at the bottom, and finally a jump to the start label and the
8546 definition of the end label. */
8547 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
8548 gnu_start_label),
8549 stmt_p);
8551 if (gnu_cond && !LOOP_STMT_BOTTOM_COND_P (stmt))
8552 append_to_statement_list (gnu_cond, stmt_p);
8554 if (gnu_update && LOOP_STMT_TOP_UPDATE_P (stmt))
8555 append_to_statement_list (gnu_update, stmt_p);
8557 append_to_statement_list (LOOP_STMT_BODY (stmt), stmt_p);
8559 if (gnu_cond && LOOP_STMT_BOTTOM_COND_P (stmt))
8560 append_to_statement_list (gnu_cond, stmt_p);
8562 if (gnu_update && !LOOP_STMT_TOP_UPDATE_P (stmt))
8563 append_to_statement_list (gnu_update, stmt_p);
8565 tree t = build1 (GOTO_EXPR, void_type_node, gnu_start_label);
8566 SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (gnu_end_label));
8567 append_to_statement_list (t, stmt_p);
8569 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
8570 gnu_end_label),
8571 stmt_p);
8572 return GS_OK;
8575 case EXIT_STMT:
8576 /* Build a statement to jump to the corresponding end label, then
8577 see if it needs to be conditional. */
8578 *stmt_p = build1 (GOTO_EXPR, void_type_node, EXIT_STMT_LABEL (stmt));
8579 if (EXIT_STMT_COND (stmt))
8580 *stmt_p = build3 (COND_EXPR, void_type_node,
8581 EXIT_STMT_COND (stmt), *stmt_p, alloc_stmt_list ());
8582 return GS_OK;
8584 default:
8585 gcc_unreachable ();
8589 /* Force a reference to each of the entities in GNAT_PACKAGE recursively.
8591 This routine is exclusively called in type_annotate mode, to compute DDA
8592 information for types in withed units, for ASIS use. */
8594 static void
8595 elaborate_all_entities_for_package (Entity_Id gnat_package)
8597 Entity_Id gnat_entity;
8599 for (gnat_entity = First_Entity (gnat_package);
8600 Present (gnat_entity);
8601 gnat_entity = Next_Entity (gnat_entity))
8603 const Entity_Kind kind = Ekind (gnat_entity);
8605 /* We are interested only in entities visible from the main unit. */
8606 if (!Is_Public (gnat_entity))
8607 continue;
8609 /* Skip stuff internal to the compiler. */
8610 if (Convention (gnat_entity) == Convention_Intrinsic)
8611 continue;
8612 if (kind == E_Operator)
8613 continue;
8614 if (IN (kind, Subprogram_Kind) && Is_Intrinsic_Subprogram (gnat_entity))
8615 continue;
8616 if (Is_Itype (gnat_entity))
8617 continue;
8619 /* Skip named numbers. */
8620 if (IN (kind, Named_Kind))
8621 continue;
8623 /* Skip generic declarations. */
8624 if (IN (kind, Generic_Unit_Kind))
8625 continue;
8627 /* Skip formal objects. */
8628 if (IN (kind, Formal_Object_Kind))
8629 continue;
8631 /* Skip package bodies. */
8632 if (kind == E_Package_Body)
8633 continue;
8635 /* Skip limited views that point back to the main unit. */
8636 if (IN (kind, Incomplete_Kind)
8637 && From_Limited_With (gnat_entity)
8638 && In_Extended_Main_Code_Unit (Non_Limited_View (gnat_entity)))
8639 continue;
8641 /* Skip types that aren't frozen. */
8642 if (IN (kind, Type_Kind) && !Is_Frozen (gnat_entity))
8643 continue;
8645 /* Recurse on real packages that aren't in the main unit. */
8646 if (kind == E_Package)
8648 if (No (Renamed_Entity (gnat_entity))
8649 && !In_Extended_Main_Code_Unit (gnat_entity))
8650 elaborate_all_entities_for_package (gnat_entity);
8652 else
8653 gnat_to_gnu_entity (gnat_entity, NULL_TREE, false);
8657 /* Force a reference to each of the entities in packages withed by GNAT_NODE.
8658 Operate recursively but check that we aren't elaborating something more
8659 than once.
8661 This routine is exclusively called in type_annotate mode, to compute DDA
8662 information for types in withed units, for ASIS use. */
8664 static void
8665 elaborate_all_entities (Node_Id gnat_node)
8667 Entity_Id gnat_with_clause;
8669 /* Process each unit only once. As we trace the context of all relevant
8670 units transitively, including generic bodies, we may encounter the
8671 same generic unit repeatedly. */
8672 if (!present_gnu_tree (gnat_node))
8673 save_gnu_tree (gnat_node, integer_zero_node, true);
8675 /* Save entities in all context units. A body may have an implicit_with
8676 on its own spec, if the context includes a child unit, so don't save
8677 the spec twice. */
8678 for (gnat_with_clause = First (Context_Items (gnat_node));
8679 Present (gnat_with_clause);
8680 gnat_with_clause = Next (gnat_with_clause))
8681 if (Nkind (gnat_with_clause) == N_With_Clause
8682 && !present_gnu_tree (Library_Unit (gnat_with_clause))
8683 && Library_Unit (gnat_with_clause) != Library_Unit (Cunit (Main_Unit)))
8685 Node_Id gnat_unit = Library_Unit (gnat_with_clause);
8686 Entity_Id gnat_entity = Entity (Name (gnat_with_clause));
8688 elaborate_all_entities (gnat_unit);
8690 if (Ekind (gnat_entity) == E_Package)
8691 elaborate_all_entities_for_package (gnat_entity);
8693 else if (Ekind (gnat_entity) == E_Generic_Package)
8695 Node_Id gnat_body = Corresponding_Body (Unit (gnat_unit));
8697 /* Retrieve compilation unit node of generic body. */
8698 while (Present (gnat_body)
8699 && Nkind (gnat_body) != N_Compilation_Unit)
8700 gnat_body = Parent (gnat_body);
8702 /* If body is available, elaborate its context. */
8703 if (Present (gnat_body))
8704 elaborate_all_entities (gnat_body);
8708 if (Nkind (Unit (gnat_node)) == N_Package_Body)
8709 elaborate_all_entities (Library_Unit (gnat_node));
8712 /* Do the processing of GNAT_NODE, an N_Freeze_Entity. */
8714 static void
8715 process_freeze_entity (Node_Id gnat_node)
8717 const Entity_Id gnat_entity = Entity (gnat_node);
8718 const Entity_Kind kind = Ekind (gnat_entity);
8719 tree gnu_old, gnu_new;
8721 /* If this is a package, generate code for the package body, if any. */
8722 if (kind == E_Package)
8724 const Node_Id gnat_decl = Parent (Declaration_Node (gnat_entity));
8725 if (Present (Corresponding_Body (gnat_decl)))
8726 insert_code_for (Parent (Corresponding_Body (gnat_decl)));
8727 return;
8730 /* Don't do anything for class-wide types as they are always transformed
8731 into their root type. */
8732 if (kind == E_Class_Wide_Type)
8733 return;
8735 /* Check for an old definition if this isn't an object with address clause,
8736 since the saved GCC tree is the address expression in that case. */
8737 gnu_old
8738 = present_gnu_tree (gnat_entity) && No (Address_Clause (gnat_entity))
8739 ? get_gnu_tree (gnat_entity) : NULL_TREE;
8741 /* Don't do anything for subprograms that may have been elaborated before
8742 their freeze nodes. This can happen, for example, because of an inner
8743 call in an instance body or because of previous compilation of a spec
8744 for inlining purposes. */
8745 if (gnu_old
8746 && ((TREE_CODE (gnu_old) == FUNCTION_DECL
8747 && (kind == E_Function || kind == E_Procedure))
8748 || (TREE_CODE (TREE_TYPE (gnu_old)) == FUNCTION_TYPE
8749 && kind == E_Subprogram_Type)))
8750 return;
8752 /* If we have a non-dummy type old tree, we have nothing to do, except for
8753 aborting, since this node was never delayed as it should have been. We
8754 let this happen for concurrent types and their Corresponding_Record_Type,
8755 however, because each might legitimately be elaborated before its own
8756 freeze node, e.g. while processing the other. */
8757 if (gnu_old
8758 && !(TREE_CODE (gnu_old) == TYPE_DECL
8759 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old))))
8761 gcc_assert (Is_Concurrent_Type (gnat_entity)
8762 || (Is_Record_Type (gnat_entity)
8763 && Is_Concurrent_Record_Type (gnat_entity)));
8764 return;
8767 /* Reset the saved tree, if any, and elaborate the object or type for real.
8768 If there is a full view, elaborate it and use the result. And, if this
8769 is the root type of a class-wide type, reuse it for the latter. */
8770 if (gnu_old)
8772 save_gnu_tree (gnat_entity, NULL_TREE, false);
8774 if (Is_Incomplete_Or_Private_Type (gnat_entity)
8775 && Present (Full_View (gnat_entity)))
8777 Entity_Id full_view = Full_View (gnat_entity);
8779 save_gnu_tree (full_view, NULL_TREE, false);
8781 if (Is_Private_Type (full_view)
8782 && Present (Underlying_Full_View (full_view)))
8784 full_view = Underlying_Full_View (full_view);
8785 save_gnu_tree (full_view, NULL_TREE, false);
8789 if (Is_Type (gnat_entity)
8790 && Present (Class_Wide_Type (gnat_entity))
8791 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
8792 save_gnu_tree (Class_Wide_Type (gnat_entity), NULL_TREE, false);
8795 if (Is_Incomplete_Or_Private_Type (gnat_entity)
8796 && Present (Full_View (gnat_entity)))
8798 Entity_Id full_view = Full_View (gnat_entity);
8800 if (Is_Private_Type (full_view)
8801 && Present (Underlying_Full_View (full_view)))
8802 full_view = Underlying_Full_View (full_view);
8804 gnu_new = gnat_to_gnu_entity (full_view, NULL_TREE, true);
8806 /* Propagate back-annotations from full view to partial view. */
8807 if (Unknown_Alignment (gnat_entity))
8808 Set_Alignment (gnat_entity, Alignment (full_view));
8810 if (Unknown_Esize (gnat_entity))
8811 Set_Esize (gnat_entity, Esize (full_view));
8813 if (Unknown_RM_Size (gnat_entity))
8814 Set_RM_Size (gnat_entity, RM_Size (full_view));
8816 /* The above call may have defined this entity (the simplest example
8817 of this is when we have a private enumeral type since the bounds
8818 will have the public view). */
8819 if (!present_gnu_tree (gnat_entity))
8820 save_gnu_tree (gnat_entity, gnu_new, false);
8822 else
8824 tree gnu_init
8825 = (Nkind (Declaration_Node (gnat_entity)) == N_Object_Declaration
8826 && present_gnu_tree (Declaration_Node (gnat_entity)))
8827 ? get_gnu_tree (Declaration_Node (gnat_entity)) : NULL_TREE;
8829 gnu_new = gnat_to_gnu_entity (gnat_entity, gnu_init, true);
8832 if (Is_Type (gnat_entity)
8833 && Present (Class_Wide_Type (gnat_entity))
8834 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
8835 save_gnu_tree (Class_Wide_Type (gnat_entity), gnu_new, false);
8837 /* If we have an old type and we've made pointers to this type, update those
8838 pointers. If this is a Taft amendment type in the main unit, we need to
8839 mark the type as used since other units referencing it don't see the full
8840 declaration and, therefore, cannot mark it as used themselves. */
8841 if (gnu_old)
8843 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
8844 TREE_TYPE (gnu_new));
8845 if (TYPE_DUMMY_IN_PROFILE_P (TREE_TYPE (gnu_old)))
8846 update_profiles_with (TREE_TYPE (gnu_old));
8847 if (DECL_TAFT_TYPE_P (gnu_old))
8848 used_types_insert (TREE_TYPE (gnu_new));
8852 /* Elaborate decls in the lists GNAT_DECLS and GNAT_DECLS2, if present.
8853 We make two passes, one to elaborate anything other than bodies (but
8854 we declare a function if there was no spec). The second pass
8855 elaborates the bodies.
8857 GNAT_END_LIST gives the element in the list past the end. Normally,
8858 this is Empty, but can be First_Real_Statement for a
8859 Handled_Sequence_Of_Statements.
8861 We make a complete pass through both lists if PASS1P is true, then make
8862 the second pass over both lists if PASS2P is true. The lists usually
8863 correspond to the public and private parts of a package. */
8865 static void
8866 process_decls (List_Id gnat_decls, List_Id gnat_decls2,
8867 Node_Id gnat_end_list, bool pass1p, bool pass2p)
8869 List_Id gnat_decl_array[2];
8870 Node_Id gnat_decl;
8871 int i;
8873 gnat_decl_array[0] = gnat_decls, gnat_decl_array[1] = gnat_decls2;
8875 if (pass1p)
8876 for (i = 0; i <= 1; i++)
8877 if (Present (gnat_decl_array[i]))
8878 for (gnat_decl = First (gnat_decl_array[i]);
8879 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
8881 /* For package specs, we recurse inside the declarations,
8882 thus taking the two pass approach inside the boundary. */
8883 if (Nkind (gnat_decl) == N_Package_Declaration
8884 && (Nkind (Specification (gnat_decl)
8885 == N_Package_Specification)))
8886 process_decls (Visible_Declarations (Specification (gnat_decl)),
8887 Private_Declarations (Specification (gnat_decl)),
8888 Empty, true, false);
8890 /* Similarly for any declarations in the actions of a
8891 freeze node. */
8892 else if (Nkind (gnat_decl) == N_Freeze_Entity)
8894 process_freeze_entity (gnat_decl);
8895 process_decls (Actions (gnat_decl), Empty, Empty, true, false);
8898 /* Package bodies with freeze nodes get their elaboration deferred
8899 until the freeze node, but the code must be placed in the right
8900 place, so record the code position now. */
8901 else if (Nkind (gnat_decl) == N_Package_Body
8902 && Present (Freeze_Node (Corresponding_Spec (gnat_decl))))
8903 record_code_position (gnat_decl);
8905 else if (Nkind (gnat_decl) == N_Package_Body_Stub
8906 && Present (Library_Unit (gnat_decl))
8907 && Present (Freeze_Node
8908 (Corresponding_Spec
8909 (Proper_Body (Unit
8910 (Library_Unit (gnat_decl)))))))
8911 record_code_position
8912 (Proper_Body (Unit (Library_Unit (gnat_decl))));
8914 /* We defer most subprogram bodies to the second pass. */
8915 else if (Nkind (gnat_decl) == N_Subprogram_Body)
8917 if (Acts_As_Spec (gnat_decl))
8919 Node_Id gnat_subprog_id = Defining_Entity (gnat_decl);
8921 if (Ekind (gnat_subprog_id) != E_Generic_Procedure
8922 && Ekind (gnat_subprog_id) != E_Generic_Function)
8923 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, true);
8927 /* For bodies and stubs that act as their own specs, the entity
8928 itself must be elaborated in the first pass, because it may
8929 be used in other declarations. */
8930 else if (Nkind (gnat_decl) == N_Subprogram_Body_Stub)
8932 Node_Id gnat_subprog_id
8933 = Defining_Entity (Specification (gnat_decl));
8935 if (Ekind (gnat_subprog_id) != E_Subprogram_Body
8936 && Ekind (gnat_subprog_id) != E_Generic_Procedure
8937 && Ekind (gnat_subprog_id) != E_Generic_Function)
8938 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, true);
8941 /* Concurrent stubs stand for the corresponding subprogram bodies,
8942 which are deferred like other bodies. */
8943 else if (Nkind (gnat_decl) == N_Task_Body_Stub
8944 || Nkind (gnat_decl) == N_Protected_Body_Stub)
8947 /* Renamed subprograms may not be elaborated yet at this point
8948 since renamings do not trigger freezing. Wait for the second
8949 pass to take care of them. */
8950 else if (Nkind (gnat_decl) == N_Subprogram_Renaming_Declaration)
8953 else
8954 add_stmt (gnat_to_gnu (gnat_decl));
8957 /* Here we elaborate everything we deferred above except for package bodies,
8958 which are elaborated at their freeze nodes. Note that we must also
8959 go inside things (package specs and freeze nodes) the first pass did. */
8960 if (pass2p)
8961 for (i = 0; i <= 1; i++)
8962 if (Present (gnat_decl_array[i]))
8963 for (gnat_decl = First (gnat_decl_array[i]);
8964 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
8966 if (Nkind (gnat_decl) == N_Subprogram_Body
8967 || Nkind (gnat_decl) == N_Subprogram_Body_Stub
8968 || Nkind (gnat_decl) == N_Task_Body_Stub
8969 || Nkind (gnat_decl) == N_Protected_Body_Stub)
8970 add_stmt (gnat_to_gnu (gnat_decl));
8972 else if (Nkind (gnat_decl) == N_Package_Declaration
8973 && (Nkind (Specification (gnat_decl)
8974 == N_Package_Specification)))
8975 process_decls (Visible_Declarations (Specification (gnat_decl)),
8976 Private_Declarations (Specification (gnat_decl)),
8977 Empty, false, true);
8979 else if (Nkind (gnat_decl) == N_Freeze_Entity)
8980 process_decls (Actions (gnat_decl), Empty, Empty, false, true);
8982 else if (Nkind (gnat_decl) == N_Subprogram_Renaming_Declaration)
8983 add_stmt (gnat_to_gnu (gnat_decl));
8987 /* Make a unary operation of kind CODE using build_unary_op, but guard
8988 the operation by an overflow check. CODE can be one of NEGATE_EXPR
8989 or ABS_EXPR. GNU_TYPE is the type desired for the result. Usually
8990 the operation is to be performed in that type. GNAT_NODE is the gnat
8991 node conveying the source location for which the error should be
8992 signaled. */
8994 static tree
8995 build_unary_op_trapv (enum tree_code code, tree gnu_type, tree operand,
8996 Node_Id gnat_node)
8998 gcc_assert (code == NEGATE_EXPR || code == ABS_EXPR);
9000 operand = gnat_protect_expr (operand);
9002 return emit_check (build_binary_op (EQ_EXPR, boolean_type_node,
9003 operand, TYPE_MIN_VALUE (gnu_type)),
9004 build_unary_op (code, gnu_type, operand),
9005 CE_Overflow_Check_Failed, gnat_node);
9008 /* Make a binary operation of kind CODE using build_binary_op, but guard
9009 the operation by an overflow check. CODE can be one of PLUS_EXPR,
9010 MINUS_EXPR or MULT_EXPR. GNU_TYPE is the type desired for the result.
9011 Usually the operation is to be performed in that type. GNAT_NODE is
9012 the GNAT node conveying the source location for which the error should
9013 be signaled. */
9015 static tree
9016 build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left,
9017 tree right, Node_Id gnat_node)
9019 const unsigned int precision = TYPE_PRECISION (gnu_type);
9020 tree lhs = gnat_protect_expr (left);
9021 tree rhs = gnat_protect_expr (right);
9022 tree type_max = TYPE_MAX_VALUE (gnu_type);
9023 tree type_min = TYPE_MIN_VALUE (gnu_type);
9024 tree gnu_expr, check;
9025 int sgn;
9027 /* Assert that the precision is a power of 2. */
9028 gcc_assert ((precision & (precision - 1)) == 0);
9030 /* Prefer a constant on the RHS to simplify checks. */
9031 if (TREE_CODE (rhs) != INTEGER_CST
9032 && TREE_CODE (lhs) == INTEGER_CST
9033 && (code == PLUS_EXPR || code == MULT_EXPR))
9035 tree tmp = lhs;
9036 lhs = rhs;
9037 rhs = tmp;
9040 gnu_expr = build_binary_op (code, gnu_type, lhs, rhs);
9042 /* If we can fold the expression to a constant, just return it.
9043 The caller will deal with overflow, no need to generate a check. */
9044 if (TREE_CODE (gnu_expr) == INTEGER_CST)
9045 return gnu_expr;
9047 /* If no operand is a constant, we use the generic implementation. */
9048 if (TREE_CODE (lhs) != INTEGER_CST && TREE_CODE (rhs) != INTEGER_CST)
9050 /* Never inline a 64-bit mult for a 32-bit target, it's way too long. */
9051 if (code == MULT_EXPR && precision == 64 && BITS_PER_WORD < 64)
9053 tree int64 = gnat_type_for_size (64, 0);
9054 return convert (gnu_type, build_call_n_expr (mulv64_decl, 2,
9055 convert (int64, lhs),
9056 convert (int64, rhs)));
9059 enum internal_fn icode;
9061 switch (code)
9063 case PLUS_EXPR:
9064 icode = IFN_ADD_OVERFLOW;
9065 break;
9066 case MINUS_EXPR:
9067 icode = IFN_SUB_OVERFLOW;
9068 break;
9069 case MULT_EXPR:
9070 icode = IFN_MUL_OVERFLOW;
9071 break;
9072 default:
9073 gcc_unreachable ();
9076 tree gnu_ctype = build_complex_type (gnu_type);
9077 tree call
9078 = build_call_expr_internal_loc (UNKNOWN_LOCATION, icode, gnu_ctype, 2,
9079 lhs, rhs);
9080 tree tgt = save_expr (call);
9081 gnu_expr = build1 (REALPART_EXPR, gnu_type, tgt);
9082 check = fold_build2 (NE_EXPR, boolean_type_node,
9083 build1 (IMAGPART_EXPR, gnu_type, tgt),
9084 build_int_cst (gnu_type, 0));
9085 return
9086 emit_check (check, gnu_expr, CE_Overflow_Check_Failed, gnat_node);
9089 /* If one operand is a constant, we expose the overflow condition to enable
9090 a subsequent simplication or even elimination. */
9091 switch (code)
9093 case PLUS_EXPR:
9094 sgn = tree_int_cst_sgn (rhs);
9095 if (sgn > 0)
9096 /* When rhs > 0, overflow when lhs > type_max - rhs. */
9097 check = build_binary_op (GT_EXPR, boolean_type_node, lhs,
9098 build_binary_op (MINUS_EXPR, gnu_type,
9099 type_max, rhs));
9100 else if (sgn < 0)
9101 /* When rhs < 0, overflow when lhs < type_min - rhs. */
9102 check = build_binary_op (LT_EXPR, boolean_type_node, lhs,
9103 build_binary_op (MINUS_EXPR, gnu_type,
9104 type_min, rhs));
9105 else
9106 return gnu_expr;
9107 break;
9109 case MINUS_EXPR:
9110 if (TREE_CODE (lhs) == INTEGER_CST)
9112 sgn = tree_int_cst_sgn (lhs);
9113 if (sgn > 0)
9114 /* When lhs > 0, overflow when rhs < lhs - type_max. */
9115 check = build_binary_op (LT_EXPR, boolean_type_node, rhs,
9116 build_binary_op (MINUS_EXPR, gnu_type,
9117 lhs, type_max));
9118 else if (sgn < 0)
9119 /* When lhs < 0, overflow when rhs > lhs - type_min. */
9120 check = build_binary_op (GT_EXPR, boolean_type_node, rhs,
9121 build_binary_op (MINUS_EXPR, gnu_type,
9122 lhs, type_min));
9123 else
9124 return gnu_expr;
9126 else
9128 sgn = tree_int_cst_sgn (rhs);
9129 if (sgn > 0)
9130 /* When rhs > 0, overflow when lhs < type_min + rhs. */
9131 check = build_binary_op (LT_EXPR, boolean_type_node, lhs,
9132 build_binary_op (PLUS_EXPR, gnu_type,
9133 type_min, rhs));
9134 else if (sgn < 0)
9135 /* When rhs < 0, overflow when lhs > type_max + rhs. */
9136 check = build_binary_op (GT_EXPR, boolean_type_node, lhs,
9137 build_binary_op (PLUS_EXPR, gnu_type,
9138 type_max, rhs));
9139 else
9140 return gnu_expr;
9142 break;
9144 case MULT_EXPR:
9145 sgn = tree_int_cst_sgn (rhs);
9146 if (sgn > 0)
9148 if (integer_onep (rhs))
9149 return gnu_expr;
9151 tree lb = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_min, rhs);
9152 tree ub = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_max, rhs);
9154 /* When rhs > 1, overflow outside [type_min/rhs; type_max/rhs]. */
9155 check
9156 = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
9157 build_binary_op (LT_EXPR, boolean_type_node,
9158 lhs, lb),
9159 build_binary_op (GT_EXPR, boolean_type_node,
9160 lhs, ub));
9162 else if (sgn < 0)
9164 tree lb = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_max, rhs);
9165 tree ub = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_min, rhs);
9167 if (integer_minus_onep (rhs))
9168 /* When rhs == -1, overflow if lhs == type_min. */
9169 check
9170 = build_binary_op (EQ_EXPR, boolean_type_node, lhs, type_min);
9171 else
9172 /* When rhs < -1, overflow outside [type_max/rhs; type_min/rhs]. */
9173 check
9174 = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
9175 build_binary_op (LT_EXPR, boolean_type_node,
9176 lhs, lb),
9177 build_binary_op (GT_EXPR, boolean_type_node,
9178 lhs, ub));
9180 else
9181 return gnu_expr;
9182 break;
9184 default:
9185 gcc_unreachable ();
9188 return emit_check (check, gnu_expr, CE_Overflow_Check_Failed, gnat_node);
9191 /* Emit code for a range check. GNU_EXPR is the expression to be checked,
9192 GNAT_RANGE_TYPE the gnat type or subtype containing the bounds against
9193 which we have to check. GNAT_NODE is the GNAT node conveying the source
9194 location for which the error should be signaled. */
9196 static tree
9197 emit_range_check (tree gnu_expr, Entity_Id gnat_range_type, Node_Id gnat_node)
9199 tree gnu_range_type = get_unpadded_type (gnat_range_type);
9200 tree gnu_compare_type = get_base_type (TREE_TYPE (gnu_expr));
9202 /* If GNU_EXPR has GNAT_RANGE_TYPE as its base type, no check is needed.
9203 This can for example happen when translating 'Val or 'Value. */
9204 if (gnu_compare_type == gnu_range_type)
9205 return gnu_expr;
9207 /* Range checks can only be applied to types with ranges. */
9208 gcc_assert (INTEGRAL_TYPE_P (gnu_range_type)
9209 || SCALAR_FLOAT_TYPE_P (gnu_range_type));
9211 /* If GNU_EXPR has an integral type that is narrower than GNU_RANGE_TYPE,
9212 we can't do anything since we might be truncating the bounds. No
9213 check is needed in this case. */
9214 if (INTEGRAL_TYPE_P (TREE_TYPE (gnu_expr))
9215 && (TYPE_PRECISION (gnu_compare_type)
9216 < TYPE_PRECISION (get_base_type (gnu_range_type))))
9217 return gnu_expr;
9219 /* Checked expressions must be evaluated only once. */
9220 gnu_expr = gnat_protect_expr (gnu_expr);
9222 /* Note that the form of the check is
9223 (not (expr >= lo)) or (not (expr <= hi))
9224 the reason for this slightly convoluted form is that NaNs
9225 are not considered to be in range in the float case. */
9226 return emit_check
9227 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
9228 invert_truthvalue
9229 (build_binary_op (GE_EXPR, boolean_type_node,
9230 convert (gnu_compare_type, gnu_expr),
9231 convert (gnu_compare_type,
9232 TYPE_MIN_VALUE
9233 (gnu_range_type)))),
9234 invert_truthvalue
9235 (build_binary_op (LE_EXPR, boolean_type_node,
9236 convert (gnu_compare_type, gnu_expr),
9237 convert (gnu_compare_type,
9238 TYPE_MAX_VALUE
9239 (gnu_range_type))))),
9240 gnu_expr, CE_Range_Check_Failed, gnat_node);
9243 /* GNU_COND contains the condition corresponding to an index, overflow or
9244 range check of value GNU_EXPR. Build a COND_EXPR that returns GNU_EXPR
9245 if GNU_COND is false and raises a CONSTRAINT_ERROR if GNU_COND is true.
9246 REASON is the code that says why the exception is raised. GNAT_NODE is
9247 the node conveying the source location for which the error should be
9248 signaled.
9250 We used to propagate TREE_SIDE_EFFECTS from GNU_EXPR to the COND_EXPR,
9251 overwriting the setting inherited from the call statement, on the ground
9252 that the expression need not be evaluated just for the check. However
9253 that's incorrect because, in the GCC type system, its value is presumed
9254 to be valid so its comparison against the type bounds always yields true
9255 and, therefore, could be done without evaluating it; given that it can
9256 be a computation that overflows the bounds, the language may require the
9257 check to fail and thus the expression to be evaluated in this case. */
9259 static tree
9260 emit_check (tree gnu_cond, tree gnu_expr, int reason, Node_Id gnat_node)
9262 tree gnu_call
9263 = build_call_raise (reason, gnat_node, N_Raise_Constraint_Error);
9264 return
9265 fold_build3 (COND_EXPR, TREE_TYPE (gnu_expr), gnu_cond,
9266 build2 (COMPOUND_EXPR, TREE_TYPE (gnu_expr), gnu_call,
9267 SCALAR_FLOAT_TYPE_P (TREE_TYPE (gnu_expr))
9268 ? build_real (TREE_TYPE (gnu_expr), dconst0)
9269 : build_int_cst (TREE_TYPE (gnu_expr), 0)),
9270 gnu_expr);
9273 /* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing overflow
9274 checks if OVERFLOW_P is true and range checks if RANGE_P is true.
9275 If TRUNCATE_P true, do a float-to-integer conversion with truncation,
9276 otherwise round. GNAT_NODE is the GNAT node conveying the source location
9277 for which the error should be signaled. */
9279 static tree
9280 convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflow_p,
9281 bool range_p, bool truncate_p, Node_Id gnat_node)
9283 tree gnu_type = get_unpadded_type (gnat_type);
9284 tree gnu_base_type = get_base_type (gnu_type);
9285 tree gnu_in_type = TREE_TYPE (gnu_expr);
9286 tree gnu_in_base_type = get_base_type (gnu_in_type);
9287 tree gnu_result = gnu_expr;
9289 /* If we are not doing any checks, the output is an integral type and the
9290 input is not a floating-point type, just do the conversion. This is
9291 required for packed array types and is simpler in all cases anyway. */
9292 if (!range_p
9293 && !overflow_p
9294 && INTEGRAL_TYPE_P (gnu_base_type)
9295 && !FLOAT_TYPE_P (gnu_in_base_type))
9296 return convert (gnu_type, gnu_expr);
9298 /* If the mode of the input base type is larger, then converting to it below
9299 may pessimize the final conversion step, for example generate a libcall
9300 instead of a simple instruction, so use a narrower type in this case. */
9301 if (TYPE_MODE (gnu_in_base_type) != TYPE_MODE (gnu_in_type)
9302 && !(TREE_CODE (gnu_in_type) == INTEGER_TYPE
9303 && TYPE_BIASED_REPRESENTATION_P (gnu_in_type)))
9304 gnu_in_base_type = gnat_type_for_mode (TYPE_MODE (gnu_in_type),
9305 TYPE_UNSIGNED (gnu_in_type));
9307 /* First convert the expression to the base type. This will never generate
9308 code, but makes the tests below simpler. But don't do this if converting
9309 from an integer type to an unconstrained array type since then we need to
9310 get the bounds from the original (unpacked) type. */
9311 if (TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE)
9312 gnu_result = convert (gnu_in_base_type, gnu_result);
9314 /* If overflow checks are requested, we need to be sure the result will fit
9315 in the output base type. But don't do this if the input is integer and
9316 the output floating-point. */
9317 if (overflow_p
9318 && !(FLOAT_TYPE_P (gnu_base_type) && INTEGRAL_TYPE_P (gnu_in_base_type)))
9320 /* Ensure GNU_EXPR only gets evaluated once. */
9321 tree gnu_input = gnat_protect_expr (gnu_result);
9322 tree gnu_cond = boolean_false_node;
9323 tree gnu_in_lb = TYPE_MIN_VALUE (gnu_in_base_type);
9324 tree gnu_in_ub = TYPE_MAX_VALUE (gnu_in_base_type);
9325 tree gnu_out_lb = TYPE_MIN_VALUE (gnu_base_type);
9326 tree gnu_out_ub = TYPE_MAX_VALUE (gnu_base_type);
9328 /* Convert the lower bounds to signed types, so we're sure we're
9329 comparing them properly. Likewise, convert the upper bounds
9330 to unsigned types. */
9331 if (INTEGRAL_TYPE_P (gnu_in_base_type)
9332 && TYPE_UNSIGNED (gnu_in_base_type))
9333 gnu_in_lb
9334 = convert (gnat_signed_type_for (gnu_in_base_type), gnu_in_lb);
9336 if (INTEGRAL_TYPE_P (gnu_in_base_type)
9337 && !TYPE_UNSIGNED (gnu_in_base_type))
9338 gnu_in_ub
9339 = convert (gnat_unsigned_type_for (gnu_in_base_type), gnu_in_ub);
9341 if (INTEGRAL_TYPE_P (gnu_base_type) && TYPE_UNSIGNED (gnu_base_type))
9342 gnu_out_lb
9343 = convert (gnat_signed_type_for (gnu_base_type), gnu_out_lb);
9345 if (INTEGRAL_TYPE_P (gnu_base_type) && !TYPE_UNSIGNED (gnu_base_type))
9346 gnu_out_ub
9347 = convert (gnat_unsigned_type_for (gnu_base_type), gnu_out_ub);
9349 /* Check each bound separately and only if the result bound
9350 is tighter than the bound on the input type. Note that all the
9351 types are base types, so the bounds must be constant. Also,
9352 the comparison is done in the base type of the input, which
9353 always has the proper signedness. First check for input
9354 integer (which means output integer), output float (which means
9355 both float), or mixed, in which case we always compare.
9356 Note that we have to do the comparison which would *fail* in the
9357 case of an error since if it's an FP comparison and one of the
9358 values is a NaN or Inf, the comparison will fail. */
9359 if (INTEGRAL_TYPE_P (gnu_in_base_type)
9360 ? tree_int_cst_lt (gnu_in_lb, gnu_out_lb)
9361 : (FLOAT_TYPE_P (gnu_base_type)
9362 ? real_less (&TREE_REAL_CST (gnu_in_lb),
9363 &TREE_REAL_CST (gnu_out_lb))
9364 : 1))
9365 gnu_cond
9366 = invert_truthvalue
9367 (build_binary_op (GE_EXPR, boolean_type_node,
9368 gnu_input, convert (gnu_in_base_type,
9369 gnu_out_lb)));
9371 if (INTEGRAL_TYPE_P (gnu_in_base_type)
9372 ? tree_int_cst_lt (gnu_out_ub, gnu_in_ub)
9373 : (FLOAT_TYPE_P (gnu_base_type)
9374 ? real_less (&TREE_REAL_CST (gnu_out_ub),
9375 &TREE_REAL_CST (gnu_in_lb))
9376 : 1))
9377 gnu_cond
9378 = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node, gnu_cond,
9379 invert_truthvalue
9380 (build_binary_op (LE_EXPR, boolean_type_node,
9381 gnu_input,
9382 convert (gnu_in_base_type,
9383 gnu_out_ub))));
9385 if (!integer_zerop (gnu_cond))
9386 gnu_result = emit_check (gnu_cond, gnu_input,
9387 CE_Overflow_Check_Failed, gnat_node);
9390 /* Now convert to the result base type. If this is a non-truncating
9391 float-to-integer conversion, round. */
9392 if (INTEGRAL_TYPE_P (gnu_base_type)
9393 && FLOAT_TYPE_P (gnu_in_base_type)
9394 && !truncate_p)
9396 REAL_VALUE_TYPE half_minus_pred_half, pred_half;
9397 tree gnu_conv, gnu_zero, gnu_comp, calc_type;
9398 tree gnu_pred_half, gnu_add_pred_half, gnu_subtract_pred_half;
9399 const struct real_format *fmt;
9401 /* The following calculations depend on proper rounding to even
9402 of each arithmetic operation. In order to prevent excess
9403 precision from spoiling this property, use the widest hardware
9404 floating-point type if FP_ARITH_MAY_WIDEN is true. */
9405 calc_type
9406 = fp_arith_may_widen ? longest_float_type_node : gnu_in_base_type;
9408 /* Compute the exact value calc_type'Pred (0.5) at compile time. */
9409 fmt = REAL_MODE_FORMAT (TYPE_MODE (calc_type));
9410 real_2expN (&half_minus_pred_half, -(fmt->p) - 1, TYPE_MODE (calc_type));
9411 real_arithmetic (&pred_half, MINUS_EXPR, &dconsthalf,
9412 &half_minus_pred_half);
9413 gnu_pred_half = build_real (calc_type, pred_half);
9415 /* If the input is strictly negative, subtract this value
9416 and otherwise add it from the input. For 0.5, the result
9417 is exactly between 1.0 and the machine number preceding 1.0
9418 (for calc_type). Since the last bit of 1.0 is even, this 0.5
9419 will round to 1.0, while all other number with an absolute
9420 value less than 0.5 round to 0.0. For larger numbers exactly
9421 halfway between integers, rounding will always be correct as
9422 the true mathematical result will be closer to the higher
9423 integer compared to the lower one. So, this constant works
9424 for all floating-point numbers.
9426 The reason to use the same constant with subtract/add instead
9427 of a positive and negative constant is to allow the comparison
9428 to be scheduled in parallel with retrieval of the constant and
9429 conversion of the input to the calc_type (if necessary). */
9431 gnu_zero = build_real (gnu_in_base_type, dconst0);
9432 gnu_result = gnat_protect_expr (gnu_result);
9433 gnu_conv = convert (calc_type, gnu_result);
9434 gnu_comp
9435 = fold_build2 (GE_EXPR, boolean_type_node, gnu_result, gnu_zero);
9436 gnu_add_pred_half
9437 = fold_build2 (PLUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
9438 gnu_subtract_pred_half
9439 = fold_build2 (MINUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
9440 gnu_result = fold_build3 (COND_EXPR, calc_type, gnu_comp,
9441 gnu_add_pred_half, gnu_subtract_pred_half);
9444 if (TREE_CODE (gnu_base_type) == INTEGER_TYPE
9445 && TYPE_HAS_ACTUAL_BOUNDS_P (gnu_base_type)
9446 && TREE_CODE (gnu_result) == UNCONSTRAINED_ARRAY_REF)
9447 gnu_result = unchecked_convert (gnu_base_type, gnu_result, false);
9448 else
9449 gnu_result = convert (gnu_base_type, gnu_result);
9451 /* Finally, do the range check if requested. Note that if the result type
9452 is a modular type, the range check is actually an overflow check. */
9453 if (range_p
9454 || (overflow_p
9455 && TREE_CODE (gnu_base_type) == INTEGER_TYPE
9456 && TYPE_MODULAR_P (gnu_base_type)))
9457 gnu_result = emit_range_check (gnu_result, gnat_type, gnat_node);
9459 return convert (gnu_type, gnu_result);
9462 /* Return true if GNU_EXPR can be directly addressed. This is the case
9463 unless it is an expression involving computation or if it involves a
9464 reference to a bitfield or to an object not sufficiently aligned for
9465 its type. If GNU_TYPE is non-null, return true only if GNU_EXPR can
9466 be directly addressed as an object of this type.
9468 *** Notes on addressability issues in the Ada compiler ***
9470 This predicate is necessary in order to bridge the gap between Gigi
9471 and the middle-end about addressability of GENERIC trees. A tree
9472 is said to be addressable if it can be directly addressed, i.e. if
9473 its address can be taken, is a multiple of the type's alignment on
9474 strict-alignment architectures and returns the first storage unit
9475 assigned to the object represented by the tree.
9477 In the C family of languages, everything is in practice addressable
9478 at the language level, except for bit-fields. This means that these
9479 compilers will take the address of any tree that doesn't represent
9480 a bit-field reference and expect the result to be the first storage
9481 unit assigned to the object. Even in cases where this will result
9482 in unaligned accesses at run time, nothing is supposed to be done
9483 and the program is considered as erroneous instead (see PR c/18287).
9485 The implicit assumptions made in the middle-end are in keeping with
9486 the C viewpoint described above:
9487 - the address of a bit-field reference is supposed to be never
9488 taken; the compiler (generally) will stop on such a construct,
9489 - any other tree is addressable if it is formally addressable,
9490 i.e. if it is formally allowed to be the operand of ADDR_EXPR.
9492 In Ada, the viewpoint is the opposite one: nothing is addressable
9493 at the language level unless explicitly declared so. This means
9494 that the compiler will both make sure that the trees representing
9495 references to addressable ("aliased" in Ada parlance) objects are
9496 addressable and make no real attempts at ensuring that the trees
9497 representing references to non-addressable objects are addressable.
9499 In the first case, Ada is effectively equivalent to C and handing
9500 down the direct result of applying ADDR_EXPR to these trees to the
9501 middle-end works flawlessly. In the second case, Ada cannot afford
9502 to consider the program as erroneous if the address of trees that
9503 are not addressable is requested for technical reasons, unlike C;
9504 as a consequence, the Ada compiler must arrange for either making
9505 sure that this address is not requested in the middle-end or for
9506 compensating by inserting temporaries if it is requested in Gigi.
9508 The first goal can be achieved because the middle-end should not
9509 request the address of non-addressable trees on its own; the only
9510 exception is for the invocation of low-level block operations like
9511 memcpy, for which the addressability requirements are lower since
9512 the type's alignment can be disregarded. In practice, this means
9513 that Gigi must make sure that such operations cannot be applied to
9514 non-BLKmode bit-fields.
9516 The second goal is achieved by means of the addressable_p predicate,
9517 which computes whether a temporary must be inserted by Gigi when the
9518 address of a tree is requested; if so, the address of the temporary
9519 will be used in lieu of that of the original tree and some glue code
9520 generated to connect everything together. */
9522 static bool
9523 addressable_p (tree gnu_expr, tree gnu_type)
9525 /* For an integral type, the size of the actual type of the object may not
9526 be greater than that of the expected type, otherwise an indirect access
9527 in the latter type wouldn't correctly set all the bits of the object. */
9528 if (gnu_type
9529 && INTEGRAL_TYPE_P (gnu_type)
9530 && smaller_form_type_p (gnu_type, TREE_TYPE (gnu_expr)))
9531 return false;
9533 /* The size of the actual type of the object may not be smaller than that
9534 of the expected type, otherwise an indirect access in the latter type
9535 would be larger than the object. But only record types need to be
9536 considered in practice for this case. */
9537 if (gnu_type
9538 && TREE_CODE (gnu_type) == RECORD_TYPE
9539 && smaller_form_type_p (TREE_TYPE (gnu_expr), gnu_type))
9540 return false;
9542 switch (TREE_CODE (gnu_expr))
9544 case VAR_DECL:
9545 case PARM_DECL:
9546 case FUNCTION_DECL:
9547 case RESULT_DECL:
9548 /* All DECLs are addressable: if they are in a register, we can force
9549 them to memory. */
9550 return true;
9552 case UNCONSTRAINED_ARRAY_REF:
9553 case INDIRECT_REF:
9554 /* Taking the address of a dereference yields the original pointer. */
9555 return true;
9557 case STRING_CST:
9558 case INTEGER_CST:
9559 /* Taking the address yields a pointer to the constant pool. */
9560 return true;
9562 case CONSTRUCTOR:
9563 /* Taking the address of a static constructor yields a pointer to the
9564 tree constant pool. */
9565 return TREE_STATIC (gnu_expr) ? true : false;
9567 case NULL_EXPR:
9568 case SAVE_EXPR:
9569 case CALL_EXPR:
9570 case PLUS_EXPR:
9571 case MINUS_EXPR:
9572 case BIT_IOR_EXPR:
9573 case BIT_XOR_EXPR:
9574 case BIT_AND_EXPR:
9575 case BIT_NOT_EXPR:
9576 /* All rvalues are deemed addressable since taking their address will
9577 force a temporary to be created by the middle-end. */
9578 return true;
9580 case COMPOUND_EXPR:
9581 /* The address of a compound expression is that of its 2nd operand. */
9582 return addressable_p (TREE_OPERAND (gnu_expr, 1), gnu_type);
9584 case COND_EXPR:
9585 /* We accept &COND_EXPR as soon as both operands are addressable and
9586 expect the outcome to be the address of the selected operand. */
9587 return (addressable_p (TREE_OPERAND (gnu_expr, 1), NULL_TREE)
9588 && addressable_p (TREE_OPERAND (gnu_expr, 2), NULL_TREE));
9590 case COMPONENT_REF:
9591 return (((!DECL_BIT_FIELD (TREE_OPERAND (gnu_expr, 1))
9592 /* Even with DECL_BIT_FIELD cleared, we have to ensure that
9593 the field is sufficiently aligned, in case it is subject
9594 to a pragma Component_Alignment. But we don't need to
9595 check the alignment of the containing record, as it is
9596 guaranteed to be not smaller than that of its most
9597 aligned field that is not a bit-field. */
9598 && (!STRICT_ALIGNMENT
9599 || DECL_ALIGN (TREE_OPERAND (gnu_expr, 1))
9600 >= TYPE_ALIGN (TREE_TYPE (gnu_expr))))
9601 /* The field of a padding record is always addressable. */
9602 || TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))))
9603 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
9605 case ARRAY_REF: case ARRAY_RANGE_REF:
9606 case REALPART_EXPR: case IMAGPART_EXPR:
9607 case NOP_EXPR:
9608 return addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE);
9610 case CONVERT_EXPR:
9611 return (AGGREGATE_TYPE_P (TREE_TYPE (gnu_expr))
9612 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
9614 case VIEW_CONVERT_EXPR:
9616 /* This is addressable if we can avoid a copy. */
9617 tree type = TREE_TYPE (gnu_expr);
9618 tree inner_type = TREE_TYPE (TREE_OPERAND (gnu_expr, 0));
9619 return (((TYPE_MODE (type) == TYPE_MODE (inner_type)
9620 && (!STRICT_ALIGNMENT
9621 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
9622 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT))
9623 || ((TYPE_MODE (type) == BLKmode
9624 || TYPE_MODE (inner_type) == BLKmode)
9625 && (!STRICT_ALIGNMENT
9626 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
9627 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT
9628 || TYPE_ALIGN_OK (type)
9629 || TYPE_ALIGN_OK (inner_type))))
9630 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
9633 default:
9634 return false;
9638 /* Do the processing for the declaration of a GNAT_ENTITY, a type or subtype.
9639 If a Freeze node exists for the entity, delay the bulk of the processing.
9640 Otherwise make a GCC type for GNAT_ENTITY and set up the correspondence. */
9642 void
9643 process_type (Entity_Id gnat_entity)
9645 tree gnu_old
9646 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : NULL_TREE;
9648 /* If we are to delay elaboration of this type, just do any elaboration
9649 needed for expressions within the declaration and make a dummy node
9650 for it and its Full_View (if any), in case something points to it.
9651 Do not do this if it has already been done (the only way that can
9652 happen is if the private completion is also delayed). */
9653 if (Present (Freeze_Node (gnat_entity)))
9655 elaborate_entity (gnat_entity);
9657 if (!gnu_old)
9659 tree gnu_decl = TYPE_STUB_DECL (make_dummy_type (gnat_entity));
9660 save_gnu_tree (gnat_entity, gnu_decl, false);
9661 if (Is_Incomplete_Or_Private_Type (gnat_entity)
9662 && Present (Full_View (gnat_entity)))
9664 if (Has_Completion_In_Body (gnat_entity))
9665 DECL_TAFT_TYPE_P (gnu_decl) = 1;
9666 save_gnu_tree (Full_View (gnat_entity), gnu_decl, false);
9670 return;
9673 /* If we saved away a dummy type for this node, it means that this made the
9674 type that corresponds to the full type of an incomplete type. Clear that
9675 type for now and then update the type in the pointers below. But, if the
9676 saved type is not dummy, it very likely means that we have a use before
9677 declaration for the type in the tree, what we really cannot handle. */
9678 if (gnu_old)
9680 gcc_assert (TREE_CODE (gnu_old) == TYPE_DECL
9681 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old)));
9683 save_gnu_tree (gnat_entity, NULL_TREE, false);
9686 /* Now fully elaborate the type. */
9687 tree gnu_new = gnat_to_gnu_entity (gnat_entity, NULL_TREE, true);
9688 gcc_assert (TREE_CODE (gnu_new) == TYPE_DECL);
9690 /* If we have an old type and we've made pointers to this type, update those
9691 pointers. If this is a Taft amendment type in the main unit, we need to
9692 mark the type as used since other units referencing it don't see the full
9693 declaration and, therefore, cannot mark it as used themselves. */
9694 if (gnu_old)
9696 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
9697 TREE_TYPE (gnu_new));
9698 if (DECL_TAFT_TYPE_P (gnu_old))
9699 used_types_insert (TREE_TYPE (gnu_new));
9702 /* If this is a record type corresponding to a task or protected type
9703 that is a completion of an incomplete type, perform a similar update
9704 on the type. ??? Including protected types here is a guess. */
9705 if (Is_Record_Type (gnat_entity)
9706 && Is_Concurrent_Record_Type (gnat_entity)
9707 && present_gnu_tree (Corresponding_Concurrent_Type (gnat_entity)))
9709 tree gnu_task_old
9710 = get_gnu_tree (Corresponding_Concurrent_Type (gnat_entity));
9712 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
9713 NULL_TREE, false);
9714 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
9715 gnu_new, false);
9717 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_task_old)),
9718 TREE_TYPE (gnu_new));
9722 /* Subroutine of assoc_to_constructor: VALUES is a list of field associations,
9723 some of which are from RECORD_TYPE. Return a CONSTRUCTOR consisting of the
9724 associations that are from RECORD_TYPE. If we see an internal record, make
9725 a recursive call to fill it in as well. */
9727 static tree
9728 extract_values (tree values, tree record_type)
9730 vec<constructor_elt, va_gc> *v = NULL;
9731 tree field;
9733 for (field = TYPE_FIELDS (record_type); field; field = DECL_CHAIN (field))
9735 tree tem, value = NULL_TREE;
9737 /* _Parent is an internal field, but may have values in the aggregate,
9738 so check for values first. */
9739 if ((tem = purpose_member (field, values)))
9741 value = TREE_VALUE (tem);
9742 TREE_ADDRESSABLE (tem) = 1;
9745 else if (DECL_INTERNAL_P (field))
9747 value = extract_values (values, TREE_TYPE (field));
9748 if (TREE_CODE (value) == CONSTRUCTOR
9749 && vec_safe_is_empty (CONSTRUCTOR_ELTS (value)))
9750 value = NULL_TREE;
9752 else
9753 /* If we have a record subtype, the names will match, but not the
9754 actual FIELD_DECLs. */
9755 for (tem = values; tem; tem = TREE_CHAIN (tem))
9756 if (DECL_NAME (TREE_PURPOSE (tem)) == DECL_NAME (field))
9758 value = convert (TREE_TYPE (field), TREE_VALUE (tem));
9759 TREE_ADDRESSABLE (tem) = 1;
9762 if (!value)
9763 continue;
9765 CONSTRUCTOR_APPEND_ELT (v, field, value);
9768 return gnat_build_constructor (record_type, v);
9771 /* GNAT_ENTITY is the type of the resulting constructor, GNAT_ASSOC is the
9772 front of the Component_Associations of an N_Aggregate and GNU_TYPE is the
9773 GCC type of the corresponding record type. Return the CONSTRUCTOR. */
9775 static tree
9776 assoc_to_constructor (Entity_Id gnat_entity, Node_Id gnat_assoc, tree gnu_type)
9778 tree gnu_list = NULL_TREE, gnu_result;
9780 /* We test for GNU_FIELD being empty in the case where a variant
9781 was the last thing since we don't take things off GNAT_ASSOC in
9782 that case. We check GNAT_ASSOC in case we have a variant, but it
9783 has no fields. */
9785 for (; Present (gnat_assoc); gnat_assoc = Next (gnat_assoc))
9787 Node_Id gnat_field = First (Choices (gnat_assoc));
9788 tree gnu_field = gnat_to_gnu_field_decl (Entity (gnat_field));
9789 tree gnu_expr = gnat_to_gnu (Expression (gnat_assoc));
9791 /* The expander is supposed to put a single component selector name
9792 in every record component association. */
9793 gcc_assert (No (Next (gnat_field)));
9795 /* Ignore discriminants that have Corresponding_Discriminants in tagged
9796 types since we'll be setting those fields in the parent subtype. */
9797 if (Ekind (Entity (gnat_field)) == E_Discriminant
9798 && Present (Corresponding_Discriminant (Entity (gnat_field)))
9799 && Is_Tagged_Type (Scope (Entity (gnat_field))))
9800 continue;
9802 /* Also ignore discriminants of Unchecked_Unions. */
9803 if (Ekind (Entity (gnat_field)) == E_Discriminant
9804 && Is_Unchecked_Union (gnat_entity))
9805 continue;
9807 /* Before assigning a value in an aggregate make sure range checks
9808 are done if required. Then convert to the type of the field. */
9809 if (Do_Range_Check (Expression (gnat_assoc)))
9810 gnu_expr = emit_range_check (gnu_expr, Etype (gnat_field), Empty);
9812 gnu_expr = convert (TREE_TYPE (gnu_field), gnu_expr);
9814 /* Add the field and expression to the list. */
9815 gnu_list = tree_cons (gnu_field, gnu_expr, gnu_list);
9818 gnu_result = extract_values (gnu_list, gnu_type);
9820 if (flag_checking)
9822 /* Verify that every entry in GNU_LIST was used. */
9823 for (; gnu_list; gnu_list = TREE_CHAIN (gnu_list))
9824 gcc_assert (TREE_ADDRESSABLE (gnu_list));
9827 return gnu_result;
9830 /* Build a possibly nested constructor for array aggregates. GNAT_EXPR is
9831 the first element of an array aggregate. It may itself be an aggregate.
9832 GNU_ARRAY_TYPE is the GCC type corresponding to the array aggregate.
9833 GNAT_COMPONENT_TYPE is the type of the array component; it is needed
9834 for range checking. */
9836 static tree
9837 pos_to_constructor (Node_Id gnat_expr, tree gnu_array_type,
9838 Entity_Id gnat_component_type)
9840 tree gnu_index = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_array_type));
9841 vec<constructor_elt, va_gc> *gnu_expr_vec = NULL;
9843 for (; Present (gnat_expr); gnat_expr = Next (gnat_expr))
9845 tree gnu_expr;
9847 /* If the expression is itself an array aggregate then first build the
9848 innermost constructor if it is part of our array (multi-dimensional
9849 case). */
9850 if (Nkind (gnat_expr) == N_Aggregate
9851 && TREE_CODE (TREE_TYPE (gnu_array_type)) == ARRAY_TYPE
9852 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_array_type)))
9853 gnu_expr = pos_to_constructor (First (Expressions (gnat_expr)),
9854 TREE_TYPE (gnu_array_type),
9855 gnat_component_type);
9856 else
9858 /* If the expression is a conversion to an unconstrained array type,
9859 skip it to avoid spilling to memory. */
9860 if (Nkind (gnat_expr) == N_Type_Conversion
9861 && Is_Array_Type (Etype (gnat_expr))
9862 && !Is_Constrained (Etype (gnat_expr)))
9863 gnu_expr = gnat_to_gnu (Expression (gnat_expr));
9864 else
9865 gnu_expr = gnat_to_gnu (gnat_expr);
9867 /* Before assigning the element to the array, make sure it is
9868 in range. */
9869 if (Do_Range_Check (gnat_expr))
9870 gnu_expr = emit_range_check (gnu_expr, gnat_component_type, Empty);
9873 CONSTRUCTOR_APPEND_ELT (gnu_expr_vec, gnu_index,
9874 convert (TREE_TYPE (gnu_array_type), gnu_expr));
9876 gnu_index = int_const_binop (PLUS_EXPR, gnu_index,
9877 convert (TREE_TYPE (gnu_index),
9878 integer_one_node));
9881 return gnat_build_constructor (gnu_array_type, gnu_expr_vec);
9884 /* Process a N_Validate_Unchecked_Conversion node. */
9886 static void
9887 validate_unchecked_conversion (Node_Id gnat_node)
9889 tree gnu_source_type = gnat_to_gnu_type (Source_Type (gnat_node));
9890 tree gnu_target_type = gnat_to_gnu_type (Target_Type (gnat_node));
9892 /* If the target is a pointer type, see if we are either converting from a
9893 non-pointer or from a pointer to a type with a different alias set and
9894 warn if so, unless the pointer has been marked to alias everything. */
9895 if (POINTER_TYPE_P (gnu_target_type)
9896 && !TYPE_REF_CAN_ALIAS_ALL (gnu_target_type))
9898 tree gnu_source_desig_type = POINTER_TYPE_P (gnu_source_type)
9899 ? TREE_TYPE (gnu_source_type)
9900 : NULL_TREE;
9901 tree gnu_target_desig_type = TREE_TYPE (gnu_target_type);
9902 alias_set_type target_alias_set = get_alias_set (gnu_target_desig_type);
9904 if (target_alias_set != 0
9905 && (!POINTER_TYPE_P (gnu_source_type)
9906 || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type),
9907 target_alias_set)))
9909 post_error_ne ("?possible aliasing problem for type&",
9910 gnat_node, Target_Type (gnat_node));
9911 post_error ("\\?use -fno-strict-aliasing switch for references",
9912 gnat_node);
9913 post_error_ne ("\\?or use `pragma No_Strict_Aliasing (&);`",
9914 gnat_node, Target_Type (gnat_node));
9918 /* Likewise if the target is a fat pointer type, but we have no mechanism to
9919 mitigate the problem in this case, so we unconditionally warn. */
9920 else if (TYPE_IS_FAT_POINTER_P (gnu_target_type))
9922 tree gnu_source_desig_type
9923 = TYPE_IS_FAT_POINTER_P (gnu_source_type)
9924 ? TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_source_type)))
9925 : NULL_TREE;
9926 tree gnu_target_desig_type
9927 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_target_type)));
9928 alias_set_type target_alias_set = get_alias_set (gnu_target_desig_type);
9930 if (target_alias_set != 0
9931 && (!TYPE_IS_FAT_POINTER_P (gnu_source_type)
9932 || !alias_sets_conflict_p (get_alias_set (gnu_source_desig_type),
9933 target_alias_set)))
9935 post_error_ne ("?possible aliasing problem for type&",
9936 gnat_node, Target_Type (gnat_node));
9937 post_error ("\\?use -fno-strict-aliasing switch for references",
9938 gnat_node);
9943 /* EXP is to be used in a context where access objects are implicitly
9944 dereferenced. Handle the cases when it is an access object. */
9946 static Node_Id
9947 adjust_for_implicit_deref (Node_Id exp)
9949 Entity_Id type = Underlying_Type (Etype (exp));
9951 /* Make sure the designated type is complete before dereferencing. */
9952 if (Is_Access_Type (type))
9953 gnat_to_gnu_entity (Designated_Type (type), NULL_TREE, false);
9955 return exp;
9958 /* EXP is to be treated as an array or record. Handle the cases when it is
9959 an access object and perform the required dereferences. */
9961 static tree
9962 maybe_implicit_deref (tree exp)
9964 /* If the type is a pointer, dereference it. */
9965 if (POINTER_TYPE_P (TREE_TYPE (exp))
9966 || TYPE_IS_FAT_POINTER_P (TREE_TYPE (exp)))
9967 exp = build_unary_op (INDIRECT_REF, NULL_TREE, exp);
9969 /* If we got a padded type, remove it too. */
9970 if (TYPE_IS_PADDING_P (TREE_TYPE (exp)))
9971 exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
9973 return exp;
9976 /* Convert SLOC into LOCUS. Return true if SLOC corresponds to a source code
9977 location and false if it doesn't. If CLEAR_COLUMN is true, set the column
9978 information to 0. */
9980 bool
9981 Sloc_to_locus (Source_Ptr Sloc, location_t *locus, bool clear_column)
9983 if (Sloc == No_Location)
9984 return false;
9986 if (Sloc <= Standard_Location)
9988 *locus = BUILTINS_LOCATION;
9989 return false;
9992 Source_File_Index file = Get_Source_File_Index (Sloc);
9993 Logical_Line_Number line = Get_Logical_Line_Number (Sloc);
9994 Column_Number column = (clear_column ? 0 : Get_Column_Number (Sloc));
9995 line_map_ordinary *map = LINEMAPS_ORDINARY_MAP_AT (line_table, file - 1);
9997 /* We can have zero if pragma Source_Reference is in effect. */
9998 if (line < 1)
9999 line = 1;
10001 /* Translate the location. */
10002 *locus
10003 = linemap_position_for_line_and_column (line_table, map, line, column);
10005 return true;
10008 /* Similar to set_expr_location, but start with the Sloc of GNAT_NODE and
10009 don't do anything if it doesn't correspond to a source location. And,
10010 if CLEAR_COLUMN is true, set the column information to 0. */
10012 static void
10013 set_expr_location_from_node (tree node, Node_Id gnat_node, bool clear_column)
10015 location_t locus;
10017 if (!Sloc_to_locus (Sloc (gnat_node), &locus, clear_column))
10018 return;
10020 SET_EXPR_LOCATION (node, locus);
10023 /* More elaborate version of set_expr_location_from_node to be used in more
10024 general contexts, for example the result of the translation of a generic
10025 GNAT node. */
10027 static void
10028 set_gnu_expr_location_from_node (tree node, Node_Id gnat_node)
10030 /* Set the location information on the node if it is a real expression.
10031 References can be reused for multiple GNAT nodes and they would get
10032 the location information of their last use. Also make sure not to
10033 overwrite an existing location as it is probably more precise. */
10035 switch (TREE_CODE (node))
10037 CASE_CONVERT:
10038 case NON_LVALUE_EXPR:
10039 case SAVE_EXPR:
10040 break;
10042 case COMPOUND_EXPR:
10043 if (EXPR_P (TREE_OPERAND (node, 1)))
10044 set_gnu_expr_location_from_node (TREE_OPERAND (node, 1), gnat_node);
10046 /* ... fall through ... */
10048 default:
10049 if (!REFERENCE_CLASS_P (node) && !EXPR_HAS_LOCATION (node))
10051 set_expr_location_from_node (node, gnat_node);
10052 set_end_locus_from_node (node, gnat_node);
10054 break;
10058 /* Set the end_locus information for GNU_NODE, if any, from an explicit end
10059 location associated with GNAT_NODE or GNAT_NODE itself, whichever makes
10060 most sense. Return true if a sensible assignment was performed. */
10062 static bool
10063 set_end_locus_from_node (tree gnu_node, Node_Id gnat_node)
10065 Node_Id gnat_end_label;
10066 location_t end_locus;
10068 /* Pick the GNAT node of which we'll take the sloc to assign to the GCC node
10069 end_locus when there is one. We consider only GNAT nodes with a possible
10070 End_Label attached. If the End_Label actually was unassigned, fallback
10071 on the original node. We'd better assign an explicit sloc associated with
10072 the outer construct in any case. */
10074 switch (Nkind (gnat_node))
10076 case N_Package_Body:
10077 case N_Subprogram_Body:
10078 case N_Block_Statement:
10079 gnat_end_label = End_Label (Handled_Statement_Sequence (gnat_node));
10080 break;
10082 case N_Package_Declaration:
10083 gnat_end_label = End_Label (Specification (gnat_node));
10084 break;
10086 default:
10087 return false;
10090 if (Present (gnat_end_label))
10091 gnat_node = gnat_end_label;
10093 /* Some expanded subprograms have neither an End_Label nor a Sloc
10094 attached. Notify that to callers. For a block statement with no
10095 End_Label, clear column information, so that the tree for a
10096 transient block does not receive the sloc of a source condition. */
10097 if (!Sloc_to_locus (Sloc (gnat_node), &end_locus,
10098 No (gnat_end_label)
10099 && (Nkind (gnat_node) == N_Block_Statement)))
10100 return false;
10102 switch (TREE_CODE (gnu_node))
10104 case BIND_EXPR:
10105 BLOCK_SOURCE_END_LOCATION (BIND_EXPR_BLOCK (gnu_node)) = end_locus;
10106 return true;
10108 case FUNCTION_DECL:
10109 DECL_STRUCT_FUNCTION (gnu_node)->function_end_locus = end_locus;
10110 return true;
10112 default:
10113 return false;
10117 /* Return a colon-separated list of encodings contained in encoded Ada
10118 name. */
10120 static const char *
10121 extract_encoding (const char *name)
10123 char *encoding = (char *) ggc_alloc_atomic (strlen (name));
10124 get_encoding (name, encoding);
10125 return encoding;
10128 /* Extract the Ada name from an encoded name. */
10130 static const char *
10131 decode_name (const char *name)
10133 char *decoded = (char *) ggc_alloc_atomic (strlen (name) * 2 + 60);
10134 __gnat_decode (name, decoded, 0);
10135 return decoded;
10138 /* Post an error message. MSG is the error message, properly annotated.
10139 NODE is the node at which to post the error and the node to use for the
10140 '&' substitution. */
10142 void
10143 post_error (const char *msg, Node_Id node)
10145 String_Template temp;
10146 String_Pointer sp;
10148 if (No (node))
10149 return;
10151 temp.Low_Bound = 1;
10152 temp.High_Bound = strlen (msg);
10153 sp.Bounds = &temp;
10154 sp.Array = msg;
10155 Error_Msg_N (sp, node);
10158 /* Similar to post_error, but NODE is the node at which to post the error and
10159 ENT is the node to use for the '&' substitution. */
10161 void
10162 post_error_ne (const char *msg, Node_Id node, Entity_Id ent)
10164 String_Template temp;
10165 String_Pointer sp;
10167 if (No (node))
10168 return;
10170 temp.Low_Bound = 1;
10171 temp.High_Bound = strlen (msg);
10172 sp.Bounds = &temp;
10173 sp.Array = msg;
10174 Error_Msg_NE (sp, node, ent);
10177 /* Similar to post_error_ne, but NUM is the number to use for the '^'. */
10179 void
10180 post_error_ne_num (const char *msg, Node_Id node, Entity_Id ent, int num)
10182 Error_Msg_Uint_1 = UI_From_Int (num);
10183 post_error_ne (msg, node, ent);
10186 /* Similar to post_error_ne, but T is a GCC tree representing the number to
10187 write. If T represents a constant, the text inside curly brackets in
10188 MSG will be output (presumably including a '^'). Otherwise it will not
10189 be output and the text inside square brackets will be output instead. */
10191 void
10192 post_error_ne_tree (const char *msg, Node_Id node, Entity_Id ent, tree t)
10194 char *new_msg = XALLOCAVEC (char, strlen (msg) + 1);
10195 char start_yes, end_yes, start_no, end_no;
10196 const char *p;
10197 char *q;
10199 if (TREE_CODE (t) == INTEGER_CST)
10201 Error_Msg_Uint_1 = UI_From_gnu (t);
10202 start_yes = '{', end_yes = '}', start_no = '[', end_no = ']';
10204 else
10205 start_yes = '[', end_yes = ']', start_no = '{', end_no = '}';
10207 for (p = msg, q = new_msg; *p; p++)
10209 if (*p == start_yes)
10210 for (p++; *p != end_yes; p++)
10211 *q++ = *p;
10212 else if (*p == start_no)
10213 for (p++; *p != end_no; p++)
10215 else
10216 *q++ = *p;
10219 *q = 0;
10221 post_error_ne (new_msg, node, ent);
10224 /* Similar to post_error_ne_tree, but NUM is a second integer to write. */
10226 void
10227 post_error_ne_tree_2 (const char *msg, Node_Id node, Entity_Id ent, tree t,
10228 int num)
10230 Error_Msg_Uint_2 = UI_From_Int (num);
10231 post_error_ne_tree (msg, node, ent, t);
10234 /* Return a label to branch to for the exception type in KIND or Empty
10235 if none. */
10237 Entity_Id
10238 get_exception_label (char kind)
10240 switch (kind)
10242 case N_Raise_Constraint_Error:
10243 return gnu_constraint_error_label_stack.last ();
10245 case N_Raise_Storage_Error:
10246 return gnu_storage_error_label_stack.last ();
10248 case N_Raise_Program_Error:
10249 return gnu_program_error_label_stack.last ();
10251 default:
10252 return Empty;
10255 gcc_unreachable ();
10258 /* Return the decl for the current elaboration procedure. */
10260 static tree
10261 get_elaboration_procedure (void)
10263 return gnu_elab_proc_stack->last ();
10266 /* Initialize the table that maps GNAT codes to GCC codes for simple
10267 binary and unary operations. */
10269 static void
10270 init_code_table (void)
10272 gnu_codes[N_Op_And] = TRUTH_AND_EXPR;
10273 gnu_codes[N_Op_Or] = TRUTH_OR_EXPR;
10274 gnu_codes[N_Op_Xor] = TRUTH_XOR_EXPR;
10275 gnu_codes[N_Op_Eq] = EQ_EXPR;
10276 gnu_codes[N_Op_Ne] = NE_EXPR;
10277 gnu_codes[N_Op_Lt] = LT_EXPR;
10278 gnu_codes[N_Op_Le] = LE_EXPR;
10279 gnu_codes[N_Op_Gt] = GT_EXPR;
10280 gnu_codes[N_Op_Ge] = GE_EXPR;
10281 gnu_codes[N_Op_Add] = PLUS_EXPR;
10282 gnu_codes[N_Op_Subtract] = MINUS_EXPR;
10283 gnu_codes[N_Op_Multiply] = MULT_EXPR;
10284 gnu_codes[N_Op_Mod] = FLOOR_MOD_EXPR;
10285 gnu_codes[N_Op_Rem] = TRUNC_MOD_EXPR;
10286 gnu_codes[N_Op_Minus] = NEGATE_EXPR;
10287 gnu_codes[N_Op_Abs] = ABS_EXPR;
10288 gnu_codes[N_Op_Not] = TRUTH_NOT_EXPR;
10289 gnu_codes[N_Op_Rotate_Left] = LROTATE_EXPR;
10290 gnu_codes[N_Op_Rotate_Right] = RROTATE_EXPR;
10291 gnu_codes[N_Op_Shift_Left] = LSHIFT_EXPR;
10292 gnu_codes[N_Op_Shift_Right] = RSHIFT_EXPR;
10293 gnu_codes[N_Op_Shift_Right_Arithmetic] = RSHIFT_EXPR;
10294 gnu_codes[N_And_Then] = TRUTH_ANDIF_EXPR;
10295 gnu_codes[N_Or_Else] = TRUTH_ORIF_EXPR;
10298 #include "gt-ada-trans.h"