1 /****************************************************************************
3 * GNAT COMPILER COMPONENTS *
7 * C Implementation File *
9 * Copyright (C) 1992-2010, Free Software Foundation, Inc. *
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/>. *
21 * GNAT was originally developed by the GNAT team at New York University. *
22 * Extensive contributions were provided by Ada Core Technologies Inc. *
24 ****************************************************************************/
28 #include "coretypes.h"
35 #include "tree-iterator.h"
39 #include "adadecode.h"
56 /* We should avoid allocating more than ALLOCA_THRESHOLD bytes via alloca,
57 for fear of running out of stack space. If we need more, we use xmalloc
59 #define ALLOCA_THRESHOLD 1000
61 /* Let code below know whether we are targetting VMS without need of
62 intrusive preprocessor directives. */
63 #ifndef TARGET_ABI_OPEN_VMS
64 #define TARGET_ABI_OPEN_VMS 0
67 /* For efficient float-to-int rounding, it is necessary to know whether
68 floating-point arithmetic may use wider intermediate results. When
69 FP_ARITH_MAY_WIDEN is not defined, be conservative and only assume
70 that arithmetic does not widen if double precision is emulated. */
71 #ifndef FP_ARITH_MAY_WIDEN
72 #if defined(HAVE_extendsfdf2)
73 #define FP_ARITH_MAY_WIDEN HAVE_extendsfdf2
75 #define FP_ARITH_MAY_WIDEN 0
79 /* Pointers to front-end tables accessed through macros. */
80 struct Node *Nodes_Ptr;
81 Node_Id *Next_Node_Ptr;
82 Node_Id *Prev_Node_Ptr;
83 struct Elist_Header *Elists_Ptr;
84 struct Elmt_Item *Elmts_Ptr;
85 struct String_Entry *Strings_Ptr;
86 Char_Code *String_Chars_Ptr;
87 struct List_Header *List_Headers_Ptr;
89 /* Highest number in the front-end node table. */
92 /* Current node being treated, in case abort called. */
93 Node_Id error_gnat_node;
95 /* True when gigi is being called on an analyzed but unexpanded
96 tree, and the only purpose of the call is to properly annotate
97 types with representation information. */
98 bool type_annotate_only;
100 /* Current filename without path. */
101 const char *ref_filename;
103 /* When not optimizing, we cache the 'First, 'Last and 'Length attributes
104 of unconstrained array IN parameters to avoid emitting a great deal of
105 redundant instructions to recompute them each time. */
106 struct GTY (()) parm_attr_d {
107 int id; /* GTY doesn't like Entity_Id. */
114 typedef struct parm_attr_d *parm_attr;
116 DEF_VEC_P(parm_attr);
117 DEF_VEC_ALLOC_P(parm_attr,gc);
119 struct GTY(()) language_function {
120 VEC(parm_attr,gc) *parm_attr_cache;
123 #define f_parm_attr_cache \
124 DECL_STRUCT_FUNCTION (current_function_decl)->language->parm_attr_cache
126 /* A structure used to gather together information about a statement group.
127 We use this to gather related statements, for example the "then" part
128 of a IF. In the case where it represents a lexical scope, we may also
129 have a BLOCK node corresponding to it and/or cleanups. */
131 struct GTY((chain_next ("%h.previous"))) stmt_group {
132 struct stmt_group *previous; /* Previous code group. */
133 tree stmt_list; /* List of statements for this code group. */
134 tree block; /* BLOCK for this code group, if any. */
135 tree cleanups; /* Cleanups for this code group, if any. */
138 static GTY(()) struct stmt_group *current_stmt_group;
140 /* List of unused struct stmt_group nodes. */
141 static GTY((deletable)) struct stmt_group *stmt_group_free_list;
143 /* A structure used to record information on elaboration procedures
144 we've made and need to process.
146 ??? gnat_node should be Node_Id, but gengtype gets confused. */
148 struct GTY((chain_next ("%h.next"))) elab_info {
149 struct elab_info *next; /* Pointer to next in chain. */
150 tree elab_proc; /* Elaboration procedure. */
151 int gnat_node; /* The N_Compilation_Unit. */
154 static GTY(()) struct elab_info *elab_info_list;
156 /* Free list of TREE_LIST nodes used for stacks. */
157 static GTY((deletable)) tree gnu_stack_free_list;
159 /* List of TREE_LIST nodes representing a stack of exception pointer
160 variables. TREE_VALUE is the VAR_DECL that stores the address of
161 the raised exception. Nonzero means we are in an exception
162 handler. Not used in the zero-cost case. */
163 static GTY(()) tree gnu_except_ptr_stack;
165 /* List of TREE_LIST nodes used to store the current elaboration procedure
166 decl. TREE_VALUE is the decl. */
167 static GTY(()) tree gnu_elab_proc_stack;
169 /* Variable that stores a list of labels to be used as a goto target instead of
170 a return in some functions. See processing for N_Subprogram_Body. */
171 static GTY(()) tree gnu_return_label_stack;
173 /* List of TREE_LIST nodes representing a stack of LOOP_STMT nodes.
174 TREE_VALUE of each entry is the label of the corresponding LOOP_STMT. */
175 static GTY(()) tree gnu_loop_label_stack;
177 /* List of TREE_LIST nodes representing labels for switch statements.
178 TREE_VALUE of each entry is the label at the end of the switch. */
179 static GTY(()) tree gnu_switch_label_stack;
181 /* List of TREE_LIST nodes containing the stacks for N_{Push,Pop}_*_Label. */
182 static GTY(()) tree gnu_constraint_error_label_stack;
183 static GTY(()) tree gnu_storage_error_label_stack;
184 static GTY(()) tree gnu_program_error_label_stack;
186 /* Map GNAT tree codes to GCC tree codes for simple expressions. */
187 static enum tree_code gnu_codes[Number_Node_Kinds];
189 static void init_code_table (void);
190 static void Compilation_Unit_to_gnu (Node_Id);
191 static void record_code_position (Node_Id);
192 static void insert_code_for (Node_Id);
193 static void add_cleanup (tree, Node_Id);
194 static tree unshare_save_expr (tree *, int *, void *);
195 static void add_stmt_list (List_Id);
196 static void push_exception_label_stack (tree *, Entity_Id);
197 static tree build_stmt_group (List_Id, bool);
198 static void push_stack (tree *, tree, tree);
199 static void pop_stack (tree *);
200 static enum gimplify_status gnat_gimplify_stmt (tree *);
201 static void elaborate_all_entities (Node_Id);
202 static void process_freeze_entity (Node_Id);
203 static void process_decls (List_Id, List_Id, Node_Id, bool, bool);
204 static tree emit_range_check (tree, Node_Id, Node_Id);
205 static tree emit_index_check (tree, tree, tree, tree, Node_Id);
206 static tree emit_check (tree, tree, int, Node_Id);
207 static tree build_unary_op_trapv (enum tree_code, tree, tree, Node_Id);
208 static tree build_binary_op_trapv (enum tree_code, tree, tree, tree, Node_Id);
209 static tree convert_with_check (Entity_Id, tree, bool, bool, bool, Node_Id);
210 static bool smaller_form_type_p (tree, tree);
211 static bool addressable_p (tree, tree);
212 static tree assoc_to_constructor (Entity_Id, Node_Id, tree);
213 static tree extract_values (tree, tree);
214 static tree pos_to_constructor (Node_Id, tree, Entity_Id);
215 static tree maybe_implicit_deref (tree);
216 static void set_expr_location_from_node (tree, Node_Id);
217 static int lvalue_required_p (Node_Id, tree, bool, bool, bool);
219 /* Hooks for debug info back-ends, only supported and used in a restricted set
220 of configurations. */
221 static const char *extract_encoding (const char *) ATTRIBUTE_UNUSED;
222 static const char *decode_name (const char *) ATTRIBUTE_UNUSED;
224 /* This is the main program of the back-end. It sets up all the table
225 structures and then generates code. */
228 gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
229 struct Node *nodes_ptr, Node_Id *next_node_ptr, Node_Id *prev_node_ptr,
230 struct Elist_Header *elists_ptr, struct Elmt_Item *elmts_ptr,
231 struct String_Entry *strings_ptr, Char_Code *string_chars_ptr,
232 struct List_Header *list_headers_ptr, Nat number_file,
233 struct File_Info_Type *file_info_ptr,
234 Entity_Id standard_boolean, Entity_Id standard_integer,
235 Entity_Id standard_character, Entity_Id standard_long_long_float,
236 Entity_Id standard_exception_type, Int gigi_operating_mode)
238 Entity_Id gnat_literal;
239 tree long_long_float_type, exception_type, t;
240 tree int64_type = gnat_type_for_size (64, 0);
241 struct elab_info *info;
244 max_gnat_nodes = max_gnat_node;
246 Nodes_Ptr = nodes_ptr;
247 Next_Node_Ptr = next_node_ptr;
248 Prev_Node_Ptr = prev_node_ptr;
249 Elists_Ptr = elists_ptr;
250 Elmts_Ptr = elmts_ptr;
251 Strings_Ptr = strings_ptr;
252 String_Chars_Ptr = string_chars_ptr;
253 List_Headers_Ptr = list_headers_ptr;
255 type_annotate_only = (gigi_operating_mode == 1);
257 gcc_assert (Nkind (gnat_root) == N_Compilation_Unit);
259 /* Declare the name of the compilation unit as the first global
260 name in order to make the middle-end fully deterministic. */
261 t = create_concat_name (Defining_Entity (Unit (gnat_root)), NULL);
262 first_global_object_name = ggc_strdup (IDENTIFIER_POINTER (t));
264 for (i = 0; i < number_file; i++)
266 /* Use the identifier table to make a permanent copy of the filename as
267 the name table gets reallocated after Gigi returns but before all the
268 debugging information is output. The __gnat_to_canonical_file_spec
269 call translates filenames from pragmas Source_Reference that contain
270 host style syntax not understood by gdb. */
274 (__gnat_to_canonical_file_spec
275 (Get_Name_String (file_info_ptr[i].File_Name))));
277 /* We rely on the order isomorphism between files and line maps. */
278 gcc_assert ((int) line_table->used == i);
280 /* We create the line map for a source file at once, with a fixed number
281 of columns chosen to avoid jumping over the next power of 2. */
282 linemap_add (line_table, LC_ENTER, 0, filename, 1);
283 linemap_line_start (line_table, file_info_ptr[i].Num_Source_Lines, 252);
284 linemap_position_for_column (line_table, 252 - 1);
285 linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
288 /* Initialize ourselves. */
293 /* If we are just annotating types, give VOID_TYPE zero sizes to avoid
295 if (type_annotate_only)
297 TYPE_SIZE (void_type_node) = bitsize_zero_node;
298 TYPE_SIZE_UNIT (void_type_node) = size_zero_node;
301 /* If the GNU type extensions to DWARF are available, setup the hooks. */
302 #if defined (DWARF2_DEBUGGING_INFO) && defined (DWARF2_GNU_TYPE_EXTENSIONS)
303 /* We condition the name demangling and the generation of type encoding
304 strings on -gdwarf+ and always set descriptive types on. */
305 if (use_gnu_debug_info_extensions)
307 dwarf2out_set_type_encoding_func (extract_encoding);
308 dwarf2out_set_demangle_name_func (decode_name);
310 dwarf2out_set_descriptive_type_func (get_parallel_type);
313 /* Enable GNAT stack checking method if needed */
314 if (!Stack_Check_Probes_On_Target)
315 set_stack_check_libfunc (gen_rtx_SYMBOL_REF (Pmode, "_gnat_stack_check"));
317 /* Retrieve alignment settings. */
318 double_float_alignment = get_target_double_float_alignment ();
319 double_scalar_alignment = get_target_double_scalar_alignment ();
321 /* Record the builtin types. Define `integer' and `character' first so that
322 dbx will output them first. */
323 record_builtin_type ("integer", integer_type_node);
324 record_builtin_type ("character", unsigned_char_type_node);
325 record_builtin_type ("boolean", boolean_type_node);
326 record_builtin_type ("void", void_type_node);
328 /* Save the type we made for integer as the type for Standard.Integer. */
329 save_gnu_tree (Base_Type (standard_integer),
330 TYPE_NAME (integer_type_node),
333 /* Likewise for character as the type for Standard.Character. */
334 save_gnu_tree (Base_Type (standard_character),
335 TYPE_NAME (unsigned_char_type_node),
338 /* Likewise for boolean as the type for Standard.Boolean. */
339 save_gnu_tree (Base_Type (standard_boolean),
340 TYPE_NAME (boolean_type_node),
342 gnat_literal = First_Literal (Base_Type (standard_boolean));
343 t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
344 gcc_assert (t == boolean_false_node);
345 t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
346 boolean_type_node, t, true, false, false, false,
348 DECL_IGNORED_P (t) = 1;
349 save_gnu_tree (gnat_literal, t, false);
350 gnat_literal = Next_Literal (gnat_literal);
351 t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
352 gcc_assert (t == boolean_true_node);
353 t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
354 boolean_type_node, t, true, false, false, false,
356 DECL_IGNORED_P (t) = 1;
357 save_gnu_tree (gnat_literal, t, false);
359 void_ftype = build_function_type (void_type_node, NULL_TREE);
360 ptr_void_ftype = build_pointer_type (void_ftype);
362 /* Now declare runtime functions. */
363 t = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
365 /* malloc is a function declaration tree for a function to allocate
368 = create_subprog_decl (get_identifier ("__gnat_malloc"), NULL_TREE,
369 build_function_type (ptr_void_type_node,
370 tree_cons (NULL_TREE,
372 NULL_TREE, false, true, true, NULL, Empty);
373 DECL_IS_MALLOC (malloc_decl) = 1;
375 /* malloc32 is a function declaration tree for a function to allocate
376 32-bit memory on a 64-bit system. Needed only on 64-bit VMS. */
378 = create_subprog_decl (get_identifier ("__gnat_malloc32"), NULL_TREE,
379 build_function_type (ptr_void_type_node,
380 tree_cons (NULL_TREE,
382 NULL_TREE, false, true, true, NULL, Empty);
383 DECL_IS_MALLOC (malloc32_decl) = 1;
385 /* free is a function declaration tree for a function to free memory. */
387 = create_subprog_decl (get_identifier ("__gnat_free"), NULL_TREE,
388 build_function_type (void_type_node,
389 tree_cons (NULL_TREE,
392 NULL_TREE, false, true, true, NULL, Empty);
394 /* This is used for 64-bit multiplication with overflow checking. */
396 = create_subprog_decl (get_identifier ("__gnat_mulv64"), NULL_TREE,
397 build_function_type_list (int64_type, int64_type,
398 int64_type, NULL_TREE),
399 NULL_TREE, false, true, true, NULL, Empty);
401 /* Name of the _Parent field in tagged record types. */
402 parent_name_id = get_identifier (Get_Name_String (Name_uParent));
404 /* Make the types and functions used for exception processing. */
406 = build_array_type (gnat_type_for_mode (Pmode, 0),
407 build_index_type (size_int (5)));
408 record_builtin_type ("JMPBUF_T", jmpbuf_type);
409 jmpbuf_ptr_type = build_pointer_type (jmpbuf_type);
411 /* Functions to get and set the jumpbuf pointer for the current thread. */
413 = create_subprog_decl
414 (get_identifier ("system__soft_links__get_jmpbuf_address_soft"),
415 NULL_TREE, build_function_type (jmpbuf_ptr_type, NULL_TREE),
416 NULL_TREE, false, true, true, NULL, Empty);
417 /* Avoid creating superfluous edges to __builtin_setjmp receivers. */
418 DECL_PURE_P (get_jmpbuf_decl) = 1;
419 DECL_IGNORED_P (get_jmpbuf_decl) = 1;
422 = create_subprog_decl
423 (get_identifier ("system__soft_links__set_jmpbuf_address_soft"),
425 build_function_type (void_type_node,
426 tree_cons (NULL_TREE, jmpbuf_ptr_type, t)),
427 NULL_TREE, false, true, true, NULL, Empty);
428 DECL_IGNORED_P (set_jmpbuf_decl) = 1;
430 /* setjmp returns an integer and has one operand, which is a pointer to
433 = create_subprog_decl
434 (get_identifier ("__builtin_setjmp"), NULL_TREE,
435 build_function_type (integer_type_node,
436 tree_cons (NULL_TREE, jmpbuf_ptr_type, t)),
437 NULL_TREE, false, true, true, NULL, Empty);
438 DECL_BUILT_IN_CLASS (setjmp_decl) = BUILT_IN_NORMAL;
439 DECL_FUNCTION_CODE (setjmp_decl) = BUILT_IN_SETJMP;
441 /* update_setjmp_buf updates a setjmp buffer from the current stack pointer
443 update_setjmp_buf_decl
444 = create_subprog_decl
445 (get_identifier ("__builtin_update_setjmp_buf"), NULL_TREE,
446 build_function_type (void_type_node,
447 tree_cons (NULL_TREE, jmpbuf_ptr_type, t)),
448 NULL_TREE, false, true, true, NULL, Empty);
449 DECL_BUILT_IN_CLASS (update_setjmp_buf_decl) = BUILT_IN_NORMAL;
450 DECL_FUNCTION_CODE (update_setjmp_buf_decl) = BUILT_IN_UPDATE_SETJMP_BUF;
452 /* Hooks to call when entering/leaving an exception handler. */
454 = create_subprog_decl (get_identifier ("__gnat_begin_handler"), NULL_TREE,
455 build_function_type (void_type_node,
456 tree_cons (NULL_TREE,
459 NULL_TREE, false, true, true, NULL, Empty);
460 DECL_IGNORED_P (begin_handler_decl) = 1;
463 = create_subprog_decl (get_identifier ("__gnat_end_handler"), NULL_TREE,
464 build_function_type (void_type_node,
465 tree_cons (NULL_TREE,
468 NULL_TREE, false, true, true, NULL, Empty);
469 DECL_IGNORED_P (end_handler_decl) = 1;
471 /* If in no exception handlers mode, all raise statements are redirected to
472 __gnat_last_chance_handler. No need to redefine raise_nodefer_decl since
473 this procedure will never be called in this mode. */
474 if (No_Exception_Handlers_Set ())
477 = create_subprog_decl
478 (get_identifier ("__gnat_last_chance_handler"), NULL_TREE,
479 build_function_type (void_type_node,
480 tree_cons (NULL_TREE,
482 (unsigned_char_type_node),
483 tree_cons (NULL_TREE,
486 NULL_TREE, false, true, true, NULL, Empty);
488 for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
489 gnat_raise_decls[i] = decl;
492 /* Otherwise, make one decl for each exception reason. */
493 for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
497 sprintf (name, "__gnat_rcheck_%.2d", i);
499 = create_subprog_decl
500 (get_identifier (name), NULL_TREE,
501 build_function_type (void_type_node,
502 tree_cons (NULL_TREE,
504 (unsigned_char_type_node),
505 tree_cons (NULL_TREE,
508 NULL_TREE, false, true, true, NULL, Empty);
511 for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
513 TREE_THIS_VOLATILE (gnat_raise_decls[i]) = 1;
514 TREE_SIDE_EFFECTS (gnat_raise_decls[i]) = 1;
515 TREE_TYPE (gnat_raise_decls[i])
516 = build_qualified_type (TREE_TYPE (gnat_raise_decls[i]),
520 /* Set the types that GCC and Gigi use from the front end. */
522 = gnat_to_gnu_entity (Base_Type (standard_exception_type), NULL_TREE, 0);
523 except_type_node = TREE_TYPE (exception_type);
525 /* Make other functions used for exception processing. */
527 = create_subprog_decl
528 (get_identifier ("system__soft_links__get_gnat_exception"),
530 build_function_type (build_pointer_type (except_type_node), NULL_TREE),
531 NULL_TREE, false, true, true, NULL, Empty);
532 /* Avoid creating superfluous edges to __builtin_setjmp receivers. */
533 DECL_PURE_P (get_excptr_decl) = 1;
536 = create_subprog_decl
537 (get_identifier ("__gnat_raise_nodefer_with_msg"), NULL_TREE,
538 build_function_type (void_type_node,
539 tree_cons (NULL_TREE,
540 build_pointer_type (except_type_node),
542 NULL_TREE, false, true, true, NULL, Empty);
544 /* Indicate that these never return. */
545 TREE_THIS_VOLATILE (raise_nodefer_decl) = 1;
546 TREE_SIDE_EFFECTS (raise_nodefer_decl) = 1;
547 TREE_TYPE (raise_nodefer_decl)
548 = build_qualified_type (TREE_TYPE (raise_nodefer_decl),
551 /* Build the special descriptor type and its null node if needed. */
552 if (TARGET_VTABLE_USES_DESCRIPTORS)
554 tree null_node = fold_convert (ptr_void_ftype, null_pointer_node);
555 tree field_list = NULL_TREE, null_list = NULL_TREE;
558 fdesc_type_node = make_node (RECORD_TYPE);
560 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; j++)
562 tree field = create_field_decl (NULL_TREE, ptr_void_ftype,
563 fdesc_type_node, 0, 0, 0, 1);
564 TREE_CHAIN (field) = field_list;
566 null_list = tree_cons (field, null_node, null_list);
569 finish_record_type (fdesc_type_node, nreverse (field_list), 0, false);
570 record_builtin_type ("descriptor", fdesc_type_node);
571 null_fdesc_node = gnat_build_constructor (fdesc_type_node, null_list);
575 = gnat_to_gnu_entity (Base_Type (standard_long_long_float), NULL_TREE, 0);
577 if (TREE_CODE (TREE_TYPE (long_long_float_type)) == INTEGER_TYPE)
579 /* In this case, the builtin floating point types are VAX float,
580 so make up a type for use. */
581 longest_float_type_node = make_node (REAL_TYPE);
582 TYPE_PRECISION (longest_float_type_node) = LONG_DOUBLE_TYPE_SIZE;
583 layout_type (longest_float_type_node);
584 record_builtin_type ("longest float type", longest_float_type_node);
587 longest_float_type_node = TREE_TYPE (long_long_float_type);
589 /* Dummy objects to materialize "others" and "all others" in the exception
590 tables. These are exported by a-exexpr.adb, so see this unit for the
593 = create_var_decl (get_identifier ("OTHERS"),
594 get_identifier ("__gnat_others_value"),
595 integer_type_node, 0, 1, 0, 1, 1, 0, Empty);
598 = create_var_decl (get_identifier ("ALL_OTHERS"),
599 get_identifier ("__gnat_all_others_value"),
600 integer_type_node, 0, 1, 0, 1, 1, 0, Empty);
602 main_identifier_node = get_identifier ("main");
604 /* Install the builtins we might need, either internally or as
605 user available facilities for Intrinsic imports. */
606 gnat_install_builtins ();
608 gnu_except_ptr_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
609 gnu_constraint_error_label_stack
610 = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
611 gnu_storage_error_label_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
612 gnu_program_error_label_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
614 /* Process any Pragma Ident for the main unit. */
615 #ifdef ASM_OUTPUT_IDENT
616 if (Present (Ident_String (Main_Unit)))
619 TREE_STRING_POINTER (gnat_to_gnu (Ident_String (Main_Unit))));
622 /* If we are using the GCC exception mechanism, let GCC know. */
623 if (Exception_Mechanism == Back_End_Exceptions)
626 /* Now translate the compilation unit proper. */
627 Compilation_Unit_to_gnu (gnat_root);
629 /* Finally see if we have any elaboration procedures to deal with. */
630 for (info = elab_info_list; info; info = info->next)
632 tree gnu_body = DECL_SAVED_TREE (info->elab_proc), gnu_stmts;
634 /* Unshare SAVE_EXPRs between subprograms. These are not unshared by
635 the gimplifier for obvious reasons, but it turns out that we need to
636 unshare them for the global level because of SAVE_EXPRs made around
637 checks for global objects and around allocators for global objects
638 of variable size, in order to prevent node sharing in the underlying
639 expression. Note that this implicitly assumes that the SAVE_EXPR
640 nodes themselves are not shared between subprograms, which would be
641 an upstream bug for which we would not change the outcome. */
642 walk_tree_without_duplicates (&gnu_body, unshare_save_expr, NULL);
644 /* We should have a BIND_EXPR but it may not have any statements in it.
645 If it doesn't have any, we have nothing to do except for setting the
646 flag on the GNAT node. Otherwise, process the function as others. */
647 gnu_stmts = gnu_body;
648 if (TREE_CODE (gnu_stmts) == BIND_EXPR)
649 gnu_stmts = BIND_EXPR_BODY (gnu_stmts);
650 if (!gnu_stmts || !STATEMENT_LIST_HEAD (gnu_stmts))
651 Set_Has_No_Elaboration_Code (info->gnat_node, 1);
654 begin_subprog_body (info->elab_proc);
655 end_subprog_body (gnu_body);
659 /* We cannot track the location of errors past this point. */
660 error_gnat_node = Empty;
663 /* Return a positive value if an lvalue is required for GNAT_NODE, which is
664 an N_Attribute_Reference. */
667 lvalue_required_for_attribute_p (Node_Id gnat_node)
669 switch (Get_Attribute_Id (Attribute_Name (gnat_node)))
677 case Attr_Range_Length:
679 case Attr_Object_Size:
680 case Attr_Value_Size:
681 case Attr_Component_Size:
682 case Attr_Max_Size_In_Storage_Elements:
685 case Attr_Null_Parameter:
686 case Attr_Passed_By_Reference:
687 case Attr_Mechanism_Code:
692 case Attr_Unchecked_Access:
693 case Attr_Unrestricted_Access:
694 case Attr_Code_Address:
695 case Attr_Pool_Address:
698 case Attr_Bit_Position:
708 /* Return a positive value if an lvalue is required for GNAT_NODE. GNU_TYPE
709 is the type that will be used for GNAT_NODE in the translated GNU tree.
710 CONSTANT indicates whether the underlying object represented by GNAT_NODE
711 is constant in the Ada sense. If it is, ADDRESS_OF_CONSTANT indicates
712 whether its value is the address of a constant and ALIASED whether it is
713 aliased. If it isn't, ADDRESS_OF_CONSTANT and ALIASED are ignored.
715 The function climbs up the GNAT tree starting from the node and returns 1
716 upon encountering a node that effectively requires an lvalue downstream.
717 It returns int instead of bool to facilitate usage in non-purely binary
721 lvalue_required_p (Node_Id gnat_node, tree gnu_type, bool constant,
722 bool address_of_constant, bool aliased)
724 Node_Id gnat_parent = Parent (gnat_node), gnat_temp;
726 switch (Nkind (gnat_parent))
731 case N_Attribute_Reference:
732 return lvalue_required_for_attribute_p (gnat_parent);
734 case N_Parameter_Association:
735 case N_Function_Call:
736 case N_Procedure_Call_Statement:
737 /* If the parameter is by reference, an lvalue is required. */
739 || must_pass_by_ref (gnu_type)
740 || default_pass_by_ref (gnu_type));
742 case N_Indexed_Component:
743 /* Only the array expression can require an lvalue. */
744 if (Prefix (gnat_parent) != gnat_node)
747 /* ??? Consider that referencing an indexed component with a
748 non-constant index forces the whole aggregate to memory.
749 Note that N_Integer_Literal is conservative, any static
750 expression in the RM sense could probably be accepted. */
751 for (gnat_temp = First (Expressions (gnat_parent));
753 gnat_temp = Next (gnat_temp))
754 if (Nkind (gnat_temp) != N_Integer_Literal)
757 /* ... fall through ... */
760 /* Only the array expression can require an lvalue. */
761 if (Prefix (gnat_parent) != gnat_node)
764 aliased |= Has_Aliased_Components (Etype (gnat_node));
765 return lvalue_required_p (gnat_parent, gnu_type, constant,
766 address_of_constant, aliased);
768 case N_Selected_Component:
769 aliased |= Is_Aliased (Entity (Selector_Name (gnat_parent)));
770 return lvalue_required_p (gnat_parent, gnu_type, constant,
771 address_of_constant, aliased);
773 case N_Object_Renaming_Declaration:
774 /* We need to make a real renaming only if the constant object is
775 aliased or if we may use a renaming pointer; otherwise we can
776 optimize and return the rvalue. We make an exception if the object
777 is an identifier since in this case the rvalue can be propagated
778 attached to the CONST_DECL. */
781 /* This should match the constant case of the renaming code. */
783 (Underlying_Type (Etype (Name (gnat_parent))))
784 || Nkind (Name (gnat_parent)) == N_Identifier);
786 case N_Object_Declaration:
787 /* We cannot use a constructor if this is an atomic object because
788 the actual assignment might end up being done component-wise. */
790 ||(Is_Composite_Type (Underlying_Type (Etype (gnat_node)))
791 && Is_Atomic (Defining_Entity (gnat_parent)))
792 /* We don't use a constructor if this is a class-wide object
793 because the effective type of the object is the equivalent
794 type of the class-wide subtype and it smashes most of the
795 data into an array of bytes to which we cannot convert. */
796 || Ekind ((Etype (Defining_Entity (gnat_parent))))
797 == E_Class_Wide_Subtype);
799 case N_Assignment_Statement:
800 /* We cannot use a constructor if the LHS is an atomic object because
801 the actual assignment might end up being done component-wise. */
803 || Name (gnat_parent) == gnat_node
804 || (Is_Composite_Type (Underlying_Type (Etype (gnat_node)))
805 && Is_Atomic (Entity (Name (gnat_parent)))));
807 case N_Type_Conversion:
808 case N_Qualified_Expression:
809 /* We must look through all conversions for composite types because we
810 may need to bypass an intermediate conversion to a narrower record
811 type that is generated for a formal conversion, e.g. the conversion
812 to the root type of a hierarchy of tagged types generated for the
813 formal conversion to the class-wide type. */
814 if (!Is_Composite_Type (Underlying_Type (Etype (gnat_node))))
817 /* ... fall through ... */
819 case N_Unchecked_Type_Conversion:
821 || lvalue_required_p (gnat_parent,
822 get_unpadded_type (Etype (gnat_parent)),
823 constant, address_of_constant, aliased));
826 /* We should only reach here through the N_Qualified_Expression case
827 and, therefore, only for composite types. Force an lvalue since
828 a block-copy to the newly allocated area of memory is made. */
831 case N_Explicit_Dereference:
832 /* We look through dereferences for address of constant because we need
833 to handle the special cases listed above. */
834 if (constant && address_of_constant)
835 return lvalue_required_p (gnat_parent,
836 get_unpadded_type (Etype (gnat_parent)),
839 /* ... fall through ... */
848 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Identifier,
849 to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer
850 to where we should place the result type. */
853 Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
855 Node_Id gnat_temp, gnat_temp_type;
856 tree gnu_result, gnu_result_type;
858 /* Whether we should require an lvalue for GNAT_NODE. Needed in
859 specific circumstances only, so evaluated lazily. < 0 means
860 unknown, > 0 means known true, 0 means known false. */
861 int require_lvalue = -1;
863 /* If GNAT_NODE is a constant, whether we should use the initialization
864 value instead of the constant entity, typically for scalars with an
865 address clause when the parent doesn't require an lvalue. */
866 bool use_constant_initializer = false;
868 /* If the Etype of this node does not equal the Etype of the Entity,
869 something is wrong with the entity map, probably in generic
870 instantiation. However, this does not apply to types. Since we sometime
871 have strange Ekind's, just do this test for objects. Also, if the Etype of
872 the Entity is private, the Etype of the N_Identifier is allowed to be the
873 full type and also we consider a packed array type to be the same as the
874 original type. Similarly, a class-wide type is equivalent to a subtype of
875 itself. Finally, if the types are Itypes, one may be a copy of the other,
876 which is also legal. */
877 gnat_temp = (Nkind (gnat_node) == N_Defining_Identifier
878 ? gnat_node : Entity (gnat_node));
879 gnat_temp_type = Etype (gnat_temp);
881 gcc_assert (Etype (gnat_node) == gnat_temp_type
882 || (Is_Packed (gnat_temp_type)
883 && Etype (gnat_node) == Packed_Array_Type (gnat_temp_type))
884 || (Is_Class_Wide_Type (Etype (gnat_node)))
885 || (IN (Ekind (gnat_temp_type), Private_Kind)
886 && Present (Full_View (gnat_temp_type))
887 && ((Etype (gnat_node) == Full_View (gnat_temp_type))
888 || (Is_Packed (Full_View (gnat_temp_type))
889 && (Etype (gnat_node)
890 == Packed_Array_Type (Full_View
891 (gnat_temp_type))))))
892 || (Is_Itype (Etype (gnat_node)) && Is_Itype (gnat_temp_type))
893 || !(Ekind (gnat_temp) == E_Variable
894 || Ekind (gnat_temp) == E_Component
895 || Ekind (gnat_temp) == E_Constant
896 || Ekind (gnat_temp) == E_Loop_Parameter
897 || IN (Ekind (gnat_temp), Formal_Kind)));
899 /* If this is a reference to a deferred constant whose partial view is an
900 unconstrained private type, the proper type is on the full view of the
901 constant, not on the full view of the type, which may be unconstrained.
903 This may be a reference to a type, for example in the prefix of the
904 attribute Position, generated for dispatching code (see Make_DT in
905 exp_disp,adb). In that case we need the type itself, not is parent,
906 in particular if it is a derived type */
907 if (Is_Private_Type (gnat_temp_type)
908 && Has_Unknown_Discriminants (gnat_temp_type)
909 && Ekind (gnat_temp) == E_Constant
910 && Present (Full_View (gnat_temp)))
912 gnat_temp = Full_View (gnat_temp);
913 gnat_temp_type = Etype (gnat_temp);
917 /* We want to use the Actual_Subtype if it has already been elaborated,
918 otherwise the Etype. Avoid using Actual_Subtype for packed arrays to
920 if ((Ekind (gnat_temp) == E_Constant
921 || Ekind (gnat_temp) == E_Variable || Is_Formal (gnat_temp))
922 && !(Is_Array_Type (Etype (gnat_temp))
923 && Present (Packed_Array_Type (Etype (gnat_temp))))
924 && Present (Actual_Subtype (gnat_temp))
925 && present_gnu_tree (Actual_Subtype (gnat_temp)))
926 gnat_temp_type = Actual_Subtype (gnat_temp);
928 gnat_temp_type = Etype (gnat_node);
931 /* Expand the type of this identifier first, in case it is an enumeral
932 literal, which only get made when the type is expanded. There is no
933 order-of-elaboration issue here. */
934 gnu_result_type = get_unpadded_type (gnat_temp_type);
936 /* If this is a non-imported scalar constant with an address clause,
937 retrieve the value instead of a pointer to be dereferenced unless
938 an lvalue is required. This is generally more efficient and actually
939 required if this is a static expression because it might be used
940 in a context where a dereference is inappropriate, such as a case
941 statement alternative or a record discriminant. There is no possible
942 volatile-ness short-circuit here since Volatile constants must bei
944 if (Ekind (gnat_temp) == E_Constant
945 && Is_Scalar_Type (gnat_temp_type)
946 && !Is_Imported (gnat_temp)
947 && Present (Address_Clause (gnat_temp)))
949 require_lvalue = lvalue_required_p (gnat_node, gnu_result_type, true,
950 false, Is_Aliased (gnat_temp));
951 use_constant_initializer = !require_lvalue;
954 if (use_constant_initializer)
956 /* If this is a deferred constant, the initializer is attached to
958 if (Present (Full_View (gnat_temp)))
959 gnat_temp = Full_View (gnat_temp);
961 gnu_result = gnat_to_gnu (Expression (Declaration_Node (gnat_temp)));
964 gnu_result = gnat_to_gnu_entity (gnat_temp, NULL_TREE, 0);
966 /* If we are in an exception handler, force this variable into memory to
967 ensure optimization does not remove stores that appear redundant but are
968 actually needed in case an exception occurs.
970 ??? Note that we need not do this if the variable is declared within the
971 handler, only if it is referenced in the handler and declared in an
972 enclosing block, but we have no way of testing that right now.
974 ??? We used to essentially set the TREE_ADDRESSABLE flag on the variable
975 here, but it can now be removed by the Tree aliasing machinery if the
976 address of the variable is never taken. All we can do is to make the
977 variable volatile, which might incur the generation of temporaries just
978 to access the memory in some circumstances. This can be avoided for
979 variables of non-constant size because they are automatically allocated
980 to memory. There might be no way of allocating a proper temporary for
981 them in any case. We only do this for SJLJ though. */
982 if (TREE_VALUE (gnu_except_ptr_stack)
983 && TREE_CODE (gnu_result) == VAR_DECL
984 && TREE_CODE (DECL_SIZE_UNIT (gnu_result)) == INTEGER_CST)
985 TREE_THIS_VOLATILE (gnu_result) = TREE_SIDE_EFFECTS (gnu_result) = 1;
987 /* Some objects (such as parameters passed by reference, globals of
988 variable size, and renamed objects) actually represent the address
989 of the object. In that case, we must do the dereference. Likewise,
990 deal with parameters to foreign convention subprograms. */
991 if (DECL_P (gnu_result)
992 && (DECL_BY_REF_P (gnu_result)
993 || (TREE_CODE (gnu_result) == PARM_DECL
994 && DECL_BY_COMPONENT_PTR_P (gnu_result))))
996 const bool read_only = DECL_POINTS_TO_READONLY_P (gnu_result);
999 if (TREE_CODE (gnu_result) == PARM_DECL
1000 && DECL_BY_COMPONENT_PTR_P (gnu_result))
1002 = build_unary_op (INDIRECT_REF, NULL_TREE,
1003 convert (build_pointer_type (gnu_result_type),
1006 /* If it's a renaming pointer and we are at the right binding level,
1007 we can reference the renamed object directly, since the renamed
1008 expression has been protected against multiple evaluations. */
1009 else if (TREE_CODE (gnu_result) == VAR_DECL
1010 && (renamed_obj = DECL_RENAMED_OBJECT (gnu_result))
1011 && (!DECL_RENAMING_GLOBAL_P (gnu_result)
1012 || global_bindings_p ()))
1013 gnu_result = renamed_obj;
1015 /* Return the underlying CST for a CONST_DECL like a few lines below,
1016 after dereferencing in this case. */
1017 else if (TREE_CODE (gnu_result) == CONST_DECL)
1018 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE,
1019 DECL_INITIAL (gnu_result));
1022 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
1025 TREE_READONLY (gnu_result) = 1;
1028 /* The GNAT tree has the type of a function as the type of its result. Also
1029 use the type of the result if the Etype is a subtype which is nominally
1030 unconstrained. But remove any padding from the resulting type. */
1031 if (TREE_CODE (TREE_TYPE (gnu_result)) == FUNCTION_TYPE
1032 || Is_Constr_Subt_For_UN_Aliased (gnat_temp_type))
1034 gnu_result_type = TREE_TYPE (gnu_result);
1035 if (TYPE_IS_PADDING_P (gnu_result_type))
1036 gnu_result_type = TREE_TYPE (TYPE_FIELDS (gnu_result_type));
1039 /* If we have a constant declaration and its initializer, try to return the
1040 latter to avoid the need to call fold in lots of places and the need for
1041 elaboration code if this identifier is used as an initializer itself. */
1042 if (TREE_CONSTANT (gnu_result)
1043 && DECL_P (gnu_result)
1044 && DECL_INITIAL (gnu_result))
1046 bool constant_only = (TREE_CODE (gnu_result) == CONST_DECL
1047 && !DECL_CONST_CORRESPONDING_VAR (gnu_result));
1048 bool address_of_constant = (TREE_CODE (gnu_result) == CONST_DECL
1049 && DECL_CONST_ADDRESS_P (gnu_result));
1051 /* If there is a (corresponding) variable or this is the address of a
1052 constant, we only want to return the initializer if an lvalue isn't
1053 required. Evaluate this now if we have not already done so. */
1054 if ((!constant_only || address_of_constant) && require_lvalue < 0)
1056 = lvalue_required_p (gnat_node, gnu_result_type, true,
1057 address_of_constant, Is_Aliased (gnat_temp));
1059 /* ??? We need to unshare the initializer if the object is external
1060 as such objects are not marked for unsharing if we are not at the
1061 global level. This should be fixed in add_decl_expr. */
1062 if ((constant_only && !address_of_constant) || !require_lvalue)
1063 gnu_result = unshare_expr (DECL_INITIAL (gnu_result));
1066 *gnu_result_type_p = gnu_result_type;
1071 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Pragma. Return
1072 any statements we generate. */
1075 Pragma_to_gnu (Node_Id gnat_node)
1078 tree gnu_result = alloc_stmt_list ();
1080 /* Check for (and ignore) unrecognized pragma and do nothing if we are just
1081 annotating types. */
1082 if (type_annotate_only
1083 || !Is_Pragma_Name (Chars (Pragma_Identifier (gnat_node))))
1086 switch (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_node))))
1088 case Pragma_Inspection_Point:
1089 /* Do nothing at top level: all such variables are already viewable. */
1090 if (global_bindings_p ())
1093 for (gnat_temp = First (Pragma_Argument_Associations (gnat_node));
1094 Present (gnat_temp);
1095 gnat_temp = Next (gnat_temp))
1097 Node_Id gnat_expr = Expression (gnat_temp);
1098 tree gnu_expr = gnat_to_gnu (gnat_expr);
1100 enum machine_mode mode;
1101 tree asm_constraint = NULL_TREE;
1102 #ifdef ASM_COMMENT_START
1106 if (TREE_CODE (gnu_expr) == UNCONSTRAINED_ARRAY_REF)
1107 gnu_expr = TREE_OPERAND (gnu_expr, 0);
1109 /* Use the value only if it fits into a normal register,
1110 otherwise use the address. */
1111 mode = TYPE_MODE (TREE_TYPE (gnu_expr));
1112 use_address = ((GET_MODE_CLASS (mode) != MODE_INT
1113 && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1114 || GET_MODE_SIZE (mode) > UNITS_PER_WORD);
1117 gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
1119 #ifdef ASM_COMMENT_START
1120 comment = concat (ASM_COMMENT_START,
1121 " inspection point: ",
1122 Get_Name_String (Chars (gnat_expr)),
1123 use_address ? " address" : "",
1126 asm_constraint = build_string (strlen (comment), comment);
1129 gnu_expr = build5 (ASM_EXPR, void_type_node,
1133 (build_tree_list (NULL_TREE,
1134 build_string (1, "g")),
1135 gnu_expr, NULL_TREE),
1136 NULL_TREE, NULL_TREE);
1137 ASM_VOLATILE_P (gnu_expr) = 1;
1138 set_expr_location_from_node (gnu_expr, gnat_node);
1139 append_to_statement_list (gnu_expr, &gnu_result);
1143 case Pragma_Optimize:
1144 switch (Chars (Expression
1145 (First (Pragma_Argument_Associations (gnat_node)))))
1147 case Name_Time: case Name_Space:
1149 post_error ("insufficient -O value?", gnat_node);
1154 post_error ("must specify -O0?", gnat_node);
1162 case Pragma_Reviewable:
1163 if (write_symbols == NO_DEBUG)
1164 post_error ("must specify -g?", gnat_node);
1171 /* Subroutine of gnat_to_gnu to translate GNAT_NODE, an N_Attribute node,
1172 to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer to
1173 where we should place the result type. ATTRIBUTE is the attribute ID. */
1176 Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
1178 tree gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
1179 tree gnu_type = TREE_TYPE (gnu_prefix);
1180 tree gnu_expr, gnu_result_type, gnu_result = error_mark_node;
1181 bool prefix_unused = false;
1183 /* If the input is a NULL_EXPR, make a new one. */
1184 if (TREE_CODE (gnu_prefix) == NULL_EXPR)
1186 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1187 *gnu_result_type_p = gnu_result_type;
1188 return build1 (NULL_EXPR, gnu_result_type, TREE_OPERAND (gnu_prefix, 0));
1195 /* These are just conversions since representation clauses for
1196 enumeration types are handled in the front-end. */
1198 bool checkp = Do_Range_Check (First (Expressions (gnat_node)));
1199 gnu_result = gnat_to_gnu (First (Expressions (gnat_node)));
1200 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1201 gnu_result = convert_with_check (Etype (gnat_node), gnu_result,
1202 checkp, checkp, true, gnat_node);
1208 /* These just add or subtract the constant 1 since representation
1209 clauses for enumeration types are handled in the front-end. */
1210 gnu_expr = gnat_to_gnu (First (Expressions (gnat_node)));
1211 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1213 if (Do_Range_Check (First (Expressions (gnat_node))))
1215 gnu_expr = gnat_protect_expr (gnu_expr);
1218 (build_binary_op (EQ_EXPR, boolean_type_node,
1220 attribute == Attr_Pred
1221 ? TYPE_MIN_VALUE (gnu_result_type)
1222 : TYPE_MAX_VALUE (gnu_result_type)),
1223 gnu_expr, CE_Range_Check_Failed, gnat_node);
1227 = build_binary_op (attribute == Attr_Pred ? MINUS_EXPR : PLUS_EXPR,
1228 gnu_result_type, gnu_expr,
1229 convert (gnu_result_type, integer_one_node));
1233 case Attr_Unrestricted_Access:
1234 /* Conversions don't change addresses but can cause us to miss the
1235 COMPONENT_REF case below, so strip them off. */
1236 gnu_prefix = remove_conversions (gnu_prefix,
1237 !Must_Be_Byte_Aligned (gnat_node));
1239 /* If we are taking 'Address of an unconstrained object, this is the
1240 pointer to the underlying array. */
1241 if (attribute == Attr_Address)
1242 gnu_prefix = maybe_unconstrained_array (gnu_prefix);
1244 /* If we are building a static dispatch table, we have to honor
1245 TARGET_VTABLE_USES_DESCRIPTORS if we want to be compatible
1246 with the C++ ABI. We do it in the non-static case as well,
1247 see gnat_to_gnu_entity, case E_Access_Subprogram_Type. */
1248 else if (TARGET_VTABLE_USES_DESCRIPTORS
1249 && Is_Dispatch_Table_Entity (Etype (gnat_node)))
1251 tree gnu_field, gnu_list = NULL_TREE, t;
1252 /* Descriptors can only be built here for top-level functions. */
1253 bool build_descriptor = (global_bindings_p () != 0);
1256 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1258 /* If we're not going to build the descriptor, we have to retrieve
1259 the one which will be built by the linker (or by the compiler
1260 later if a static chain is requested). */
1261 if (!build_descriptor)
1263 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_prefix);
1264 gnu_result = fold_convert (build_pointer_type (gnu_result_type),
1266 gnu_result = build1 (INDIRECT_REF, gnu_result_type, gnu_result);
1269 for (gnu_field = TYPE_FIELDS (gnu_result_type), i = 0;
1270 i < TARGET_VTABLE_USES_DESCRIPTORS;
1271 gnu_field = TREE_CHAIN (gnu_field), i++)
1273 if (build_descriptor)
1275 t = build2 (FDESC_EXPR, TREE_TYPE (gnu_field), gnu_prefix,
1276 build_int_cst (NULL_TREE, i));
1277 TREE_CONSTANT (t) = 1;
1280 t = build3 (COMPONENT_REF, ptr_void_ftype, gnu_result,
1281 gnu_field, NULL_TREE);
1283 gnu_list = tree_cons (gnu_field, t, gnu_list);
1286 gnu_result = gnat_build_constructor (gnu_result_type, gnu_list);
1290 /* ... fall through ... */
1293 case Attr_Unchecked_Access:
1294 case Attr_Code_Address:
1295 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1297 = build_unary_op (((attribute == Attr_Address
1298 || attribute == Attr_Unrestricted_Access)
1299 && !Must_Be_Byte_Aligned (gnat_node))
1300 ? ATTR_ADDR_EXPR : ADDR_EXPR,
1301 gnu_result_type, gnu_prefix);
1303 /* For 'Code_Address, find an inner ADDR_EXPR and mark it so that we
1304 don't try to build a trampoline. */
1305 if (attribute == Attr_Code_Address)
1307 for (gnu_expr = gnu_result;
1308 CONVERT_EXPR_P (gnu_expr);
1309 gnu_expr = TREE_OPERAND (gnu_expr, 0))
1310 TREE_CONSTANT (gnu_expr) = 1;
1312 if (TREE_CODE (gnu_expr) == ADDR_EXPR)
1313 TREE_NO_TRAMPOLINE (gnu_expr) = TREE_CONSTANT (gnu_expr) = 1;
1316 /* For other address attributes applied to a nested function,
1317 find an inner ADDR_EXPR and annotate it so that we can issue
1318 a useful warning with -Wtrampolines. */
1319 else if (TREE_CODE (TREE_TYPE (gnu_prefix)) == FUNCTION_TYPE)
1321 for (gnu_expr = gnu_result;
1322 CONVERT_EXPR_P (gnu_expr);
1323 gnu_expr = TREE_OPERAND (gnu_expr, 0))
1326 if (TREE_CODE (gnu_expr) == ADDR_EXPR
1327 && decl_function_context (TREE_OPERAND (gnu_expr, 0)))
1329 set_expr_location_from_node (gnu_expr, gnat_node);
1331 /* Check that we're not violating the No_Implicit_Dynamic_Code
1332 restriction. Be conservative if we don't know anything
1333 about the trampoline strategy for the target. */
1334 Check_Implicit_Dynamic_Code_Allowed (gnat_node);
1339 case Attr_Pool_Address:
1342 tree gnu_ptr = gnu_prefix;
1344 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1346 /* If this is an unconstrained array, we know the object has been
1347 allocated with the template in front of the object. So compute
1348 the template address. */
1349 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
1351 = convert (build_pointer_type
1352 (TYPE_OBJECT_RECORD_TYPE
1353 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
1356 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
1357 if (TREE_CODE (gnu_obj_type) == RECORD_TYPE
1358 && TYPE_CONTAINS_TEMPLATE_P (gnu_obj_type))
1360 tree gnu_char_ptr_type
1361 = build_pointer_type (unsigned_char_type_node);
1362 tree gnu_pos = byte_position (TYPE_FIELDS (gnu_obj_type));
1363 gnu_ptr = convert (gnu_char_ptr_type, gnu_ptr);
1364 gnu_ptr = build_binary_op (POINTER_PLUS_EXPR, gnu_char_ptr_type,
1368 gnu_result = convert (gnu_result_type, gnu_ptr);
1373 case Attr_Object_Size:
1374 case Attr_Value_Size:
1375 case Attr_Max_Size_In_Storage_Elements:
1376 gnu_expr = gnu_prefix;
1378 /* Remove NOPs and conversions between original and packable version
1379 from GNU_EXPR, and conversions from GNU_PREFIX. We use GNU_EXPR
1380 to see if a COMPONENT_REF was involved. */
1381 while (TREE_CODE (gnu_expr) == NOP_EXPR
1382 || (TREE_CODE (gnu_expr) == VIEW_CONVERT_EXPR
1383 && TREE_CODE (TREE_TYPE (gnu_expr)) == RECORD_TYPE
1384 && TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))
1386 && TYPE_NAME (TREE_TYPE (gnu_expr))
1387 == TYPE_NAME (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))))
1388 gnu_expr = TREE_OPERAND (gnu_expr, 0);
1390 gnu_prefix = remove_conversions (gnu_prefix, true);
1391 prefix_unused = true;
1392 gnu_type = TREE_TYPE (gnu_prefix);
1394 /* Replace an unconstrained array type with the type of the underlying
1395 array. We can't do this with a call to maybe_unconstrained_array
1396 since we may have a TYPE_DECL. For 'Max_Size_In_Storage_Elements,
1397 use the record type that will be used to allocate the object and its
1399 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1401 gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type);
1402 if (attribute != Attr_Max_Size_In_Storage_Elements)
1403 gnu_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
1406 /* If we're looking for the size of a field, return the field size.
1407 Otherwise, if the prefix is an object, or if we're looking for
1408 'Object_Size or 'Max_Size_In_Storage_Elements, the result is the
1409 GCC size of the type. Otherwise, it is the RM size of the type. */
1410 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1411 gnu_result = DECL_SIZE (TREE_OPERAND (gnu_prefix, 1));
1412 else if (TREE_CODE (gnu_prefix) != TYPE_DECL
1413 || attribute == Attr_Object_Size
1414 || attribute == Attr_Max_Size_In_Storage_Elements)
1416 /* If the prefix is an object of a padded type, the GCC size isn't
1417 relevant to the programmer. Normally what we want is the RM size,
1418 which was set from the specified size, but if it was not set, we
1419 want the size of the field. Using the MAX of those two produces
1420 the right result in all cases. Don't use the size of the field
1421 if it's self-referential, since that's never what's wanted. */
1422 if (TREE_CODE (gnu_prefix) != TYPE_DECL
1423 && TYPE_IS_PADDING_P (gnu_type)
1424 && TREE_CODE (gnu_expr) == COMPONENT_REF)
1426 gnu_result = rm_size (gnu_type);
1427 if (!CONTAINS_PLACEHOLDER_P
1428 (DECL_SIZE (TREE_OPERAND (gnu_expr, 1))))
1430 = size_binop (MAX_EXPR, gnu_result,
1431 DECL_SIZE (TREE_OPERAND (gnu_expr, 1)));
1433 else if (Nkind (Prefix (gnat_node)) == N_Explicit_Dereference)
1435 Node_Id gnat_deref = Prefix (gnat_node);
1436 Node_Id gnat_actual_subtype
1437 = Actual_Designated_Subtype (gnat_deref);
1439 = TREE_TYPE (gnat_to_gnu (Prefix (gnat_deref)));
1441 if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type)
1442 && Present (gnat_actual_subtype))
1444 tree gnu_actual_obj_type
1445 = gnat_to_gnu_type (gnat_actual_subtype);
1447 = build_unc_object_type_from_ptr (gnu_ptr_type,
1448 gnu_actual_obj_type,
1449 get_identifier ("SIZE"));
1452 gnu_result = TYPE_SIZE (gnu_type);
1455 gnu_result = TYPE_SIZE (gnu_type);
1458 gnu_result = rm_size (gnu_type);
1460 /* Deal with a self-referential size by returning the maximum size for
1461 a type and by qualifying the size with the object otherwise. */
1462 if (CONTAINS_PLACEHOLDER_P (gnu_result))
1464 if (TREE_CODE (gnu_prefix) == TYPE_DECL)
1465 gnu_result = max_size (gnu_result, true);
1467 gnu_result = substitute_placeholder_in_expr (gnu_result, gnu_expr);
1470 /* If the type contains a template, subtract its size. */
1471 if (TREE_CODE (gnu_type) == RECORD_TYPE
1472 && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
1473 gnu_result = size_binop (MINUS_EXPR, gnu_result,
1474 DECL_SIZE (TYPE_FIELDS (gnu_type)));
1476 /* For 'Max_Size_In_Storage_Elements, adjust the unit. */
1477 if (attribute == Attr_Max_Size_In_Storage_Elements)
1478 gnu_result = size_binop (CEIL_DIV_EXPR, gnu_result, bitsize_unit_node);
1480 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1483 case Attr_Alignment:
1487 if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1488 && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0))))
1489 gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1491 gnu_type = TREE_TYPE (gnu_prefix);
1492 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1493 prefix_unused = true;
1495 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1496 align = DECL_ALIGN (TREE_OPERAND (gnu_prefix, 1)) / BITS_PER_UNIT;
1499 Node_Id gnat_prefix = Prefix (gnat_node);
1500 Entity_Id gnat_type = Etype (gnat_prefix);
1501 unsigned int double_align;
1502 bool is_capped_double, align_clause;
1504 /* If the default alignment of "double" or larger scalar types is
1505 specifically capped and there is an alignment clause neither
1506 on the type nor on the prefix itself, return the cap. */
1507 if ((double_align = double_float_alignment) > 0)
1509 = is_double_float_or_array (gnat_type, &align_clause);
1510 else if ((double_align = double_scalar_alignment) > 0)
1512 = is_double_scalar_or_array (gnat_type, &align_clause);
1514 is_capped_double = align_clause = false;
1516 if (is_capped_double
1517 && Nkind (gnat_prefix) == N_Identifier
1518 && Present (Alignment_Clause (Entity (gnat_prefix))))
1519 align_clause = true;
1521 if (is_capped_double && !align_clause)
1522 align = double_align;
1524 align = TYPE_ALIGN (gnu_type) / BITS_PER_UNIT;
1527 gnu_result = size_int (align);
1533 case Attr_Range_Length:
1534 prefix_unused = true;
1536 if (INTEGRAL_TYPE_P (gnu_type) || TREE_CODE (gnu_type) == REAL_TYPE)
1538 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1540 if (attribute == Attr_First)
1541 gnu_result = TYPE_MIN_VALUE (gnu_type);
1542 else if (attribute == Attr_Last)
1543 gnu_result = TYPE_MAX_VALUE (gnu_type);
1547 (MAX_EXPR, get_base_type (gnu_result_type),
1549 (PLUS_EXPR, get_base_type (gnu_result_type),
1550 build_binary_op (MINUS_EXPR,
1551 get_base_type (gnu_result_type),
1552 convert (gnu_result_type,
1553 TYPE_MAX_VALUE (gnu_type)),
1554 convert (gnu_result_type,
1555 TYPE_MIN_VALUE (gnu_type))),
1556 convert (gnu_result_type, integer_one_node)),
1557 convert (gnu_result_type, integer_zero_node));
1562 /* ... fall through ... */
1566 int Dimension = (Present (Expressions (gnat_node))
1567 ? UI_To_Int (Intval (First (Expressions (gnat_node))))
1569 struct parm_attr_d *pa = NULL;
1570 Entity_Id gnat_param = Empty;
1572 /* Make sure any implicit dereference gets done. */
1573 gnu_prefix = maybe_implicit_deref (gnu_prefix);
1574 gnu_prefix = maybe_unconstrained_array (gnu_prefix);
1575 /* We treat unconstrained array In parameters specially. */
1576 if (Nkind (Prefix (gnat_node)) == N_Identifier
1577 && !Is_Constrained (Etype (Prefix (gnat_node)))
1578 && Ekind (Entity (Prefix (gnat_node))) == E_In_Parameter)
1579 gnat_param = Entity (Prefix (gnat_node));
1580 gnu_type = TREE_TYPE (gnu_prefix);
1581 prefix_unused = true;
1582 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1584 if (TYPE_CONVENTION_FORTRAN_P (gnu_type))
1589 for (ndim = 1, gnu_type_temp = gnu_type;
1590 TREE_CODE (TREE_TYPE (gnu_type_temp)) == ARRAY_TYPE
1591 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type_temp));
1592 ndim++, gnu_type_temp = TREE_TYPE (gnu_type_temp))
1595 Dimension = ndim + 1 - Dimension;
1598 for (i = 1; i < Dimension; i++)
1599 gnu_type = TREE_TYPE (gnu_type);
1601 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1603 /* When not optimizing, look up the slot associated with the parameter
1604 and the dimension in the cache and create a new one on failure. */
1605 if (!optimize && Present (gnat_param))
1607 for (i = 0; VEC_iterate (parm_attr, f_parm_attr_cache, i, pa); i++)
1608 if (pa->id == gnat_param && pa->dim == Dimension)
1613 pa = GGC_CNEW (struct parm_attr_d);
1614 pa->id = gnat_param;
1615 pa->dim = Dimension;
1616 VEC_safe_push (parm_attr, gc, f_parm_attr_cache, pa);
1620 /* Return the cached expression or build a new one. */
1621 if (attribute == Attr_First)
1623 if (pa && pa->first)
1625 gnu_result = pa->first;
1630 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1633 else if (attribute == Attr_Last)
1637 gnu_result = pa->last;
1642 = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1645 else /* attribute == Attr_Range_Length || attribute == Attr_Length */
1647 if (pa && pa->length)
1649 gnu_result = pa->length;
1654 /* We used to compute the length as max (hb - lb + 1, 0),
1655 which could overflow for some cases of empty arrays, e.g.
1656 when lb == index_type'first. We now compute the length as
1657 (hb >= lb) ? hb - lb + 1 : 0, which would only overflow in
1658 much rarer cases, for extremely large arrays we expect
1659 never to encounter in practice. In addition, the former
1660 computation required the use of potentially constraining
1661 signed arithmetic while the latter doesn't. Note that
1662 the comparison must be done in the original index type,
1663 to avoid any overflow during the conversion. */
1664 tree comp_type = get_base_type (gnu_result_type);
1665 tree index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type));
1666 tree lb = TYPE_MIN_VALUE (index_type);
1667 tree hb = TYPE_MAX_VALUE (index_type);
1669 = build_binary_op (PLUS_EXPR, comp_type,
1670 build_binary_op (MINUS_EXPR,
1672 convert (comp_type, hb),
1673 convert (comp_type, lb)),
1674 convert (comp_type, integer_one_node));
1676 = build_cond_expr (comp_type,
1677 build_binary_op (GE_EXPR,
1681 convert (comp_type, integer_zero_node));
1685 /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1686 handling. Note that these attributes could not have been used on
1687 an unconstrained array type. */
1688 gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1690 /* Cache the expression we have just computed. Since we want to do it
1691 at runtime, we force the use of a SAVE_EXPR and let the gimplifier
1692 create the temporary. */
1696 = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
1697 TREE_SIDE_EFFECTS (gnu_result) = 1;
1698 if (attribute == Attr_First)
1699 pa->first = gnu_result;
1700 else if (attribute == Attr_Last)
1701 pa->last = gnu_result;
1703 pa->length = gnu_result;
1706 /* Set the source location onto the predicate of the condition in the
1707 'Length case but do not do it if the expression is cached to avoid
1708 messing up the debug info. */
1709 else if ((attribute == Attr_Range_Length || attribute == Attr_Length)
1710 && TREE_CODE (gnu_result) == COND_EXPR
1711 && EXPR_P (TREE_OPERAND (gnu_result, 0)))
1712 set_expr_location_from_node (TREE_OPERAND (gnu_result, 0),
1718 case Attr_Bit_Position:
1720 case Attr_First_Bit:
1724 HOST_WIDE_INT bitsize;
1725 HOST_WIDE_INT bitpos;
1727 tree gnu_field_bitpos;
1728 tree gnu_field_offset;
1730 enum machine_mode mode;
1731 int unsignedp, volatilep;
1733 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1734 gnu_prefix = remove_conversions (gnu_prefix, true);
1735 prefix_unused = true;
1737 /* We can have 'Bit on any object, but if it isn't a COMPONENT_REF,
1738 the result is 0. Don't allow 'Bit on a bare component, though. */
1739 if (attribute == Attr_Bit
1740 && TREE_CODE (gnu_prefix) != COMPONENT_REF
1741 && TREE_CODE (gnu_prefix) != FIELD_DECL)
1743 gnu_result = integer_zero_node;
1748 gcc_assert (TREE_CODE (gnu_prefix) == COMPONENT_REF
1749 || (attribute == Attr_Bit_Position
1750 && TREE_CODE (gnu_prefix) == FIELD_DECL));
1752 get_inner_reference (gnu_prefix, &bitsize, &bitpos, &gnu_offset,
1753 &mode, &unsignedp, &volatilep, false);
1755 if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1757 gnu_field_bitpos = bit_position (TREE_OPERAND (gnu_prefix, 1));
1758 gnu_field_offset = byte_position (TREE_OPERAND (gnu_prefix, 1));
1760 for (gnu_inner = TREE_OPERAND (gnu_prefix, 0);
1761 TREE_CODE (gnu_inner) == COMPONENT_REF
1762 && DECL_INTERNAL_P (TREE_OPERAND (gnu_inner, 1));
1763 gnu_inner = TREE_OPERAND (gnu_inner, 0))
1766 = size_binop (PLUS_EXPR, gnu_field_bitpos,
1767 bit_position (TREE_OPERAND (gnu_inner, 1)));
1769 = size_binop (PLUS_EXPR, gnu_field_offset,
1770 byte_position (TREE_OPERAND (gnu_inner, 1)));
1773 else if (TREE_CODE (gnu_prefix) == FIELD_DECL)
1775 gnu_field_bitpos = bit_position (gnu_prefix);
1776 gnu_field_offset = byte_position (gnu_prefix);
1780 gnu_field_bitpos = bitsize_zero_node;
1781 gnu_field_offset = size_zero_node;
1787 gnu_result = gnu_field_offset;
1790 case Attr_First_Bit:
1792 gnu_result = size_int (bitpos % BITS_PER_UNIT);
1796 gnu_result = bitsize_int (bitpos % BITS_PER_UNIT);
1797 gnu_result = size_binop (PLUS_EXPR, gnu_result,
1798 TYPE_SIZE (TREE_TYPE (gnu_prefix)));
1799 gnu_result = size_binop (MINUS_EXPR, gnu_result,
1803 case Attr_Bit_Position:
1804 gnu_result = gnu_field_bitpos;
1808 /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1810 gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1817 tree gnu_lhs = gnat_to_gnu (First (Expressions (gnat_node)));
1818 tree gnu_rhs = gnat_to_gnu (Next (First (Expressions (gnat_node))));
1820 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1821 gnu_result = build_binary_op (attribute == Attr_Min
1822 ? MIN_EXPR : MAX_EXPR,
1823 gnu_result_type, gnu_lhs, gnu_rhs);
1827 case Attr_Passed_By_Reference:
1828 gnu_result = size_int (default_pass_by_ref (gnu_type)
1829 || must_pass_by_ref (gnu_type));
1830 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1833 case Attr_Component_Size:
1834 if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1835 && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0))))
1836 gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1838 gnu_prefix = maybe_implicit_deref (gnu_prefix);
1839 gnu_type = TREE_TYPE (gnu_prefix);
1841 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1842 gnu_type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_type))));
1844 while (TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
1845 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type)))
1846 gnu_type = TREE_TYPE (gnu_type);
1848 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1850 /* Note this size cannot be self-referential. */
1851 gnu_result = TYPE_SIZE (TREE_TYPE (gnu_type));
1852 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1853 prefix_unused = true;
1856 case Attr_Null_Parameter:
1857 /* This is just a zero cast to the pointer type for our prefix and
1859 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1861 = build_unary_op (INDIRECT_REF, NULL_TREE,
1862 convert (build_pointer_type (gnu_result_type),
1863 integer_zero_node));
1864 TREE_PRIVATE (gnu_result) = 1;
1867 case Attr_Mechanism_Code:
1870 Entity_Id gnat_obj = Entity (Prefix (gnat_node));
1872 prefix_unused = true;
1873 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1874 if (Present (Expressions (gnat_node)))
1876 int i = UI_To_Int (Intval (First (Expressions (gnat_node))));
1878 for (gnat_obj = First_Formal (gnat_obj); i > 1;
1879 i--, gnat_obj = Next_Formal (gnat_obj))
1883 code = Mechanism (gnat_obj);
1884 if (code == Default)
1885 code = ((present_gnu_tree (gnat_obj)
1886 && (DECL_BY_REF_P (get_gnu_tree (gnat_obj))
1887 || ((TREE_CODE (get_gnu_tree (gnat_obj))
1889 && (DECL_BY_COMPONENT_PTR_P
1890 (get_gnu_tree (gnat_obj))))))
1891 ? By_Reference : By_Copy);
1892 gnu_result = convert (gnu_result_type, size_int (- code));
1897 /* Say we have an unimplemented attribute. Then set the value to be
1898 returned to be a zero and hope that's something we can convert to
1899 the type of this attribute. */
1900 post_error ("unimplemented attribute", gnat_node);
1901 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1902 gnu_result = integer_zero_node;
1906 /* If this is an attribute where the prefix was unused, force a use of it if
1907 it has a side-effect. But don't do it if the prefix is just an entity
1908 name. However, if an access check is needed, we must do it. See second
1909 example in AARM 11.6(5.e). */
1910 if (prefix_unused && TREE_SIDE_EFFECTS (gnu_prefix)
1911 && !Is_Entity_Name (Prefix (gnat_node)))
1912 gnu_result = fold_build2 (COMPOUND_EXPR, TREE_TYPE (gnu_result),
1913 gnu_prefix, gnu_result);
1915 *gnu_result_type_p = gnu_result_type;
1919 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Case_Statement,
1920 to a GCC tree, which is returned. */
1923 Case_Statement_to_gnu (Node_Id gnat_node)
1929 gnu_expr = gnat_to_gnu (Expression (gnat_node));
1930 gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
1932 /* The range of values in a case statement is determined by the rules in
1933 RM 5.4(7-9). In almost all cases, this range is represented by the Etype
1934 of the expression. One exception arises in the case of a simple name that
1935 is parenthesized. This still has the Etype of the name, but since it is
1936 not a name, para 7 does not apply, and we need to go to the base type.
1937 This is the only case where parenthesization affects the dynamic
1938 semantics (i.e. the range of possible values at runtime that is covered
1939 by the others alternative.
1941 Another exception is if the subtype of the expression is non-static. In
1942 that case, we also have to use the base type. */
1943 if (Paren_Count (Expression (gnat_node)) != 0
1944 || !Is_OK_Static_Subtype (Underlying_Type
1945 (Etype (Expression (gnat_node)))))
1946 gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
1948 /* We build a SWITCH_EXPR that contains the code with interspersed
1949 CASE_LABEL_EXPRs for each label. */
1951 push_stack (&gnu_switch_label_stack, NULL_TREE,
1952 create_artificial_label (input_location));
1953 start_stmt_group ();
1954 for (gnat_when = First_Non_Pragma (Alternatives (gnat_node));
1955 Present (gnat_when);
1956 gnat_when = Next_Non_Pragma (gnat_when))
1958 bool choices_added_p = false;
1959 Node_Id gnat_choice;
1961 /* First compile all the different case choices for the current WHEN
1963 for (gnat_choice = First (Discrete_Choices (gnat_when));
1964 Present (gnat_choice); gnat_choice = Next (gnat_choice))
1966 tree gnu_low = NULL_TREE, gnu_high = NULL_TREE;
1968 switch (Nkind (gnat_choice))
1971 gnu_low = gnat_to_gnu (Low_Bound (gnat_choice));
1972 gnu_high = gnat_to_gnu (High_Bound (gnat_choice));
1975 case N_Subtype_Indication:
1976 gnu_low = gnat_to_gnu (Low_Bound (Range_Expression
1977 (Constraint (gnat_choice))));
1978 gnu_high = gnat_to_gnu (High_Bound (Range_Expression
1979 (Constraint (gnat_choice))));
1983 case N_Expanded_Name:
1984 /* This represents either a subtype range or a static value of
1985 some kind; Ekind says which. */
1986 if (IN (Ekind (Entity (gnat_choice)), Type_Kind))
1988 tree gnu_type = get_unpadded_type (Entity (gnat_choice));
1990 gnu_low = fold (TYPE_MIN_VALUE (gnu_type));
1991 gnu_high = fold (TYPE_MAX_VALUE (gnu_type));
1995 /* ... fall through ... */
1997 case N_Character_Literal:
1998 case N_Integer_Literal:
1999 gnu_low = gnat_to_gnu (gnat_choice);
2002 case N_Others_Choice:
2009 /* If the case value is a subtype that raises Constraint_Error at
2010 run-time because of a wrong bound, then gnu_low or gnu_high is
2011 not translated into an INTEGER_CST. In such a case, we need
2012 to ensure that the when statement is not added in the tree,
2013 otherwise it will crash the gimplifier. */
2014 if ((!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST)
2015 && (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST))
2017 add_stmt_with_node (build3
2018 (CASE_LABEL_EXPR, void_type_node,
2020 create_artificial_label (input_location)),
2022 choices_added_p = true;
2026 /* Push a binding level here in case variables are declared as we want
2027 them to be local to this set of statements instead of to the block
2028 containing the Case statement. */
2029 if (choices_added_p)
2031 add_stmt (build_stmt_group (Statements (gnat_when), true));
2032 add_stmt (build1 (GOTO_EXPR, void_type_node,
2033 TREE_VALUE (gnu_switch_label_stack)));
2037 /* Now emit a definition of the label all the cases branched to. */
2038 add_stmt (build1 (LABEL_EXPR, void_type_node,
2039 TREE_VALUE (gnu_switch_label_stack)));
2040 gnu_result = build3 (SWITCH_EXPR, TREE_TYPE (gnu_expr), gnu_expr,
2041 end_stmt_group (), NULL_TREE);
2042 pop_stack (&gnu_switch_label_stack);
2047 /* Return true if VAL (of type TYPE) can equal the minimum value if MAX is
2048 false, or the maximum value if MAX is true, of TYPE. */
2051 can_equal_min_or_max_val_p (tree val, tree type, bool max)
2053 tree min_or_max_val = (max ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type));
2055 if (TREE_CODE (min_or_max_val) != INTEGER_CST)
2058 if (TREE_CODE (val) == NOP_EXPR)
2060 ? TYPE_MAX_VALUE (TREE_TYPE (TREE_OPERAND (val, 0)))
2061 : TYPE_MIN_VALUE (TREE_TYPE (TREE_OPERAND (val, 0))));
2063 if (TREE_CODE (val) != INTEGER_CST)
2066 return tree_int_cst_equal (val, min_or_max_val) == 1;
2069 /* Return true if VAL (of type TYPE) can equal the minimum value of TYPE.
2070 If REVERSE is true, minimum value is taken as maximum value. */
2073 can_equal_min_val_p (tree val, tree type, bool reverse)
2075 return can_equal_min_or_max_val_p (val, type, reverse);
2078 /* Return true if VAL (of type TYPE) can equal the maximum value of TYPE.
2079 If REVERSE is true, maximum value is taken as minimum value. */
2082 can_equal_max_val_p (tree val, tree type, bool reverse)
2084 return can_equal_min_or_max_val_p (val, type, !reverse);
2087 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement,
2088 to a GCC tree, which is returned. */
2091 Loop_Statement_to_gnu (Node_Id gnat_node)
2093 const Node_Id gnat_iter_scheme = Iteration_Scheme (gnat_node);
2094 tree gnu_loop_stmt = build4 (LOOP_STMT, void_type_node, NULL_TREE,
2095 NULL_TREE, NULL_TREE, NULL_TREE);
2096 tree gnu_loop_label = create_artificial_label (input_location);
2097 tree gnu_loop_var = NULL_TREE, gnu_cond_expr = NULL_TREE;
2100 /* Set location information for statement and end label. */
2101 set_expr_location_from_node (gnu_loop_stmt, gnat_node);
2102 Sloc_to_locus (Sloc (End_Label (gnat_node)),
2103 &DECL_SOURCE_LOCATION (gnu_loop_label));
2104 LOOP_STMT_LABEL (gnu_loop_stmt) = gnu_loop_label;
2106 /* Save the end label of this LOOP_STMT in a stack so that a corresponding
2107 N_Exit_Statement can find it. */
2108 push_stack (&gnu_loop_label_stack, NULL_TREE, gnu_loop_label);
2110 /* Set the condition under which the loop must keep going.
2111 For the case "LOOP .... END LOOP;" the condition is always true. */
2112 if (No (gnat_iter_scheme))
2115 /* For the case "WHILE condition LOOP ..... END LOOP;" it's immediate. */
2116 else if (Present (Condition (gnat_iter_scheme)))
2117 LOOP_STMT_COND (gnu_loop_stmt)
2118 = gnat_to_gnu (Condition (gnat_iter_scheme));
2120 /* Otherwise we have an iteration scheme and the condition is given by the
2121 bounds of the subtype of the iteration variable. */
2124 Node_Id gnat_loop_spec = Loop_Parameter_Specification (gnat_iter_scheme);
2125 Entity_Id gnat_loop_var = Defining_Entity (gnat_loop_spec);
2126 Entity_Id gnat_type = Etype (gnat_loop_var);
2127 tree gnu_type = get_unpadded_type (gnat_type);
2128 tree gnu_low = TYPE_MIN_VALUE (gnu_type);
2129 tree gnu_high = TYPE_MAX_VALUE (gnu_type);
2130 tree gnu_base_type = get_base_type (gnu_type);
2131 tree gnu_one_node = convert (gnu_base_type, integer_one_node);
2132 tree gnu_first, gnu_last;
2133 enum tree_code update_code, test_code, shift_code;
2134 bool reverse = Reverse_Present (gnat_loop_spec), fallback = false;
2136 /* We must disable modulo reduction for the iteration variable, if any,
2137 in order for the loop comparison to be effective. */
2140 gnu_first = gnu_high;
2142 update_code = MINUS_NOMOD_EXPR;
2143 test_code = GE_EXPR;
2144 shift_code = PLUS_NOMOD_EXPR;
2148 gnu_first = gnu_low;
2149 gnu_last = gnu_high;
2150 update_code = PLUS_NOMOD_EXPR;
2151 test_code = LE_EXPR;
2152 shift_code = MINUS_NOMOD_EXPR;
2155 /* We use two different strategies to translate the loop, depending on
2156 whether optimization is enabled.
2158 If it is, we try to generate the canonical form of loop expected by
2159 the loop optimizer, which is the do-while form:
2168 This makes it possible to bypass loop header copying and to turn the
2169 BOTTOM_COND into an inequality test. This should catch (almost) all
2170 loops with constant starting point. If we cannot, we try to generate
2171 the default form, which is:
2179 It will be rotated during loop header copying and an entry test added
2180 to yield the do-while form. This should catch (almost) all loops with
2181 constant ending point. If we cannot, we generate the fallback form:
2190 which works in all cases but for which loop header copying will copy
2191 the BOTTOM_COND, thus adding a third conditional branch.
2193 If optimization is disabled, loop header copying doesn't come into
2194 play and we try to generate the loop forms with the less conditional
2195 branches directly. First, the default form, it should catch (almost)
2196 all loops with constant ending point. Then, if we cannot, we try to
2197 generate the shifted form:
2205 which should catch loops with constant starting point. Otherwise, if
2206 we cannot, we generate the fallback form. */
2210 /* We can use the do-while form if GNU_FIRST-1 doesn't overflow. */
2211 if (!can_equal_min_val_p (gnu_first, gnu_base_type, reverse))
2213 gnu_first = build_binary_op (shift_code, gnu_base_type,
2214 gnu_first, gnu_one_node);
2215 LOOP_STMT_TOP_UPDATE_P (gnu_loop_stmt) = 1;
2216 LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt) = 1;
2219 /* Otherwise, we can use the default form if GNU_LAST+1 doesn't. */
2220 else if (!can_equal_max_val_p (gnu_last, gnu_base_type, reverse))
2223 /* Otherwise, use the fallback form. */
2229 /* We can use the default form if GNU_LAST+1 doesn't overflow. */
2230 if (!can_equal_max_val_p (gnu_last, gnu_base_type, reverse))
2233 /* Otherwise, we can use the shifted form if neither GNU_FIRST-1 nor
2235 else if (!can_equal_min_val_p (gnu_first, gnu_base_type, reverse)
2236 && !can_equal_min_val_p (gnu_last, gnu_base_type, reverse))
2238 gnu_first = build_binary_op (shift_code, gnu_base_type,
2239 gnu_first, gnu_one_node);
2240 gnu_last = build_binary_op (shift_code, gnu_base_type,
2241 gnu_last, gnu_one_node);
2242 LOOP_STMT_TOP_UPDATE_P (gnu_loop_stmt) = 1;
2245 /* Otherwise, use the fallback form. */
2251 LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt) = 1;
2253 /* If we use the BOTTOM_COND, we can turn the test into an inequality
2254 test but we have to add an ENTRY_COND to protect the empty loop. */
2255 if (LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt))
2257 test_code = NE_EXPR;
2259 = build3 (COND_EXPR, void_type_node,
2260 build_binary_op (LE_EXPR, boolean_type_node,
2262 NULL_TREE, alloc_stmt_list ());
2263 set_expr_location_from_node (gnu_cond_expr, gnat_loop_spec);
2266 /* Open a new nesting level that will surround the loop to declare the
2267 iteration variable. */
2268 start_stmt_group ();
2271 /* Declare the iteration variable and set it to its initial value. */
2272 gnu_loop_var = gnat_to_gnu_entity (gnat_loop_var, gnu_first, 1);
2273 if (DECL_BY_REF_P (gnu_loop_var))
2274 gnu_loop_var = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_loop_var);
2276 /* Do all the arithmetics in the base type. */
2277 gnu_loop_var = convert (gnu_base_type, gnu_loop_var);
2279 /* Set either the top or bottom exit condition. */
2280 LOOP_STMT_COND (gnu_loop_stmt)
2281 = build_binary_op (test_code, boolean_type_node, gnu_loop_var,
2284 /* Set either the top or bottom update statement and give it the source
2285 location of the iteration for better coverage info. */
2286 LOOP_STMT_UPDATE (gnu_loop_stmt)
2287 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_loop_var,
2288 build_binary_op (update_code, gnu_base_type,
2289 gnu_loop_var, gnu_one_node));
2290 set_expr_location_from_node (LOOP_STMT_UPDATE (gnu_loop_stmt),
2294 /* If the loop was named, have the name point to this loop. In this case,
2295 the association is not a DECL node, but the end label of the loop. */
2296 if (Present (Identifier (gnat_node)))
2297 save_gnu_tree (Entity (Identifier (gnat_node)), gnu_loop_label, true);
2299 /* Make the loop body into its own block, so any allocated storage will be
2300 released every iteration. This is needed for stack allocation. */
2301 LOOP_STMT_BODY (gnu_loop_stmt)
2302 = build_stmt_group (Statements (gnat_node), true);
2303 TREE_SIDE_EFFECTS (gnu_loop_stmt) = 1;
2305 /* If we declared a variable, then we are in a statement group for that
2306 declaration. Add the LOOP_STMT to it and make that the "loop". */
2309 add_stmt (gnu_loop_stmt);
2311 gnu_loop_stmt = end_stmt_group ();
2314 /* If we have an outer COND_EXPR, that's our result and this loop is its
2315 "true" statement. Otherwise, the result is the LOOP_STMT. */
2318 COND_EXPR_THEN (gnu_cond_expr) = gnu_loop_stmt;
2319 gnu_result = gnu_cond_expr;
2320 recalculate_side_effects (gnu_cond_expr);
2323 gnu_result = gnu_loop_stmt;
2325 pop_stack (&gnu_loop_label_stack);
2330 /* Emit statements to establish __gnat_handle_vms_condition as a VMS condition
2331 handler for the current function. */
2333 /* This is implemented by issuing a call to the appropriate VMS specific
2334 builtin. To avoid having VMS specific sections in the global gigi decls
2335 array, we maintain the decls of interest here. We can't declare them
2336 inside the function because we must mark them never to be GC'd, which we
2337 can only do at the global level. */
2339 static GTY(()) tree vms_builtin_establish_handler_decl = NULL_TREE;
2340 static GTY(()) tree gnat_vms_condition_handler_decl = NULL_TREE;
2343 establish_gnat_vms_condition_handler (void)
2345 tree establish_stmt;
2347 /* Elaborate the required decls on the first call. Check on the decl for
2348 the gnat condition handler to decide, as this is one we create so we are
2349 sure that it will be non null on subsequent calls. The builtin decl is
2350 looked up so remains null on targets where it is not implemented yet. */
2351 if (gnat_vms_condition_handler_decl == NULL_TREE)
2353 vms_builtin_establish_handler_decl
2355 (get_identifier ("__builtin_establish_vms_condition_handler"));
2357 gnat_vms_condition_handler_decl
2358 = create_subprog_decl (get_identifier ("__gnat_handle_vms_condition"),
2360 build_function_type_list (boolean_type_node,
2364 NULL_TREE, 0, 1, 1, 0, Empty);
2366 /* ??? DECL_CONTEXT shouldn't have been set because of DECL_EXTERNAL. */
2367 DECL_CONTEXT (gnat_vms_condition_handler_decl) = NULL_TREE;
2370 /* Do nothing if the establish builtin is not available, which might happen
2371 on targets where the facility is not implemented. */
2372 if (vms_builtin_establish_handler_decl == NULL_TREE)
2376 = build_call_1_expr (vms_builtin_establish_handler_decl,
2378 (ADDR_EXPR, NULL_TREE,
2379 gnat_vms_condition_handler_decl));
2381 add_stmt (establish_stmt);
2384 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Subprogram_Body. We
2385 don't return anything. */
2388 Subprogram_Body_to_gnu (Node_Id gnat_node)
2390 /* Defining identifier of a parameter to the subprogram. */
2391 Entity_Id gnat_param;
2392 /* The defining identifier for the subprogram body. Note that if a
2393 specification has appeared before for this body, then the identifier
2394 occurring in that specification will also be a defining identifier and all
2395 the calls to this subprogram will point to that specification. */
2396 Entity_Id gnat_subprog_id
2397 = (Present (Corresponding_Spec (gnat_node))
2398 ? Corresponding_Spec (gnat_node) : Defining_Entity (gnat_node));
2399 /* The FUNCTION_DECL node corresponding to the subprogram spec. */
2400 tree gnu_subprog_decl;
2401 /* Its RESULT_DECL node. */
2402 tree gnu_result_decl;
2403 /* The FUNCTION_TYPE node corresponding to the subprogram spec. */
2404 tree gnu_subprog_type;
2407 VEC(parm_attr,gc) *cache;
2409 /* If this is a generic object or if it has been eliminated,
2411 if (Ekind (gnat_subprog_id) == E_Generic_Procedure
2412 || Ekind (gnat_subprog_id) == E_Generic_Function
2413 || Is_Eliminated (gnat_subprog_id))
2416 /* If this subprogram acts as its own spec, define it. Otherwise, just get
2417 the already-elaborated tree node. However, if this subprogram had its
2418 elaboration deferred, we will already have made a tree node for it. So
2419 treat it as not being defined in that case. Such a subprogram cannot
2420 have an address clause or a freeze node, so this test is safe, though it
2421 does disable some otherwise-useful error checking. */
2423 = gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE,
2424 Acts_As_Spec (gnat_node)
2425 && !present_gnu_tree (gnat_subprog_id));
2426 gnu_result_decl = DECL_RESULT (gnu_subprog_decl);
2427 gnu_subprog_type = TREE_TYPE (gnu_subprog_decl);
2429 /* If the function returns by invisible reference, make it explicit in the
2430 function body. See gnat_to_gnu_entity, E_Subprogram_Type case. */
2431 if (TREE_ADDRESSABLE (gnu_subprog_type))
2433 TREE_TYPE (gnu_result_decl)
2434 = build_reference_type (TREE_TYPE (gnu_result_decl));
2435 relayout_decl (gnu_result_decl);
2438 /* Propagate the debug mode. */
2439 if (!Needs_Debug_Info (gnat_subprog_id))
2440 DECL_IGNORED_P (gnu_subprog_decl) = 1;
2442 /* Set the line number in the decl to correspond to that of the body so that
2443 the line number notes are written correctly. */
2444 Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (gnu_subprog_decl));
2446 /* Initialize the information structure for the function. */
2447 allocate_struct_function (gnu_subprog_decl, false);
2448 DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language
2449 = GGC_CNEW (struct language_function);
2452 begin_subprog_body (gnu_subprog_decl);
2454 /* If there are Out parameters, we need to ensure that the return statement
2455 properly copies them out. We do this by making a new block and converting
2456 any inner return into a goto to a label at the end of the block. */
2457 gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
2458 push_stack (&gnu_return_label_stack, NULL_TREE,
2459 gnu_cico_list ? create_artificial_label (input_location)
2462 /* Get a tree corresponding to the code for the subprogram. */
2463 start_stmt_group ();
2466 /* See if there are any parameters for which we don't yet have GCC entities.
2467 These must be for Out parameters for which we will be making VAR_DECL
2468 nodes here. Fill them in to TYPE_CI_CO_LIST, which must contain the empty
2469 entry as well. We can match up the entries because TYPE_CI_CO_LIST is in
2470 the order of the parameters. */
2471 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
2472 Present (gnat_param);
2473 gnat_param = Next_Formal_With_Extras (gnat_param))
2474 if (!present_gnu_tree (gnat_param))
2476 /* Skip any entries that have been already filled in; they must
2477 correspond to In Out parameters. */
2478 for (; gnu_cico_list && TREE_VALUE (gnu_cico_list);
2479 gnu_cico_list = TREE_CHAIN (gnu_cico_list))
2482 /* Do any needed references for padded types. */
2483 TREE_VALUE (gnu_cico_list)
2484 = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_list)),
2485 gnat_to_gnu_entity (gnat_param, NULL_TREE, 1));
2488 /* On VMS, establish our condition handler to possibly turn a condition into
2489 the corresponding exception if the subprogram has a foreign convention or
2492 To ensure proper execution of local finalizations on condition instances,
2493 we must turn a condition into the corresponding exception even if there
2494 is no applicable Ada handler, and need at least one condition handler per
2495 possible call chain involving GNAT code. OTOH, establishing the handler
2496 has a cost so we want to minimize the number of subprograms into which
2497 this happens. The foreign or exported condition is expected to satisfy
2498 all the constraints. */
2499 if (TARGET_ABI_OPEN_VMS
2500 && (Has_Foreign_Convention (gnat_subprog_id)
2501 || Is_Exported (gnat_subprog_id)))
2502 establish_gnat_vms_condition_handler ();
2504 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
2506 /* Generate the code of the subprogram itself. A return statement will be
2507 present and any Out parameters will be handled there. */
2508 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
2510 gnu_result = end_stmt_group ();
2512 /* If we populated the parameter attributes cache, we need to make sure
2513 that the cached expressions are evaluated on all possible paths. */
2514 cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
2517 struct parm_attr_d *pa;
2520 start_stmt_group ();
2522 for (i = 0; VEC_iterate (parm_attr, cache, i, pa); i++)
2525 add_stmt_with_node (pa->first, gnat_node);
2527 add_stmt_with_node (pa->last, gnat_node);
2529 add_stmt_with_node (pa->length, gnat_node);
2532 add_stmt (gnu_result);
2533 gnu_result = end_stmt_group ();
2536 /* If we are dealing with a return from an Ada procedure with parameters
2537 passed by copy-in/copy-out, we need to return a record containing the
2538 final values of these parameters. If the list contains only one entry,
2539 return just that entry though.
2541 For a full description of the copy-in/copy-out parameter mechanism, see
2542 the part of the gnat_to_gnu_entity routine dealing with the translation
2545 We need to make a block that contains the definition of that label and
2546 the copying of the return value. It first contains the function, then
2547 the label and copy statement. */
2548 if (TREE_VALUE (gnu_return_label_stack))
2552 start_stmt_group ();
2554 add_stmt (gnu_result);
2555 add_stmt (build1 (LABEL_EXPR, void_type_node,
2556 TREE_VALUE (gnu_return_label_stack)));
2558 gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
2559 if (list_length (gnu_cico_list) == 1)
2560 gnu_retval = TREE_VALUE (gnu_cico_list);
2562 gnu_retval = gnat_build_constructor (TREE_TYPE (gnu_subprog_type),
2565 add_stmt_with_node (build_return_expr (gnu_result_decl, gnu_retval),
2566 End_Label (Handled_Statement_Sequence (gnat_node)));
2568 gnu_result = end_stmt_group ();
2571 pop_stack (&gnu_return_label_stack);
2573 /* Set the end location. */
2575 ((Present (End_Label (Handled_Statement_Sequence (gnat_node)))
2576 ? Sloc (End_Label (Handled_Statement_Sequence (gnat_node)))
2577 : Sloc (gnat_node)),
2578 &DECL_STRUCT_FUNCTION (gnu_subprog_decl)->function_end_locus);
2580 end_subprog_body (gnu_result);
2582 /* Finally annotate the parameters and disconnect the trees for parameters
2583 that we have turned into variables since they are now unusable. */
2584 for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
2585 Present (gnat_param);
2586 gnat_param = Next_Formal_With_Extras (gnat_param))
2588 tree gnu_param = get_gnu_tree (gnat_param);
2589 annotate_object (gnat_param, TREE_TYPE (gnu_param), NULL_TREE,
2590 DECL_BY_REF_P (gnu_param));
2591 if (TREE_CODE (gnu_param) == VAR_DECL)
2592 save_gnu_tree (gnat_param, NULL_TREE, false);
2595 if (DECL_FUNCTION_STUB (gnu_subprog_decl))
2596 build_function_stub (gnu_subprog_decl, gnat_subprog_id);
2598 mark_out_of_scope (Defining_Unit_Name (Specification (gnat_node)));
2601 /* Subroutine of gnat_to_gnu to translate gnat_node, either an N_Function_Call
2602 or an N_Procedure_Call_Statement, to a GCC tree, which is returned.
2603 GNU_RESULT_TYPE_P is a pointer to where we should place the result type.
2604 If GNU_TARGET is non-null, this must be a function call on the RHS of a
2605 N_Assignment_Statement and the result is to be placed into that object. */
2608 call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
2610 /* The GCC node corresponding to the GNAT subprogram name. This can either
2611 be a FUNCTION_DECL node if we are dealing with a standard subprogram call,
2612 or an indirect reference expression (an INDIRECT_REF node) pointing to a
2614 tree gnu_subprog = gnat_to_gnu (Name (gnat_node));
2615 /* The FUNCTION_TYPE node giving the GCC type of the subprogram. */
2616 tree gnu_subprog_type = TREE_TYPE (gnu_subprog);
2617 tree gnu_subprog_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_subprog);
2618 Entity_Id gnat_formal;
2619 Node_Id gnat_actual;
2620 tree gnu_actual_list = NULL_TREE;
2621 tree gnu_name_list = NULL_TREE;
2622 tree gnu_before_list = NULL_TREE;
2623 tree gnu_after_list = NULL_TREE;
2625 bool went_into_elab_proc = false;
2627 gcc_assert (TREE_CODE (gnu_subprog_type) == FUNCTION_TYPE);
2629 /* If we are calling a stubbed function, raise Program_Error, but Elaborate
2630 all our args first. */
2631 if (TREE_CODE (gnu_subprog) == FUNCTION_DECL && DECL_STUBBED_P (gnu_subprog))
2633 tree call_expr = build_call_raise (PE_Stubbed_Subprogram_Called,
2634 gnat_node, N_Raise_Program_Error);
2636 for (gnat_actual = First_Actual (gnat_node);
2637 Present (gnat_actual);
2638 gnat_actual = Next_Actual (gnat_actual))
2639 add_stmt (gnat_to_gnu (gnat_actual));
2641 if (Nkind (gnat_node) == N_Function_Call && !gnu_target)
2643 *gnu_result_type_p = TREE_TYPE (gnu_subprog_type);
2644 return build1 (NULL_EXPR, TREE_TYPE (gnu_subprog_type), call_expr);
2650 /* The only way we can be making a call via an access type is if Name is an
2651 explicit dereference. In that case, get the list of formal args from the
2652 type the access type is pointing to. Otherwise, get the formals from the
2653 entity being called. */
2654 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
2655 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
2656 else if (Nkind (Name (gnat_node)) == N_Attribute_Reference)
2657 /* Assume here that this must be 'Elab_Body or 'Elab_Spec. */
2658 gnat_formal = Empty;
2660 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
2662 /* If we are translating a statement, open a new nesting level that will
2663 surround it to declare the temporaries created for the call. */
2664 if (Nkind (gnat_node) == N_Procedure_Call_Statement || gnu_target)
2666 start_stmt_group ();
2670 /* The lifetime of the temporaries created for the call ends with the call
2671 so we can give them the scope of the elaboration routine at top level. */
2672 else if (!current_function_decl)
2674 current_function_decl = TREE_VALUE (gnu_elab_proc_stack);
2675 went_into_elab_proc = true;
2678 /* Create the list of the actual parameters as GCC expects it, namely a
2679 chain of TREE_LIST nodes in which the TREE_VALUE field of each node
2680 is an expression and the TREE_PURPOSE field is null. But skip Out
2681 parameters not passed by reference and that need not be copied in. */
2682 for (gnat_actual = First_Actual (gnat_node);
2683 Present (gnat_actual);
2684 gnat_formal = Next_Formal_With_Extras (gnat_formal),
2685 gnat_actual = Next_Actual (gnat_actual))
2687 tree gnu_formal = present_gnu_tree (gnat_formal)
2688 ? get_gnu_tree (gnat_formal) : NULL_TREE;
2689 tree gnu_formal_type = gnat_to_gnu_type (Etype (gnat_formal));
2690 /* In the Out or In Out case, we must suppress conversions that yield
2691 an lvalue but can nevertheless cause the creation of a temporary,
2692 because we need the real object in this case, either to pass its
2693 address if it's passed by reference or as target of the back copy
2694 done after the call if it uses the copy-in copy-out mechanism.
2695 We do it in the In case too, except for an unchecked conversion
2696 because it alone can cause the actual to be misaligned and the
2697 addressability test is applied to the real object. */
2698 bool suppress_type_conversion
2699 = ((Nkind (gnat_actual) == N_Unchecked_Type_Conversion
2700 && Ekind (gnat_formal) != E_In_Parameter)
2701 || (Nkind (gnat_actual) == N_Type_Conversion
2702 && Is_Composite_Type (Underlying_Type (Etype (gnat_formal)))));
2703 Node_Id gnat_name = suppress_type_conversion
2704 ? Expression (gnat_actual) : gnat_actual;
2705 tree gnu_name = gnat_to_gnu (gnat_name), gnu_name_type;
2708 /* If it's possible we may need to use this expression twice, make sure
2709 that any side-effects are handled via SAVE_EXPRs; likewise if we need
2710 to force side-effects before the call.
2711 ??? This is more conservative than we need since we don't need to do
2712 this for pass-by-ref with no conversion. */
2713 if (Ekind (gnat_formal) != E_In_Parameter)
2714 gnu_name = gnat_stabilize_reference (gnu_name, true, NULL);
2716 /* If we are passing a non-addressable parameter by reference, pass the
2717 address of a copy. In the Out or In Out case, set up to copy back
2718 out after the call. */
2720 && (DECL_BY_REF_P (gnu_formal)
2721 || (TREE_CODE (gnu_formal) == PARM_DECL
2722 && (DECL_BY_COMPONENT_PTR_P (gnu_formal)
2723 || (DECL_BY_DESCRIPTOR_P (gnu_formal)))))
2724 && (gnu_name_type = gnat_to_gnu_type (Etype (gnat_name)))
2725 && !addressable_p (gnu_name, gnu_name_type))
2727 tree gnu_orig = gnu_name, gnu_temp, gnu_stmt;
2729 /* Do not issue warnings for CONSTRUCTORs since this is not a copy
2730 but sort of an instantiation for them. */
2731 if (TREE_CODE (gnu_name) == CONSTRUCTOR)
2734 /* If the type is passed by reference, a copy is not allowed. */
2735 else if (TREE_ADDRESSABLE (gnu_formal_type))
2736 post_error ("misaligned actual cannot be passed by reference",
2739 /* For users of Starlet we issue a warning because the interface
2740 apparently assumes that by-ref parameters outlive the procedure
2741 invocation. The code still will not work as intended, but we
2742 cannot do much better since low-level parts of the back-end
2743 would allocate temporaries at will because of the misalignment
2744 if we did not do so here. */
2745 else if (Is_Valued_Procedure (Entity (Name (gnat_node))))
2748 ("?possible violation of implicit assumption", gnat_actual);
2750 ("?made by pragma Import_Valued_Procedure on &", gnat_actual,
2751 Entity (Name (gnat_node)));
2752 post_error_ne ("?because of misalignment of &", gnat_actual,
2756 /* If the actual type of the object is already the nominal type,
2757 we have nothing to do, except if the size is self-referential
2758 in which case we'll remove the unpadding below. */
2759 if (TREE_TYPE (gnu_name) == gnu_name_type
2760 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_name_type)))
2763 /* Otherwise remove the unpadding from all the objects. */
2764 else if (TREE_CODE (gnu_name) == COMPONENT_REF
2765 && TYPE_IS_PADDING_P
2766 (TREE_TYPE (TREE_OPERAND (gnu_name, 0))))
2767 gnu_orig = gnu_name = TREE_OPERAND (gnu_name, 0);
2769 /* Otherwise convert to the nominal type of the object if needed.
2770 There are several cases in which we need to make the temporary
2771 using this type instead of the actual type of the object when
2772 they are distinct, because the expectations of the callee would
2773 otherwise not be met:
2774 - if it's a justified modular type,
2775 - if the actual type is a smaller form of it,
2776 - if it's a smaller form of the actual type. */
2777 else if ((TREE_CODE (gnu_name_type) == RECORD_TYPE
2778 && (TYPE_JUSTIFIED_MODULAR_P (gnu_name_type)
2779 || smaller_form_type_p (TREE_TYPE (gnu_name),
2781 || (INTEGRAL_TYPE_P (gnu_name_type)
2782 && smaller_form_type_p (gnu_name_type,
2783 TREE_TYPE (gnu_name))))
2784 gnu_name = convert (gnu_name_type, gnu_name);
2786 /* Create an explicit temporary holding the copy. This ensures that
2787 its lifetime is as narrow as possible around a statement. */
2788 gnu_temp = create_var_decl (create_tmp_var_name ("A"), NULL_TREE,
2789 TREE_TYPE (gnu_name), NULL_TREE, false,
2790 false, false, false, NULL, Empty);
2791 DECL_ARTIFICIAL (gnu_temp) = 1;
2792 DECL_IGNORED_P (gnu_temp) = 1;
2794 /* But initialize it on the fly like for an implicit temporary as
2795 we aren't necessarily dealing with a statement. */
2797 = build_binary_op (INIT_EXPR, NULL_TREE, gnu_temp, gnu_name);
2798 set_expr_location_from_node (gnu_stmt, gnat_actual);
2800 /* From now on, the real object is the temporary. */
2801 gnu_name = build2 (COMPOUND_EXPR, TREE_TYPE (gnu_name), gnu_stmt,
2804 /* Set up to move the copy back to the original if needed. */
2805 if (Ekind (gnat_formal) != E_In_Parameter)
2807 gnu_stmt = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_orig,
2809 set_expr_location_from_node (gnu_stmt, gnat_node);
2810 append_to_statement_list (gnu_stmt, &gnu_after_list);
2814 /* Start from the real object and build the actual. */
2815 gnu_actual = gnu_name;
2817 /* If this was a procedure call, we may not have removed any padding.
2818 So do it here for the part we will use as an input, if any. */
2819 if (Ekind (gnat_formal) != E_Out_Parameter
2820 && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
2822 = convert (get_unpadded_type (Etype (gnat_actual)), gnu_actual);
2824 /* Put back the conversion we suppressed above in the computation of the
2825 real object. And even if we didn't suppress any conversion there, we
2826 may have suppressed a conversion to the Etype of the actual earlier,
2827 since the parent is a procedure call, so put it back here. */
2828 if (suppress_type_conversion
2829 && Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
2831 = unchecked_convert (gnat_to_gnu_type (Etype (gnat_actual)),
2832 gnu_actual, No_Truncation (gnat_actual));
2835 = convert (gnat_to_gnu_type (Etype (gnat_actual)), gnu_actual);
2837 /* Make sure that the actual is in range of the formal's type. */
2838 if (Ekind (gnat_formal) != E_Out_Parameter
2839 && Do_Range_Check (gnat_actual))
2841 = emit_range_check (gnu_actual, Etype (gnat_formal), gnat_actual);
2843 /* Unless this is an In parameter, we must remove any justified modular
2844 building from GNU_NAME to get an lvalue. */
2845 if (Ekind (gnat_formal) != E_In_Parameter
2846 && TREE_CODE (gnu_name) == CONSTRUCTOR
2847 && TREE_CODE (TREE_TYPE (gnu_name)) == RECORD_TYPE
2848 && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (gnu_name)))
2850 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_name))), gnu_name);
2852 /* If we have not saved a GCC object for the formal, it means it is an
2853 Out parameter not passed by reference and that need not be copied in.
2854 Otherwise, first see if the parameter is passed by reference. */
2856 && TREE_CODE (gnu_formal) == PARM_DECL
2857 && DECL_BY_REF_P (gnu_formal))
2859 if (Ekind (gnat_formal) != E_In_Parameter)
2861 /* In Out or Out parameters passed by reference don't use the
2862 copy-in copy-out mechanism so the address of the real object
2863 must be passed to the function. */
2864 gnu_actual = gnu_name;
2866 /* If we have a padded type, be sure we've removed padding. */
2867 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
2868 gnu_actual = convert (get_unpadded_type (Etype (gnat_actual)),
2871 /* If we have the constructed subtype of an aliased object
2872 with an unconstrained nominal subtype, the type of the
2873 actual includes the template, although it is formally
2874 constrained. So we need to convert it back to the real
2875 constructed subtype to retrieve the constrained part
2876 and takes its address. */
2877 if (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
2878 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_actual))
2879 && Is_Constr_Subt_For_UN_Aliased (Etype (gnat_actual))
2880 && Is_Array_Type (Etype (gnat_actual)))
2881 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
2885 /* There is no need to convert the actual to the formal's type before
2886 taking its address. The only exception is for unconstrained array
2887 types because of the way we build fat pointers. */
2888 else if (TREE_CODE (gnu_formal_type) == UNCONSTRAINED_ARRAY_TYPE)
2889 gnu_actual = convert (gnu_formal_type, gnu_actual);
2891 /* The symmetry of the paths to the type of an entity is broken here
2892 since arguments don't know that they will be passed by ref. */
2893 gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal));
2894 gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
2897 && TREE_CODE (gnu_formal) == PARM_DECL
2898 && DECL_BY_COMPONENT_PTR_P (gnu_formal))
2900 gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal));
2901 gnu_actual = maybe_implicit_deref (gnu_actual);
2902 gnu_actual = maybe_unconstrained_array (gnu_actual);
2904 if (TYPE_IS_PADDING_P (gnu_formal_type))
2906 gnu_formal_type = TREE_TYPE (TYPE_FIELDS (gnu_formal_type));
2907 gnu_actual = convert (gnu_formal_type, gnu_actual);
2910 /* Take the address of the object and convert to the proper pointer
2911 type. We'd like to actually compute the address of the beginning
2912 of the array using an ADDR_EXPR of an ARRAY_REF, but there's a
2913 possibility that the ARRAY_REF might return a constant and we'd be
2914 getting the wrong address. Neither approach is exactly correct,
2915 but this is the most likely to work in all cases. */
2916 gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
2919 && TREE_CODE (gnu_formal) == PARM_DECL
2920 && DECL_BY_DESCRIPTOR_P (gnu_formal))
2922 gnu_actual = convert (gnu_formal_type, gnu_actual);
2924 /* If this is 'Null_Parameter, pass a zero descriptor. */
2925 if ((TREE_CODE (gnu_actual) == INDIRECT_REF
2926 || TREE_CODE (gnu_actual) == UNCONSTRAINED_ARRAY_REF)
2927 && TREE_PRIVATE (gnu_actual))
2929 = convert (DECL_ARG_TYPE (gnu_formal), integer_zero_node);
2931 gnu_actual = build_unary_op (ADDR_EXPR, NULL_TREE,
2932 fill_vms_descriptor (gnu_actual,
2940 if (Ekind (gnat_formal) != E_In_Parameter)
2941 gnu_name_list = tree_cons (NULL_TREE, gnu_name, gnu_name_list);
2943 if (!(gnu_formal && TREE_CODE (gnu_formal) == PARM_DECL))
2945 /* Make sure side-effects are evaluated before the call. */
2946 if (TREE_SIDE_EFFECTS (gnu_name))
2947 append_to_statement_list (gnu_name, &gnu_before_list);
2951 gnu_actual = convert (gnu_formal_type, gnu_actual);
2953 /* If this is 'Null_Parameter, pass a zero even though we are
2954 dereferencing it. */
2955 if (TREE_CODE (gnu_actual) == INDIRECT_REF
2956 && TREE_PRIVATE (gnu_actual)
2957 && (gnu_size = TYPE_SIZE (TREE_TYPE (gnu_actual)))
2958 && TREE_CODE (gnu_size) == INTEGER_CST
2959 && compare_tree_int (gnu_size, BITS_PER_WORD) <= 0)
2961 = unchecked_convert (DECL_ARG_TYPE (gnu_formal),
2962 convert (gnat_type_for_size
2963 (TREE_INT_CST_LOW (gnu_size), 1),
2967 gnu_actual = convert (DECL_ARG_TYPE (gnu_formal), gnu_actual);
2970 gnu_actual_list = tree_cons (NULL_TREE, gnu_actual, gnu_actual_list);
2973 gnu_call = build_call_list (TREE_TYPE (gnu_subprog_type), gnu_subprog_addr,
2974 nreverse (gnu_actual_list));
2975 set_expr_location_from_node (gnu_call, gnat_node);
2977 /* If it's a function call, the result is the call expression unless a target
2978 is specified, in which case we copy the result into the target and return
2979 the assignment statement. */
2980 if (Nkind (gnat_node) == N_Function_Call)
2982 tree gnu_result = gnu_call;
2984 /* If the function returns an unconstrained array or by direct reference,
2985 we have to dereference the pointer. */
2986 if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type)
2987 || TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type))
2988 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
2992 Node_Id gnat_parent = Parent (gnat_node);
2993 enum tree_code op_code;
2995 /* If range check is needed, emit code to generate it. */
2996 if (Do_Range_Check (gnat_node))
2998 = emit_range_check (gnu_result, Etype (Name (gnat_parent)),
3001 /* ??? If the return type has non-constant size, then force the
3002 return slot optimization as we would not be able to generate
3003 a temporary. That's what has been done historically. */
3004 if (TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_subprog_type))))
3005 op_code = MODIFY_EXPR;
3007 op_code = INIT_EXPR;
3010 = build_binary_op (op_code, NULL_TREE, gnu_target, gnu_result);
3011 add_stmt_with_node (gnu_result, gnat_parent);
3013 gnu_result = end_stmt_group ();
3017 if (went_into_elab_proc)
3018 current_function_decl = NULL_TREE;
3019 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
3025 /* If this is the case where the GNAT tree contains a procedure call but the
3026 Ada procedure has copy-in/copy-out parameters, then the special parameter
3027 passing mechanism must be used. */
3028 if (TYPE_CI_CO_LIST (gnu_subprog_type))
3030 /* List of FIELD_DECLs associated with the PARM_DECLs of the copy-in/
3031 copy-out parameters. */
3032 tree gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
3033 const int length = list_length (gnu_cico_list);
3037 tree gnu_temp, gnu_stmt;
3039 /* The call sequence must contain one and only one call, even though
3040 the function is pure. Save the result into a temporary. */
3041 gnu_temp = create_var_decl (create_tmp_var_name ("R"), NULL_TREE,
3042 TREE_TYPE (gnu_call), NULL_TREE, false,
3043 false, false, false, NULL, Empty);
3044 DECL_ARTIFICIAL (gnu_temp) = 1;
3045 DECL_IGNORED_P (gnu_temp) = 1;
3048 = build_binary_op (INIT_EXPR, NULL_TREE, gnu_temp, gnu_call);
3049 set_expr_location_from_node (gnu_stmt, gnat_node);
3051 /* Add the call statement to the list and start from its result. */
3052 append_to_statement_list (gnu_stmt, &gnu_before_list);
3053 gnu_call = gnu_temp;
3055 gnu_name_list = nreverse (gnu_name_list);
3058 if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
3059 gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
3061 gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
3063 for (gnat_actual = First_Actual (gnat_node);
3064 Present (gnat_actual);
3065 gnat_formal = Next_Formal_With_Extras (gnat_formal),
3066 gnat_actual = Next_Actual (gnat_actual))
3067 /* If we are dealing with a copy in copy out parameter, we must
3068 retrieve its value from the record returned in the call. */
3069 if (!(present_gnu_tree (gnat_formal)
3070 && TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
3071 && (DECL_BY_REF_P (get_gnu_tree (gnat_formal))
3072 || (TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
3073 && ((DECL_BY_COMPONENT_PTR_P (get_gnu_tree (gnat_formal))
3074 || (DECL_BY_DESCRIPTOR_P
3075 (get_gnu_tree (gnat_formal))))))))
3076 && Ekind (gnat_formal) != E_In_Parameter)
3078 /* Get the value to assign to this Out or In Out parameter. It is
3079 either the result of the function if there is only a single such
3080 parameter or the appropriate field from the record returned. */
3084 : build_component_ref (gnu_call, NULL_TREE,
3085 TREE_PURPOSE (gnu_cico_list), false);
3087 /* If the actual is a conversion, get the inner expression, which
3088 will be the real destination, and convert the result to the
3089 type of the actual parameter. */
3091 = maybe_unconstrained_array (TREE_VALUE (gnu_name_list));
3093 /* If the result is a padded type, remove the padding. */
3094 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
3096 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
3099 /* If the actual is a type conversion, the real target object is
3100 denoted by the inner Expression and we need to convert the
3101 result to the associated type.
3102 We also need to convert our gnu assignment target to this type
3103 if the corresponding GNU_NAME was constructed from the GNAT
3104 conversion node and not from the inner Expression. */
3105 if (Nkind (gnat_actual) == N_Type_Conversion)
3108 = convert_with_check
3109 (Etype (Expression (gnat_actual)), gnu_result,
3110 Do_Overflow_Check (gnat_actual),
3111 Do_Range_Check (Expression (gnat_actual)),
3112 Float_Truncate (gnat_actual), gnat_actual);
3114 if (!Is_Composite_Type (Underlying_Type (Etype (gnat_formal))))
3115 gnu_actual = convert (TREE_TYPE (gnu_result), gnu_actual);
3118 /* Unchecked conversions as actuals for Out parameters are not
3119 allowed in user code because they are not variables, but do
3120 occur in front-end expansions. The associated GNU_NAME is
3121 always obtained from the inner expression in such cases. */
3122 else if (Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
3123 gnu_result = unchecked_convert (TREE_TYPE (gnu_actual),
3125 No_Truncation (gnat_actual));
3128 if (Do_Range_Check (gnat_actual))
3130 = emit_range_check (gnu_result, Etype (gnat_actual),
3133 if (!(!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_actual)))
3134 && TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_result)))))
3135 gnu_result = convert (TREE_TYPE (gnu_actual), gnu_result);
3138 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
3139 gnu_actual, gnu_result);
3140 set_expr_location_from_node (gnu_result, gnat_node);
3141 append_to_statement_list (gnu_result, &gnu_before_list);
3142 gnu_cico_list = TREE_CHAIN (gnu_cico_list);
3143 gnu_name_list = TREE_CHAIN (gnu_name_list);
3147 append_to_statement_list (gnu_call, &gnu_before_list);
3149 append_to_statement_list (gnu_after_list, &gnu_before_list);
3151 add_stmt (gnu_before_list);
3153 return end_stmt_group ();
3156 /* Subroutine of gnat_to_gnu to translate gnat_node, an
3157 N_Handled_Sequence_Of_Statements, to a GCC tree, which is returned. */
3160 Handled_Sequence_Of_Statements_to_gnu (Node_Id gnat_node)
3162 tree gnu_jmpsave_decl = NULL_TREE;
3163 tree gnu_jmpbuf_decl = NULL_TREE;
3164 /* If just annotating, ignore all EH and cleanups. */
3165 bool gcc_zcx = (!type_annotate_only
3166 && Present (Exception_Handlers (gnat_node))
3167 && Exception_Mechanism == Back_End_Exceptions);
3169 = (!type_annotate_only && Present (Exception_Handlers (gnat_node))
3170 && Exception_Mechanism == Setjmp_Longjmp);
3171 bool at_end = !type_annotate_only && Present (At_End_Proc (gnat_node));
3172 bool binding_for_block = (at_end || gcc_zcx || setjmp_longjmp);
3173 tree gnu_inner_block; /* The statement(s) for the block itself. */
3178 /* The GCC exception handling mechanism can handle both ZCX and SJLJ schemes
3179 and we have our own SJLJ mechanism. To call the GCC mechanism, we call
3180 add_cleanup, and when we leave the binding, end_stmt_group will create
3181 the TRY_FINALLY_EXPR.
3183 ??? The region level calls down there have been specifically put in place
3184 for a ZCX context and currently the order in which things are emitted
3185 (region/handlers) is different from the SJLJ case. Instead of putting
3186 other calls with different conditions at other places for the SJLJ case,
3187 it seems cleaner to reorder things for the SJLJ case and generalize the
3188 condition to make it not ZCX specific.
3190 If there are any exceptions or cleanup processing involved, we need an
3191 outer statement group (for Setjmp_Longjmp) and binding level. */
3192 if (binding_for_block)
3194 start_stmt_group ();
3198 /* If using setjmp_longjmp, make the variables for the setjmp buffer and save
3199 area for address of previous buffer. Do this first since we need to have
3200 the setjmp buf known for any decls in this block. */
3203 gnu_jmpsave_decl = create_var_decl (get_identifier ("JMPBUF_SAVE"),
3204 NULL_TREE, jmpbuf_ptr_type,
3205 build_call_0_expr (get_jmpbuf_decl),
3206 false, false, false, false, NULL,
3208 DECL_ARTIFICIAL (gnu_jmpsave_decl) = 1;
3210 /* The __builtin_setjmp receivers will immediately reinstall it. Now
3211 because of the unstructured form of EH used by setjmp_longjmp, there
3212 might be forward edges going to __builtin_setjmp receivers on which
3213 it is uninitialized, although they will never be actually taken. */
3214 TREE_NO_WARNING (gnu_jmpsave_decl) = 1;
3215 gnu_jmpbuf_decl = create_var_decl (get_identifier ("JMP_BUF"),
3216 NULL_TREE, jmpbuf_type,
3217 NULL_TREE, false, false, false, false,
3219 DECL_ARTIFICIAL (gnu_jmpbuf_decl) = 1;
3221 set_block_jmpbuf_decl (gnu_jmpbuf_decl);
3223 /* When we exit this block, restore the saved value. */
3224 add_cleanup (build_call_1_expr (set_jmpbuf_decl, gnu_jmpsave_decl),
3225 End_Label (gnat_node));
3228 /* If we are to call a function when exiting this block, add a cleanup
3229 to the binding level we made above. Note that add_cleanup is FIFO
3230 so we must register this cleanup after the EH cleanup just above. */
3232 add_cleanup (build_call_0_expr (gnat_to_gnu (At_End_Proc (gnat_node))),
3233 End_Label (gnat_node));
3235 /* Now build the tree for the declarations and statements inside this block.
3236 If this is SJLJ, set our jmp_buf as the current buffer. */
3237 start_stmt_group ();
3240 add_stmt (build_call_1_expr (set_jmpbuf_decl,
3241 build_unary_op (ADDR_EXPR, NULL_TREE,
3244 if (Present (First_Real_Statement (gnat_node)))
3245 process_decls (Statements (gnat_node), Empty,
3246 First_Real_Statement (gnat_node), true, true);
3248 /* Generate code for each statement in the block. */
3249 for (gnat_temp = (Present (First_Real_Statement (gnat_node))
3250 ? First_Real_Statement (gnat_node)
3251 : First (Statements (gnat_node)));
3252 Present (gnat_temp); gnat_temp = Next (gnat_temp))
3253 add_stmt (gnat_to_gnu (gnat_temp));
3254 gnu_inner_block = end_stmt_group ();
3256 /* Now generate code for the two exception models, if either is relevant for
3260 tree *gnu_else_ptr = 0;
3263 /* Make a binding level for the exception handling declarations and code
3264 and set up gnu_except_ptr_stack for the handlers to use. */
3265 start_stmt_group ();
3268 push_stack (&gnu_except_ptr_stack, NULL_TREE,
3269 create_var_decl (get_identifier ("EXCEPT_PTR"),
3271 build_pointer_type (except_type_node),
3272 build_call_0_expr (get_excptr_decl), false,
3273 false, false, false, NULL, gnat_node));
3275 /* Generate code for each handler. The N_Exception_Handler case does the
3276 real work and returns a COND_EXPR for each handler, which we chain
3278 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
3279 Present (gnat_temp); gnat_temp = Next_Non_Pragma (gnat_temp))
3281 gnu_expr = gnat_to_gnu (gnat_temp);
3283 /* If this is the first one, set it as the outer one. Otherwise,
3284 point the "else" part of the previous handler to us. Then point
3285 to our "else" part. */
3287 add_stmt (gnu_expr);
3289 *gnu_else_ptr = gnu_expr;
3291 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
3294 /* If none of the exception handlers did anything, re-raise but do not
3296 gnu_expr = build_call_1_expr (raise_nodefer_decl,
3297 TREE_VALUE (gnu_except_ptr_stack));
3298 set_expr_location_from_node
3300 Present (End_Label (gnat_node)) ? End_Label (gnat_node) : gnat_node);
3303 *gnu_else_ptr = gnu_expr;
3305 add_stmt (gnu_expr);
3307 /* End the binding level dedicated to the exception handlers and get the
3308 whole statement group. */
3309 pop_stack (&gnu_except_ptr_stack);
3311 gnu_handler = end_stmt_group ();
3313 /* If the setjmp returns 1, we restore our incoming longjmp value and
3314 then check the handlers. */
3315 start_stmt_group ();
3316 add_stmt_with_node (build_call_1_expr (set_jmpbuf_decl,
3319 add_stmt (gnu_handler);
3320 gnu_handler = end_stmt_group ();
3322 /* This block is now "if (setjmp) ... <handlers> else <block>". */
3323 gnu_result = build3 (COND_EXPR, void_type_node,
3326 build_unary_op (ADDR_EXPR, NULL_TREE,
3328 gnu_handler, gnu_inner_block);
3334 /* First make a block containing the handlers. */
3335 start_stmt_group ();
3336 for (gnat_temp = First_Non_Pragma (Exception_Handlers (gnat_node));
3337 Present (gnat_temp);
3338 gnat_temp = Next_Non_Pragma (gnat_temp))
3339 add_stmt (gnat_to_gnu (gnat_temp));
3340 gnu_handlers = end_stmt_group ();
3342 /* Now make the TRY_CATCH_EXPR for the block. */
3343 gnu_result = build2 (TRY_CATCH_EXPR, void_type_node,
3344 gnu_inner_block, gnu_handlers);
3347 gnu_result = gnu_inner_block;
3349 /* Now close our outer block, if we had to make one. */
3350 if (binding_for_block)
3352 add_stmt (gnu_result);
3354 gnu_result = end_stmt_group ();
3360 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
3361 to a GCC tree, which is returned. This is the variant for Setjmp_Longjmp
3362 exception handling. */
3365 Exception_Handler_to_gnu_sjlj (Node_Id gnat_node)
3367 /* Unless this is "Others" or the special "Non-Ada" exception for Ada, make
3368 an "if" statement to select the proper exceptions. For "Others", exclude
3369 exceptions where Handled_By_Others is nonzero unless the All_Others flag
3370 is set. For "Non-ada", accept an exception if "Lang" is 'V'. */
3371 tree gnu_choice = integer_zero_node;
3372 tree gnu_body = build_stmt_group (Statements (gnat_node), false);
3375 for (gnat_temp = First (Exception_Choices (gnat_node));
3376 gnat_temp; gnat_temp = Next (gnat_temp))
3380 if (Nkind (gnat_temp) == N_Others_Choice)
3382 if (All_Others (gnat_temp))
3383 this_choice = integer_one_node;
3387 (EQ_EXPR, boolean_type_node,
3392 (INDIRECT_REF, NULL_TREE,
3393 TREE_VALUE (gnu_except_ptr_stack)),
3394 get_identifier ("not_handled_by_others"), NULL_TREE,
3399 else if (Nkind (gnat_temp) == N_Identifier
3400 || Nkind (gnat_temp) == N_Expanded_Name)
3402 Entity_Id gnat_ex_id = Entity (gnat_temp);
3405 /* Exception may be a renaming. Recover original exception which is
3406 the one elaborated and registered. */
3407 if (Present (Renamed_Object (gnat_ex_id)))
3408 gnat_ex_id = Renamed_Object (gnat_ex_id);
3410 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, 0);
3414 (EQ_EXPR, boolean_type_node, TREE_VALUE (gnu_except_ptr_stack),
3415 convert (TREE_TYPE (TREE_VALUE (gnu_except_ptr_stack)),
3416 build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr)));
3418 /* If this is the distinguished exception "Non_Ada_Error" (and we are
3419 in VMS mode), also allow a non-Ada exception (a VMS condition) t
3421 if (Is_Non_Ada_Error (Entity (gnat_temp)))
3424 = build_component_ref
3425 (build_unary_op (INDIRECT_REF, NULL_TREE,
3426 TREE_VALUE (gnu_except_ptr_stack)),
3427 get_identifier ("lang"), NULL_TREE, false);
3431 (TRUTH_ORIF_EXPR, boolean_type_node,
3432 build_binary_op (EQ_EXPR, boolean_type_node, gnu_comp,
3433 build_int_cst (TREE_TYPE (gnu_comp), 'V')),
3440 gnu_choice = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
3441 gnu_choice, this_choice);
3444 return build3 (COND_EXPR, void_type_node, gnu_choice, gnu_body, NULL_TREE);
3447 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Exception_Handler,
3448 to a GCC tree, which is returned. This is the variant for ZCX. */
3451 Exception_Handler_to_gnu_zcx (Node_Id gnat_node)
3453 tree gnu_etypes_list = NULL_TREE;
3456 tree gnu_current_exc_ptr;
3457 tree gnu_incoming_exc_ptr;
3460 /* We build a TREE_LIST of nodes representing what exception types this
3461 handler can catch, with special cases for others and all others cases.
3463 Each exception type is actually identified by a pointer to the exception
3464 id, or to a dummy object for "others" and "all others". */
3465 for (gnat_temp = First (Exception_Choices (gnat_node));
3466 gnat_temp; gnat_temp = Next (gnat_temp))
3468 if (Nkind (gnat_temp) == N_Others_Choice)
3471 = All_Others (gnat_temp) ? all_others_decl : others_decl;
3474 = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
3476 else if (Nkind (gnat_temp) == N_Identifier
3477 || Nkind (gnat_temp) == N_Expanded_Name)
3479 Entity_Id gnat_ex_id = Entity (gnat_temp);
3481 /* Exception may be a renaming. Recover original exception which is
3482 the one elaborated and registered. */
3483 if (Present (Renamed_Object (gnat_ex_id)))
3484 gnat_ex_id = Renamed_Object (gnat_ex_id);
3486 gnu_expr = gnat_to_gnu_entity (gnat_ex_id, NULL_TREE, 0);
3487 gnu_etype = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
3489 /* The Non_Ada_Error case for VMS exceptions is handled
3490 by the personality routine. */
3495 /* The GCC interface expects NULL to be passed for catch all handlers, so
3496 it would be quite tempting to set gnu_etypes_list to NULL if gnu_etype
3497 is integer_zero_node. It would not work, however, because GCC's
3498 notion of "catch all" is stronger than our notion of "others". Until
3499 we correctly use the cleanup interface as well, doing that would
3500 prevent the "all others" handlers from being seen, because nothing
3501 can be caught beyond a catch all from GCC's point of view. */
3502 gnu_etypes_list = tree_cons (NULL_TREE, gnu_etype, gnu_etypes_list);
3505 start_stmt_group ();
3508 /* Expand a call to the begin_handler hook at the beginning of the handler,
3509 and arrange for a call to the end_handler hook to occur on every possible
3512 The hooks expect a pointer to the low level occurrence. This is required
3513 for our stack management scheme because a raise inside the handler pushes
3514 a new occurrence on top of the stack, which means that this top does not
3515 necessarily match the occurrence this handler was dealing with.
3517 __builtin_eh_pointer references the exception occurrence being
3518 propagated. Upon handler entry, this is the exception for which the
3519 handler is triggered. This might not be the case upon handler exit,
3520 however, as we might have a new occurrence propagated by the handler's
3521 body, and the end_handler hook called as a cleanup in this context.
3523 We use a local variable to retrieve the incoming value at handler entry
3524 time, and reuse it to feed the end_handler hook's argument at exit. */
3527 = build_call_expr (built_in_decls [BUILT_IN_EH_POINTER],
3528 1, integer_zero_node);
3529 gnu_incoming_exc_ptr = create_var_decl (get_identifier ("EXPTR"), NULL_TREE,
3530 ptr_type_node, gnu_current_exc_ptr,
3531 false, false, false, false, NULL,
3534 add_stmt_with_node (build_call_1_expr (begin_handler_decl,
3535 gnu_incoming_exc_ptr),
3537 /* ??? We don't seem to have an End_Label at hand to set the location. */
3538 add_cleanup (build_call_1_expr (end_handler_decl, gnu_incoming_exc_ptr),
3540 add_stmt_list (Statements (gnat_node));
3543 return build2 (CATCH_EXPR, void_type_node, gnu_etypes_list,
3547 /* Subroutine of gnat_to_gnu to generate code for an N_Compilation unit. */
3550 Compilation_Unit_to_gnu (Node_Id gnat_node)
3552 const Node_Id gnat_unit = Unit (gnat_node);
3553 const bool body_p = (Nkind (gnat_unit) == N_Package_Body
3554 || Nkind (gnat_unit) == N_Subprogram_Body);
3555 const Entity_Id gnat_unit_entity = Defining_Entity (gnat_unit);
3556 /* Make the decl for the elaboration procedure. */
3557 tree gnu_elab_proc_decl
3558 = create_subprog_decl
3559 (create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
3560 NULL_TREE, void_ftype, NULL_TREE, false, true, false, NULL, gnat_unit);
3561 struct elab_info *info;
3563 push_stack (&gnu_elab_proc_stack, NULL_TREE, gnu_elab_proc_decl);
3564 DECL_ELABORATION_PROC_P (gnu_elab_proc_decl) = 1;
3566 /* Initialize the information structure for the function. */
3567 allocate_struct_function (gnu_elab_proc_decl, false);
3570 current_function_decl = NULL_TREE;
3572 start_stmt_group ();
3575 /* For a body, first process the spec if there is one. */
3576 if (Nkind (Unit (gnat_node)) == N_Package_Body
3577 || (Nkind (Unit (gnat_node)) == N_Subprogram_Body
3578 && !Acts_As_Spec (gnat_node)))
3580 add_stmt (gnat_to_gnu (Library_Unit (gnat_node)));
3581 finalize_from_with_types ();
3584 /* If we can inline, generate code for all the inlined subprograms. */
3587 Entity_Id gnat_entity;
3589 for (gnat_entity = First_Inlined_Subprogram (gnat_node);
3590 Present (gnat_entity);
3591 gnat_entity = Next_Inlined_Subprogram (gnat_entity))
3593 Node_Id gnat_body = Parent (Declaration_Node (gnat_entity));
3595 if (Nkind (gnat_body) != N_Subprogram_Body)
3597 /* ??? This really should always be present. */
3598 if (No (Corresponding_Body (gnat_body)))
3601 = Parent (Declaration_Node (Corresponding_Body (gnat_body)));
3604 if (Present (gnat_body))
3606 /* Define the entity first so we set DECL_EXTERNAL. */
3607 gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
3608 add_stmt (gnat_to_gnu (gnat_body));
3613 if (type_annotate_only && gnat_node == Cunit (Main_Unit))
3615 elaborate_all_entities (gnat_node);
3617 if (Nkind (Unit (gnat_node)) == N_Subprogram_Declaration
3618 || Nkind (Unit (gnat_node)) == N_Generic_Package_Declaration
3619 || Nkind (Unit (gnat_node)) == N_Generic_Subprogram_Declaration)
3623 process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty,
3625 add_stmt (gnat_to_gnu (Unit (gnat_node)));
3627 /* Process any pragmas and actions following the unit. */
3628 add_stmt_list (Pragmas_After (Aux_Decls_Node (gnat_node)));
3629 add_stmt_list (Actions (Aux_Decls_Node (gnat_node)));
3630 finalize_from_with_types ();
3632 /* Save away what we've made so far and record this potential elaboration
3634 info = (struct elab_info *) ggc_alloc (sizeof (struct elab_info));
3635 set_current_block_context (gnu_elab_proc_decl);
3637 DECL_SAVED_TREE (gnu_elab_proc_decl) = end_stmt_group ();
3641 &DECL_STRUCT_FUNCTION (gnu_elab_proc_decl)->function_end_locus);
3643 info->next = elab_info_list;
3644 info->elab_proc = gnu_elab_proc_decl;
3645 info->gnat_node = gnat_node;
3646 elab_info_list = info;
3648 /* Generate elaboration code for this unit, if necessary, and say whether
3650 pop_stack (&gnu_elab_proc_stack);
3652 /* Invalidate the global renaming pointers. This is necessary because
3653 stabilization of the renamed entities may create SAVE_EXPRs which
3654 have been tied to a specific elaboration routine just above. */
3655 invalidate_global_renaming_pointers ();
3658 /* Return true if GNAT_NODE, an unchecked type conversion, is a no-op as far
3659 as gigi is concerned. This is used to avoid conversions on the LHS. */
3662 unchecked_conversion_nop (Node_Id gnat_node)
3664 Entity_Id from_type, to_type;
3666 /* The conversion must be on the LHS of an assignment or an actual parameter
3667 of a call. Otherwise, even if the conversion was essentially a no-op, it
3668 could de facto ensure type consistency and this should be preserved. */
3669 if (!(Nkind (Parent (gnat_node)) == N_Assignment_Statement
3670 && Name (Parent (gnat_node)) == gnat_node)
3671 && !((Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement
3672 || Nkind (Parent (gnat_node)) == N_Function_Call)
3673 && Name (Parent (gnat_node)) != gnat_node))
3676 from_type = Etype (Expression (gnat_node));
3678 /* We're interested in artificial conversions generated by the front-end
3679 to make private types explicit, e.g. in Expand_Assign_Array. */
3680 if (!Is_Private_Type (from_type))
3683 from_type = Underlying_Type (from_type);
3684 to_type = Etype (gnat_node);
3686 /* The direct conversion to the underlying type is a no-op. */
3687 if (to_type == from_type)
3690 /* For an array subtype, the conversion to the PAT is a no-op. */
3691 if (Ekind (from_type) == E_Array_Subtype
3692 && to_type == Packed_Array_Type (from_type))
3695 /* For a record subtype, the conversion to the type is a no-op. */
3696 if (Ekind (from_type) == E_Record_Subtype
3697 && to_type == Etype (from_type))
3703 /* This function is the driver of the GNAT to GCC tree transformation process.
3704 It is the entry point of the tree transformer. GNAT_NODE is the root of
3705 some GNAT tree. Return the root of the corresponding GCC tree. If this
3706 is an expression, return the GCC equivalent of the expression. If this
3707 is a statement, return the statement or add it to the current statement
3708 group, in which case anything returned is to be interpreted as occurring
3709 after anything added. */
3712 gnat_to_gnu (Node_Id gnat_node)
3714 const Node_Kind kind = Nkind (gnat_node);
3715 bool went_into_elab_proc = false;
3716 tree gnu_result = error_mark_node; /* Default to no value. */
3717 tree gnu_result_type = void_type_node;
3718 tree gnu_expr, gnu_lhs, gnu_rhs;
3721 /* Save node number for error message and set location information. */
3722 error_gnat_node = gnat_node;
3723 Sloc_to_locus (Sloc (gnat_node), &input_location);
3725 /* If this node is a statement and we are only annotating types, return an
3726 empty statement list. */
3727 if (type_annotate_only && IN (kind, N_Statement_Other_Than_Procedure_Call))
3728 return alloc_stmt_list ();
3730 /* If this node is a non-static subexpression and we are only annotating
3731 types, make this into a NULL_EXPR. */
3732 if (type_annotate_only
3733 && IN (kind, N_Subexpr)
3734 && kind != N_Identifier
3735 && !Compile_Time_Known_Value (gnat_node))
3736 return build1 (NULL_EXPR, get_unpadded_type (Etype (gnat_node)),
3737 build_call_raise (CE_Range_Check_Failed, gnat_node,
3738 N_Raise_Constraint_Error));
3740 if ((IN (kind, N_Statement_Other_Than_Procedure_Call)
3741 && kind != N_Null_Statement)
3742 || kind == N_Procedure_Call_Statement
3744 || kind == N_Implicit_Label_Declaration
3745 || kind == N_Handled_Sequence_Of_Statements
3746 || (IN (kind, N_Raise_xxx_Error) && Ekind (Etype (gnat_node)) == E_Void))
3748 /* If this is a statement and we are at top level, it must be part of
3749 the elaboration procedure, so mark us as being in that procedure. */
3750 if (!current_function_decl)
3752 current_function_decl = TREE_VALUE (gnu_elab_proc_stack);
3753 went_into_elab_proc = true;
3756 /* If we are in the elaboration procedure, check if we are violating a
3757 No_Elaboration_Code restriction by having a statement there. Don't
3758 check for a possible No_Elaboration_Code restriction violation on
3759 N_Handled_Sequence_Of_Statements, as we want to signal an error on
3760 every nested real statement instead. This also avoids triggering
3761 spurious errors on dummy (empty) sequences created by the front-end
3762 for package bodies in some cases. */
3763 if (current_function_decl == TREE_VALUE (gnu_elab_proc_stack)
3764 && kind != N_Handled_Sequence_Of_Statements)
3765 Check_Elaboration_Code_Allowed (gnat_node);
3770 /********************************/
3771 /* Chapter 2: Lexical Elements */
3772 /********************************/
3775 case N_Expanded_Name:
3776 case N_Operator_Symbol:
3777 case N_Defining_Identifier:
3778 gnu_result = Identifier_to_gnu (gnat_node, &gnu_result_type);
3781 case N_Integer_Literal:
3785 /* Get the type of the result, looking inside any padding and
3786 justified modular types. Then get the value in that type. */
3787 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
3789 if (TREE_CODE (gnu_type) == RECORD_TYPE
3790 && TYPE_JUSTIFIED_MODULAR_P (gnu_type))
3791 gnu_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
3793 gnu_result = UI_To_gnu (Intval (gnat_node), gnu_type);
3795 /* If the result overflows (meaning it doesn't fit in its base type),
3796 abort. We would like to check that the value is within the range
3797 of the subtype, but that causes problems with subtypes whose usage
3798 will raise Constraint_Error and with biased representation, so
3800 gcc_assert (!TREE_OVERFLOW (gnu_result));
3804 case N_Character_Literal:
3805 /* If a Entity is present, it means that this was one of the
3806 literals in a user-defined character type. In that case,
3807 just return the value in the CONST_DECL. Otherwise, use the
3808 character code. In that case, the base type should be an
3809 INTEGER_TYPE, but we won't bother checking for that. */
3810 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3811 if (Present (Entity (gnat_node)))
3812 gnu_result = DECL_INITIAL (get_gnu_tree (Entity (gnat_node)));
3815 = build_int_cst_type
3816 (gnu_result_type, UI_To_CC (Char_Literal_Value (gnat_node)));
3819 case N_Real_Literal:
3820 /* If this is of a fixed-point type, the value we want is the
3821 value of the corresponding integer. */
3822 if (IN (Ekind (Underlying_Type (Etype (gnat_node))), Fixed_Point_Kind))
3824 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3825 gnu_result = UI_To_gnu (Corresponding_Integer_Value (gnat_node),
3827 gcc_assert (!TREE_OVERFLOW (gnu_result));
3830 /* We should never see a Vax_Float type literal, since the front end
3831 is supposed to transform these using appropriate conversions. */
3832 else if (Vax_Float (Underlying_Type (Etype (gnat_node))))
3837 Ureal ur_realval = Realval (gnat_node);
3839 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3841 /* If the real value is zero, so is the result. Otherwise,
3842 convert it to a machine number if it isn't already. That
3843 forces BASE to 0 or 2 and simplifies the rest of our logic. */
3844 if (UR_Is_Zero (ur_realval))
3845 gnu_result = convert (gnu_result_type, integer_zero_node);
3848 if (!Is_Machine_Number (gnat_node))
3850 = Machine (Base_Type (Underlying_Type (Etype (gnat_node))),
3851 ur_realval, Round_Even, gnat_node);
3854 = UI_To_gnu (Numerator (ur_realval), gnu_result_type);
3856 /* If we have a base of zero, divide by the denominator.
3857 Otherwise, the base must be 2 and we scale the value, which
3858 we know can fit in the mantissa of the type (hence the use
3859 of that type above). */
3860 if (No (Rbase (ur_realval)))
3862 = build_binary_op (RDIV_EXPR,
3863 get_base_type (gnu_result_type),
3865 UI_To_gnu (Denominator (ur_realval),
3869 REAL_VALUE_TYPE tmp;
3871 gcc_assert (Rbase (ur_realval) == 2);
3872 real_ldexp (&tmp, &TREE_REAL_CST (gnu_result),
3873 - UI_To_Int (Denominator (ur_realval)));
3874 gnu_result = build_real (gnu_result_type, tmp);
3878 /* Now see if we need to negate the result. Do it this way to
3879 properly handle -0. */
3880 if (UR_Is_Negative (Realval (gnat_node)))
3882 = build_unary_op (NEGATE_EXPR, get_base_type (gnu_result_type),
3888 case N_String_Literal:
3889 gnu_result_type = get_unpadded_type (Etype (gnat_node));
3890 if (TYPE_PRECISION (TREE_TYPE (gnu_result_type)) == HOST_BITS_PER_CHAR)
3892 String_Id gnat_string = Strval (gnat_node);
3893 int length = String_Length (gnat_string);
3896 if (length >= ALLOCA_THRESHOLD)
3897 string = XNEWVEC (char, length + 1);
3899 string = (char *) alloca (length + 1);
3901 /* Build the string with the characters in the literal. Note
3902 that Ada strings are 1-origin. */
3903 for (i = 0; i < length; i++)
3904 string[i] = Get_String_Char (gnat_string, i + 1);
3906 /* Put a null at the end of the string in case it's in a context
3907 where GCC will want to treat it as a C string. */
3910 gnu_result = build_string (length, string);
3912 /* Strings in GCC don't normally have types, but we want
3913 this to not be converted to the array type. */
3914 TREE_TYPE (gnu_result) = gnu_result_type;
3916 if (length >= ALLOCA_THRESHOLD)
3921 /* Build a list consisting of each character, then make
3923 String_Id gnat_string = Strval (gnat_node);
3924 int length = String_Length (gnat_string);
3926 tree gnu_list = NULL_TREE;
3927 tree gnu_idx = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
3929 for (i = 0; i < length; i++)
3932 = tree_cons (gnu_idx,
3933 build_int_cst (TREE_TYPE (gnu_result_type),
3934 Get_String_Char (gnat_string,
3938 gnu_idx = int_const_binop (PLUS_EXPR, gnu_idx, integer_one_node,
3943 = gnat_build_constructor (gnu_result_type, nreverse (gnu_list));
3948 gnu_result = Pragma_to_gnu (gnat_node);
3951 /**************************************/
3952 /* Chapter 3: Declarations and Types */
3953 /**************************************/
3955 case N_Subtype_Declaration:
3956 case N_Full_Type_Declaration:
3957 case N_Incomplete_Type_Declaration:
3958 case N_Private_Type_Declaration:
3959 case N_Private_Extension_Declaration:
3960 case N_Task_Type_Declaration:
3961 process_type (Defining_Entity (gnat_node));
3962 gnu_result = alloc_stmt_list ();
3965 case N_Object_Declaration:
3966 case N_Exception_Declaration:
3967 gnat_temp = Defining_Entity (gnat_node);
3968 gnu_result = alloc_stmt_list ();
3970 /* If we are just annotating types and this object has an unconstrained
3971 or task type, don't elaborate it. */
3972 if (type_annotate_only
3973 && (((Is_Array_Type (Etype (gnat_temp))
3974 || Is_Record_Type (Etype (gnat_temp)))
3975 && !Is_Constrained (Etype (gnat_temp)))
3976 || Is_Concurrent_Type (Etype (gnat_temp))))
3979 if (Present (Expression (gnat_node))
3980 && !(kind == N_Object_Declaration && No_Initialization (gnat_node))
3981 && (!type_annotate_only
3982 || Compile_Time_Known_Value (Expression (gnat_node))))
3984 gnu_expr = gnat_to_gnu (Expression (gnat_node));
3985 if (Do_Range_Check (Expression (gnat_node)))
3987 = emit_range_check (gnu_expr, Etype (gnat_temp), gnat_node);
3989 /* If this object has its elaboration delayed, we must force
3990 evaluation of GNU_EXPR right now and save it for when the object
3992 if (Present (Freeze_Node (gnat_temp)))
3994 if ((Is_Public (gnat_temp) || global_bindings_p ())
3995 && !TREE_CONSTANT (gnu_expr))
3997 = create_var_decl (create_concat_name (gnat_temp, "init"),
3998 NULL_TREE, TREE_TYPE (gnu_expr),
3999 gnu_expr, false, Is_Public (gnat_temp),
4000 false, false, NULL, gnat_temp);
4002 gnu_expr = gnat_save_expr (gnu_expr);
4004 save_gnu_tree (gnat_node, gnu_expr, true);
4008 gnu_expr = NULL_TREE;
4010 if (type_annotate_only && gnu_expr && TREE_CODE (gnu_expr) == ERROR_MARK)
4011 gnu_expr = NULL_TREE;
4013 /* If this is a deferred constant with an address clause, we ignore the
4014 full view since the clause is on the partial view and we cannot have
4015 2 different GCC trees for the object. The only bits of the full view
4016 we will use is the initializer, but it will be directly fetched. */
4017 if (Ekind(gnat_temp) == E_Constant
4018 && Present (Address_Clause (gnat_temp))
4019 && Present (Full_View (gnat_temp)))
4020 save_gnu_tree (Full_View (gnat_temp), error_mark_node, true);
4022 if (No (Freeze_Node (gnat_temp)))
4023 gnat_to_gnu_entity (gnat_temp, gnu_expr, 1);
4026 case N_Object_Renaming_Declaration:
4027 gnat_temp = Defining_Entity (gnat_node);
4029 /* Don't do anything if this renaming is handled by the front end or if
4030 we are just annotating types and this object has a composite or task
4031 type, don't elaborate it. We return the result in case it has any
4032 SAVE_EXPRs in it that need to be evaluated here. */
4033 if (!Is_Renaming_Of_Object (gnat_temp)
4034 && ! (type_annotate_only
4035 && (Is_Array_Type (Etype (gnat_temp))
4036 || Is_Record_Type (Etype (gnat_temp))
4037 || Is_Concurrent_Type (Etype (gnat_temp)))))
4039 = gnat_to_gnu_entity (gnat_temp,
4040 gnat_to_gnu (Renamed_Object (gnat_temp)), 1);
4042 gnu_result = alloc_stmt_list ();
4045 case N_Implicit_Label_Declaration:
4046 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
4047 gnu_result = alloc_stmt_list ();
4050 case N_Exception_Renaming_Declaration:
4051 case N_Number_Declaration:
4052 case N_Package_Renaming_Declaration:
4053 case N_Subprogram_Renaming_Declaration:
4054 /* These are fully handled in the front end. */
4055 gnu_result = alloc_stmt_list ();
4058 /*************************************/
4059 /* Chapter 4: Names and Expressions */
4060 /*************************************/
4062 case N_Explicit_Dereference:
4063 gnu_result = gnat_to_gnu (Prefix (gnat_node));
4064 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4065 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
4068 case N_Indexed_Component:
4070 tree gnu_array_object = gnat_to_gnu (Prefix (gnat_node));
4074 Node_Id *gnat_expr_array;
4076 gnu_array_object = maybe_implicit_deref (gnu_array_object);
4078 /* Convert vector inputs to their representative array type, to fit
4079 what the code below expects. */
4080 gnu_array_object = maybe_vector_array (gnu_array_object);
4082 gnu_array_object = maybe_unconstrained_array (gnu_array_object);
4084 /* If we got a padded type, remove it too. */
4085 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_array_object)))
4087 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_array_object))),
4090 gnu_result = gnu_array_object;
4092 /* First compute the number of dimensions of the array, then
4093 fill the expression array, the order depending on whether
4094 this is a Convention_Fortran array or not. */
4095 for (ndim = 1, gnu_type = TREE_TYPE (gnu_array_object);
4096 TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
4097 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type));
4098 ndim++, gnu_type = TREE_TYPE (gnu_type))
4101 gnat_expr_array = (Node_Id *) alloca (ndim * sizeof (Node_Id));
4103 if (TYPE_CONVENTION_FORTRAN_P (TREE_TYPE (gnu_array_object)))
4104 for (i = ndim - 1, gnat_temp = First (Expressions (gnat_node));
4106 i--, gnat_temp = Next (gnat_temp))
4107 gnat_expr_array[i] = gnat_temp;
4109 for (i = 0, gnat_temp = First (Expressions (gnat_node));
4111 i++, gnat_temp = Next (gnat_temp))
4112 gnat_expr_array[i] = gnat_temp;
4114 for (i = 0, gnu_type = TREE_TYPE (gnu_array_object);
4115 i < ndim; i++, gnu_type = TREE_TYPE (gnu_type))
4117 gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
4118 gnat_temp = gnat_expr_array[i];
4119 gnu_expr = gnat_to_gnu (gnat_temp);
4121 if (Do_Range_Check (gnat_temp))
4124 (gnu_array_object, gnu_expr,
4125 TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type))),
4126 TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type))),
4129 gnu_result = build_binary_op (ARRAY_REF, NULL_TREE,
4130 gnu_result, gnu_expr);
4134 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4139 Node_Id gnat_range_node = Discrete_Range (gnat_node);
4142 gnu_result = gnat_to_gnu (Prefix (gnat_node));
4143 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4145 /* Do any implicit dereferences of the prefix and do any needed
4147 gnu_result = maybe_implicit_deref (gnu_result);
4148 gnu_result = maybe_unconstrained_array (gnu_result);
4149 gnu_type = TREE_TYPE (gnu_result);
4150 if (Do_Range_Check (gnat_range_node))
4152 /* Get the bounds of the slice. */
4154 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_result_type));
4155 tree gnu_min_expr = TYPE_MIN_VALUE (gnu_index_type);
4156 tree gnu_max_expr = TYPE_MAX_VALUE (gnu_index_type);
4157 /* Get the permitted bounds. */
4158 tree gnu_base_index_type
4159 = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type));
4160 tree gnu_base_min_expr = SUBSTITUTE_PLACEHOLDER_IN_EXPR
4161 (TYPE_MIN_VALUE (gnu_base_index_type), gnu_result);
4162 tree gnu_base_max_expr = SUBSTITUTE_PLACEHOLDER_IN_EXPR
4163 (TYPE_MAX_VALUE (gnu_base_index_type), gnu_result);
4164 tree gnu_expr_l, gnu_expr_h, gnu_expr_type;
4166 gnu_min_expr = gnat_protect_expr (gnu_min_expr);
4167 gnu_max_expr = gnat_protect_expr (gnu_max_expr);
4169 /* Derive a good type to convert everything to. */
4170 gnu_expr_type = get_base_type (gnu_index_type);
4172 /* Test whether the minimum slice value is too small. */
4173 gnu_expr_l = build_binary_op (LT_EXPR, boolean_type_node,
4174 convert (gnu_expr_type,
4176 convert (gnu_expr_type,
4177 gnu_base_min_expr));
4179 /* Test whether the maximum slice value is too large. */
4180 gnu_expr_h = build_binary_op (GT_EXPR, boolean_type_node,
4181 convert (gnu_expr_type,
4183 convert (gnu_expr_type,
4184 gnu_base_max_expr));
4186 /* Build a slice index check that returns the low bound,
4187 assuming the slice is not empty. */
4188 gnu_expr = emit_check
4189 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
4190 gnu_expr_l, gnu_expr_h),
4191 gnu_min_expr, CE_Index_Check_Failed, gnat_node);
4193 /* Build a conditional expression that does the index checks and
4194 returns the low bound if the slice is not empty (max >= min),
4195 and returns the naked low bound otherwise (max < min), unless
4196 it is non-constant and the high bound is; this prevents VRP
4197 from inferring bogus ranges on the unlikely path. */
4198 gnu_expr = fold_build3 (COND_EXPR, gnu_expr_type,
4199 build_binary_op (GE_EXPR, gnu_expr_type,
4200 convert (gnu_expr_type,
4202 convert (gnu_expr_type,
4205 TREE_CODE (gnu_min_expr) != INTEGER_CST
4206 && TREE_CODE (gnu_max_expr) == INTEGER_CST
4207 ? gnu_max_expr : gnu_min_expr);
4210 /* Simply return the naked low bound. */
4211 gnu_expr = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_result_type));
4213 /* If this is a slice with non-constant size of an array with constant
4214 size, set the maximum size for the allocation of temporaries. */
4215 if (!TREE_CONSTANT (TYPE_SIZE_UNIT (gnu_result_type))
4216 && TREE_CONSTANT (TYPE_SIZE_UNIT (gnu_type)))
4217 TYPE_ARRAY_MAX_SIZE (gnu_result_type) = TYPE_SIZE_UNIT (gnu_type);
4219 gnu_result = build_binary_op (ARRAY_RANGE_REF, gnu_result_type,
4220 gnu_result, gnu_expr);
4224 case N_Selected_Component:
4226 tree gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
4227 Entity_Id gnat_field = Entity (Selector_Name (gnat_node));
4228 Entity_Id gnat_pref_type = Etype (Prefix (gnat_node));
4231 while (IN (Ekind (gnat_pref_type), Incomplete_Or_Private_Kind)
4232 || IN (Ekind (gnat_pref_type), Access_Kind))
4234 if (IN (Ekind (gnat_pref_type), Incomplete_Or_Private_Kind))
4235 gnat_pref_type = Underlying_Type (gnat_pref_type);
4236 else if (IN (Ekind (gnat_pref_type), Access_Kind))
4237 gnat_pref_type = Designated_Type (gnat_pref_type);
4240 gnu_prefix = maybe_implicit_deref (gnu_prefix);
4242 /* For discriminant references in tagged types always substitute the
4243 corresponding discriminant as the actual selected component. */
4244 if (Is_Tagged_Type (gnat_pref_type))
4245 while (Present (Corresponding_Discriminant (gnat_field)))
4246 gnat_field = Corresponding_Discriminant (gnat_field);
4248 /* For discriminant references of untagged types always substitute the
4249 corresponding stored discriminant. */
4250 else if (Present (Corresponding_Discriminant (gnat_field)))
4251 gnat_field = Original_Record_Component (gnat_field);
4253 /* Handle extracting the real or imaginary part of a complex.
4254 The real part is the first field and the imaginary the last. */
4255 if (TREE_CODE (TREE_TYPE (gnu_prefix)) == COMPLEX_TYPE)
4256 gnu_result = build_unary_op (Present (Next_Entity (gnat_field))
4257 ? REALPART_EXPR : IMAGPART_EXPR,
4258 NULL_TREE, gnu_prefix);
4261 gnu_field = gnat_to_gnu_field_decl (gnat_field);
4263 /* If there are discriminants, the prefix might be evaluated more
4264 than once, which is a problem if it has side-effects. */
4265 if (Has_Discriminants (Is_Access_Type (Etype (Prefix (gnat_node)))
4266 ? Designated_Type (Etype
4267 (Prefix (gnat_node)))
4268 : Etype (Prefix (gnat_node))))
4269 gnu_prefix = gnat_stabilize_reference (gnu_prefix, false, NULL);
4272 = build_component_ref (gnu_prefix, NULL_TREE, gnu_field,
4273 (Nkind (Parent (gnat_node))
4274 == N_Attribute_Reference)
4275 && lvalue_required_for_attribute_p
4276 (Parent (gnat_node)));
4279 gcc_assert (gnu_result);
4280 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4284 case N_Attribute_Reference:
4286 /* The attribute designator. */
4287 const int attr = Get_Attribute_Id (Attribute_Name (gnat_node));
4289 /* The Elab_Spec and Elab_Body attributes are special in that Prefix
4290 is a unit, not an object with a GCC equivalent. */
4291 if (attr == Attr_Elab_Spec || attr == Attr_Elab_Body)
4293 create_subprog_decl (create_concat_name
4294 (Entity (Prefix (gnat_node)),
4295 attr == Attr_Elab_Body ? "elabb" : "elabs"),
4296 NULL_TREE, void_ftype, NULL_TREE, false,
4297 true, true, NULL, gnat_node);
4299 gnu_result = Attribute_to_gnu (gnat_node, &gnu_result_type, attr);
4304 /* Like 'Access as far as we are concerned. */
4305 gnu_result = gnat_to_gnu (Prefix (gnat_node));
4306 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_result);
4307 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4311 case N_Extension_Aggregate:
4315 /* ??? It is wrong to evaluate the type now, but there doesn't
4316 seem to be any other practical way of doing it. */
4318 gcc_assert (!Expansion_Delayed (gnat_node));
4320 gnu_aggr_type = gnu_result_type
4321 = get_unpadded_type (Etype (gnat_node));
4323 if (TREE_CODE (gnu_result_type) == RECORD_TYPE
4324 && TYPE_CONTAINS_TEMPLATE_P (gnu_result_type))
4326 = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_result_type)));
4327 else if (TREE_CODE (gnu_result_type) == VECTOR_TYPE)
4328 gnu_aggr_type = TYPE_REPRESENTATIVE_ARRAY (gnu_result_type);
4330 if (Null_Record_Present (gnat_node))
4331 gnu_result = gnat_build_constructor (gnu_aggr_type, NULL_TREE);
4333 else if (TREE_CODE (gnu_aggr_type) == RECORD_TYPE
4334 || TREE_CODE (gnu_aggr_type) == UNION_TYPE)
4336 = assoc_to_constructor (Etype (gnat_node),
4337 First (Component_Associations (gnat_node)),
4339 else if (TREE_CODE (gnu_aggr_type) == ARRAY_TYPE)
4340 gnu_result = pos_to_constructor (First (Expressions (gnat_node)),
4342 Component_Type (Etype (gnat_node)));
4343 else if (TREE_CODE (gnu_aggr_type) == COMPLEX_TYPE)
4346 (COMPLEX_EXPR, gnu_aggr_type,
4347 gnat_to_gnu (Expression (First
4348 (Component_Associations (gnat_node)))),
4349 gnat_to_gnu (Expression
4351 (First (Component_Associations (gnat_node))))));
4355 gnu_result = convert (gnu_result_type, gnu_result);
4360 if (TARGET_VTABLE_USES_DESCRIPTORS
4361 && Ekind (Etype (gnat_node)) == E_Access_Subprogram_Type
4362 && Is_Dispatch_Table_Entity (Etype (gnat_node)))
4363 gnu_result = null_fdesc_node;
4365 gnu_result = null_pointer_node;
4366 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4369 case N_Type_Conversion:
4370 case N_Qualified_Expression:
4371 /* Get the operand expression. */
4372 gnu_result = gnat_to_gnu (Expression (gnat_node));
4373 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4376 = convert_with_check (Etype (gnat_node), gnu_result,
4377 Do_Overflow_Check (gnat_node),
4378 Do_Range_Check (Expression (gnat_node)),
4379 kind == N_Type_Conversion
4380 && Float_Truncate (gnat_node), gnat_node);
4383 case N_Unchecked_Type_Conversion:
4384 gnu_result = gnat_to_gnu (Expression (gnat_node));
4386 /* Skip further processing if the conversion is deemed a no-op. */
4387 if (unchecked_conversion_nop (gnat_node))
4389 gnu_result_type = TREE_TYPE (gnu_result);
4393 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4395 /* If the result is a pointer type, see if we are improperly
4396 converting to a stricter alignment. */
4397 if (STRICT_ALIGNMENT && POINTER_TYPE_P (gnu_result_type)
4398 && IN (Ekind (Etype (gnat_node)), Access_Kind))
4400 unsigned int align = known_alignment (gnu_result);
4401 tree gnu_obj_type = TREE_TYPE (gnu_result_type);
4402 unsigned int oalign = TYPE_ALIGN (gnu_obj_type);
4404 if (align != 0 && align < oalign && !TYPE_ALIGN_OK (gnu_obj_type))
4405 post_error_ne_tree_2
4406 ("?source alignment (^) '< alignment of & (^)",
4407 gnat_node, Designated_Type (Etype (gnat_node)),
4408 size_int (align / BITS_PER_UNIT), oalign / BITS_PER_UNIT);
4411 /* If we are converting a descriptor to a function pointer, first
4412 build the pointer. */
4413 if (TARGET_VTABLE_USES_DESCRIPTORS
4414 && TREE_TYPE (gnu_result) == fdesc_type_node
4415 && POINTER_TYPE_P (gnu_result_type))
4416 gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_result);
4418 gnu_result = unchecked_convert (gnu_result_type, gnu_result,
4419 No_Truncation (gnat_node));
4425 tree gnu_obj = gnat_to_gnu (Left_Opnd (gnat_node));
4426 Node_Id gnat_range = Right_Opnd (gnat_node);
4427 tree gnu_low, gnu_high;
4429 /* GNAT_RANGE is either an N_Range node or an identifier denoting a
4431 if (Nkind (gnat_range) == N_Range)
4433 gnu_low = gnat_to_gnu (Low_Bound (gnat_range));
4434 gnu_high = gnat_to_gnu (High_Bound (gnat_range));
4436 else if (Nkind (gnat_range) == N_Identifier
4437 || Nkind (gnat_range) == N_Expanded_Name)
4439 tree gnu_range_type = get_unpadded_type (Entity (gnat_range));
4441 gnu_low = TYPE_MIN_VALUE (gnu_range_type);
4442 gnu_high = TYPE_MAX_VALUE (gnu_range_type);
4447 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4449 /* If LOW and HIGH are identical, perform an equality test. Otherwise,
4450 ensure that GNU_OBJ is evaluated only once and perform a full range
4452 if (operand_equal_p (gnu_low, gnu_high, 0))
4454 = build_binary_op (EQ_EXPR, gnu_result_type, gnu_obj, gnu_low);
4458 gnu_obj = gnat_protect_expr (gnu_obj);
4459 t1 = build_binary_op (GE_EXPR, gnu_result_type, gnu_obj, gnu_low);
4461 set_expr_location_from_node (t1, gnat_node);
4462 t2 = build_binary_op (LE_EXPR, gnu_result_type, gnu_obj, gnu_high);
4464 set_expr_location_from_node (t2, gnat_node);
4466 = build_binary_op (TRUTH_ANDIF_EXPR, gnu_result_type, t1, t2);
4469 if (kind == N_Not_In)
4470 gnu_result = invert_truthvalue (gnu_result);
4475 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
4476 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
4477 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4478 gnu_result = build_binary_op (FLOAT_TYPE_P (gnu_result_type)
4480 : (Rounded_Result (gnat_node)
4481 ? ROUND_DIV_EXPR : TRUNC_DIV_EXPR),
4482 gnu_result_type, gnu_lhs, gnu_rhs);
4485 case N_Op_Or: case N_Op_And: case N_Op_Xor:
4486 /* These can either be operations on booleans or on modular types.
4487 Fall through for boolean types since that's the way GNU_CODES is
4489 if (IN (Ekind (Underlying_Type (Etype (gnat_node))),
4490 Modular_Integer_Kind))
4493 = (kind == N_Op_Or ? BIT_IOR_EXPR
4494 : kind == N_Op_And ? BIT_AND_EXPR
4497 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
4498 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
4499 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4500 gnu_result = build_binary_op (code, gnu_result_type,
4505 /* ... fall through ... */
4507 case N_Op_Eq: case N_Op_Ne: case N_Op_Lt:
4508 case N_Op_Le: case N_Op_Gt: case N_Op_Ge:
4509 case N_Op_Add: case N_Op_Subtract: case N_Op_Multiply:
4510 case N_Op_Mod: case N_Op_Rem:
4511 case N_Op_Rotate_Left:
4512 case N_Op_Rotate_Right:
4513 case N_Op_Shift_Left:
4514 case N_Op_Shift_Right:
4515 case N_Op_Shift_Right_Arithmetic:
4516 case N_And_Then: case N_Or_Else:
4518 enum tree_code code = gnu_codes[kind];
4519 bool ignore_lhs_overflow = false;
4520 location_t saved_location = input_location;
4523 gnu_lhs = gnat_to_gnu (Left_Opnd (gnat_node));
4524 gnu_rhs = gnat_to_gnu (Right_Opnd (gnat_node));
4525 gnu_type = gnu_result_type = get_unpadded_type (Etype (gnat_node));
4527 /* Pending generic support for efficient vector logical operations in
4528 GCC, convert vectors to their representative array type view and
4530 gnu_lhs = maybe_vector_array (gnu_lhs);
4531 gnu_rhs = maybe_vector_array (gnu_rhs);
4533 /* If this is a comparison operator, convert any references to
4534 an unconstrained array value into a reference to the
4536 if (TREE_CODE_CLASS (code) == tcc_comparison)
4538 gnu_lhs = maybe_unconstrained_array (gnu_lhs);
4539 gnu_rhs = maybe_unconstrained_array (gnu_rhs);
4542 /* If the result type is a private type, its full view may be a
4543 numeric subtype. The representation we need is that of its base
4544 type, given that it is the result of an arithmetic operation. */
4545 else if (Is_Private_Type (Etype (gnat_node)))
4546 gnu_type = gnu_result_type
4547 = get_unpadded_type (Base_Type (Full_View (Etype (gnat_node))));
4549 /* If this is a shift whose count is not guaranteed to be correct,
4550 we need to adjust the shift count. */
4551 if (IN (kind, N_Op_Shift) && !Shift_Count_OK (gnat_node))
4553 tree gnu_count_type = get_base_type (TREE_TYPE (gnu_rhs));
4555 = convert (gnu_count_type, TYPE_SIZE (gnu_type));
4557 if (kind == N_Op_Rotate_Left || kind == N_Op_Rotate_Right)
4558 gnu_rhs = build_binary_op (TRUNC_MOD_EXPR, gnu_count_type,
4559 gnu_rhs, gnu_max_shift);
4560 else if (kind == N_Op_Shift_Right_Arithmetic)
4563 (MIN_EXPR, gnu_count_type,
4564 build_binary_op (MINUS_EXPR,
4567 convert (gnu_count_type,
4572 /* For right shifts, the type says what kind of shift to do,
4573 so we may need to choose a different type. In this case,
4574 we have to ignore integer overflow lest it propagates all
4575 the way down and causes a CE to be explicitly raised. */
4576 if (kind == N_Op_Shift_Right && !TYPE_UNSIGNED (gnu_type))
4578 gnu_type = gnat_unsigned_type (gnu_type);
4579 ignore_lhs_overflow = true;
4581 else if (kind == N_Op_Shift_Right_Arithmetic
4582 && TYPE_UNSIGNED (gnu_type))
4584 gnu_type = gnat_signed_type (gnu_type);
4585 ignore_lhs_overflow = true;
4588 if (gnu_type != gnu_result_type)
4590 tree gnu_old_lhs = gnu_lhs;
4591 gnu_lhs = convert (gnu_type, gnu_lhs);
4592 if (TREE_CODE (gnu_lhs) == INTEGER_CST && ignore_lhs_overflow)
4593 TREE_OVERFLOW (gnu_lhs) = TREE_OVERFLOW (gnu_old_lhs);
4594 gnu_rhs = convert (gnu_type, gnu_rhs);
4597 /* Instead of expanding overflow checks for addition, subtraction
4598 and multiplication itself, the front end will leave this to
4599 the back end when Backend_Overflow_Checks_On_Target is set.
4600 As the GCC back end itself does not know yet how to properly
4601 do overflow checking, do it here. The goal is to push
4602 the expansions further into the back end over time. */
4603 if (Do_Overflow_Check (gnat_node) && Backend_Overflow_Checks_On_Target
4604 && (kind == N_Op_Add
4605 || kind == N_Op_Subtract
4606 || kind == N_Op_Multiply)
4607 && !TYPE_UNSIGNED (gnu_type)
4608 && !FLOAT_TYPE_P (gnu_type))
4609 gnu_result = build_binary_op_trapv (code, gnu_type,
4610 gnu_lhs, gnu_rhs, gnat_node);
4613 /* Some operations, e.g. comparisons of arrays, generate complex
4614 trees that need to be annotated while they are being built. */
4615 input_location = saved_location;
4616 gnu_result = build_binary_op (code, gnu_type, gnu_lhs, gnu_rhs);
4619 /* If this is a logical shift with the shift count not verified,
4620 we must return zero if it is too large. We cannot compensate
4621 above in this case. */
4622 if ((kind == N_Op_Shift_Left || kind == N_Op_Shift_Right)
4623 && !Shift_Count_OK (gnat_node))
4627 build_binary_op (GE_EXPR, boolean_type_node,
4629 convert (TREE_TYPE (gnu_rhs),
4630 TYPE_SIZE (gnu_type))),
4631 convert (gnu_type, integer_zero_node),
4636 case N_Conditional_Expression:
4638 tree gnu_cond = gnat_to_gnu (First (Expressions (gnat_node)));
4639 tree gnu_true = gnat_to_gnu (Next (First (Expressions (gnat_node))));
4641 = gnat_to_gnu (Next (Next (First (Expressions (gnat_node)))));
4643 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4645 = build_cond_expr (gnu_result_type, gnu_cond, gnu_true, gnu_false);
4650 gnu_result = gnat_to_gnu (Right_Opnd (gnat_node));
4651 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4655 /* This case can apply to a boolean or a modular type.
4656 Fall through for a boolean operand since GNU_CODES is set
4657 up to handle this. */
4658 if (Is_Modular_Integer_Type (Etype (gnat_node))
4659 || (Ekind (Etype (gnat_node)) == E_Private_Type
4660 && Is_Modular_Integer_Type (Full_View (Etype (gnat_node)))))
4662 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
4663 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4664 gnu_result = build_unary_op (BIT_NOT_EXPR, gnu_result_type,
4669 /* ... fall through ... */
4671 case N_Op_Minus: case N_Op_Abs:
4672 gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node));
4674 if (Ekind (Etype (gnat_node)) != E_Private_Type)
4675 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4677 gnu_result_type = get_unpadded_type (Base_Type
4678 (Full_View (Etype (gnat_node))));
4680 if (Do_Overflow_Check (gnat_node)
4681 && !TYPE_UNSIGNED (gnu_result_type)
4682 && !FLOAT_TYPE_P (gnu_result_type))
4684 = build_unary_op_trapv (gnu_codes[kind],
4685 gnu_result_type, gnu_expr, gnat_node);
4687 gnu_result = build_unary_op (gnu_codes[kind],
4688 gnu_result_type, gnu_expr);
4695 bool ignore_init_type = false;
4697 gnat_temp = Expression (gnat_node);
4699 /* The Expression operand can either be an N_Identifier or
4700 Expanded_Name, which must represent a type, or a
4701 N_Qualified_Expression, which contains both the object type and an
4702 initial value for the object. */
4703 if (Nkind (gnat_temp) == N_Identifier
4704 || Nkind (gnat_temp) == N_Expanded_Name)
4705 gnu_type = gnat_to_gnu_type (Entity (gnat_temp));
4706 else if (Nkind (gnat_temp) == N_Qualified_Expression)
4708 Entity_Id gnat_desig_type
4709 = Designated_Type (Underlying_Type (Etype (gnat_node)));
4711 ignore_init_type = Has_Constrained_Partial_View (gnat_desig_type);
4712 gnu_init = gnat_to_gnu (Expression (gnat_temp));
4714 gnu_init = maybe_unconstrained_array (gnu_init);
4715 if (Do_Range_Check (Expression (gnat_temp)))
4717 = emit_range_check (gnu_init, gnat_desig_type, gnat_temp);
4719 if (Is_Elementary_Type (gnat_desig_type)
4720 || Is_Constrained (gnat_desig_type))
4722 gnu_type = gnat_to_gnu_type (gnat_desig_type);
4723 gnu_init = convert (gnu_type, gnu_init);
4727 gnu_type = gnat_to_gnu_type (Etype (Expression (gnat_temp)));
4728 if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
4729 gnu_type = TREE_TYPE (gnu_init);
4731 gnu_init = convert (gnu_type, gnu_init);
4737 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4738 return build_allocator (gnu_type, gnu_init, gnu_result_type,
4739 Procedure_To_Call (gnat_node),
4740 Storage_Pool (gnat_node), gnat_node,
4745 /**************************/
4746 /* Chapter 5: Statements */
4747 /**************************/
4750 gnu_result = build1 (LABEL_EXPR, void_type_node,
4751 gnat_to_gnu (Identifier (gnat_node)));
4754 case N_Null_Statement:
4755 /* When not optimizing, turn null statements from source into gotos to
4756 the next statement that the middle-end knows how to preserve. */
4757 if (!optimize && Comes_From_Source (gnat_node))
4759 tree stmt, label = create_label_decl (NULL_TREE);
4760 start_stmt_group ();
4761 stmt = build1 (GOTO_EXPR, void_type_node, label);
4762 set_expr_location_from_node (stmt, gnat_node);
4764 stmt = build1 (LABEL_EXPR, void_type_node, label);
4765 set_expr_location_from_node (stmt, gnat_node);
4767 gnu_result = end_stmt_group ();
4770 gnu_result = alloc_stmt_list ();
4773 case N_Assignment_Statement:
4774 /* Get the LHS and RHS of the statement and convert any reference to an
4775 unconstrained array into a reference to the underlying array. */
4776 gnu_lhs = maybe_unconstrained_array (gnat_to_gnu (Name (gnat_node)));
4778 /* If the type has a size that overflows, convert this into raise of
4779 Storage_Error: execution shouldn't have gotten here anyway. */
4780 if (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))) == INTEGER_CST
4781 && TREE_OVERFLOW (TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs))))
4782 gnu_result = build_call_raise (SE_Object_Too_Large, gnat_node,
4783 N_Raise_Storage_Error);
4784 else if (Nkind (Expression (gnat_node)) == N_Function_Call)
4786 = call_to_gnu (Expression (gnat_node), &gnu_result_type, gnu_lhs);
4790 = maybe_unconstrained_array (gnat_to_gnu (Expression (gnat_node)));
4792 /* If range check is needed, emit code to generate it. */
4793 if (Do_Range_Check (Expression (gnat_node)))
4794 gnu_rhs = emit_range_check (gnu_rhs, Etype (Name (gnat_node)),
4798 = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_lhs, gnu_rhs);
4800 /* If the type being assigned is an array type and the two sides are
4801 not completely disjoint, play safe and use memmove. But don't do
4802 it for a bit-packed array as it might not be byte-aligned. */
4803 if (TREE_CODE (gnu_result) == MODIFY_EXPR
4804 && Is_Array_Type (Etype (Name (gnat_node)))
4805 && !Is_Bit_Packed_Array (Etype (Name (gnat_node)))
4806 && !(Forwards_OK (gnat_node) && Backwards_OK (gnat_node)))
4808 tree to, from, size, to_ptr, from_ptr, t;
4810 to = TREE_OPERAND (gnu_result, 0);
4811 from = TREE_OPERAND (gnu_result, 1);
4813 size = TYPE_SIZE_UNIT (TREE_TYPE (from));
4814 size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, from);
4816 to_ptr = build_fold_addr_expr (to);
4817 from_ptr = build_fold_addr_expr (from);
4819 t = implicit_built_in_decls[BUILT_IN_MEMMOVE];
4820 gnu_result = build_call_expr (t, 3, to_ptr, from_ptr, size);
4825 case N_If_Statement:
4827 tree *gnu_else_ptr; /* Point to put next "else if" or "else". */
4829 /* Make the outer COND_EXPR. Avoid non-determinism. */
4830 gnu_result = build3 (COND_EXPR, void_type_node,
4831 gnat_to_gnu (Condition (gnat_node)),
4832 NULL_TREE, NULL_TREE);
4833 COND_EXPR_THEN (gnu_result)
4834 = build_stmt_group (Then_Statements (gnat_node), false);
4835 TREE_SIDE_EFFECTS (gnu_result) = 1;
4836 gnu_else_ptr = &COND_EXPR_ELSE (gnu_result);
4838 /* Now make a COND_EXPR for each of the "else if" parts. Put each
4839 into the previous "else" part and point to where to put any
4840 outer "else". Also avoid non-determinism. */
4841 if (Present (Elsif_Parts (gnat_node)))
4842 for (gnat_temp = First (Elsif_Parts (gnat_node));
4843 Present (gnat_temp); gnat_temp = Next (gnat_temp))
4845 gnu_expr = build3 (COND_EXPR, void_type_node,
4846 gnat_to_gnu (Condition (gnat_temp)),
4847 NULL_TREE, NULL_TREE);
4848 COND_EXPR_THEN (gnu_expr)
4849 = build_stmt_group (Then_Statements (gnat_temp), false);
4850 TREE_SIDE_EFFECTS (gnu_expr) = 1;
4851 set_expr_location_from_node (gnu_expr, gnat_temp);
4852 *gnu_else_ptr = gnu_expr;
4853 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
4856 *gnu_else_ptr = build_stmt_group (Else_Statements (gnat_node), false);
4860 case N_Case_Statement:
4861 gnu_result = Case_Statement_to_gnu (gnat_node);
4864 case N_Loop_Statement:
4865 gnu_result = Loop_Statement_to_gnu (gnat_node);
4868 case N_Block_Statement:
4869 start_stmt_group ();
4871 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
4872 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
4874 gnu_result = end_stmt_group ();
4876 if (Present (Identifier (gnat_node)))
4877 mark_out_of_scope (Entity (Identifier (gnat_node)));
4880 case N_Exit_Statement:
4882 = build2 (EXIT_STMT, void_type_node,
4883 (Present (Condition (gnat_node))
4884 ? gnat_to_gnu (Condition (gnat_node)) : NULL_TREE),
4885 (Present (Name (gnat_node))
4886 ? get_gnu_tree (Entity (Name (gnat_node)))
4887 : TREE_VALUE (gnu_loop_label_stack)));
4890 case N_Return_Statement:
4892 tree gnu_ret_val, gnu_ret_obj;
4894 /* If we have a return label defined, convert this into a branch to
4895 that label. The return proper will be handled elsewhere. */
4896 if (TREE_VALUE (gnu_return_label_stack))
4898 gnu_result = build1 (GOTO_EXPR, void_type_node,
4899 TREE_VALUE (gnu_return_label_stack));
4900 /* When not optimizing, make sure the return is preserved. */
4901 if (!optimize && Comes_From_Source (gnat_node))
4902 DECL_ARTIFICIAL (TREE_VALUE (gnu_return_label_stack)) = 0;
4906 /* If the subprogram is a function, we must return the expression. */
4907 if (Present (Expression (gnat_node)))
4909 tree gnu_subprog_type = TREE_TYPE (current_function_decl);
4910 tree gnu_result_decl = DECL_RESULT (current_function_decl);
4911 gnu_ret_val = gnat_to_gnu (Expression (gnat_node));
4913 /* Do not remove the padding from GNU_RET_VAL if the inner type is
4914 self-referential since we want to allocate the fixed size. */
4915 if (TREE_CODE (gnu_ret_val) == COMPONENT_REF
4916 && TYPE_IS_PADDING_P
4917 (TREE_TYPE (TREE_OPERAND (gnu_ret_val, 0)))
4918 && CONTAINS_PLACEHOLDER_P
4919 (TYPE_SIZE (TREE_TYPE (gnu_ret_val))))
4920 gnu_ret_val = TREE_OPERAND (gnu_ret_val, 0);
4922 /* If the subprogram returns by direct reference, return a pointer
4923 to the return value. */
4924 if (TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type)
4925 || By_Ref (gnat_node))
4926 gnu_ret_val = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_ret_val);
4928 /* Otherwise, if it returns an unconstrained array, we have to
4929 allocate a new version of the result and return it. */
4930 else if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type))
4932 gnu_ret_val = maybe_unconstrained_array (gnu_ret_val);
4933 gnu_ret_val = build_allocator (TREE_TYPE (gnu_ret_val),
4935 TREE_TYPE (gnu_subprog_type),
4936 Procedure_To_Call (gnat_node),
4937 Storage_Pool (gnat_node),
4941 /* If the subprogram returns by invisible reference, dereference
4942 the pointer it is passed using the type of the return value
4943 and build the copy operation manually. This ensures that we
4944 don't copy too much data, for example if the return type is
4945 unconstrained with a maximum size. */
4946 if (TREE_ADDRESSABLE (gnu_subprog_type))
4949 = build_unary_op (INDIRECT_REF, TREE_TYPE (gnu_ret_val),
4951 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
4952 gnu_ret_obj, gnu_ret_val);
4953 add_stmt_with_node (gnu_result, gnat_node);
4954 gnu_ret_val = NULL_TREE;
4955 gnu_ret_obj = gnu_result_decl;
4958 /* Otherwise, build a regular return. */
4960 gnu_ret_obj = gnu_result_decl;
4964 gnu_ret_val = NULL_TREE;
4965 gnu_ret_obj = NULL_TREE;
4968 gnu_result = build_return_expr (gnu_ret_obj, gnu_ret_val);
4972 case N_Goto_Statement:
4973 gnu_result = build1 (GOTO_EXPR, void_type_node,
4974 gnat_to_gnu (Name (gnat_node)));
4977 /***************************/
4978 /* Chapter 6: Subprograms */
4979 /***************************/
4981 case N_Subprogram_Declaration:
4982 /* Unless there is a freeze node, declare the subprogram. We consider
4983 this a "definition" even though we're not generating code for
4984 the subprogram because we will be making the corresponding GCC
4987 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node)))))
4988 gnat_to_gnu_entity (Defining_Entity (Specification (gnat_node)),
4990 gnu_result = alloc_stmt_list ();
4993 case N_Abstract_Subprogram_Declaration:
4994 /* This subprogram doesn't exist for code generation purposes, but we
4995 have to elaborate the types of any parameters and result, unless
4996 they are imported types (nothing to generate in this case). */
4998 /* Process the parameter types first. */
5001 = First_Formal_With_Extras
5002 (Defining_Entity (Specification (gnat_node)));
5003 Present (gnat_temp);
5004 gnat_temp = Next_Formal_With_Extras (gnat_temp))
5005 if (Is_Itype (Etype (gnat_temp))
5006 && !From_With_Type (Etype (gnat_temp)))
5007 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
5010 /* Then the result type, set to Standard_Void_Type for procedures. */
5013 Entity_Id gnat_temp_type
5014 = Etype (Defining_Entity (Specification (gnat_node)));
5016 if (Is_Itype (gnat_temp_type) && !From_With_Type (gnat_temp_type))
5017 gnat_to_gnu_entity (Etype (gnat_temp_type), NULL_TREE, 0);
5020 gnu_result = alloc_stmt_list ();
5023 case N_Defining_Program_Unit_Name:
5024 /* For a child unit identifier go up a level to get the specification.
5025 We get this when we try to find the spec of a child unit package
5026 that is the compilation unit being compiled. */
5027 gnu_result = gnat_to_gnu (Parent (gnat_node));
5030 case N_Subprogram_Body:
5031 Subprogram_Body_to_gnu (gnat_node);
5032 gnu_result = alloc_stmt_list ();
5035 case N_Function_Call:
5036 case N_Procedure_Call_Statement:
5037 gnu_result = call_to_gnu (gnat_node, &gnu_result_type, NULL_TREE);
5040 /************************/
5041 /* Chapter 7: Packages */
5042 /************************/
5044 case N_Package_Declaration:
5045 gnu_result = gnat_to_gnu (Specification (gnat_node));
5048 case N_Package_Specification:
5050 start_stmt_group ();
5051 process_decls (Visible_Declarations (gnat_node),
5052 Private_Declarations (gnat_node), Empty, true, true);
5053 gnu_result = end_stmt_group ();
5056 case N_Package_Body:
5058 /* If this is the body of a generic package - do nothing. */
5059 if (Ekind (Corresponding_Spec (gnat_node)) == E_Generic_Package)
5061 gnu_result = alloc_stmt_list ();
5065 start_stmt_group ();
5066 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
5068 if (Present (Handled_Statement_Sequence (gnat_node)))
5069 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
5071 gnu_result = end_stmt_group ();
5074 /********************************/
5075 /* Chapter 8: Visibility Rules */
5076 /********************************/
5078 case N_Use_Package_Clause:
5079 case N_Use_Type_Clause:
5080 /* Nothing to do here - but these may appear in list of declarations. */
5081 gnu_result = alloc_stmt_list ();
5084 /*********************/
5085 /* Chapter 9: Tasks */
5086 /*********************/
5088 case N_Protected_Type_Declaration:
5089 gnu_result = alloc_stmt_list ();
5092 case N_Single_Task_Declaration:
5093 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
5094 gnu_result = alloc_stmt_list ();
5097 /*********************************************************/
5098 /* Chapter 10: Program Structure and Compilation Issues */
5099 /*********************************************************/
5101 case N_Compilation_Unit:
5102 /* This is not called for the main unit on which gigi is invoked. */
5103 Compilation_Unit_to_gnu (gnat_node);
5104 gnu_result = alloc_stmt_list ();
5107 case N_Subprogram_Body_Stub:
5108 case N_Package_Body_Stub:
5109 case N_Protected_Body_Stub:
5110 case N_Task_Body_Stub:
5111 /* Simply process whatever unit is being inserted. */
5112 gnu_result = gnat_to_gnu (Unit (Library_Unit (gnat_node)));
5116 gnu_result = gnat_to_gnu (Proper_Body (gnat_node));
5119 /***************************/
5120 /* Chapter 11: Exceptions */
5121 /***************************/
5123 case N_Handled_Sequence_Of_Statements:
5124 /* If there is an At_End procedure attached to this node, and the EH
5125 mechanism is SJLJ, we must have at least a corresponding At_End
5126 handler, unless the No_Exception_Handlers restriction is set. */
5127 gcc_assert (type_annotate_only
5128 || Exception_Mechanism != Setjmp_Longjmp
5129 || No (At_End_Proc (gnat_node))
5130 || Present (Exception_Handlers (gnat_node))
5131 || No_Exception_Handlers_Set ());
5133 gnu_result = Handled_Sequence_Of_Statements_to_gnu (gnat_node);
5136 case N_Exception_Handler:
5137 if (Exception_Mechanism == Setjmp_Longjmp)
5138 gnu_result = Exception_Handler_to_gnu_sjlj (gnat_node);
5139 else if (Exception_Mechanism == Back_End_Exceptions)
5140 gnu_result = Exception_Handler_to_gnu_zcx (gnat_node);
5146 case N_Push_Constraint_Error_Label:
5147 push_exception_label_stack (&gnu_constraint_error_label_stack,
5148 Exception_Label (gnat_node));
5151 case N_Push_Storage_Error_Label:
5152 push_exception_label_stack (&gnu_storage_error_label_stack,
5153 Exception_Label (gnat_node));
5156 case N_Push_Program_Error_Label:
5157 push_exception_label_stack (&gnu_program_error_label_stack,
5158 Exception_Label (gnat_node));
5161 case N_Pop_Constraint_Error_Label:
5162 gnu_constraint_error_label_stack
5163 = TREE_CHAIN (gnu_constraint_error_label_stack);
5166 case N_Pop_Storage_Error_Label:
5167 gnu_storage_error_label_stack
5168 = TREE_CHAIN (gnu_storage_error_label_stack);
5171 case N_Pop_Program_Error_Label:
5172 gnu_program_error_label_stack
5173 = TREE_CHAIN (gnu_program_error_label_stack);
5176 /******************************/
5177 /* Chapter 12: Generic Units */
5178 /******************************/
5180 case N_Generic_Function_Renaming_Declaration:
5181 case N_Generic_Package_Renaming_Declaration:
5182 case N_Generic_Procedure_Renaming_Declaration:
5183 case N_Generic_Package_Declaration:
5184 case N_Generic_Subprogram_Declaration:
5185 case N_Package_Instantiation:
5186 case N_Procedure_Instantiation:
5187 case N_Function_Instantiation:
5188 /* These nodes can appear on a declaration list but there is nothing to
5189 to be done with them. */
5190 gnu_result = alloc_stmt_list ();
5193 /**************************************************/
5194 /* Chapter 13: Representation Clauses and */
5195 /* Implementation-Dependent Features */
5196 /**************************************************/
5198 case N_Attribute_Definition_Clause:
5199 gnu_result = alloc_stmt_list ();
5201 /* The only one we need to deal with is 'Address since, for the others,
5202 the front-end puts the information elsewhere. */
5203 if (Get_Attribute_Id (Chars (gnat_node)) != Attr_Address)
5206 /* And we only deal with 'Address if the object has a Freeze node. */
5207 gnat_temp = Entity (Name (gnat_node));
5208 if (No (Freeze_Node (gnat_temp)))
5211 /* Get the value to use as the address and save it as the equivalent
5212 for the object. When it is frozen, gnat_to_gnu_entity will do the
5214 save_gnu_tree (gnat_temp, gnat_to_gnu (Expression (gnat_node)), true);
5217 case N_Enumeration_Representation_Clause:
5218 case N_Record_Representation_Clause:
5220 /* We do nothing with these. SEM puts the information elsewhere. */
5221 gnu_result = alloc_stmt_list ();
5224 case N_Code_Statement:
5225 if (!type_annotate_only)
5227 tree gnu_template = gnat_to_gnu (Asm_Template (gnat_node));
5228 tree gnu_inputs = NULL_TREE, gnu_outputs = NULL_TREE;
5229 tree gnu_clobbers = NULL_TREE, tail;
5230 bool allows_mem, allows_reg, fake;
5231 int ninputs, noutputs, i;
5232 const char **oconstraints;
5233 const char *constraint;
5236 /* First retrieve the 3 operand lists built by the front-end. */
5237 Setup_Asm_Outputs (gnat_node);
5238 while (Present (gnat_temp = Asm_Output_Variable ()))
5240 tree gnu_value = gnat_to_gnu (gnat_temp);
5241 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
5242 (Asm_Output_Constraint ()));
5244 gnu_outputs = tree_cons (gnu_constr, gnu_value, gnu_outputs);
5248 Setup_Asm_Inputs (gnat_node);
5249 while (Present (gnat_temp = Asm_Input_Value ()))
5251 tree gnu_value = gnat_to_gnu (gnat_temp);
5252 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
5253 (Asm_Input_Constraint ()));
5255 gnu_inputs = tree_cons (gnu_constr, gnu_value, gnu_inputs);
5259 Clobber_Setup (gnat_node);
5260 while ((clobber = Clobber_Get_Next ()))
5262 = tree_cons (NULL_TREE,
5263 build_string (strlen (clobber) + 1, clobber),
5266 /* Then perform some standard checking and processing on the
5267 operands. In particular, mark them addressable if needed. */
5268 gnu_outputs = nreverse (gnu_outputs);
5269 noutputs = list_length (gnu_outputs);
5270 gnu_inputs = nreverse (gnu_inputs);
5271 ninputs = list_length (gnu_inputs);
5273 = (const char **) alloca (noutputs * sizeof (const char *));
5275 for (i = 0, tail = gnu_outputs; tail; ++i, tail = TREE_CHAIN (tail))
5277 tree output = TREE_VALUE (tail);
5279 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
5280 oconstraints[i] = constraint;
5282 if (parse_output_constraint (&constraint, i, ninputs, noutputs,
5283 &allows_mem, &allows_reg, &fake))
5285 /* If the operand is going to end up in memory,
5286 mark it addressable. Note that we don't test
5287 allows_mem like in the input case below; this
5288 is modelled on the C front-end. */
5290 && !gnat_mark_addressable (output))
5291 output = error_mark_node;
5294 output = error_mark_node;
5296 TREE_VALUE (tail) = output;
5299 for (i = 0, tail = gnu_inputs; tail; ++i, tail = TREE_CHAIN (tail))
5301 tree input = TREE_VALUE (tail);
5303 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
5305 if (parse_input_constraint (&constraint, i, ninputs, noutputs,
5307 &allows_mem, &allows_reg))
5309 /* If the operand is going to end up in memory,
5310 mark it addressable. */
5311 if (!allows_reg && allows_mem
5312 && !gnat_mark_addressable (input))
5313 input = error_mark_node;
5316 input = error_mark_node;
5318 TREE_VALUE (tail) = input;
5321 gnu_result = build5 (ASM_EXPR, void_type_node,
5322 gnu_template, gnu_outputs,
5323 gnu_inputs, gnu_clobbers, NULL_TREE);
5324 ASM_VOLATILE_P (gnu_result) = Is_Asm_Volatile (gnat_node);
5327 gnu_result = alloc_stmt_list ();
5335 case N_Freeze_Entity:
5336 start_stmt_group ();
5337 process_freeze_entity (gnat_node);
5338 process_decls (Actions (gnat_node), Empty, Empty, true, true);
5339 gnu_result = end_stmt_group ();
5342 case N_Itype_Reference:
5343 if (!present_gnu_tree (Itype (gnat_node)))
5344 process_type (Itype (gnat_node));
5346 gnu_result = alloc_stmt_list ();
5349 case N_Free_Statement:
5350 if (!type_annotate_only)
5352 tree gnu_ptr = gnat_to_gnu (Expression (gnat_node));
5353 tree gnu_ptr_type = TREE_TYPE (gnu_ptr);
5355 tree gnu_actual_obj_type = 0;
5358 /* If this is a thin pointer, we must dereference it to create
5359 a fat pointer, then go back below to a thin pointer. The
5360 reason for this is that we need a fat pointer someplace in
5361 order to properly compute the size. */
5362 if (TYPE_IS_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
5363 gnu_ptr = build_unary_op (ADDR_EXPR, NULL_TREE,
5364 build_unary_op (INDIRECT_REF, NULL_TREE,
5367 /* If this is an unconstrained array, we know the object must
5368 have been allocated with the template in front of the object.
5369 So pass the template address, but get the total size. Do this
5370 by converting to a thin pointer. */
5371 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
5373 = convert (build_pointer_type
5374 (TYPE_OBJECT_RECORD_TYPE
5375 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
5378 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
5380 if (Present (Actual_Designated_Subtype (gnat_node)))
5383 = gnat_to_gnu_type (Actual_Designated_Subtype (gnat_node));
5385 if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type))
5387 = build_unc_object_type_from_ptr (gnu_ptr_type,
5388 gnu_actual_obj_type,
5393 gnu_actual_obj_type = gnu_obj_type;
5395 gnu_obj_size = TYPE_SIZE_UNIT (gnu_actual_obj_type);
5397 if (TREE_CODE (gnu_obj_type) == RECORD_TYPE
5398 && TYPE_CONTAINS_TEMPLATE_P (gnu_obj_type))
5400 tree gnu_char_ptr_type
5401 = build_pointer_type (unsigned_char_type_node);
5402 tree gnu_pos = byte_position (TYPE_FIELDS (gnu_obj_type));
5403 gnu_ptr = convert (gnu_char_ptr_type, gnu_ptr);
5404 gnu_ptr = build_binary_op (POINTER_PLUS_EXPR, gnu_char_ptr_type,
5409 = build_call_alloc_dealloc (gnu_ptr, gnu_obj_size, gnu_obj_type,
5410 Procedure_To_Call (gnat_node),
5411 Storage_Pool (gnat_node),
5416 case N_Raise_Constraint_Error:
5417 case N_Raise_Program_Error:
5418 case N_Raise_Storage_Error:
5419 if (type_annotate_only)
5421 gnu_result = alloc_stmt_list ();
5425 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5427 = build_call_raise (UI_To_Int (Reason (gnat_node)), gnat_node, kind);
5429 /* If the type is VOID, this is a statement, so we need to
5430 generate the code for the call. Handle a Condition, if there
5432 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
5434 set_expr_location_from_node (gnu_result, gnat_node);
5436 if (Present (Condition (gnat_node)))
5437 gnu_result = build3 (COND_EXPR, void_type_node,
5438 gnat_to_gnu (Condition (gnat_node)),
5439 gnu_result, alloc_stmt_list ());
5442 gnu_result = build1 (NULL_EXPR, gnu_result_type, gnu_result);
5445 case N_Validate_Unchecked_Conversion:
5447 Entity_Id gnat_target_type = Target_Type (gnat_node);
5448 tree gnu_source_type = gnat_to_gnu_type (Source_Type (gnat_node));
5449 tree gnu_target_type = gnat_to_gnu_type (gnat_target_type);
5451 /* No need for any warning in this case. */
5452 if (!flag_strict_aliasing)
5455 /* If the result is a pointer type, see if we are either converting
5456 from a non-pointer or from a pointer to a type with a different
5457 alias set and warn if so. If the result is defined in the same
5458 unit as this unchecked conversion, we can allow this because we
5459 can know to make the pointer type behave properly. */
5460 else if (POINTER_TYPE_P (gnu_target_type)
5461 && !In_Same_Source_Unit (gnat_target_type, gnat_node)
5462 && !No_Strict_Aliasing (Underlying_Type (gnat_target_type)))
5464 tree gnu_source_desig_type = POINTER_TYPE_P (gnu_source_type)
5465 ? TREE_TYPE (gnu_source_type)
5467 tree gnu_target_desig_type = TREE_TYPE (gnu_target_type);
5469 if ((TYPE_DUMMY_P (gnu_target_desig_type)
5470 || get_alias_set (gnu_target_desig_type) != 0)
5471 && (!POINTER_TYPE_P (gnu_source_type)
5472 || (TYPE_DUMMY_P (gnu_source_desig_type)
5473 != TYPE_DUMMY_P (gnu_target_desig_type))
5474 || (TYPE_DUMMY_P (gnu_source_desig_type)
5475 && gnu_source_desig_type != gnu_target_desig_type)
5476 || !alias_sets_conflict_p
5477 (get_alias_set (gnu_source_desig_type),
5478 get_alias_set (gnu_target_desig_type))))
5481 ("?possible aliasing problem for type&",
5482 gnat_node, Target_Type (gnat_node));
5484 ("\\?use -fno-strict-aliasing switch for references",
5487 ("\\?or use `pragma No_Strict_Aliasing (&);`",
5488 gnat_node, Target_Type (gnat_node));
5492 /* But if the result is a fat pointer type, we have no mechanism to
5493 do that, so we unconditionally warn in problematic cases. */
5494 else if (TYPE_IS_FAT_POINTER_P (gnu_target_type))
5496 tree gnu_source_array_type
5497 = TYPE_IS_FAT_POINTER_P (gnu_source_type)
5498 ? TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_source_type)))
5500 tree gnu_target_array_type
5501 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_target_type)));
5503 if ((TYPE_DUMMY_P (gnu_target_array_type)
5504 || get_alias_set (gnu_target_array_type) != 0)
5505 && (!TYPE_IS_FAT_POINTER_P (gnu_source_type)
5506 || (TYPE_DUMMY_P (gnu_source_array_type)
5507 != TYPE_DUMMY_P (gnu_target_array_type))
5508 || (TYPE_DUMMY_P (gnu_source_array_type)
5509 && gnu_source_array_type != gnu_target_array_type)
5510 || !alias_sets_conflict_p
5511 (get_alias_set (gnu_source_array_type),
5512 get_alias_set (gnu_target_array_type))))
5515 ("?possible aliasing problem for type&",
5516 gnat_node, Target_Type (gnat_node));
5518 ("\\?use -fno-strict-aliasing switch for references",
5523 gnu_result = alloc_stmt_list ();
5527 /* SCIL nodes require no processing for GCC. Other nodes should only
5528 be present when annotating types. */
5529 gcc_assert (IN (kind, N_SCIL_Node) || type_annotate_only);
5530 gnu_result = alloc_stmt_list ();
5533 /* If we pushed the processing of the elaboration routine, pop it back. */
5534 if (went_into_elab_proc)
5535 current_function_decl = NULL_TREE;
5537 /* When not optimizing, turn boolean rvalues B into B != false tests
5538 so that the code just below can put the location information of the
5539 reference to B on the inequality operator for better debug info. */
5541 && (kind == N_Identifier
5542 || kind == N_Expanded_Name
5543 || kind == N_Explicit_Dereference
5544 || kind == N_Function_Call
5545 || kind == N_Indexed_Component
5546 || kind == N_Selected_Component)
5547 && TREE_CODE (get_base_type (gnu_result_type)) == BOOLEAN_TYPE
5548 && !lvalue_required_p (gnat_node, gnu_result_type, false, false, false))
5549 gnu_result = build_binary_op (NE_EXPR, gnu_result_type,
5550 convert (gnu_result_type, gnu_result),
5551 convert (gnu_result_type,
5552 boolean_false_node));
5554 /* Set the location information on the result if it is a real expression.
5555 References can be reused for multiple GNAT nodes and they would get
5556 the location information of their last use. Note that we may have
5557 no result if we tried to build a CALL_EXPR node to a procedure with
5558 no side-effects and optimization is enabled. */
5560 && EXPR_P (gnu_result)
5561 && TREE_CODE (gnu_result) != NOP_EXPR
5562 && !REFERENCE_CLASS_P (gnu_result)
5563 && !EXPR_HAS_LOCATION (gnu_result))
5564 set_expr_location_from_node (gnu_result, gnat_node);
5566 /* If we're supposed to return something of void_type, it means we have
5567 something we're elaborating for effect, so just return. */
5568 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
5571 /* If the result is a constant that overflowed, raise Constraint_Error. */
5572 if (TREE_CODE (gnu_result) == INTEGER_CST && TREE_OVERFLOW (gnu_result))
5574 post_error ("Constraint_Error will be raised at run-time?", gnat_node);
5576 = build1 (NULL_EXPR, gnu_result_type,
5577 build_call_raise (CE_Overflow_Check_Failed, gnat_node,
5578 N_Raise_Constraint_Error));
5581 /* If our result has side-effects and is of an unconstrained type,
5582 make a SAVE_EXPR so that we can be sure it will only be referenced
5583 once. Note we must do this before any conversions. */
5584 if (TREE_SIDE_EFFECTS (gnu_result)
5585 && (TREE_CODE (gnu_result_type) == UNCONSTRAINED_ARRAY_TYPE
5586 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))))
5587 gnu_result = gnat_stabilize_reference (gnu_result, false, NULL);
5589 /* Now convert the result to the result type, unless we are in one of the
5592 1. If this is the Name of an assignment statement or a parameter of
5593 a procedure call, return the result almost unmodified since the
5594 RHS will have to be converted to our type in that case, unless
5595 the result type has a simpler size. Likewise if there is just
5596 a no-op unchecked conversion in-between. Similarly, don't convert
5597 integral types that are the operands of an unchecked conversion
5598 since we need to ignore those conversions (for 'Valid).
5600 2. If we have a label (which doesn't have any well-defined type), a
5601 field or an error, return the result almost unmodified. Also don't
5602 do the conversion if the result type involves a PLACEHOLDER_EXPR in
5603 its size since those are the cases where the front end may have the
5604 type wrong due to "instantiating" the unconstrained record with
5605 discriminant values. Similarly, if the two types are record types
5606 with the same name don't convert. This will be the case when we are
5607 converting from a packable version of a type to its original type and
5608 we need those conversions to be NOPs in order for assignments into
5609 these types to work properly.
5611 3. If the type is void or if we have no result, return error_mark_node
5612 to show we have no result.
5614 4. Finally, if the type of the result is already correct. */
5616 if (Present (Parent (gnat_node))
5617 && ((Nkind (Parent (gnat_node)) == N_Assignment_Statement
5618 && Name (Parent (gnat_node)) == gnat_node)
5619 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
5620 && unchecked_conversion_nop (Parent (gnat_node)))
5621 || (Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement
5622 && Name (Parent (gnat_node)) != gnat_node)
5623 || Nkind (Parent (gnat_node)) == N_Parameter_Association
5624 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
5625 && !AGGREGATE_TYPE_P (gnu_result_type)
5626 && !AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))))
5627 && !(TYPE_SIZE (gnu_result_type)
5628 && TYPE_SIZE (TREE_TYPE (gnu_result))
5629 && (AGGREGATE_TYPE_P (gnu_result_type)
5630 == AGGREGATE_TYPE_P (TREE_TYPE (gnu_result)))
5631 && ((TREE_CODE (TYPE_SIZE (gnu_result_type)) == INTEGER_CST
5632 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_result)))
5634 || (TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
5635 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))
5636 && (CONTAINS_PLACEHOLDER_P
5637 (TYPE_SIZE (TREE_TYPE (gnu_result))))))
5638 && !(TREE_CODE (gnu_result_type) == RECORD_TYPE
5639 && TYPE_JUSTIFIED_MODULAR_P (gnu_result_type))))
5641 /* Remove padding only if the inner object is of self-referential
5642 size: in that case it must be an object of unconstrained type
5643 with a default discriminant and we want to avoid copying too
5645 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result))
5646 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS
5647 (TREE_TYPE (gnu_result))))))
5648 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
5652 else if (TREE_CODE (gnu_result) == LABEL_DECL
5653 || TREE_CODE (gnu_result) == FIELD_DECL
5654 || TREE_CODE (gnu_result) == ERROR_MARK
5655 || (TYPE_SIZE (gnu_result_type)
5656 && TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
5657 && TREE_CODE (gnu_result) != INDIRECT_REF
5658 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type)))
5659 || ((TYPE_NAME (gnu_result_type)
5660 == TYPE_NAME (TREE_TYPE (gnu_result)))
5661 && TREE_CODE (gnu_result_type) == RECORD_TYPE
5662 && TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE))
5664 /* Remove any padding. */
5665 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
5666 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
5670 else if (gnu_result == error_mark_node || gnu_result_type == void_type_node)
5671 gnu_result = error_mark_node;
5673 else if (gnu_result_type != TREE_TYPE (gnu_result))
5674 gnu_result = convert (gnu_result_type, gnu_result);
5676 /* We don't need any NOP_EXPR or NON_LVALUE_EXPR on the result. */
5677 while ((TREE_CODE (gnu_result) == NOP_EXPR
5678 || TREE_CODE (gnu_result) == NON_LVALUE_EXPR)
5679 && TREE_TYPE (TREE_OPERAND (gnu_result, 0)) == TREE_TYPE (gnu_result))
5680 gnu_result = TREE_OPERAND (gnu_result, 0);
5685 /* Subroutine of above to push the exception label stack. GNU_STACK is
5686 a pointer to the stack to update and GNAT_LABEL, if present, is the
5687 label to push onto the stack. */
5690 push_exception_label_stack (tree *gnu_stack, Entity_Id gnat_label)
5692 tree gnu_label = (Present (gnat_label)
5693 ? gnat_to_gnu_entity (gnat_label, NULL_TREE, 0)
5696 *gnu_stack = tree_cons (NULL_TREE, gnu_label, *gnu_stack);
5699 /* Record the current code position in GNAT_NODE. */
5702 record_code_position (Node_Id gnat_node)
5704 tree stmt_stmt = build1 (STMT_STMT, void_type_node, NULL_TREE);
5706 add_stmt_with_node (stmt_stmt, gnat_node);
5707 save_gnu_tree (gnat_node, stmt_stmt, true);
5710 /* Insert the code for GNAT_NODE at the position saved for that node. */
5713 insert_code_for (Node_Id gnat_node)
5715 STMT_STMT_STMT (get_gnu_tree (gnat_node)) = gnat_to_gnu (gnat_node);
5716 save_gnu_tree (gnat_node, NULL_TREE, true);
5719 /* Start a new statement group chained to the previous group. */
5722 start_stmt_group (void)
5724 struct stmt_group *group = stmt_group_free_list;
5726 /* First see if we can get one from the free list. */
5728 stmt_group_free_list = group->previous;
5730 group = (struct stmt_group *) ggc_alloc (sizeof (struct stmt_group));
5732 group->previous = current_stmt_group;
5733 group->stmt_list = group->block = group->cleanups = NULL_TREE;
5734 current_stmt_group = group;
5737 /* Add GNU_STMT to the current statement group. */
5740 add_stmt (tree gnu_stmt)
5742 append_to_statement_list (gnu_stmt, ¤t_stmt_group->stmt_list);
5745 /* Similar, but set the location of GNU_STMT to that of GNAT_NODE. */
5748 add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node)
5750 if (Present (gnat_node))
5751 set_expr_location_from_node (gnu_stmt, gnat_node);
5752 add_stmt (gnu_stmt);
5755 /* Add a declaration statement for GNU_DECL to the current statement group.
5756 Get SLOC from Entity_Id. */
5759 add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
5761 tree type = TREE_TYPE (gnu_decl);
5762 tree gnu_stmt, gnu_init, t;
5764 /* If this is a variable that Gigi is to ignore, we may have been given
5765 an ERROR_MARK. So test for it. We also might have been given a
5766 reference for a renaming. So only do something for a decl. Also
5767 ignore a TYPE_DECL for an UNCONSTRAINED_ARRAY_TYPE. */
5768 if (!DECL_P (gnu_decl)
5769 || (TREE_CODE (gnu_decl) == TYPE_DECL
5770 && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE))
5773 gnu_stmt = build1 (DECL_EXPR, void_type_node, gnu_decl);
5775 /* If we are global, we don't want to actually output the DECL_EXPR for
5776 this decl since we already have evaluated the expressions in the
5777 sizes and positions as globals and doing it again would be wrong. */
5778 if (global_bindings_p ())
5780 /* Mark everything as used to prevent node sharing with subprograms.
5781 Note that walk_tree knows how to deal with TYPE_DECL, but neither
5782 VAR_DECL nor CONST_DECL. This appears to be somewhat arbitrary. */
5783 MARK_VISITED (gnu_stmt);
5784 if (TREE_CODE (gnu_decl) == VAR_DECL
5785 || TREE_CODE (gnu_decl) == CONST_DECL)
5787 MARK_VISITED (DECL_SIZE (gnu_decl));
5788 MARK_VISITED (DECL_SIZE_UNIT (gnu_decl));
5789 MARK_VISITED (DECL_INITIAL (gnu_decl));
5791 /* In any case, we have to deal with our own TYPE_ADA_SIZE field. */
5792 else if (TREE_CODE (gnu_decl) == TYPE_DECL
5793 && ((TREE_CODE (type) == RECORD_TYPE
5794 && !TYPE_FAT_POINTER_P (type))
5795 || TREE_CODE (type) == UNION_TYPE
5796 || TREE_CODE (type) == QUAL_UNION_TYPE))
5797 MARK_VISITED (TYPE_ADA_SIZE (type));
5800 add_stmt_with_node (gnu_stmt, gnat_entity);
5802 /* If this is a variable and an initializer is attached to it, it must be
5803 valid for the context. Similar to init_const in create_var_decl_1. */
5804 if (TREE_CODE (gnu_decl) == VAR_DECL
5805 && (gnu_init = DECL_INITIAL (gnu_decl)) != NULL_TREE
5806 && (!gnat_types_compatible_p (type, TREE_TYPE (gnu_init))
5807 || (TREE_STATIC (gnu_decl)
5808 && !initializer_constant_valid_p (gnu_init,
5809 TREE_TYPE (gnu_init)))))
5811 /* If GNU_DECL has a padded type, convert it to the unpadded
5812 type so the assignment is done properly. */
5813 if (TYPE_IS_PADDING_P (type))
5814 t = convert (TREE_TYPE (TYPE_FIELDS (type)), gnu_decl);
5818 gnu_stmt = build_binary_op (INIT_EXPR, NULL_TREE, t, gnu_init);
5820 DECL_INITIAL (gnu_decl) = NULL_TREE;
5821 if (TREE_READONLY (gnu_decl))
5823 TREE_READONLY (gnu_decl) = 0;
5824 DECL_READONLY_ONCE_ELAB (gnu_decl) = 1;
5827 add_stmt_with_node (gnu_stmt, gnat_entity);
5831 /* Callback for walk_tree to mark the visited trees rooted at *TP. */
5834 mark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
5838 if (TREE_VISITED (t))
5841 /* Don't mark a dummy type as visited because we want to mark its sizes
5842 and fields once it's filled in. */
5843 else if (!TYPE_IS_DUMMY_P (t))
5844 TREE_VISITED (t) = 1;
5847 TYPE_SIZES_GIMPLIFIED (t) = 1;
5852 /* Mark nodes rooted at T with TREE_VISITED and types as having their
5853 sized gimplified. We use this to indicate all variable sizes and
5854 positions in global types may not be shared by any subprogram. */
5857 mark_visited (tree t)
5859 walk_tree (&t, mark_visited_r, NULL, NULL);
5862 /* Utility function to unshare expressions wrapped up in a SAVE_EXPR. */
5865 unshare_save_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
5866 void *data ATTRIBUTE_UNUSED)
5870 if (TREE_CODE (t) == SAVE_EXPR)
5871 TREE_OPERAND (t, 0) = unshare_expr (TREE_OPERAND (t, 0));
5876 /* Add GNU_CLEANUP, a cleanup action, to the current code group and
5877 set its location to that of GNAT_NODE if present. */
5880 add_cleanup (tree gnu_cleanup, Node_Id gnat_node)
5882 if (Present (gnat_node))
5883 set_expr_location_from_node (gnu_cleanup, gnat_node);
5884 append_to_statement_list (gnu_cleanup, ¤t_stmt_group->cleanups);
5887 /* Set the BLOCK node corresponding to the current code group to GNU_BLOCK. */
5890 set_block_for_group (tree gnu_block)
5892 gcc_assert (!current_stmt_group->block);
5893 current_stmt_group->block = gnu_block;
5896 /* Return code corresponding to the current code group. It is normally
5897 a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
5898 BLOCK or cleanups were set. */
5901 end_stmt_group (void)
5903 struct stmt_group *group = current_stmt_group;
5904 tree gnu_retval = group->stmt_list;
5906 /* If this is a null list, allocate a new STATEMENT_LIST. Then, if there
5907 are cleanups, make a TRY_FINALLY_EXPR. Last, if there is a BLOCK,
5908 make a BIND_EXPR. Note that we nest in that because the cleanup may
5909 reference variables in the block. */
5910 if (gnu_retval == NULL_TREE)
5911 gnu_retval = alloc_stmt_list ();
5913 if (group->cleanups)
5914 gnu_retval = build2 (TRY_FINALLY_EXPR, void_type_node, gnu_retval,
5917 if (current_stmt_group->block)
5918 gnu_retval = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (group->block),
5919 gnu_retval, group->block);
5921 /* Remove this group from the stack and add it to the free list. */
5922 current_stmt_group = group->previous;
5923 group->previous = stmt_group_free_list;
5924 stmt_group_free_list = group;
5929 /* Add a list of statements from GNAT_LIST, a possibly-empty list of
5933 add_stmt_list (List_Id gnat_list)
5937 if (Present (gnat_list))
5938 for (gnat_node = First (gnat_list); Present (gnat_node);
5939 gnat_node = Next (gnat_node))
5940 add_stmt (gnat_to_gnu (gnat_node));
5943 /* Build a tree from GNAT_LIST, a possibly-empty list of statements.
5944 If BINDING_P is true, push and pop a binding level around the list. */
5947 build_stmt_group (List_Id gnat_list, bool binding_p)
5949 start_stmt_group ();
5953 add_stmt_list (gnat_list);
5957 return end_stmt_group ();
5960 /* Push and pop routines for stacks. We keep a free list around so we
5961 don't waste tree nodes. */
5964 push_stack (tree *gnu_stack_ptr, tree gnu_purpose, tree gnu_value)
5966 tree gnu_node = gnu_stack_free_list;
5970 gnu_stack_free_list = TREE_CHAIN (gnu_node);
5971 TREE_CHAIN (gnu_node) = *gnu_stack_ptr;
5972 TREE_PURPOSE (gnu_node) = gnu_purpose;
5973 TREE_VALUE (gnu_node) = gnu_value;
5976 gnu_node = tree_cons (gnu_purpose, gnu_value, *gnu_stack_ptr);
5978 *gnu_stack_ptr = gnu_node;
5982 pop_stack (tree *gnu_stack_ptr)
5984 tree gnu_node = *gnu_stack_ptr;
5986 *gnu_stack_ptr = TREE_CHAIN (gnu_node);
5987 TREE_CHAIN (gnu_node) = gnu_stack_free_list;
5988 gnu_stack_free_list = gnu_node;
5991 /* Generate GIMPLE in place for the expression at *EXPR_P. */
5994 gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
5995 gimple_seq *post_p ATTRIBUTE_UNUSED)
5997 tree expr = *expr_p;
6000 if (IS_ADA_STMT (expr))
6001 return gnat_gimplify_stmt (expr_p);
6003 switch (TREE_CODE (expr))
6006 /* If this is for a scalar, just make a VAR_DECL for it. If for
6007 an aggregate, get a null pointer of the appropriate type and
6009 if (AGGREGATE_TYPE_P (TREE_TYPE (expr)))
6010 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (expr),
6011 convert (build_pointer_type (TREE_TYPE (expr)),
6012 integer_zero_node));
6015 *expr_p = create_tmp_var (TREE_TYPE (expr), NULL);
6016 TREE_NO_WARNING (*expr_p) = 1;
6019 gimplify_and_add (TREE_OPERAND (expr, 0), pre_p);
6022 case UNCONSTRAINED_ARRAY_REF:
6023 /* We should only do this if we are just elaborating for side-effects,
6024 but we can't know that yet. */
6025 *expr_p = TREE_OPERAND (*expr_p, 0);
6029 op = TREE_OPERAND (expr, 0);
6031 if (TREE_CODE (op) == CONSTRUCTOR)
6033 /* If we are taking the address of a constant CONSTRUCTOR, make sure
6034 it is put into static memory. We know it's going to be read-only
6035 given the semantics we have and it must be in static memory when
6036 the reference is in an elaboration procedure. */
6037 if (TREE_CONSTANT (op))
6039 tree new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
6040 TREE_ADDRESSABLE (new_var) = 1;
6041 gimple_add_tmp_var (new_var);
6043 TREE_READONLY (new_var) = 1;
6044 TREE_STATIC (new_var) = 1;
6045 DECL_INITIAL (new_var) = op;
6047 TREE_OPERAND (expr, 0) = new_var;
6048 recompute_tree_invariant_for_addr_expr (expr);
6051 /* Otherwise explicitly create the local temporary. That's required
6052 if the type is passed by reference. */
6055 tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
6056 TREE_ADDRESSABLE (new_var) = 1;
6057 gimple_add_tmp_var (new_var);
6059 mod = build2 (INIT_EXPR, TREE_TYPE (new_var), new_var, op);
6060 gimplify_and_add (mod, pre_p);
6062 TREE_OPERAND (expr, 0) = new_var;
6063 recompute_tree_invariant_for_addr_expr (expr);
6069 return GS_UNHANDLED;
6072 op = DECL_EXPR_DECL (expr);
6074 /* The expressions for the RM bounds must be gimplified to ensure that
6075 they are properly elaborated. See gimplify_decl_expr. */
6076 if ((TREE_CODE (op) == TYPE_DECL || TREE_CODE (op) == VAR_DECL)
6077 && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (op)))
6078 switch (TREE_CODE (TREE_TYPE (op)))
6085 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (op)), t, val;
6087 val = TYPE_RM_MIN_VALUE (type);
6090 gimplify_one_sizepos (&val, pre_p);
6091 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
6092 SET_TYPE_RM_MIN_VALUE (t, val);
6095 val = TYPE_RM_MAX_VALUE (type);
6098 gimplify_one_sizepos (&val, pre_p);
6099 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
6100 SET_TYPE_RM_MAX_VALUE (t, val);
6110 /* ... fall through ... */
6113 return GS_UNHANDLED;
6117 /* Generate GIMPLE in place for the statement at *STMT_P. */
6119 static enum gimplify_status
6120 gnat_gimplify_stmt (tree *stmt_p)
6122 tree stmt = *stmt_p;
6124 switch (TREE_CODE (stmt))
6127 *stmt_p = STMT_STMT_STMT (stmt);
6132 tree gnu_start_label = create_artificial_label (input_location);
6133 tree gnu_cond = LOOP_STMT_COND (stmt);
6134 tree gnu_update = LOOP_STMT_UPDATE (stmt);
6135 tree gnu_end_label = LOOP_STMT_LABEL (stmt);
6138 /* Build the condition expression from the test, if any. */
6141 = build3 (COND_EXPR, void_type_node, gnu_cond, alloc_stmt_list (),
6142 build1 (GOTO_EXPR, void_type_node, gnu_end_label));
6144 /* Set to emit the statements of the loop. */
6145 *stmt_p = NULL_TREE;
6147 /* We first emit the start label and then a conditional jump to the
6148 end label if there's a top condition, then the update if it's at
6149 the top, then the body of the loop, then a conditional jump to
6150 the end label if there's a bottom condition, then the update if
6151 it's at the bottom, and finally a jump to the start label and the
6152 definition of the end label. */
6153 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
6157 if (gnu_cond && !LOOP_STMT_BOTTOM_COND_P (stmt))
6158 append_to_statement_list (gnu_cond, stmt_p);
6160 if (gnu_update && LOOP_STMT_TOP_UPDATE_P (stmt))
6161 append_to_statement_list (gnu_update, stmt_p);
6163 append_to_statement_list (LOOP_STMT_BODY (stmt), stmt_p);
6165 if (gnu_cond && LOOP_STMT_BOTTOM_COND_P (stmt))
6166 append_to_statement_list (gnu_cond, stmt_p);
6168 if (gnu_update && !LOOP_STMT_TOP_UPDATE_P (stmt))
6169 append_to_statement_list (gnu_update, stmt_p);
6171 t = build1 (GOTO_EXPR, void_type_node, gnu_start_label);
6172 SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (gnu_end_label));
6173 append_to_statement_list (t, stmt_p);
6175 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
6182 /* Build a statement to jump to the corresponding end label, then
6183 see if it needs to be conditional. */
6184 *stmt_p = build1 (GOTO_EXPR, void_type_node, EXIT_STMT_LABEL (stmt));
6185 if (EXIT_STMT_COND (stmt))
6186 *stmt_p = build3 (COND_EXPR, void_type_node,
6187 EXIT_STMT_COND (stmt), *stmt_p, alloc_stmt_list ());
6195 /* Force references to each of the entities in packages withed by GNAT_NODE.
6196 Operate recursively but check that we aren't elaborating something more
6199 This routine is exclusively called in type_annotate mode, to compute DDA
6200 information for types in withed units, for ASIS use. */
6203 elaborate_all_entities (Node_Id gnat_node)
6205 Entity_Id gnat_with_clause, gnat_entity;
6207 /* Process each unit only once. As we trace the context of all relevant
6208 units transitively, including generic bodies, we may encounter the
6209 same generic unit repeatedly. */
6210 if (!present_gnu_tree (gnat_node))
6211 save_gnu_tree (gnat_node, integer_zero_node, true);
6213 /* Save entities in all context units. A body may have an implicit_with
6214 on its own spec, if the context includes a child unit, so don't save
6216 for (gnat_with_clause = First (Context_Items (gnat_node));
6217 Present (gnat_with_clause);
6218 gnat_with_clause = Next (gnat_with_clause))
6219 if (Nkind (gnat_with_clause) == N_With_Clause
6220 && !present_gnu_tree (Library_Unit (gnat_with_clause))
6221 && Library_Unit (gnat_with_clause) != Library_Unit (Cunit (Main_Unit)))
6223 elaborate_all_entities (Library_Unit (gnat_with_clause));
6225 if (Ekind (Entity (Name (gnat_with_clause))) == E_Package)
6227 for (gnat_entity = First_Entity (Entity (Name (gnat_with_clause)));
6228 Present (gnat_entity);
6229 gnat_entity = Next_Entity (gnat_entity))
6230 if (Is_Public (gnat_entity)
6231 && Convention (gnat_entity) != Convention_Intrinsic
6232 && Ekind (gnat_entity) != E_Package
6233 && Ekind (gnat_entity) != E_Package_Body
6234 && Ekind (gnat_entity) != E_Operator
6235 && !(IN (Ekind (gnat_entity), Type_Kind)
6236 && !Is_Frozen (gnat_entity))
6237 && !((Ekind (gnat_entity) == E_Procedure
6238 || Ekind (gnat_entity) == E_Function)
6239 && Is_Intrinsic_Subprogram (gnat_entity))
6240 && !IN (Ekind (gnat_entity), Named_Kind)
6241 && !IN (Ekind (gnat_entity), Generic_Unit_Kind))
6242 gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
6244 else if (Ekind (Entity (Name (gnat_with_clause))) == E_Generic_Package)
6247 = Corresponding_Body (Unit (Library_Unit (gnat_with_clause)));
6249 /* Retrieve compilation unit node of generic body. */
6250 while (Present (gnat_body)
6251 && Nkind (gnat_body) != N_Compilation_Unit)
6252 gnat_body = Parent (gnat_body);
6254 /* If body is available, elaborate its context. */
6255 if (Present (gnat_body))
6256 elaborate_all_entities (gnat_body);
6260 if (Nkind (Unit (gnat_node)) == N_Package_Body)
6261 elaborate_all_entities (Library_Unit (gnat_node));
6264 /* Do the processing of GNAT_NODE, an N_Freeze_Entity. */
6267 process_freeze_entity (Node_Id gnat_node)
6269 const Entity_Id gnat_entity = Entity (gnat_node);
6270 const Entity_Kind kind = Ekind (gnat_entity);
6271 tree gnu_old, gnu_new;
6273 /* If this is a package, we need to generate code for the package. */
6274 if (kind == E_Package)
6277 (Parent (Corresponding_Body
6278 (Parent (Declaration_Node (gnat_entity)))));
6282 /* Don't do anything for class-wide types as they are always transformed
6283 into their root type. */
6284 if (kind == E_Class_Wide_Type)
6287 /* Check for an old definition. This freeze node might be for an Itype. */
6289 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : NULL_TREE;
6291 /* If this entity has an address representation clause, GNU_OLD is the
6292 address, so discard it here. */
6293 if (Present (Address_Clause (gnat_entity)))
6294 gnu_old = NULL_TREE;
6296 /* Don't do anything for subprograms that may have been elaborated before
6297 their freeze nodes. This can happen, for example, because of an inner
6298 call in an instance body or because of previous compilation of a spec
6299 for inlining purposes. */
6301 && ((TREE_CODE (gnu_old) == FUNCTION_DECL
6302 && (kind == E_Function || kind == E_Procedure))
6303 || (TREE_CODE (TREE_TYPE (gnu_old)) == FUNCTION_TYPE
6304 && kind == E_Subprogram_Type)))
6307 /* If we have a non-dummy type old tree, we have nothing to do, except
6308 aborting if this is the public view of a private type whose full view was
6309 not delayed, as this node was never delayed as it should have been. We
6310 let this happen for concurrent types and their Corresponding_Record_Type,
6311 however, because each might legitimately be elaborated before its own
6312 freeze node, e.g. while processing the other. */
6314 && !(TREE_CODE (gnu_old) == TYPE_DECL
6315 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old))))
6317 gcc_assert ((IN (kind, Incomplete_Or_Private_Kind)
6318 && Present (Full_View (gnat_entity))
6319 && No (Freeze_Node (Full_View (gnat_entity))))
6320 || Is_Concurrent_Type (gnat_entity)
6321 || (IN (kind, Record_Kind)
6322 && Is_Concurrent_Record_Type (gnat_entity)));
6326 /* Reset the saved tree, if any, and elaborate the object or type for real.
6327 If there is a full view, elaborate it and use the result. And, if this
6328 is the root type of a class-wide type, reuse it for the latter. */
6331 save_gnu_tree (gnat_entity, NULL_TREE, false);
6332 if (IN (kind, Incomplete_Or_Private_Kind)
6333 && Present (Full_View (gnat_entity))
6334 && present_gnu_tree (Full_View (gnat_entity)))
6335 save_gnu_tree (Full_View (gnat_entity), NULL_TREE, false);
6336 if (IN (kind, Type_Kind)
6337 && Present (Class_Wide_Type (gnat_entity))
6338 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
6339 save_gnu_tree (Class_Wide_Type (gnat_entity), NULL_TREE, false);
6342 if (IN (kind, Incomplete_Or_Private_Kind)
6343 && Present (Full_View (gnat_entity)))
6345 gnu_new = gnat_to_gnu_entity (Full_View (gnat_entity), NULL_TREE, 1);
6347 /* Propagate back-annotations from full view to partial view. */
6348 if (Unknown_Alignment (gnat_entity))
6349 Set_Alignment (gnat_entity, Alignment (Full_View (gnat_entity)));
6351 if (Unknown_Esize (gnat_entity))
6352 Set_Esize (gnat_entity, Esize (Full_View (gnat_entity)));
6354 if (Unknown_RM_Size (gnat_entity))
6355 Set_RM_Size (gnat_entity, RM_Size (Full_View (gnat_entity)));
6357 /* The above call may have defined this entity (the simplest example
6358 of this is when we have a private enumeral type since the bounds
6359 will have the public view). */
6360 if (!present_gnu_tree (gnat_entity))
6361 save_gnu_tree (gnat_entity, gnu_new, false);
6366 = (Nkind (Declaration_Node (gnat_entity)) == N_Object_Declaration
6367 && present_gnu_tree (Declaration_Node (gnat_entity)))
6368 ? get_gnu_tree (Declaration_Node (gnat_entity)) : NULL_TREE;
6370 gnu_new = gnat_to_gnu_entity (gnat_entity, gnu_init, 1);
6373 if (IN (kind, Type_Kind)
6374 && Present (Class_Wide_Type (gnat_entity))
6375 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
6376 save_gnu_tree (Class_Wide_Type (gnat_entity), gnu_new, false);
6378 /* If we've made any pointers to the old version of this type, we
6379 have to update them. */
6381 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
6382 TREE_TYPE (gnu_new));
6385 /* Elaborate decls in the lists GNAT_DECLS and GNAT_DECLS2, if present.
6386 We make two passes, one to elaborate anything other than bodies (but
6387 we declare a function if there was no spec). The second pass
6388 elaborates the bodies.
6390 GNAT_END_LIST gives the element in the list past the end. Normally,
6391 this is Empty, but can be First_Real_Statement for a
6392 Handled_Sequence_Of_Statements.
6394 We make a complete pass through both lists if PASS1P is true, then make
6395 the second pass over both lists if PASS2P is true. The lists usually
6396 correspond to the public and private parts of a package. */
6399 process_decls (List_Id gnat_decls, List_Id gnat_decls2,
6400 Node_Id gnat_end_list, bool pass1p, bool pass2p)
6402 List_Id gnat_decl_array[2];
6406 gnat_decl_array[0] = gnat_decls, gnat_decl_array[1] = gnat_decls2;
6409 for (i = 0; i <= 1; i++)
6410 if (Present (gnat_decl_array[i]))
6411 for (gnat_decl = First (gnat_decl_array[i]);
6412 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
6414 /* For package specs, we recurse inside the declarations,
6415 thus taking the two pass approach inside the boundary. */
6416 if (Nkind (gnat_decl) == N_Package_Declaration
6417 && (Nkind (Specification (gnat_decl)
6418 == N_Package_Specification)))
6419 process_decls (Visible_Declarations (Specification (gnat_decl)),
6420 Private_Declarations (Specification (gnat_decl)),
6421 Empty, true, false);
6423 /* Similarly for any declarations in the actions of a
6425 else if (Nkind (gnat_decl) == N_Freeze_Entity)
6427 process_freeze_entity (gnat_decl);
6428 process_decls (Actions (gnat_decl), Empty, Empty, true, false);
6431 /* Package bodies with freeze nodes get their elaboration deferred
6432 until the freeze node, but the code must be placed in the right
6433 place, so record the code position now. */
6434 else if (Nkind (gnat_decl) == N_Package_Body
6435 && Present (Freeze_Node (Corresponding_Spec (gnat_decl))))
6436 record_code_position (gnat_decl);
6438 else if (Nkind (gnat_decl) == N_Package_Body_Stub
6439 && Present (Library_Unit (gnat_decl))
6440 && Present (Freeze_Node
6443 (Library_Unit (gnat_decl)))))))
6444 record_code_position
6445 (Proper_Body (Unit (Library_Unit (gnat_decl))));
6447 /* We defer most subprogram bodies to the second pass. */
6448 else if (Nkind (gnat_decl) == N_Subprogram_Body)
6450 if (Acts_As_Spec (gnat_decl))
6452 Node_Id gnat_subprog_id = Defining_Entity (gnat_decl);
6454 if (Ekind (gnat_subprog_id) != E_Generic_Procedure
6455 && Ekind (gnat_subprog_id) != E_Generic_Function)
6456 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
6460 /* For bodies and stubs that act as their own specs, the entity
6461 itself must be elaborated in the first pass, because it may
6462 be used in other declarations. */
6463 else if (Nkind (gnat_decl) == N_Subprogram_Body_Stub)
6465 Node_Id gnat_subprog_id
6466 = Defining_Entity (Specification (gnat_decl));
6468 if (Ekind (gnat_subprog_id) != E_Subprogram_Body
6469 && Ekind (gnat_subprog_id) != E_Generic_Procedure
6470 && Ekind (gnat_subprog_id) != E_Generic_Function)
6471 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
6474 /* Concurrent stubs stand for the corresponding subprogram bodies,
6475 which are deferred like other bodies. */
6476 else if (Nkind (gnat_decl) == N_Task_Body_Stub
6477 || Nkind (gnat_decl) == N_Protected_Body_Stub)
6481 add_stmt (gnat_to_gnu (gnat_decl));
6484 /* Here we elaborate everything we deferred above except for package bodies,
6485 which are elaborated at their freeze nodes. Note that we must also
6486 go inside things (package specs and freeze nodes) the first pass did. */
6488 for (i = 0; i <= 1; i++)
6489 if (Present (gnat_decl_array[i]))
6490 for (gnat_decl = First (gnat_decl_array[i]);
6491 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
6493 if (Nkind (gnat_decl) == N_Subprogram_Body
6494 || Nkind (gnat_decl) == N_Subprogram_Body_Stub
6495 || Nkind (gnat_decl) == N_Task_Body_Stub
6496 || Nkind (gnat_decl) == N_Protected_Body_Stub)
6497 add_stmt (gnat_to_gnu (gnat_decl));
6499 else if (Nkind (gnat_decl) == N_Package_Declaration
6500 && (Nkind (Specification (gnat_decl)
6501 == N_Package_Specification)))
6502 process_decls (Visible_Declarations (Specification (gnat_decl)),
6503 Private_Declarations (Specification (gnat_decl)),
6504 Empty, false, true);
6506 else if (Nkind (gnat_decl) == N_Freeze_Entity)
6507 process_decls (Actions (gnat_decl), Empty, Empty, false, true);
6511 /* Make a unary operation of kind CODE using build_unary_op, but guard
6512 the operation by an overflow check. CODE can be one of NEGATE_EXPR
6513 or ABS_EXPR. GNU_TYPE is the type desired for the result. Usually
6514 the operation is to be performed in that type. GNAT_NODE is the gnat
6515 node conveying the source location for which the error should be
6519 build_unary_op_trapv (enum tree_code code, tree gnu_type, tree operand,
6522 gcc_assert (code == NEGATE_EXPR || code == ABS_EXPR);
6524 operand = gnat_protect_expr (operand);
6526 return emit_check (build_binary_op (EQ_EXPR, boolean_type_node,
6527 operand, TYPE_MIN_VALUE (gnu_type)),
6528 build_unary_op (code, gnu_type, operand),
6529 CE_Overflow_Check_Failed, gnat_node);
6532 /* Make a binary operation of kind CODE using build_binary_op, but guard
6533 the operation by an overflow check. CODE can be one of PLUS_EXPR,
6534 MINUS_EXPR or MULT_EXPR. GNU_TYPE is the type desired for the result.
6535 Usually the operation is to be performed in that type. GNAT_NODE is
6536 the GNAT node conveying the source location for which the error should
6540 build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left,
6541 tree right, Node_Id gnat_node)
6543 tree lhs = gnat_protect_expr (left);
6544 tree rhs = gnat_protect_expr (right);
6545 tree type_max = TYPE_MAX_VALUE (gnu_type);
6546 tree type_min = TYPE_MIN_VALUE (gnu_type);
6549 tree zero = convert (gnu_type, integer_zero_node);
6554 int precision = TYPE_PRECISION (gnu_type);
6556 gcc_assert (!(precision & (precision - 1))); /* ensure power of 2 */
6558 /* Prefer a constant or known-positive rhs to simplify checks. */
6559 if (!TREE_CONSTANT (rhs)
6560 && commutative_tree_code (code)
6561 && (TREE_CONSTANT (lhs) || (!tree_expr_nonnegative_p (rhs)
6562 && tree_expr_nonnegative_p (lhs))))
6569 rhs_lt_zero = tree_expr_nonnegative_p (rhs)
6570 ? boolean_false_node
6571 : build_binary_op (LT_EXPR, boolean_type_node, rhs, zero);
6573 /* ??? Should use more efficient check for operand_equal_p (lhs, rhs, 0) */
6575 /* Try a few strategies that may be cheaper than the general
6576 code at the end of the function, if the rhs is not known.
6578 - Call library function for 64-bit multiplication (complex)
6579 - Widen, if input arguments are sufficiently small
6580 - Determine overflow using wrapped result for addition/subtraction. */
6582 if (!TREE_CONSTANT (rhs))
6584 /* Even for add/subtract double size to get another base type. */
6585 int needed_precision = precision * 2;
6587 if (code == MULT_EXPR && precision == 64)
6589 tree int_64 = gnat_type_for_size (64, 0);
6591 return convert (gnu_type, build_call_2_expr (mulv64_decl,
6592 convert (int_64, lhs),
6593 convert (int_64, rhs)));
6596 else if (needed_precision <= BITS_PER_WORD
6597 || (code == MULT_EXPR
6598 && needed_precision <= LONG_LONG_TYPE_SIZE))
6600 tree wide_type = gnat_type_for_size (needed_precision, 0);
6602 tree wide_result = build_binary_op (code, wide_type,
6603 convert (wide_type, lhs),
6604 convert (wide_type, rhs));
6606 tree check = build_binary_op
6607 (TRUTH_ORIF_EXPR, boolean_type_node,
6608 build_binary_op (LT_EXPR, boolean_type_node, wide_result,
6609 convert (wide_type, type_min)),
6610 build_binary_op (GT_EXPR, boolean_type_node, wide_result,
6611 convert (wide_type, type_max)));
6613 tree result = convert (gnu_type, wide_result);
6616 emit_check (check, result, CE_Overflow_Check_Failed, gnat_node);
6619 else if (code == PLUS_EXPR || code == MINUS_EXPR)
6621 tree unsigned_type = gnat_type_for_size (precision, 1);
6622 tree wrapped_expr = convert
6623 (gnu_type, build_binary_op (code, unsigned_type,
6624 convert (unsigned_type, lhs),
6625 convert (unsigned_type, rhs)));
6627 tree result = convert
6628 (gnu_type, build_binary_op (code, gnu_type, lhs, rhs));
6630 /* Overflow when (rhs < 0) ^ (wrapped_expr < lhs)), for addition
6631 or when (rhs < 0) ^ (wrapped_expr > lhs) for subtraction. */
6632 tree check = build_binary_op
6633 (TRUTH_XOR_EXPR, boolean_type_node, rhs_lt_zero,
6634 build_binary_op (code == PLUS_EXPR ? LT_EXPR : GT_EXPR,
6635 boolean_type_node, wrapped_expr, lhs));
6638 emit_check (check, result, CE_Overflow_Check_Failed, gnat_node);
6645 /* When rhs >= 0, overflow when lhs > type_max - rhs. */
6646 check_pos = build_binary_op (GT_EXPR, boolean_type_node, lhs,
6647 build_binary_op (MINUS_EXPR, gnu_type,
6650 /* When rhs < 0, overflow when lhs < type_min - rhs. */
6651 check_neg = build_binary_op (LT_EXPR, boolean_type_node, lhs,
6652 build_binary_op (MINUS_EXPR, gnu_type,
6657 /* When rhs >= 0, overflow when lhs < type_min + rhs. */
6658 check_pos = build_binary_op (LT_EXPR, boolean_type_node, lhs,
6659 build_binary_op (PLUS_EXPR, gnu_type,
6662 /* When rhs < 0, overflow when lhs > type_max + rhs. */
6663 check_neg = build_binary_op (GT_EXPR, boolean_type_node, lhs,
6664 build_binary_op (PLUS_EXPR, gnu_type,
6669 /* The check here is designed to be efficient if the rhs is constant,
6670 but it will work for any rhs by using integer division.
6671 Four different check expressions determine wether X * C overflows,
6674 C > 0 => X > type_max / C || X < type_min / C
6675 C == -1 => X == type_min
6676 C < -1 => X > type_min / C || X < type_max / C */
6678 tmp1 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_max, rhs);
6679 tmp2 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_min, rhs);
6682 = build_binary_op (TRUTH_ANDIF_EXPR, boolean_type_node,
6683 build_binary_op (NE_EXPR, boolean_type_node, zero,
6685 build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6686 build_binary_op (GT_EXPR,
6689 build_binary_op (LT_EXPR,
6694 = fold_build3 (COND_EXPR, boolean_type_node,
6695 build_binary_op (EQ_EXPR, boolean_type_node, rhs,
6696 build_int_cst (gnu_type, -1)),
6697 build_binary_op (EQ_EXPR, boolean_type_node, lhs,
6699 build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6700 build_binary_op (GT_EXPR,
6703 build_binary_op (LT_EXPR,
6712 gnu_expr = build_binary_op (code, gnu_type, lhs, rhs);
6714 /* If we can fold the expression to a constant, just return it.
6715 The caller will deal with overflow, no need to generate a check. */
6716 if (TREE_CONSTANT (gnu_expr))
6719 check = fold_build3 (COND_EXPR, boolean_type_node, rhs_lt_zero, check_neg,
6722 return emit_check (check, gnu_expr, CE_Overflow_Check_Failed, gnat_node);
6725 /* Emit code for a range check. GNU_EXPR is the expression to be checked,
6726 GNAT_RANGE_TYPE the gnat type or subtype containing the bounds against
6727 which we have to check. GNAT_NODE is the GNAT node conveying the source
6728 location for which the error should be signaled. */
6731 emit_range_check (tree gnu_expr, Entity_Id gnat_range_type, Node_Id gnat_node)
6733 tree gnu_range_type = get_unpadded_type (gnat_range_type);
6734 tree gnu_low = TYPE_MIN_VALUE (gnu_range_type);
6735 tree gnu_high = TYPE_MAX_VALUE (gnu_range_type);
6736 tree gnu_compare_type = get_base_type (TREE_TYPE (gnu_expr));
6738 /* If GNU_EXPR has GNAT_RANGE_TYPE as its base type, no check is needed.
6739 This can for example happen when translating 'Val or 'Value. */
6740 if (gnu_compare_type == gnu_range_type)
6743 /* If GNU_EXPR has an integral type that is narrower than GNU_RANGE_TYPE,
6744 we can't do anything since we might be truncating the bounds. No
6745 check is needed in this case. */
6746 if (INTEGRAL_TYPE_P (TREE_TYPE (gnu_expr))
6747 && (TYPE_PRECISION (gnu_compare_type)
6748 < TYPE_PRECISION (get_base_type (gnu_range_type))))
6751 /* Checked expressions must be evaluated only once. */
6752 gnu_expr = gnat_protect_expr (gnu_expr);
6754 /* Note that the form of the check is
6755 (not (expr >= lo)) or (not (expr <= hi))
6756 the reason for this slightly convoluted form is that NaNs
6757 are not considered to be in range in the float case. */
6759 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6761 (build_binary_op (GE_EXPR, boolean_type_node,
6762 convert (gnu_compare_type, gnu_expr),
6763 convert (gnu_compare_type, gnu_low))),
6765 (build_binary_op (LE_EXPR, boolean_type_node,
6766 convert (gnu_compare_type, gnu_expr),
6767 convert (gnu_compare_type,
6769 gnu_expr, CE_Range_Check_Failed, gnat_node);
6772 /* Emit code for an index check. GNU_ARRAY_OBJECT is the array object which
6773 we are about to index, GNU_EXPR is the index expression to be checked,
6774 GNU_LOW and GNU_HIGH are the lower and upper bounds against which GNU_EXPR
6775 has to be checked. Note that for index checking we cannot simply use the
6776 emit_range_check function (although very similar code needs to be generated
6777 in both cases) since for index checking the array type against which we are
6778 checking the indices may be unconstrained and consequently we need to get
6779 the actual index bounds from the array object itself (GNU_ARRAY_OBJECT).
6780 The place where we need to do that is in subprograms having unconstrained
6781 array formal parameters. GNAT_NODE is the GNAT node conveying the source
6782 location for which the error should be signaled. */
6785 emit_index_check (tree gnu_array_object, tree gnu_expr, tree gnu_low,
6786 tree gnu_high, Node_Id gnat_node)
6788 tree gnu_expr_check;
6790 /* Checked expressions must be evaluated only once. */
6791 gnu_expr = gnat_protect_expr (gnu_expr);
6793 /* Must do this computation in the base type in case the expression's
6794 type is an unsigned subtypes. */
6795 gnu_expr_check = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
6797 /* If GNU_LOW or GNU_HIGH are a PLACEHOLDER_EXPR, qualify them by
6798 the object we are handling. */
6799 gnu_low = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_low, gnu_array_object);
6800 gnu_high = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_high, gnu_array_object);
6803 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6804 build_binary_op (LT_EXPR, boolean_type_node,
6806 convert (TREE_TYPE (gnu_expr_check),
6808 build_binary_op (GT_EXPR, boolean_type_node,
6810 convert (TREE_TYPE (gnu_expr_check),
6812 gnu_expr, CE_Index_Check_Failed, gnat_node);
6815 /* GNU_COND contains the condition corresponding to an access, discriminant or
6816 range check of value GNU_EXPR. Build a COND_EXPR that returns GNU_EXPR if
6817 GNU_COND is false and raises a CONSTRAINT_ERROR if GNU_COND is true.
6818 REASON is the code that says why the exception was raised. GNAT_NODE is
6819 the GNAT node conveying the source location for which the error should be
6823 emit_check (tree gnu_cond, tree gnu_expr, int reason, Node_Id gnat_node)
6826 = build_call_raise (reason, gnat_node, N_Raise_Constraint_Error);
6828 = fold_build3 (COND_EXPR, TREE_TYPE (gnu_expr), gnu_cond,
6829 build2 (COMPOUND_EXPR, TREE_TYPE (gnu_expr), gnu_call,
6830 convert (TREE_TYPE (gnu_expr), integer_zero_node)),
6833 /* GNU_RESULT has side effects if and only if GNU_EXPR has:
6834 we don't need to evaluate it just for the check. */
6835 TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr);
6840 /* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing overflow
6841 checks if OVERFLOW_P is true and range checks if RANGE_P is true.
6842 GNAT_TYPE is known to be an integral type. If TRUNCATE_P true, do a
6843 float to integer conversion with truncation; otherwise round.
6844 GNAT_NODE is the GNAT node conveying the source location for which the
6845 error should be signaled. */
6848 convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp,
6849 bool rangep, bool truncatep, Node_Id gnat_node)
6851 tree gnu_type = get_unpadded_type (gnat_type);
6852 tree gnu_in_type = TREE_TYPE (gnu_expr);
6853 tree gnu_in_basetype = get_base_type (gnu_in_type);
6854 tree gnu_base_type = get_base_type (gnu_type);
6855 tree gnu_result = gnu_expr;
6857 /* If we are not doing any checks, the output is an integral type, and
6858 the input is not a floating type, just do the conversion. This
6859 shortcut is required to avoid problems with packed array types
6860 and simplifies code in all cases anyway. */
6861 if (!rangep && !overflowp && INTEGRAL_TYPE_P (gnu_base_type)
6862 && !FLOAT_TYPE_P (gnu_in_type))
6863 return convert (gnu_type, gnu_expr);
6865 /* First convert the expression to its base type. This
6866 will never generate code, but makes the tests below much simpler.
6867 But don't do this if converting from an integer type to an unconstrained
6868 array type since then we need to get the bounds from the original
6870 if (TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE)
6871 gnu_result = convert (gnu_in_basetype, gnu_result);
6873 /* If overflow checks are requested, we need to be sure the result will
6874 fit in the output base type. But don't do this if the input
6875 is integer and the output floating-point. */
6877 && !(FLOAT_TYPE_P (gnu_base_type) && INTEGRAL_TYPE_P (gnu_in_basetype)))
6879 /* Ensure GNU_EXPR only gets evaluated once. */
6880 tree gnu_input = gnat_protect_expr (gnu_result);
6881 tree gnu_cond = integer_zero_node;
6882 tree gnu_in_lb = TYPE_MIN_VALUE (gnu_in_basetype);
6883 tree gnu_in_ub = TYPE_MAX_VALUE (gnu_in_basetype);
6884 tree gnu_out_lb = TYPE_MIN_VALUE (gnu_base_type);
6885 tree gnu_out_ub = TYPE_MAX_VALUE (gnu_base_type);
6887 /* Convert the lower bounds to signed types, so we're sure we're
6888 comparing them properly. Likewise, convert the upper bounds
6889 to unsigned types. */
6890 if (INTEGRAL_TYPE_P (gnu_in_basetype) && TYPE_UNSIGNED (gnu_in_basetype))
6891 gnu_in_lb = convert (gnat_signed_type (gnu_in_basetype), gnu_in_lb);
6893 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6894 && !TYPE_UNSIGNED (gnu_in_basetype))
6895 gnu_in_ub = convert (gnat_unsigned_type (gnu_in_basetype), gnu_in_ub);
6897 if (INTEGRAL_TYPE_P (gnu_base_type) && TYPE_UNSIGNED (gnu_base_type))
6898 gnu_out_lb = convert (gnat_signed_type (gnu_base_type), gnu_out_lb);
6900 if (INTEGRAL_TYPE_P (gnu_base_type) && !TYPE_UNSIGNED (gnu_base_type))
6901 gnu_out_ub = convert (gnat_unsigned_type (gnu_base_type), gnu_out_ub);
6903 /* Check each bound separately and only if the result bound
6904 is tighter than the bound on the input type. Note that all the
6905 types are base types, so the bounds must be constant. Also,
6906 the comparison is done in the base type of the input, which
6907 always has the proper signedness. First check for input
6908 integer (which means output integer), output float (which means
6909 both float), or mixed, in which case we always compare.
6910 Note that we have to do the comparison which would *fail* in the
6911 case of an error since if it's an FP comparison and one of the
6912 values is a NaN or Inf, the comparison will fail. */
6913 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6914 ? tree_int_cst_lt (gnu_in_lb, gnu_out_lb)
6915 : (FLOAT_TYPE_P (gnu_base_type)
6916 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_in_lb),
6917 TREE_REAL_CST (gnu_out_lb))
6921 (build_binary_op (GE_EXPR, boolean_type_node,
6922 gnu_input, convert (gnu_in_basetype,
6925 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6926 ? tree_int_cst_lt (gnu_out_ub, gnu_in_ub)
6927 : (FLOAT_TYPE_P (gnu_base_type)
6928 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_out_ub),
6929 TREE_REAL_CST (gnu_in_lb))
6932 = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node, gnu_cond,
6934 (build_binary_op (LE_EXPR, boolean_type_node,
6936 convert (gnu_in_basetype,
6939 if (!integer_zerop (gnu_cond))
6940 gnu_result = emit_check (gnu_cond, gnu_input,
6941 CE_Overflow_Check_Failed, gnat_node);
6944 /* Now convert to the result base type. If this is a non-truncating
6945 float-to-integer conversion, round. */
6946 if (INTEGRAL_TYPE_P (gnu_base_type) && FLOAT_TYPE_P (gnu_in_basetype)
6949 REAL_VALUE_TYPE half_minus_pred_half, pred_half;
6950 tree gnu_conv, gnu_zero, gnu_comp, calc_type;
6951 tree gnu_pred_half, gnu_add_pred_half, gnu_subtract_pred_half;
6952 const struct real_format *fmt;
6954 /* The following calculations depend on proper rounding to even
6955 of each arithmetic operation. In order to prevent excess
6956 precision from spoiling this property, use the widest hardware
6957 floating-point type if FP_ARITH_MAY_WIDEN is true. */
6959 = FP_ARITH_MAY_WIDEN ? longest_float_type_node : gnu_in_basetype;
6961 /* FIXME: Should not have padding in the first place. */
6962 if (TYPE_IS_PADDING_P (calc_type))
6963 calc_type = TREE_TYPE (TYPE_FIELDS (calc_type));
6965 /* Compute the exact value calc_type'Pred (0.5) at compile time. */
6966 fmt = REAL_MODE_FORMAT (TYPE_MODE (calc_type));
6967 real_2expN (&half_minus_pred_half, -(fmt->p) - 1, TYPE_MODE (calc_type));
6968 REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf,
6969 half_minus_pred_half);
6970 gnu_pred_half = build_real (calc_type, pred_half);
6972 /* If the input is strictly negative, subtract this value
6973 and otherwise add it from the input. For 0.5, the result
6974 is exactly between 1.0 and the machine number preceding 1.0
6975 (for calc_type). Since the last bit of 1.0 is even, this 0.5
6976 will round to 1.0, while all other number with an absolute
6977 value less than 0.5 round to 0.0. For larger numbers exactly
6978 halfway between integers, rounding will always be correct as
6979 the true mathematical result will be closer to the higher
6980 integer compared to the lower one. So, this constant works
6981 for all floating-point numbers.
6983 The reason to use the same constant with subtract/add instead
6984 of a positive and negative constant is to allow the comparison
6985 to be scheduled in parallel with retrieval of the constant and
6986 conversion of the input to the calc_type (if necessary). */
6988 gnu_zero = convert (gnu_in_basetype, integer_zero_node);
6989 gnu_result = gnat_protect_expr (gnu_result);
6990 gnu_conv = convert (calc_type, gnu_result);
6992 = fold_build2 (GE_EXPR, boolean_type_node, gnu_result, gnu_zero);
6994 = fold_build2 (PLUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
6995 gnu_subtract_pred_half
6996 = fold_build2 (MINUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
6997 gnu_result = fold_build3 (COND_EXPR, calc_type, gnu_comp,
6998 gnu_add_pred_half, gnu_subtract_pred_half);
7001 if (TREE_CODE (gnu_base_type) == INTEGER_TYPE
7002 && TYPE_HAS_ACTUAL_BOUNDS_P (gnu_base_type)
7003 && TREE_CODE (gnu_result) == UNCONSTRAINED_ARRAY_REF)
7004 gnu_result = unchecked_convert (gnu_base_type, gnu_result, false);
7006 gnu_result = convert (gnu_base_type, gnu_result);
7008 /* Finally, do the range check if requested. Note that if the result type
7009 is a modular type, the range check is actually an overflow check. */
7011 || (TREE_CODE (gnu_base_type) == INTEGER_TYPE
7012 && TYPE_MODULAR_P (gnu_base_type) && overflowp))
7013 gnu_result = emit_range_check (gnu_result, gnat_type, gnat_node);
7015 return convert (gnu_type, gnu_result);
7018 /* Return true if TYPE is a smaller form of ORIG_TYPE. */
7021 smaller_form_type_p (tree type, tree orig_type)
7025 /* We're not interested in variants here. */
7026 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig_type))
7029 /* Like a variant, a packable version keeps the original TYPE_NAME. */
7030 if (TYPE_NAME (type) != TYPE_NAME (orig_type))
7033 size = TYPE_SIZE (type);
7034 osize = TYPE_SIZE (orig_type);
7036 if (!(TREE_CODE (size) == INTEGER_CST && TREE_CODE (osize) == INTEGER_CST))
7039 return tree_int_cst_lt (size, osize) != 0;
7042 /* Return true if GNU_EXPR can be directly addressed. This is the case
7043 unless it is an expression involving computation or if it involves a
7044 reference to a bitfield or to an object not sufficiently aligned for
7045 its type. If GNU_TYPE is non-null, return true only if GNU_EXPR can
7046 be directly addressed as an object of this type.
7048 *** Notes on addressability issues in the Ada compiler ***
7050 This predicate is necessary in order to bridge the gap between Gigi
7051 and the middle-end about addressability of GENERIC trees. A tree
7052 is said to be addressable if it can be directly addressed, i.e. if
7053 its address can be taken, is a multiple of the type's alignment on
7054 strict-alignment architectures and returns the first storage unit
7055 assigned to the object represented by the tree.
7057 In the C family of languages, everything is in practice addressable
7058 at the language level, except for bit-fields. This means that these
7059 compilers will take the address of any tree that doesn't represent
7060 a bit-field reference and expect the result to be the first storage
7061 unit assigned to the object. Even in cases where this will result
7062 in unaligned accesses at run time, nothing is supposed to be done
7063 and the program is considered as erroneous instead (see PR c/18287).
7065 The implicit assumptions made in the middle-end are in keeping with
7066 the C viewpoint described above:
7067 - the address of a bit-field reference is supposed to be never
7068 taken; the compiler (generally) will stop on such a construct,
7069 - any other tree is addressable if it is formally addressable,
7070 i.e. if it is formally allowed to be the operand of ADDR_EXPR.
7072 In Ada, the viewpoint is the opposite one: nothing is addressable
7073 at the language level unless explicitly declared so. This means
7074 that the compiler will both make sure that the trees representing
7075 references to addressable ("aliased" in Ada parlance) objects are
7076 addressable and make no real attempts at ensuring that the trees
7077 representing references to non-addressable objects are addressable.
7079 In the first case, Ada is effectively equivalent to C and handing
7080 down the direct result of applying ADDR_EXPR to these trees to the
7081 middle-end works flawlessly. In the second case, Ada cannot afford
7082 to consider the program as erroneous if the address of trees that
7083 are not addressable is requested for technical reasons, unlike C;
7084 as a consequence, the Ada compiler must arrange for either making
7085 sure that this address is not requested in the middle-end or for
7086 compensating by inserting temporaries if it is requested in Gigi.
7088 The first goal can be achieved because the middle-end should not
7089 request the address of non-addressable trees on its own; the only
7090 exception is for the invocation of low-level block operations like
7091 memcpy, for which the addressability requirements are lower since
7092 the type's alignment can be disregarded. In practice, this means
7093 that Gigi must make sure that such operations cannot be applied to
7094 non-BLKmode bit-fields.
7096 The second goal is achieved by means of the addressable_p predicate
7097 and by inserting SAVE_EXPRs around trees deemed non-addressable.
7098 They will be turned during gimplification into proper temporaries
7099 whose address will be used in lieu of that of the original tree. */
7102 addressable_p (tree gnu_expr, tree gnu_type)
7104 /* For an integral type, the size of the actual type of the object may not
7105 be greater than that of the expected type, otherwise an indirect access
7106 in the latter type wouldn't correctly set all the bits of the object. */
7108 && INTEGRAL_TYPE_P (gnu_type)
7109 && smaller_form_type_p (gnu_type, TREE_TYPE (gnu_expr)))
7112 /* The size of the actual type of the object may not be smaller than that
7113 of the expected type, otherwise an indirect access in the latter type
7114 would be larger than the object. But only record types need to be
7115 considered in practice for this case. */
7117 && TREE_CODE (gnu_type) == RECORD_TYPE
7118 && smaller_form_type_p (TREE_TYPE (gnu_expr), gnu_type))
7121 switch (TREE_CODE (gnu_expr))
7127 /* All DECLs are addressable: if they are in a register, we can force
7131 case UNCONSTRAINED_ARRAY_REF:
7133 /* Taking the address of a dereference yields the original pointer. */
7138 /* Taking the address yields a pointer to the constant pool. */
7142 /* Taking the address of a static constructor yields a pointer to the
7143 tree constant pool. */
7144 return TREE_STATIC (gnu_expr) ? true : false;
7155 /* All rvalues are deemed addressable since taking their address will
7156 force a temporary to be created by the middle-end. */
7160 /* The address of a compound expression is that of its 2nd operand. */
7161 return addressable_p (TREE_OPERAND (gnu_expr, 1), gnu_type);
7164 /* We accept &COND_EXPR as soon as both operands are addressable and
7165 expect the outcome to be the address of the selected operand. */
7166 return (addressable_p (TREE_OPERAND (gnu_expr, 1), NULL_TREE)
7167 && addressable_p (TREE_OPERAND (gnu_expr, 2), NULL_TREE));
7170 return (((!DECL_BIT_FIELD (TREE_OPERAND (gnu_expr, 1))
7171 /* Even with DECL_BIT_FIELD cleared, we have to ensure that
7172 the field is sufficiently aligned, in case it is subject
7173 to a pragma Component_Alignment. But we don't need to
7174 check the alignment of the containing record, as it is
7175 guaranteed to be not smaller than that of its most
7176 aligned field that is not a bit-field. */
7177 && (!STRICT_ALIGNMENT
7178 || DECL_ALIGN (TREE_OPERAND (gnu_expr, 1))
7179 >= TYPE_ALIGN (TREE_TYPE (gnu_expr))))
7180 /* The field of a padding record is always addressable. */
7181 || TYPE_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))))
7182 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
7184 case ARRAY_REF: case ARRAY_RANGE_REF:
7185 case REALPART_EXPR: case IMAGPART_EXPR:
7187 return addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE);
7190 return (AGGREGATE_TYPE_P (TREE_TYPE (gnu_expr))
7191 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
7193 case VIEW_CONVERT_EXPR:
7195 /* This is addressable if we can avoid a copy. */
7196 tree type = TREE_TYPE (gnu_expr);
7197 tree inner_type = TREE_TYPE (TREE_OPERAND (gnu_expr, 0));
7198 return (((TYPE_MODE (type) == TYPE_MODE (inner_type)
7199 && (!STRICT_ALIGNMENT
7200 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
7201 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT))
7202 || ((TYPE_MODE (type) == BLKmode
7203 || TYPE_MODE (inner_type) == BLKmode)
7204 && (!STRICT_ALIGNMENT
7205 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
7206 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT
7207 || TYPE_ALIGN_OK (type)
7208 || TYPE_ALIGN_OK (inner_type))))
7209 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
7217 /* Do the processing for the declaration of a GNAT_ENTITY, a type. If
7218 a separate Freeze node exists, delay the bulk of the processing. Otherwise
7219 make a GCC type for GNAT_ENTITY and set up the correspondence. */
7222 process_type (Entity_Id gnat_entity)
7225 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : 0;
7228 /* If we are to delay elaboration of this type, just do any
7229 elaborations needed for expressions within the declaration and
7230 make a dummy type entry for this node and its Full_View (if
7231 any) in case something points to it. Don't do this if it
7232 has already been done (the only way that can happen is if
7233 the private completion is also delayed). */
7234 if (Present (Freeze_Node (gnat_entity))
7235 || (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
7236 && Present (Full_View (gnat_entity))
7237 && Freeze_Node (Full_View (gnat_entity))
7238 && !present_gnu_tree (Full_View (gnat_entity))))
7240 elaborate_entity (gnat_entity);
7244 tree gnu_decl = TYPE_STUB_DECL (make_dummy_type (gnat_entity));
7245 save_gnu_tree (gnat_entity, gnu_decl, false);
7246 if (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
7247 && Present (Full_View (gnat_entity)))
7248 save_gnu_tree (Full_View (gnat_entity), gnu_decl, false);
7254 /* If we saved away a dummy type for this node it means that this
7255 made the type that corresponds to the full type of an incomplete
7256 type. Clear that type for now and then update the type in the
7260 gcc_assert (TREE_CODE (gnu_old) == TYPE_DECL
7261 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old)));
7263 save_gnu_tree (gnat_entity, NULL_TREE, false);
7266 /* Now fully elaborate the type. */
7267 gnu_new = gnat_to_gnu_entity (gnat_entity, NULL_TREE, 1);
7268 gcc_assert (TREE_CODE (gnu_new) == TYPE_DECL);
7270 /* If we have an old type and we've made pointers to this type,
7271 update those pointers. */
7273 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
7274 TREE_TYPE (gnu_new));
7276 /* If this is a record type corresponding to a task or protected type
7277 that is a completion of an incomplete type, perform a similar update
7278 on the type. ??? Including protected types here is a guess. */
7279 if (IN (Ekind (gnat_entity), Record_Kind)
7280 && Is_Concurrent_Record_Type (gnat_entity)
7281 && present_gnu_tree (Corresponding_Concurrent_Type (gnat_entity)))
7284 = get_gnu_tree (Corresponding_Concurrent_Type (gnat_entity));
7286 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
7288 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
7291 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_task_old)),
7292 TREE_TYPE (gnu_new));
7296 /* GNAT_ENTITY is the type of the resulting constructors,
7297 GNAT_ASSOC is the front of the Component_Associations of an N_Aggregate,
7298 and GNU_TYPE is the GCC type of the corresponding record.
7300 Return a CONSTRUCTOR to build the record. */
7303 assoc_to_constructor (Entity_Id gnat_entity, Node_Id gnat_assoc, tree gnu_type)
7305 tree gnu_list, gnu_result;
7307 /* We test for GNU_FIELD being empty in the case where a variant
7308 was the last thing since we don't take things off GNAT_ASSOC in
7309 that case. We check GNAT_ASSOC in case we have a variant, but it
7312 for (gnu_list = NULL_TREE; Present (gnat_assoc);
7313 gnat_assoc = Next (gnat_assoc))
7315 Node_Id gnat_field = First (Choices (gnat_assoc));
7316 tree gnu_field = gnat_to_gnu_field_decl (Entity (gnat_field));
7317 tree gnu_expr = gnat_to_gnu (Expression (gnat_assoc));
7319 /* The expander is supposed to put a single component selector name
7320 in every record component association. */
7321 gcc_assert (No (Next (gnat_field)));
7323 /* Ignore fields that have Corresponding_Discriminants since we'll
7324 be setting that field in the parent. */
7325 if (Present (Corresponding_Discriminant (Entity (gnat_field)))
7326 && Is_Tagged_Type (Scope (Entity (gnat_field))))
7329 /* Also ignore discriminants of Unchecked_Unions. */
7330 else if (Is_Unchecked_Union (gnat_entity)
7331 && Ekind (Entity (gnat_field)) == E_Discriminant)
7334 /* Before assigning a value in an aggregate make sure range checks
7335 are done if required. Then convert to the type of the field. */
7336 if (Do_Range_Check (Expression (gnat_assoc)))
7337 gnu_expr = emit_range_check (gnu_expr, Etype (gnat_field), Empty);
7339 gnu_expr = convert (TREE_TYPE (gnu_field), gnu_expr);
7341 /* Add the field and expression to the list. */
7342 gnu_list = tree_cons (gnu_field, gnu_expr, gnu_list);
7345 gnu_result = extract_values (gnu_list, gnu_type);
7347 #ifdef ENABLE_CHECKING
7351 /* Verify every entry in GNU_LIST was used. */
7352 for (gnu_field = gnu_list; gnu_field; gnu_field = TREE_CHAIN (gnu_field))
7353 gcc_assert (TREE_ADDRESSABLE (gnu_field));
7360 /* Build a possibly nested constructor for array aggregates. GNAT_EXPR is
7361 the first element of an array aggregate. It may itself be an aggregate.
7362 GNU_ARRAY_TYPE is the GCC type corresponding to the array aggregate.
7363 GNAT_COMPONENT_TYPE is the type of the array component; it is needed
7364 for range checking. */
7367 pos_to_constructor (Node_Id gnat_expr, tree gnu_array_type,
7368 Entity_Id gnat_component_type)
7370 tree gnu_expr_list = NULL_TREE;
7371 tree gnu_index = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_array_type));
7374 for ( ; Present (gnat_expr); gnat_expr = Next (gnat_expr))
7376 /* If the expression is itself an array aggregate then first build the
7377 innermost constructor if it is part of our array (multi-dimensional
7379 if (Nkind (gnat_expr) == N_Aggregate
7380 && TREE_CODE (TREE_TYPE (gnu_array_type)) == ARRAY_TYPE
7381 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_array_type)))
7382 gnu_expr = pos_to_constructor (First (Expressions (gnat_expr)),
7383 TREE_TYPE (gnu_array_type),
7384 gnat_component_type);
7387 gnu_expr = gnat_to_gnu (gnat_expr);
7389 /* Before assigning the element to the array, make sure it is
7391 if (Do_Range_Check (gnat_expr))
7392 gnu_expr = emit_range_check (gnu_expr, gnat_component_type, Empty);
7396 = tree_cons (gnu_index, convert (TREE_TYPE (gnu_array_type), gnu_expr),
7399 gnu_index = int_const_binop (PLUS_EXPR, gnu_index, integer_one_node, 0);
7402 return gnat_build_constructor (gnu_array_type, nreverse (gnu_expr_list));
7405 /* Subroutine of assoc_to_constructor: VALUES is a list of field associations,
7406 some of which are from RECORD_TYPE. Return a CONSTRUCTOR consisting
7407 of the associations that are from RECORD_TYPE. If we see an internal
7408 record, make a recursive call to fill it in as well. */
7411 extract_values (tree values, tree record_type)
7413 tree result = NULL_TREE;
7416 for (field = TYPE_FIELDS (record_type); field; field = TREE_CHAIN (field))
7420 /* _Parent is an internal field, but may have values in the aggregate,
7421 so check for values first. */
7422 if ((tem = purpose_member (field, values)))
7424 value = TREE_VALUE (tem);
7425 TREE_ADDRESSABLE (tem) = 1;
7428 else if (DECL_INTERNAL_P (field))
7430 value = extract_values (values, TREE_TYPE (field));
7431 if (TREE_CODE (value) == CONSTRUCTOR
7432 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (value)))
7436 /* If we have a record subtype, the names will match, but not the
7437 actual FIELD_DECLs. */
7438 for (tem = values; tem; tem = TREE_CHAIN (tem))
7439 if (DECL_NAME (TREE_PURPOSE (tem)) == DECL_NAME (field))
7441 value = convert (TREE_TYPE (field), TREE_VALUE (tem));
7442 TREE_ADDRESSABLE (tem) = 1;
7448 result = tree_cons (field, value, result);
7451 return gnat_build_constructor (record_type, nreverse (result));
7454 /* EXP is to be treated as an array or record. Handle the cases when it is
7455 an access object and perform the required dereferences. */
7458 maybe_implicit_deref (tree exp)
7460 /* If the type is a pointer, dereference it. */
7461 if (POINTER_TYPE_P (TREE_TYPE (exp))
7462 || TYPE_IS_FAT_POINTER_P (TREE_TYPE (exp)))
7463 exp = build_unary_op (INDIRECT_REF, NULL_TREE, exp);
7465 /* If we got a padded type, remove it too. */
7466 if (TYPE_IS_PADDING_P (TREE_TYPE (exp)))
7467 exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
7472 /* Convert SLOC into LOCUS. Return true if SLOC corresponds to a source code
7473 location and false if it doesn't. In the former case, set the Gigi global
7474 variable REF_FILENAME to the simple debug file name as given by sinput. */
7477 Sloc_to_locus (Source_Ptr Sloc, location_t *locus)
7479 if (Sloc == No_Location)
7482 if (Sloc <= Standard_Location)
7484 *locus = BUILTINS_LOCATION;
7489 Source_File_Index file = Get_Source_File_Index (Sloc);
7490 Logical_Line_Number line = Get_Logical_Line_Number (Sloc);
7491 Column_Number column = Get_Column_Number (Sloc);
7492 struct line_map *map = &line_table->maps[file - 1];
7494 /* Translate the location according to the line-map.h formula. */
7495 *locus = map->start_location
7496 + ((line - map->to_line) << map->column_bits)
7497 + (column & ((1 << map->column_bits) - 1));
7501 = IDENTIFIER_POINTER
7503 (Get_Name_String (Debug_Source_Name (Get_Source_File_Index (Sloc)))));;
7508 /* Similar to set_expr_location, but start with the Sloc of GNAT_NODE and
7509 don't do anything if it doesn't correspond to a source location. */
7512 set_expr_location_from_node (tree node, Node_Id gnat_node)
7516 if (!Sloc_to_locus (Sloc (gnat_node), &locus))
7519 SET_EXPR_LOCATION (node, locus);
7522 /* Return a colon-separated list of encodings contained in encoded Ada
7526 extract_encoding (const char *name)
7528 char *encoding = GGC_NEWVEC (char, strlen (name));
7529 get_encoding (name, encoding);
7533 /* Extract the Ada name from an encoded name. */
7536 decode_name (const char *name)
7538 char *decoded = GGC_NEWVEC (char, strlen (name) * 2 + 60);
7539 __gnat_decode (name, decoded, 0);
7543 /* Post an error message. MSG is the error message, properly annotated.
7544 NODE is the node at which to post the error and the node to use for the
7545 '&' substitution. */
7548 post_error (const char *msg, Node_Id node)
7550 String_Template temp;
7553 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
7554 fp.Array = msg, fp.Bounds = &temp;
7556 Error_Msg_N (fp, node);
7559 /* Similar to post_error, but NODE is the node at which to post the error and
7560 ENT is the node to use for the '&' substitution. */
7563 post_error_ne (const char *msg, Node_Id node, Entity_Id ent)
7565 String_Template temp;
7568 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
7569 fp.Array = msg, fp.Bounds = &temp;
7571 Error_Msg_NE (fp, node, ent);
7574 /* Similar to post_error_ne, but NUM is the number to use for the '^'. */
7577 post_error_ne_num (const char *msg, Node_Id node, Entity_Id ent, int num)
7579 Error_Msg_Uint_1 = UI_From_Int (num);
7580 post_error_ne (msg, node, ent);
7583 /* Similar to post_error_ne, but T is a GCC tree representing the number to
7584 write. If T represents a constant, the text inside curly brackets in
7585 MSG will be output (presumably including a '^'). Otherwise it will not
7586 be output and the text inside square brackets will be output instead. */
7589 post_error_ne_tree (const char *msg, Node_Id node, Entity_Id ent, tree t)
7591 char *new_msg = XALLOCAVEC (char, strlen (msg) + 1);
7592 char start_yes, end_yes, start_no, end_no;
7596 if (TREE_CODE (t) == INTEGER_CST)
7598 Error_Msg_Uint_1 = UI_From_gnu (t);
7599 start_yes = '{', end_yes = '}', start_no = '[', end_no = ']';
7602 start_yes = '[', end_yes = ']', start_no = '{', end_no = '}';
7604 for (p = msg, q = new_msg; *p; p++)
7606 if (*p == start_yes)
7607 for (p++; *p != end_yes; p++)
7609 else if (*p == start_no)
7610 for (p++; *p != end_no; p++)
7618 post_error_ne (new_msg, node, ent);
7621 /* Similar to post_error_ne_tree, but NUM is a second integer to write. */
7624 post_error_ne_tree_2 (const char *msg, Node_Id node, Entity_Id ent, tree t,
7627 Error_Msg_Uint_2 = UI_From_Int (num);
7628 post_error_ne_tree (msg, node, ent, t);
7631 /* Initialize the table that maps GNAT codes to GCC codes for simple
7632 binary and unary operations. */
7635 init_code_table (void)
7637 gnu_codes[N_And_Then] = TRUTH_ANDIF_EXPR;
7638 gnu_codes[N_Or_Else] = TRUTH_ORIF_EXPR;
7640 gnu_codes[N_Op_And] = TRUTH_AND_EXPR;
7641 gnu_codes[N_Op_Or] = TRUTH_OR_EXPR;
7642 gnu_codes[N_Op_Xor] = TRUTH_XOR_EXPR;
7643 gnu_codes[N_Op_Eq] = EQ_EXPR;
7644 gnu_codes[N_Op_Ne] = NE_EXPR;
7645 gnu_codes[N_Op_Lt] = LT_EXPR;
7646 gnu_codes[N_Op_Le] = LE_EXPR;
7647 gnu_codes[N_Op_Gt] = GT_EXPR;
7648 gnu_codes[N_Op_Ge] = GE_EXPR;
7649 gnu_codes[N_Op_Add] = PLUS_EXPR;
7650 gnu_codes[N_Op_Subtract] = MINUS_EXPR;
7651 gnu_codes[N_Op_Multiply] = MULT_EXPR;
7652 gnu_codes[N_Op_Mod] = FLOOR_MOD_EXPR;
7653 gnu_codes[N_Op_Rem] = TRUNC_MOD_EXPR;
7654 gnu_codes[N_Op_Minus] = NEGATE_EXPR;
7655 gnu_codes[N_Op_Abs] = ABS_EXPR;
7656 gnu_codes[N_Op_Not] = TRUTH_NOT_EXPR;
7657 gnu_codes[N_Op_Rotate_Left] = LROTATE_EXPR;
7658 gnu_codes[N_Op_Rotate_Right] = RROTATE_EXPR;
7659 gnu_codes[N_Op_Shift_Left] = LSHIFT_EXPR;
7660 gnu_codes[N_Op_Shift_Right] = RSHIFT_EXPR;
7661 gnu_codes[N_Op_Shift_Right_Arithmetic] = RSHIFT_EXPR;
7664 /* Return a label to branch to for the exception type in KIND or NULL_TREE
7668 get_exception_label (char kind)
7670 if (kind == N_Raise_Constraint_Error)
7671 return TREE_VALUE (gnu_constraint_error_label_stack);
7672 else if (kind == N_Raise_Storage_Error)
7673 return TREE_VALUE (gnu_storage_error_label_stack);
7674 else if (kind == N_Raise_Program_Error)
7675 return TREE_VALUE (gnu_program_error_label_stack);
7680 #include "gt-ada-trans.h"