Merged r158229 through r158464 into branch.
[official-gcc.git] / gcc / ada / gcc-interface / trans.c
blob71c9e862aba6aa17395c7438836ecb1329acd855
1 /****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * T R A N S *
6 * *
7 * C Implementation File *
8 * *
9 * Copyright (C) 1992-2010, Free Software Foundation, Inc. *
10 * *
11 * GNAT is free software; you can redistribute it and/or modify it under *
12 * terms of the GNU General Public License as published by the Free Soft- *
13 * ware Foundation; either version 3, or (at your option) any later ver- *
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
17 * for more details. You should have received a copy of the GNU General *
18 * Public License distributed with GNAT; see file COPYING3. If not see *
19 * <http://www.gnu.org/licenses/>. *
20 * *
21 * GNAT was originally developed by the GNAT team at New York University. *
22 * Extensive contributions were provided by Ada Core Technologies Inc. *
23 * *
24 ****************************************************************************/
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "tree.h"
31 #include "flags.h"
32 #include "expr.h"
33 #include "ggc.h"
34 #include "output.h"
35 #include "tree-iterator.h"
36 #include "gimple.h"
38 #include "ada.h"
39 #include "adadecode.h"
40 #include "types.h"
41 #include "atree.h"
42 #include "elists.h"
43 #include "namet.h"
44 #include "nlists.h"
45 #include "snames.h"
46 #include "stringt.h"
47 #include "uintp.h"
48 #include "urealp.h"
49 #include "fe.h"
50 #include "sinfo.h"
51 #include "einfo.h"
52 #include "gadaint.h"
53 #include "ada-tree.h"
54 #include "gigi.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
58 instead. */
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
65 #endif
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
74 #else
75 #define FP_ARITH_MAY_WIDEN 0
76 #endif
77 #endif
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. */
90 int max_gnat_nodes;
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. */
108 int dim;
109 tree first;
110 tree last;
111 tree length;
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. */
227 void
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;
242 int i;
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. */
271 const char *filename
272 = IDENTIFIER_POINTER
273 (get_identifier
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. */
289 init_code_table ();
290 init_gnat_to_gnu ();
291 init_dummy_type ();
293 /* If we are just annotating types, give VOID_TYPE zero sizes to avoid
294 errors. */
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);
311 #endif
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),
331 false);
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),
336 false);
338 /* Likewise for boolean as the type for Standard.Boolean. */
339 save_gnu_tree (Base_Type (standard_boolean),
340 TYPE_NAME (boolean_type_node),
341 false);
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,
347 NULL, gnat_literal);
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,
355 NULL, gnat_literal);
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
366 memory. */
367 malloc_decl
368 = create_subprog_decl (get_identifier ("__gnat_malloc"), NULL_TREE,
369 build_function_type (ptr_void_type_node,
370 tree_cons (NULL_TREE,
371 sizetype, t)),
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. */
377 malloc32_decl
378 = create_subprog_decl (get_identifier ("__gnat_malloc32"), NULL_TREE,
379 build_function_type (ptr_void_type_node,
380 tree_cons (NULL_TREE,
381 sizetype, t)),
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. */
386 free_decl
387 = create_subprog_decl (get_identifier ("__gnat_free"), NULL_TREE,
388 build_function_type (void_type_node,
389 tree_cons (NULL_TREE,
390 ptr_void_type_node,
391 t)),
392 NULL_TREE, false, true, true, NULL, Empty);
394 /* This is used for 64-bit multiplication with overflow checking. */
395 mulv64_decl
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. */
405 jmpbuf_type
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. */
412 get_jmpbuf_decl
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;
421 set_jmpbuf_decl
422 = create_subprog_decl
423 (get_identifier ("system__soft_links__set_jmpbuf_address_soft"),
424 NULL_TREE,
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
431 a jmpbuf. */
432 setjmp_decl
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
442 address. */
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. */
453 begin_handler_decl
454 = create_subprog_decl (get_identifier ("__gnat_begin_handler"), NULL_TREE,
455 build_function_type (void_type_node,
456 tree_cons (NULL_TREE,
457 ptr_void_type_node,
458 t)),
459 NULL_TREE, false, true, true, NULL, Empty);
460 DECL_IGNORED_P (begin_handler_decl) = 1;
462 end_handler_decl
463 = create_subprog_decl (get_identifier ("__gnat_end_handler"), NULL_TREE,
464 build_function_type (void_type_node,
465 tree_cons (NULL_TREE,
466 ptr_void_type_node,
467 t)),
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 ())
476 tree decl
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,
481 build_pointer_type
482 (unsigned_char_type_node),
483 tree_cons (NULL_TREE,
484 integer_type_node,
485 t))),
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;
491 else
492 /* Otherwise, make one decl for each exception reason. */
493 for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
495 char name[17];
497 sprintf (name, "__gnat_rcheck_%.2d", i);
498 gnat_raise_decls[i]
499 = create_subprog_decl
500 (get_identifier (name), NULL_TREE,
501 build_function_type (void_type_node,
502 tree_cons (NULL_TREE,
503 build_pointer_type
504 (unsigned_char_type_node),
505 tree_cons (NULL_TREE,
506 integer_type_node,
507 t))),
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]),
517 TYPE_QUAL_VOLATILE);
520 /* Set the types that GCC and Gigi use from the front end. */
521 exception_type
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. */
526 get_excptr_decl
527 = create_subprog_decl
528 (get_identifier ("system__soft_links__get_gnat_exception"),
529 NULL_TREE,
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;
535 raise_nodefer_decl
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),
541 t)),
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),
549 TYPE_QUAL_VOLATILE);
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;
556 int j;
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;
565 field_list = field;
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);
574 long_long_float_type
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);
586 else
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
591 types to use. */
592 others_decl
593 = create_var_decl (get_identifier ("OTHERS"),
594 get_identifier ("__gnat_others_value"),
595 integer_type_node, 0, 1, 0, 1, 1, 0, Empty);
597 all_others_decl
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)))
617 ASM_OUTPUT_IDENT
618 (asm_out_file,
619 TREE_STRING_POINTER (gnat_to_gnu (Ident_String (Main_Unit))));
620 #endif
622 /* If we are using the GCC exception mechanism, let GCC know. */
623 if (Exception_Mechanism == Back_End_Exceptions)
624 gnat_init_gcc_eh ();
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);
652 else
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. */
666 static int
667 lvalue_required_for_attribute_p (Node_Id gnat_node)
669 switch (Get_Attribute_Id (Attribute_Name (gnat_node)))
671 case Attr_Pos:
672 case Attr_Val:
673 case Attr_Pred:
674 case Attr_Succ:
675 case Attr_First:
676 case Attr_Last:
677 case Attr_Range_Length:
678 case Attr_Length:
679 case Attr_Object_Size:
680 case Attr_Value_Size:
681 case Attr_Component_Size:
682 case Attr_Max_Size_In_Storage_Elements:
683 case Attr_Min:
684 case Attr_Max:
685 case Attr_Null_Parameter:
686 case Attr_Passed_By_Reference:
687 case Attr_Mechanism_Code:
688 return 0;
690 case Attr_Address:
691 case Attr_Access:
692 case Attr_Unchecked_Access:
693 case Attr_Unrestricted_Access:
694 case Attr_Code_Address:
695 case Attr_Pool_Address:
696 case Attr_Size:
697 case Attr_Alignment:
698 case Attr_Bit_Position:
699 case Attr_Position:
700 case Attr_First_Bit:
701 case Attr_Last_Bit:
702 case Attr_Bit:
703 default:
704 return 1;
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
718 logic contexts. */
720 static int
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))
728 case N_Reference:
729 return 1;
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. */
738 return (!constant
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)
745 return 0;
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));
752 Present (gnat_temp);
753 gnat_temp = Next (gnat_temp))
754 if (Nkind (gnat_temp) != N_Integer_Literal)
755 return 1;
757 /* ... fall through ... */
759 case N_Slice:
760 /* Only the array expression can require an lvalue. */
761 if (Prefix (gnat_parent) != gnat_node)
762 return 0;
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. */
779 return (!constant
780 || aliased
781 /* This should match the constant case of the renaming code. */
782 || Is_Composite_Type
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. */
789 return (!constant
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. */
802 return (!constant
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))))
815 return 0;
817 /* ... fall through ... */
819 case N_Unchecked_Type_Conversion:
820 return (!constant
821 || lvalue_required_p (gnat_parent,
822 get_unpadded_type (Etype (gnat_parent)),
823 constant, address_of_constant, aliased));
825 case N_Allocator:
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. */
829 return 1;
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)),
837 true, false, true);
839 /* ... fall through ... */
841 default:
842 return 0;
845 gcc_unreachable ();
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. */
852 static tree
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);
915 else
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
919 simplify things. */
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);
927 else
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
943 imported per C.6. */
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
957 the full view. */
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)));
963 else
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);
997 tree renamed_obj;
999 if (TREE_CODE (gnu_result) == PARM_DECL
1000 && DECL_BY_COMPONENT_PTR_P (gnu_result))
1001 gnu_result
1002 = build_unary_op (INDIRECT_REF, NULL_TREE,
1003 convert (build_pointer_type (gnu_result_type),
1004 gnu_result));
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));
1021 else
1022 gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
1024 if (read_only)
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)
1055 require_lvalue
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;
1068 return gnu_result;
1071 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Pragma. Return
1072 any statements we generate. */
1074 static tree
1075 Pragma_to_gnu (Node_Id gnat_node)
1077 Node_Id gnat_temp;
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))))
1084 return gnu_result;
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 ())
1091 break;
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);
1099 int use_address;
1100 enum machine_mode mode;
1101 tree asm_constraint = NULL_TREE;
1102 #ifdef ASM_COMMENT_START
1103 char *comment;
1104 #endif
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);
1116 if (use_address)
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" : "",
1124 " is in %0",
1125 NULL);
1126 asm_constraint = build_string (strlen (comment), comment);
1127 free (comment);
1128 #endif
1129 gnu_expr = build5 (ASM_EXPR, void_type_node,
1130 asm_constraint,
1131 NULL_TREE,
1132 tree_cons
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);
1141 break;
1143 case Pragma_Optimize:
1144 switch (Chars (Expression
1145 (First (Pragma_Argument_Associations (gnat_node)))))
1147 case Name_Time: case Name_Space:
1148 if (!optimize)
1149 post_error ("insufficient -O value?", gnat_node);
1150 break;
1152 case Name_Off:
1153 if (optimize)
1154 post_error ("must specify -O0?", gnat_node);
1155 break;
1157 default:
1158 gcc_unreachable ();
1160 break;
1162 case Pragma_Reviewable:
1163 if (write_symbols == NO_DEBUG)
1164 post_error ("must specify -g?", gnat_node);
1165 break;
1168 return gnu_result;
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. */
1175 static tree
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));
1191 switch (attribute)
1193 case Attr_Pos:
1194 case Attr_Val:
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);
1204 break;
1206 case Attr_Pred:
1207 case Attr_Succ:
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);
1216 gnu_expr
1217 = emit_check
1218 (build_binary_op (EQ_EXPR, boolean_type_node,
1219 gnu_expr,
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);
1226 gnu_result
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));
1230 break;
1232 case Attr_Address:
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);
1254 int i;
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),
1265 gnu_result);
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;
1279 else
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);
1287 break;
1290 /* ... fall through ... */
1292 case Attr_Access:
1293 case Attr_Unchecked_Access:
1294 case Attr_Code_Address:
1295 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1296 gnu_result
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);
1337 break;
1339 case Attr_Pool_Address:
1341 tree gnu_obj_type;
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)))
1350 gnu_ptr
1351 = convert (build_pointer_type
1352 (TYPE_OBJECT_RECORD_TYPE
1353 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
1354 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,
1365 gnu_ptr, gnu_pos);
1368 gnu_result = convert (gnu_result_type, gnu_ptr);
1370 break;
1372 case Attr_Size:
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)))
1385 == RECORD_TYPE
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
1398 template. */
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))))
1429 gnu_result
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);
1438 tree gnu_ptr_type
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);
1446 gnu_type
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);
1454 else
1455 gnu_result = TYPE_SIZE (gnu_type);
1457 else
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);
1466 else
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));
1481 break;
1483 case Attr_Alignment:
1485 unsigned int align;
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;
1497 else
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)
1508 is_capped_double
1509 = is_double_float_or_array (gnat_type, &align_clause);
1510 else if ((double_align = double_scalar_alignment) > 0)
1511 is_capped_double
1512 = is_double_scalar_or_array (gnat_type, &align_clause);
1513 else
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;
1523 else
1524 align = TYPE_ALIGN (gnu_type) / BITS_PER_UNIT;
1527 gnu_result = size_int (align);
1529 break;
1531 case Attr_First:
1532 case Attr_Last:
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);
1544 else
1545 gnu_result
1546 = build_binary_op
1547 (MAX_EXPR, get_base_type (gnu_result_type),
1548 build_binary_op
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));
1559 break;
1562 /* ... fall through ... */
1564 case Attr_Length:
1566 int Dimension = (Present (Expressions (gnat_node))
1567 ? UI_To_Int (Intval (First (Expressions (gnat_node))))
1568 : 1), i;
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))
1586 int ndim;
1587 tree gnu_type_temp;
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)
1609 break;
1611 if (!pa)
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;
1626 break;
1629 gnu_result
1630 = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1633 else if (attribute == Attr_Last)
1635 if (pa && pa->last)
1637 gnu_result = pa->last;
1638 break;
1641 gnu_result
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;
1650 break;
1652 else
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);
1668 gnu_result
1669 = build_binary_op (PLUS_EXPR, comp_type,
1670 build_binary_op (MINUS_EXPR,
1671 comp_type,
1672 convert (comp_type, hb),
1673 convert (comp_type, lb)),
1674 convert (comp_type, integer_one_node));
1675 gnu_result
1676 = build_cond_expr (comp_type,
1677 build_binary_op (GE_EXPR,
1678 boolean_type_node,
1679 hb, lb),
1680 gnu_result,
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. */
1693 if (pa)
1695 gnu_result
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;
1702 else
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),
1713 gnat_node);
1715 break;
1718 case Attr_Bit_Position:
1719 case Attr_Position:
1720 case Attr_First_Bit:
1721 case Attr_Last_Bit:
1722 case Attr_Bit:
1724 HOST_WIDE_INT bitsize;
1725 HOST_WIDE_INT bitpos;
1726 tree gnu_offset;
1727 tree gnu_field_bitpos;
1728 tree gnu_field_offset;
1729 tree gnu_inner;
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;
1744 break;
1747 else
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))
1765 gnu_field_bitpos
1766 = size_binop (PLUS_EXPR, gnu_field_bitpos,
1767 bit_position (TREE_OPERAND (gnu_inner, 1)));
1768 gnu_field_offset
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);
1778 else
1780 gnu_field_bitpos = bitsize_zero_node;
1781 gnu_field_offset = size_zero_node;
1784 switch (attribute)
1786 case Attr_Position:
1787 gnu_result = gnu_field_offset;
1788 break;
1790 case Attr_First_Bit:
1791 case Attr_Bit:
1792 gnu_result = size_int (bitpos % BITS_PER_UNIT);
1793 break;
1795 case Attr_Last_Bit:
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,
1800 bitsize_one_node);
1801 break;
1803 case Attr_Bit_Position:
1804 gnu_result = gnu_field_bitpos;
1805 break;
1808 /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1809 handling. */
1810 gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1811 break;
1814 case Attr_Min:
1815 case Attr_Max:
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);
1825 break;
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));
1831 break;
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;
1854 break;
1856 case Attr_Null_Parameter:
1857 /* This is just a zero cast to the pointer type for our prefix and
1858 dereferenced. */
1859 gnu_result_type = get_unpadded_type (Etype (gnat_node));
1860 gnu_result
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;
1865 break;
1867 case Attr_Mechanism_Code:
1869 int 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))
1888 == PARM_DECL)
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));
1894 break;
1896 default:
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;
1903 break;
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;
1916 return gnu_result;
1919 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Case_Statement,
1920 to a GCC tree, which is returned. */
1922 static tree
1923 Case_Statement_to_gnu (Node_Id gnat_node)
1925 tree gnu_result;
1926 tree gnu_expr;
1927 Node_Id gnat_when;
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
1962 alternative. */
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))
1970 case N_Range:
1971 gnu_low = gnat_to_gnu (Low_Bound (gnat_choice));
1972 gnu_high = gnat_to_gnu (High_Bound (gnat_choice));
1973 break;
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))));
1980 break;
1982 case N_Identifier:
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));
1992 break;
1995 /* ... fall through ... */
1997 case N_Character_Literal:
1998 case N_Integer_Literal:
1999 gnu_low = gnat_to_gnu (gnat_choice);
2000 break;
2002 case N_Others_Choice:
2003 break;
2005 default:
2006 gcc_unreachable ();
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,
2019 gnu_low, gnu_high,
2020 create_artificial_label (input_location)),
2021 gnat_choice);
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);
2044 return gnu_result;
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. */
2050 static bool
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)
2056 return true;
2058 if (TREE_CODE (val) == NOP_EXPR)
2059 val = (max
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)
2064 return true;
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. */
2072 static inline bool
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. */
2081 static inline bool
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. */
2090 static tree
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;
2098 tree gnu_result;
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. */
2122 else
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. */
2138 if (reverse)
2140 gnu_first = gnu_high;
2141 gnu_last = gnu_low;
2142 update_code = MINUS_NOMOD_EXPR;
2143 test_code = GE_EXPR;
2144 shift_code = PLUS_NOMOD_EXPR;
2146 else
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:
2161 ENTRY_COND
2162 loop:
2163 TOP_UPDATE
2164 BODY
2165 BOTTOM_COND
2166 GOTO loop
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:
2173 loop:
2174 TOP_COND
2175 BODY
2176 BOTTOM_UPDATE
2177 GOTO loop
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:
2183 ENTRY_COND
2184 loop:
2185 BODY
2186 BOTTOM_COND
2187 BOTTOM_UPDATE
2188 GOTO loop
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:
2199 loop:
2200 TOP_COND
2201 TOP_UPDATE
2202 BODY
2203 GOTO loop
2205 which should catch loops with constant starting point. Otherwise, if
2206 we cannot, we generate the fallback form. */
2208 if (optimize)
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. */
2224 else
2225 fallback = true;
2227 else
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
2234 GNU_LAST-1 does. */
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. */
2246 else
2247 fallback = true;
2250 if (fallback)
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;
2258 gnu_cond_expr
2259 = build3 (COND_EXPR, void_type_node,
2260 build_binary_op (LE_EXPR, boolean_type_node,
2261 gnu_low, gnu_high),
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 ();
2269 gnat_pushlevel ();
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,
2282 gnu_last);
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),
2291 gnat_iter_scheme);
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". */
2307 if (gnu_loop_var)
2309 add_stmt (gnu_loop_stmt);
2310 gnat_poplevel ();
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. */
2316 if (gnu_cond_expr)
2318 COND_EXPR_THEN (gnu_cond_expr) = gnu_loop_stmt;
2319 gnu_result = gnu_cond_expr;
2320 recalculate_side_effects (gnu_cond_expr);
2322 else
2323 gnu_result = gnu_loop_stmt;
2325 pop_stack (&gnu_loop_label_stack);
2327 return gnu_result;
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;
2342 static void
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
2354 = builtin_decl_for
2355 (get_identifier ("__builtin_establish_vms_condition_handler"));
2357 gnat_vms_condition_handler_decl
2358 = create_subprog_decl (get_identifier ("__gnat_handle_vms_condition"),
2359 NULL_TREE,
2360 build_function_type_list (boolean_type_node,
2361 ptr_void_type_node,
2362 ptr_void_type_node,
2363 NULL_TREE),
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)
2373 return;
2375 establish_stmt
2376 = build_call_1_expr (vms_builtin_establish_handler_decl,
2377 build_unary_op
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. */
2387 static void
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;
2405 tree gnu_cico_list;
2406 tree gnu_result;
2407 VEC(parm_attr,gc) *cache;
2409 /* If this is a generic object or if it has been eliminated,
2410 ignore it. */
2411 if (Ekind (gnat_subprog_id) == E_Generic_Procedure
2412 || Ekind (gnat_subprog_id) == E_Generic_Function
2413 || Is_Eliminated (gnat_subprog_id))
2414 return;
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. */
2422 gnu_subprog_decl
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);
2450 set_cfun (NULL);
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)
2460 : NULL_TREE);
2462 /* Get a tree corresponding to the code for the subprogram. */
2463 start_stmt_group ();
2464 gnat_pushlevel ();
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
2490 is exported.
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)));
2509 gnat_poplevel ();
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;
2515 if (cache)
2517 struct parm_attr_d *pa;
2518 int i;
2520 start_stmt_group ();
2522 for (i = 0; VEC_iterate (parm_attr, cache, i, pa); i++)
2524 if (pa->first)
2525 add_stmt_with_node (pa->first, gnat_node);
2526 if (pa->last)
2527 add_stmt_with_node (pa->last, gnat_node);
2528 if (pa->length)
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
2543 of subprograms.
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))
2550 tree gnu_retval;
2552 start_stmt_group ();
2553 gnat_pushlevel ();
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);
2561 else
2562 gnu_retval = gnat_build_constructor (TREE_TYPE (gnu_subprog_type),
2563 gnu_cico_list);
2565 add_stmt_with_node (build_return_expr (gnu_result_decl, gnu_retval),
2566 End_Label (Handled_Statement_Sequence (gnat_node)));
2567 gnat_poplevel ();
2568 gnu_result = end_stmt_group ();
2571 pop_stack (&gnu_return_label_stack);
2573 /* Set the end location. */
2574 Sloc_to_locus
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. */
2607 static tree
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
2613 subprogram. */
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;
2624 tree gnu_call;
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);
2647 return 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;
2659 else
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 ();
2667 gnat_pushlevel ();
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;
2706 tree gnu_actual;
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. */
2719 if (gnu_formal
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",
2737 gnat_actual);
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))))
2747 post_error
2748 ("?possible violation of implicit assumption", gnat_actual);
2749 post_error_ne
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,
2753 gnat_formal);
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),
2780 gnu_name_type)))
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. */
2796 gnu_stmt
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,
2802 gnu_temp);
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,
2808 gnu_temp);
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)))
2821 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)
2830 gnu_actual
2831 = unchecked_convert (gnat_to_gnu_type (Etype (gnat_actual)),
2832 gnu_actual, No_Truncation (gnat_actual));
2833 else
2834 gnu_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))
2840 gnu_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)))
2849 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. */
2855 if (gnu_formal
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)),
2869 gnu_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)),
2882 gnu_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);
2896 else if (gnu_formal
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);
2918 else if (gnu_formal
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))
2928 gnu_actual
2929 = convert (DECL_ARG_TYPE (gnu_formal), integer_zero_node);
2930 else
2931 gnu_actual = build_unary_op (ADDR_EXPR, NULL_TREE,
2932 fill_vms_descriptor (gnu_actual,
2933 gnat_formal,
2934 gnat_actual));
2936 else
2938 tree gnu_size;
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);
2948 continue;
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)
2960 gnu_actual
2961 = unchecked_convert (DECL_ARG_TYPE (gnu_formal),
2962 convert (gnat_type_for_size
2963 (TREE_INT_CST_LOW (gnu_size), 1),
2964 integer_zero_node),
2965 false);
2966 else
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);
2990 if (gnu_target)
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))
2997 gnu_result
2998 = emit_range_check (gnu_result, Etype (Name (gnat_parent)),
2999 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;
3006 else
3007 op_code = INIT_EXPR;
3009 gnu_result
3010 = build_binary_op (op_code, NULL_TREE, gnu_target, gnu_result);
3011 add_stmt_with_node (gnu_result, gnat_parent);
3012 gnat_poplevel ();
3013 gnu_result = end_stmt_group ();
3015 else
3017 if (went_into_elab_proc)
3018 current_function_decl = NULL_TREE;
3019 *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
3022 return gnu_result;
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);
3035 if (length > 1)
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;
3047 gnu_stmt
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)));
3060 else
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. */
3081 tree gnu_result
3082 = length == 1
3083 ? gnu_call
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. */
3090 tree gnu_actual
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)))
3095 gnu_result
3096 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
3097 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)
3107 gnu_result
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),
3124 gnu_result,
3125 No_Truncation (gnat_actual));
3126 else
3128 if (Do_Range_Check (gnat_actual))
3129 gnu_result
3130 = emit_range_check (gnu_result, Etype (gnat_actual),
3131 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);
3146 else
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);
3152 gnat_poplevel ();
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. */
3159 static tree
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);
3168 bool setjmp_longjmp
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. */
3174 tree gnu_result;
3175 tree gnu_expr;
3176 Node_Id gnat_temp;
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 ();
3195 gnat_pushlevel ();
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. */
3201 if (setjmp_longjmp)
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,
3207 gnat_node);
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,
3218 NULL, gnat_node);
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. */
3231 if (at_end)
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 ();
3239 if (setjmp_longjmp)
3240 add_stmt (build_call_1_expr (set_jmpbuf_decl,
3241 build_unary_op (ADDR_EXPR, NULL_TREE,
3242 gnu_jmpbuf_decl)));
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
3257 this block. */
3258 if (setjmp_longjmp)
3260 tree *gnu_else_ptr = 0;
3261 tree gnu_handler;
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 ();
3266 gnat_pushlevel ();
3268 push_stack (&gnu_except_ptr_stack, NULL_TREE,
3269 create_var_decl (get_identifier ("EXCEPT_PTR"),
3270 NULL_TREE,
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
3277 together here. */
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. */
3286 if (!gnu_else_ptr)
3287 add_stmt (gnu_expr);
3288 else
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
3295 defer abortion. */
3296 gnu_expr = build_call_1_expr (raise_nodefer_decl,
3297 TREE_VALUE (gnu_except_ptr_stack));
3298 set_expr_location_from_node
3299 (gnu_expr,
3300 Present (End_Label (gnat_node)) ? End_Label (gnat_node) : gnat_node);
3302 if (gnu_else_ptr)
3303 *gnu_else_ptr = gnu_expr;
3304 else
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);
3310 gnat_poplevel ();
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,
3317 gnu_jmpsave_decl),
3318 gnat_node);
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,
3324 (build_call_1_expr
3325 (setjmp_decl,
3326 build_unary_op (ADDR_EXPR, NULL_TREE,
3327 gnu_jmpbuf_decl))),
3328 gnu_handler, gnu_inner_block);
3330 else if (gcc_zcx)
3332 tree gnu_handlers;
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);
3346 else
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);
3353 gnat_poplevel ();
3354 gnu_result = end_stmt_group ();
3357 return gnu_result;
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. */
3364 static tree
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);
3373 Node_Id gnat_temp;
3375 for (gnat_temp = First (Exception_Choices (gnat_node));
3376 gnat_temp; gnat_temp = Next (gnat_temp))
3378 tree this_choice;
3380 if (Nkind (gnat_temp) == N_Others_Choice)
3382 if (All_Others (gnat_temp))
3383 this_choice = integer_one_node;
3384 else
3385 this_choice
3386 = build_binary_op
3387 (EQ_EXPR, boolean_type_node,
3388 convert
3389 (integer_type_node,
3390 build_component_ref
3391 (build_unary_op
3392 (INDIRECT_REF, NULL_TREE,
3393 TREE_VALUE (gnu_except_ptr_stack)),
3394 get_identifier ("not_handled_by_others"), NULL_TREE,
3395 false)),
3396 integer_zero_node);
3399 else if (Nkind (gnat_temp) == N_Identifier
3400 || Nkind (gnat_temp) == N_Expanded_Name)
3402 Entity_Id gnat_ex_id = Entity (gnat_temp);
3403 tree gnu_expr;
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);
3412 this_choice
3413 = build_binary_op
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
3420 match. */
3421 if (Is_Non_Ada_Error (Entity (gnat_temp)))
3423 tree gnu_comp
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);
3429 this_choice
3430 = build_binary_op
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')),
3434 this_choice);
3437 else
3438 gcc_unreachable ();
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. */
3450 static tree
3451 Exception_Handler_to_gnu_zcx (Node_Id gnat_node)
3453 tree gnu_etypes_list = NULL_TREE;
3454 tree gnu_expr;
3455 tree gnu_etype;
3456 tree gnu_current_exc_ptr;
3457 tree gnu_incoming_exc_ptr;
3458 Node_Id gnat_temp;
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)
3470 tree gnu_expr
3471 = All_Others (gnat_temp) ? all_others_decl : others_decl;
3473 gnu_etype
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. */
3492 else
3493 gcc_unreachable ();
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 ();
3506 gnat_pushlevel ();
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
3510 exit path.
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. */
3526 gnu_current_exc_ptr
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,
3532 gnat_node);
3534 add_stmt_with_node (build_call_1_expr (begin_handler_decl,
3535 gnu_incoming_exc_ptr),
3536 gnat_node);
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),
3539 Empty);
3540 add_stmt_list (Statements (gnat_node));
3541 gnat_poplevel ();
3543 return build2 (CATCH_EXPR, void_type_node, gnu_etypes_list,
3544 end_stmt_group ());
3547 /* Subroutine of gnat_to_gnu to generate code for an N_Compilation unit. */
3549 static void
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);
3568 set_cfun (NULL);
3570 current_function_decl = NULL_TREE;
3572 start_stmt_group ();
3573 gnat_pushlevel ();
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. */
3585 if (optimize)
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)))
3599 continue;
3600 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)
3620 return;
3623 process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty,
3624 true, true);
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
3633 procedure. */
3634 info = (struct elab_info *) ggc_alloc (sizeof (struct elab_info));
3635 set_current_block_context (gnu_elab_proc_decl);
3636 gnat_poplevel ();
3637 DECL_SAVED_TREE (gnu_elab_proc_decl) = end_stmt_group ();
3639 Sloc_to_locus
3640 (Sloc (gnat_unit),
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
3649 we did or not. */
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. */
3661 static bool
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))
3674 return false;
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))
3681 return false;
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)
3688 return true;
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))
3693 return true;
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))
3698 return true;
3700 return false;
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. */
3711 tree
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;
3719 Node_Id gnat_temp;
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
3743 || kind == N_Label
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);
3768 switch (kind)
3770 /********************************/
3771 /* Chapter 2: Lexical Elements */
3772 /********************************/
3774 case N_Identifier:
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);
3779 break;
3781 case N_Integer_Literal:
3783 tree gnu_type;
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
3799 we don't. */
3800 gcc_assert (!TREE_OVERFLOW (gnu_result));
3802 break;
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)));
3813 else
3814 gnu_result
3815 = build_int_cst_type
3816 (gnu_result_type, UI_To_CC (Char_Literal_Value (gnat_node)));
3817 break;
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),
3826 gnu_result_type);
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))))
3833 gcc_unreachable ();
3835 else
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);
3846 else
3848 if (!Is_Machine_Number (gnat_node))
3849 ur_realval
3850 = Machine (Base_Type (Underlying_Type (Etype (gnat_node))),
3851 ur_realval, Round_Even, gnat_node);
3853 gnu_result
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)))
3861 gnu_result
3862 = build_binary_op (RDIV_EXPR,
3863 get_base_type (gnu_result_type),
3864 gnu_result,
3865 UI_To_gnu (Denominator (ur_realval),
3866 gnu_result_type));
3867 else
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)))
3881 gnu_result
3882 = build_unary_op (NEGATE_EXPR, get_base_type (gnu_result_type),
3883 gnu_result);
3886 break;
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);
3894 int i;
3895 char *string;
3896 if (length >= ALLOCA_THRESHOLD)
3897 string = XNEWVEC (char, length + 1);
3898 else
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. */
3908 string[i] = 0;
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)
3917 free (string);
3919 else
3921 /* Build a list consisting of each character, then make
3922 the aggregate. */
3923 String_Id gnat_string = Strval (gnat_node);
3924 int length = String_Length (gnat_string);
3925 int i;
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++)
3931 gnu_list
3932 = tree_cons (gnu_idx,
3933 build_int_cst (TREE_TYPE (gnu_result_type),
3934 Get_String_Char (gnat_string,
3935 i + 1)),
3936 gnu_list);
3938 gnu_idx = int_const_binop (PLUS_EXPR, gnu_idx, integer_one_node,
3942 gnu_result
3943 = gnat_build_constructor (gnu_result_type, nreverse (gnu_list));
3945 break;
3947 case N_Pragma:
3948 gnu_result = Pragma_to_gnu (gnat_node);
3949 break;
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 ();
3963 break;
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))))
3977 break;
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)))
3986 gnu_expr
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
3991 is frozen. */
3992 if (Present (Freeze_Node (gnat_temp)))
3994 if ((Is_Public (gnat_temp) || global_bindings_p ())
3995 && !TREE_CONSTANT (gnu_expr))
3996 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);
4001 else
4002 gnu_expr = gnat_save_expr (gnu_expr);
4004 save_gnu_tree (gnat_node, gnu_expr, true);
4007 else
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);
4024 break;
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)))))
4038 gnu_result
4039 = gnat_to_gnu_entity (gnat_temp,
4040 gnat_to_gnu (Renamed_Object (gnat_temp)), 1);
4041 else
4042 gnu_result = alloc_stmt_list ();
4043 break;
4045 case N_Implicit_Label_Declaration:
4046 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
4047 gnu_result = alloc_stmt_list ();
4048 break;
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 ();
4056 break;
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);
4066 break;
4068 case N_Indexed_Component:
4070 tree gnu_array_object = gnat_to_gnu (Prefix (gnat_node));
4071 tree gnu_type;
4072 int ndim;
4073 int i;
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)))
4086 gnu_array_object
4087 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_array_object))),
4088 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));
4105 i >= 0;
4106 i--, gnat_temp = Next (gnat_temp))
4107 gnat_expr_array[i] = gnat_temp;
4108 else
4109 for (i = 0, gnat_temp = First (Expressions (gnat_node));
4110 i < ndim;
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))
4122 gnu_expr
4123 = emit_index_check
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))),
4127 gnat_temp);
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));
4135 break;
4137 case N_Slice:
4139 Node_Id gnat_range_node = Discrete_Range (gnat_node);
4140 tree gnu_type;
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
4146 range check. */
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. */
4153 tree gnu_index_type
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,
4175 gnu_min_expr),
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,
4182 gnu_max_expr),
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,
4201 gnu_max_expr),
4202 convert (gnu_expr_type,
4203 gnu_min_expr)),
4204 gnu_expr,
4205 TREE_CODE (gnu_min_expr) != INTEGER_CST
4206 && TREE_CODE (gnu_max_expr) == INTEGER_CST
4207 ? gnu_max_expr : gnu_min_expr);
4209 else
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);
4222 break;
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));
4229 tree gnu_field;
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);
4259 else
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);
4271 gnu_result
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));
4282 break;
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)
4292 return
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);
4301 break;
4303 case N_Reference:
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));
4308 break;
4310 case N_Aggregate:
4311 case N_Extension_Aggregate:
4313 tree gnu_aggr_type;
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))
4325 gnu_aggr_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)
4335 gnu_result
4336 = assoc_to_constructor (Etype (gnat_node),
4337 First (Component_Associations (gnat_node)),
4338 gnu_aggr_type);
4339 else if (TREE_CODE (gnu_aggr_type) == ARRAY_TYPE)
4340 gnu_result = pos_to_constructor (First (Expressions (gnat_node)),
4341 gnu_aggr_type,
4342 Component_Type (Etype (gnat_node)));
4343 else if (TREE_CODE (gnu_aggr_type) == COMPLEX_TYPE)
4344 gnu_result
4345 = build_binary_op
4346 (COMPLEX_EXPR, gnu_aggr_type,
4347 gnat_to_gnu (Expression (First
4348 (Component_Associations (gnat_node)))),
4349 gnat_to_gnu (Expression
4350 (Next
4351 (First (Component_Associations (gnat_node))))));
4352 else
4353 gcc_unreachable ();
4355 gnu_result = convert (gnu_result_type, gnu_result);
4357 break;
4359 case N_Null:
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;
4364 else
4365 gnu_result = null_pointer_node;
4366 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4367 break;
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));
4375 gnu_result
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);
4381 break;
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);
4390 break;
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));
4420 break;
4422 case N_In:
4423 case N_Not_In:
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
4430 subtype. */
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);
4444 else
4445 gcc_unreachable ();
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
4451 test. */
4452 if (operand_equal_p (gnu_low, gnu_high, 0))
4453 gnu_result
4454 = build_binary_op (EQ_EXPR, gnu_result_type, gnu_obj, gnu_low);
4455 else
4457 tree t1, t2;
4458 gnu_obj = gnat_protect_expr (gnu_obj);
4459 t1 = build_binary_op (GE_EXPR, gnu_result_type, gnu_obj, gnu_low);
4460 if (EXPR_P (t1))
4461 set_expr_location_from_node (t1, gnat_node);
4462 t2 = build_binary_op (LE_EXPR, gnu_result_type, gnu_obj, gnu_high);
4463 if (EXPR_P (t2))
4464 set_expr_location_from_node (t2, gnat_node);
4465 gnu_result
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);
4472 break;
4474 case N_Op_Divide:
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)
4479 ? RDIV_EXPR
4480 : (Rounded_Result (gnat_node)
4481 ? ROUND_DIV_EXPR : TRUNC_DIV_EXPR),
4482 gnu_result_type, gnu_lhs, gnu_rhs);
4483 break;
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
4488 set up. */
4489 if (IN (Ekind (Underlying_Type (Etype (gnat_node))),
4490 Modular_Integer_Kind))
4492 enum tree_code code
4493 = (kind == N_Op_Or ? BIT_IOR_EXPR
4494 : kind == N_Op_And ? BIT_AND_EXPR
4495 : BIT_XOR_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,
4501 gnu_lhs, gnu_rhs);
4502 break;
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;
4521 tree gnu_type;
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
4529 fallthrough. */
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
4535 actual array. */
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));
4554 tree gnu_max_shift
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)
4561 gnu_rhs
4562 = build_binary_op
4563 (MIN_EXPR, gnu_count_type,
4564 build_binary_op (MINUS_EXPR,
4565 gnu_count_type,
4566 gnu_max_shift,
4567 convert (gnu_count_type,
4568 integer_one_node)),
4569 gnu_rhs);
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);
4611 else
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))
4624 gnu_result
4625 = build_cond_expr
4626 (gnu_type,
4627 build_binary_op (GE_EXPR, boolean_type_node,
4628 gnu_rhs,
4629 convert (TREE_TYPE (gnu_rhs),
4630 TYPE_SIZE (gnu_type))),
4631 convert (gnu_type, integer_zero_node),
4632 gnu_result);
4634 break;
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))));
4640 tree gnu_false
4641 = gnat_to_gnu (Next (Next (First (Expressions (gnat_node)))));
4643 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4644 gnu_result
4645 = build_cond_expr (gnu_result_type, gnu_cond, gnu_true, gnu_false);
4647 break;
4649 case N_Op_Plus:
4650 gnu_result = gnat_to_gnu (Right_Opnd (gnat_node));
4651 gnu_result_type = get_unpadded_type (Etype (gnat_node));
4652 break;
4654 case N_Op_Not:
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,
4665 gnu_expr);
4666 break;
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));
4676 else
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))
4683 gnu_result
4684 = build_unary_op_trapv (gnu_codes[kind],
4685 gnu_result_type, gnu_expr, gnat_node);
4686 else
4687 gnu_result = build_unary_op (gnu_codes[kind],
4688 gnu_result_type, gnu_expr);
4689 break;
4691 case N_Allocator:
4693 tree gnu_init = 0;
4694 tree gnu_type;
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)))
4716 gnu_init
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);
4725 else
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);
4734 else
4735 gcc_unreachable ();
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,
4741 ignore_init_type);
4743 break;
4745 /**************************/
4746 /* Chapter 5: Statements */
4747 /**************************/
4749 case N_Label:
4750 gnu_result = build1 (LABEL_EXPR, void_type_node,
4751 gnat_to_gnu (Identifier (gnat_node)));
4752 break;
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);
4763 add_stmt (stmt);
4764 stmt = build1 (LABEL_EXPR, void_type_node, label);
4765 set_expr_location_from_node (stmt, gnat_node);
4766 add_stmt (stmt);
4767 gnu_result = end_stmt_group ();
4769 else
4770 gnu_result = alloc_stmt_list ();
4771 break;
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)
4785 gnu_result
4786 = call_to_gnu (Expression (gnat_node), &gnu_result_type, gnu_lhs);
4787 else
4789 gnu_rhs
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)),
4795 gnat_node);
4797 gnu_result
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
4801 are not completely disjoint, play safe and use memmove. */
4802 if (TREE_CODE (gnu_result) == MODIFY_EXPR
4803 && Is_Array_Type (Etype (Name (gnat_node)))
4804 && !(Forwards_OK (gnat_node) && Backwards_OK (gnat_node)))
4806 tree to, from, size, to_ptr, from_ptr, t;
4808 to = TREE_OPERAND (gnu_result, 0);
4809 from = TREE_OPERAND (gnu_result, 1);
4811 size = TYPE_SIZE_UNIT (TREE_TYPE (from));
4812 size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, from);
4814 to_ptr = build_fold_addr_expr (to);
4815 from_ptr = build_fold_addr_expr (from);
4817 t = implicit_built_in_decls[BUILT_IN_MEMMOVE];
4818 gnu_result = build_call_expr (t, 3, to_ptr, from_ptr, size);
4821 break;
4823 case N_If_Statement:
4825 tree *gnu_else_ptr; /* Point to put next "else if" or "else". */
4827 /* Make the outer COND_EXPR. Avoid non-determinism. */
4828 gnu_result = build3 (COND_EXPR, void_type_node,
4829 gnat_to_gnu (Condition (gnat_node)),
4830 NULL_TREE, NULL_TREE);
4831 COND_EXPR_THEN (gnu_result)
4832 = build_stmt_group (Then_Statements (gnat_node), false);
4833 TREE_SIDE_EFFECTS (gnu_result) = 1;
4834 gnu_else_ptr = &COND_EXPR_ELSE (gnu_result);
4836 /* Now make a COND_EXPR for each of the "else if" parts. Put each
4837 into the previous "else" part and point to where to put any
4838 outer "else". Also avoid non-determinism. */
4839 if (Present (Elsif_Parts (gnat_node)))
4840 for (gnat_temp = First (Elsif_Parts (gnat_node));
4841 Present (gnat_temp); gnat_temp = Next (gnat_temp))
4843 gnu_expr = build3 (COND_EXPR, void_type_node,
4844 gnat_to_gnu (Condition (gnat_temp)),
4845 NULL_TREE, NULL_TREE);
4846 COND_EXPR_THEN (gnu_expr)
4847 = build_stmt_group (Then_Statements (gnat_temp), false);
4848 TREE_SIDE_EFFECTS (gnu_expr) = 1;
4849 set_expr_location_from_node (gnu_expr, gnat_temp);
4850 *gnu_else_ptr = gnu_expr;
4851 gnu_else_ptr = &COND_EXPR_ELSE (gnu_expr);
4854 *gnu_else_ptr = build_stmt_group (Else_Statements (gnat_node), false);
4856 break;
4858 case N_Case_Statement:
4859 gnu_result = Case_Statement_to_gnu (gnat_node);
4860 break;
4862 case N_Loop_Statement:
4863 gnu_result = Loop_Statement_to_gnu (gnat_node);
4864 break;
4866 case N_Block_Statement:
4867 start_stmt_group ();
4868 gnat_pushlevel ();
4869 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
4870 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
4871 gnat_poplevel ();
4872 gnu_result = end_stmt_group ();
4874 if (Present (Identifier (gnat_node)))
4875 mark_out_of_scope (Entity (Identifier (gnat_node)));
4876 break;
4878 case N_Exit_Statement:
4879 gnu_result
4880 = build2 (EXIT_STMT, void_type_node,
4881 (Present (Condition (gnat_node))
4882 ? gnat_to_gnu (Condition (gnat_node)) : NULL_TREE),
4883 (Present (Name (gnat_node))
4884 ? get_gnu_tree (Entity (Name (gnat_node)))
4885 : TREE_VALUE (gnu_loop_label_stack)));
4886 break;
4888 case N_Return_Statement:
4890 tree gnu_ret_val, gnu_ret_obj;
4892 /* If we have a return label defined, convert this into a branch to
4893 that label. The return proper will be handled elsewhere. */
4894 if (TREE_VALUE (gnu_return_label_stack))
4896 gnu_result = build1 (GOTO_EXPR, void_type_node,
4897 TREE_VALUE (gnu_return_label_stack));
4898 /* When not optimizing, make sure the return is preserved. */
4899 if (!optimize && Comes_From_Source (gnat_node))
4900 DECL_ARTIFICIAL (TREE_VALUE (gnu_return_label_stack)) = 0;
4901 break;
4904 /* If the subprogram is a function, we must return the expression. */
4905 if (Present (Expression (gnat_node)))
4907 tree gnu_subprog_type = TREE_TYPE (current_function_decl);
4908 tree gnu_result_decl = DECL_RESULT (current_function_decl);
4909 gnu_ret_val = gnat_to_gnu (Expression (gnat_node));
4911 /* Do not remove the padding from GNU_RET_VAL if the inner type is
4912 self-referential since we want to allocate the fixed size. */
4913 if (TREE_CODE (gnu_ret_val) == COMPONENT_REF
4914 && TYPE_IS_PADDING_P
4915 (TREE_TYPE (TREE_OPERAND (gnu_ret_val, 0)))
4916 && CONTAINS_PLACEHOLDER_P
4917 (TYPE_SIZE (TREE_TYPE (gnu_ret_val))))
4918 gnu_ret_val = TREE_OPERAND (gnu_ret_val, 0);
4920 /* If the subprogram returns by direct reference, return a pointer
4921 to the return value. */
4922 if (TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type)
4923 || By_Ref (gnat_node))
4924 gnu_ret_val = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_ret_val);
4926 /* Otherwise, if it returns an unconstrained array, we have to
4927 allocate a new version of the result and return it. */
4928 else if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type))
4930 gnu_ret_val = maybe_unconstrained_array (gnu_ret_val);
4931 gnu_ret_val = build_allocator (TREE_TYPE (gnu_ret_val),
4932 gnu_ret_val,
4933 TREE_TYPE (gnu_subprog_type),
4934 Procedure_To_Call (gnat_node),
4935 Storage_Pool (gnat_node),
4936 gnat_node, false);
4939 /* If the subprogram returns by invisible reference, dereference
4940 the pointer it is passed using the type of the return value
4941 and build the copy operation manually. This ensures that we
4942 don't copy too much data, for example if the return type is
4943 unconstrained with a maximum size. */
4944 if (TREE_ADDRESSABLE (gnu_subprog_type))
4946 gnu_ret_obj
4947 = build_unary_op (INDIRECT_REF, TREE_TYPE (gnu_ret_val),
4948 gnu_result_decl);
4949 gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
4950 gnu_ret_obj, gnu_ret_val);
4951 add_stmt_with_node (gnu_result, gnat_node);
4952 gnu_ret_val = NULL_TREE;
4953 gnu_ret_obj = gnu_result_decl;
4956 /* Otherwise, build a regular return. */
4957 else
4958 gnu_ret_obj = gnu_result_decl;
4960 else
4962 gnu_ret_val = NULL_TREE;
4963 gnu_ret_obj = NULL_TREE;
4966 gnu_result = build_return_expr (gnu_ret_obj, gnu_ret_val);
4968 break;
4970 case N_Goto_Statement:
4971 gnu_result = build1 (GOTO_EXPR, void_type_node,
4972 gnat_to_gnu (Name (gnat_node)));
4973 break;
4975 /***************************/
4976 /* Chapter 6: Subprograms */
4977 /***************************/
4979 case N_Subprogram_Declaration:
4980 /* Unless there is a freeze node, declare the subprogram. We consider
4981 this a "definition" even though we're not generating code for
4982 the subprogram because we will be making the corresponding GCC
4983 node here. */
4985 if (No (Freeze_Node (Defining_Entity (Specification (gnat_node)))))
4986 gnat_to_gnu_entity (Defining_Entity (Specification (gnat_node)),
4987 NULL_TREE, 1);
4988 gnu_result = alloc_stmt_list ();
4989 break;
4991 case N_Abstract_Subprogram_Declaration:
4992 /* This subprogram doesn't exist for code generation purposes, but we
4993 have to elaborate the types of any parameters and result, unless
4994 they are imported types (nothing to generate in this case). */
4996 /* Process the parameter types first. */
4998 for (gnat_temp
4999 = First_Formal_With_Extras
5000 (Defining_Entity (Specification (gnat_node)));
5001 Present (gnat_temp);
5002 gnat_temp = Next_Formal_With_Extras (gnat_temp))
5003 if (Is_Itype (Etype (gnat_temp))
5004 && !From_With_Type (Etype (gnat_temp)))
5005 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
5008 /* Then the result type, set to Standard_Void_Type for procedures. */
5011 Entity_Id gnat_temp_type
5012 = Etype (Defining_Entity (Specification (gnat_node)));
5014 if (Is_Itype (gnat_temp_type) && !From_With_Type (gnat_temp_type))
5015 gnat_to_gnu_entity (Etype (gnat_temp_type), NULL_TREE, 0);
5018 gnu_result = alloc_stmt_list ();
5019 break;
5021 case N_Defining_Program_Unit_Name:
5022 /* For a child unit identifier go up a level to get the specification.
5023 We get this when we try to find the spec of a child unit package
5024 that is the compilation unit being compiled. */
5025 gnu_result = gnat_to_gnu (Parent (gnat_node));
5026 break;
5028 case N_Subprogram_Body:
5029 Subprogram_Body_to_gnu (gnat_node);
5030 gnu_result = alloc_stmt_list ();
5031 break;
5033 case N_Function_Call:
5034 case N_Procedure_Call_Statement:
5035 gnu_result = call_to_gnu (gnat_node, &gnu_result_type, NULL_TREE);
5036 break;
5038 /************************/
5039 /* Chapter 7: Packages */
5040 /************************/
5042 case N_Package_Declaration:
5043 gnu_result = gnat_to_gnu (Specification (gnat_node));
5044 break;
5046 case N_Package_Specification:
5048 start_stmt_group ();
5049 process_decls (Visible_Declarations (gnat_node),
5050 Private_Declarations (gnat_node), Empty, true, true);
5051 gnu_result = end_stmt_group ();
5052 break;
5054 case N_Package_Body:
5056 /* If this is the body of a generic package - do nothing. */
5057 if (Ekind (Corresponding_Spec (gnat_node)) == E_Generic_Package)
5059 gnu_result = alloc_stmt_list ();
5060 break;
5063 start_stmt_group ();
5064 process_decls (Declarations (gnat_node), Empty, Empty, true, true);
5066 if (Present (Handled_Statement_Sequence (gnat_node)))
5067 add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
5069 gnu_result = end_stmt_group ();
5070 break;
5072 /********************************/
5073 /* Chapter 8: Visibility Rules */
5074 /********************************/
5076 case N_Use_Package_Clause:
5077 case N_Use_Type_Clause:
5078 /* Nothing to do here - but these may appear in list of declarations. */
5079 gnu_result = alloc_stmt_list ();
5080 break;
5082 /*********************/
5083 /* Chapter 9: Tasks */
5084 /*********************/
5086 case N_Protected_Type_Declaration:
5087 gnu_result = alloc_stmt_list ();
5088 break;
5090 case N_Single_Task_Declaration:
5091 gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1);
5092 gnu_result = alloc_stmt_list ();
5093 break;
5095 /*********************************************************/
5096 /* Chapter 10: Program Structure and Compilation Issues */
5097 /*********************************************************/
5099 case N_Compilation_Unit:
5100 /* This is not called for the main unit on which gigi is invoked. */
5101 Compilation_Unit_to_gnu (gnat_node);
5102 gnu_result = alloc_stmt_list ();
5103 break;
5105 case N_Subprogram_Body_Stub:
5106 case N_Package_Body_Stub:
5107 case N_Protected_Body_Stub:
5108 case N_Task_Body_Stub:
5109 /* Simply process whatever unit is being inserted. */
5110 gnu_result = gnat_to_gnu (Unit (Library_Unit (gnat_node)));
5111 break;
5113 case N_Subunit:
5114 gnu_result = gnat_to_gnu (Proper_Body (gnat_node));
5115 break;
5117 /***************************/
5118 /* Chapter 11: Exceptions */
5119 /***************************/
5121 case N_Handled_Sequence_Of_Statements:
5122 /* If there is an At_End procedure attached to this node, and the EH
5123 mechanism is SJLJ, we must have at least a corresponding At_End
5124 handler, unless the No_Exception_Handlers restriction is set. */
5125 gcc_assert (type_annotate_only
5126 || Exception_Mechanism != Setjmp_Longjmp
5127 || No (At_End_Proc (gnat_node))
5128 || Present (Exception_Handlers (gnat_node))
5129 || No_Exception_Handlers_Set ());
5131 gnu_result = Handled_Sequence_Of_Statements_to_gnu (gnat_node);
5132 break;
5134 case N_Exception_Handler:
5135 if (Exception_Mechanism == Setjmp_Longjmp)
5136 gnu_result = Exception_Handler_to_gnu_sjlj (gnat_node);
5137 else if (Exception_Mechanism == Back_End_Exceptions)
5138 gnu_result = Exception_Handler_to_gnu_zcx (gnat_node);
5139 else
5140 gcc_unreachable ();
5142 break;
5144 case N_Push_Constraint_Error_Label:
5145 push_exception_label_stack (&gnu_constraint_error_label_stack,
5146 Exception_Label (gnat_node));
5147 break;
5149 case N_Push_Storage_Error_Label:
5150 push_exception_label_stack (&gnu_storage_error_label_stack,
5151 Exception_Label (gnat_node));
5152 break;
5154 case N_Push_Program_Error_Label:
5155 push_exception_label_stack (&gnu_program_error_label_stack,
5156 Exception_Label (gnat_node));
5157 break;
5159 case N_Pop_Constraint_Error_Label:
5160 gnu_constraint_error_label_stack
5161 = TREE_CHAIN (gnu_constraint_error_label_stack);
5162 break;
5164 case N_Pop_Storage_Error_Label:
5165 gnu_storage_error_label_stack
5166 = TREE_CHAIN (gnu_storage_error_label_stack);
5167 break;
5169 case N_Pop_Program_Error_Label:
5170 gnu_program_error_label_stack
5171 = TREE_CHAIN (gnu_program_error_label_stack);
5172 break;
5174 /******************************/
5175 /* Chapter 12: Generic Units */
5176 /******************************/
5178 case N_Generic_Function_Renaming_Declaration:
5179 case N_Generic_Package_Renaming_Declaration:
5180 case N_Generic_Procedure_Renaming_Declaration:
5181 case N_Generic_Package_Declaration:
5182 case N_Generic_Subprogram_Declaration:
5183 case N_Package_Instantiation:
5184 case N_Procedure_Instantiation:
5185 case N_Function_Instantiation:
5186 /* These nodes can appear on a declaration list but there is nothing to
5187 to be done with them. */
5188 gnu_result = alloc_stmt_list ();
5189 break;
5191 /**************************************************/
5192 /* Chapter 13: Representation Clauses and */
5193 /* Implementation-Dependent Features */
5194 /**************************************************/
5196 case N_Attribute_Definition_Clause:
5197 gnu_result = alloc_stmt_list ();
5199 /* The only one we need to deal with is 'Address since, for the others,
5200 the front-end puts the information elsewhere. */
5201 if (Get_Attribute_Id (Chars (gnat_node)) != Attr_Address)
5202 break;
5204 /* And we only deal with 'Address if the object has a Freeze node. */
5205 gnat_temp = Entity (Name (gnat_node));
5206 if (No (Freeze_Node (gnat_temp)))
5207 break;
5209 /* Get the value to use as the address and save it as the equivalent
5210 for the object. When it is frozen, gnat_to_gnu_entity will do the
5211 right thing. */
5212 save_gnu_tree (gnat_temp, gnat_to_gnu (Expression (gnat_node)), true);
5213 break;
5215 case N_Enumeration_Representation_Clause:
5216 case N_Record_Representation_Clause:
5217 case N_At_Clause:
5218 /* We do nothing with these. SEM puts the information elsewhere. */
5219 gnu_result = alloc_stmt_list ();
5220 break;
5222 case N_Code_Statement:
5223 if (!type_annotate_only)
5225 tree gnu_template = gnat_to_gnu (Asm_Template (gnat_node));
5226 tree gnu_inputs = NULL_TREE, gnu_outputs = NULL_TREE;
5227 tree gnu_clobbers = NULL_TREE, tail;
5228 bool allows_mem, allows_reg, fake;
5229 int ninputs, noutputs, i;
5230 const char **oconstraints;
5231 const char *constraint;
5232 char *clobber;
5234 /* First retrieve the 3 operand lists built by the front-end. */
5235 Setup_Asm_Outputs (gnat_node);
5236 while (Present (gnat_temp = Asm_Output_Variable ()))
5238 tree gnu_value = gnat_to_gnu (gnat_temp);
5239 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
5240 (Asm_Output_Constraint ()));
5242 gnu_outputs = tree_cons (gnu_constr, gnu_value, gnu_outputs);
5243 Next_Asm_Output ();
5246 Setup_Asm_Inputs (gnat_node);
5247 while (Present (gnat_temp = Asm_Input_Value ()))
5249 tree gnu_value = gnat_to_gnu (gnat_temp);
5250 tree gnu_constr = build_tree_list (NULL_TREE, gnat_to_gnu
5251 (Asm_Input_Constraint ()));
5253 gnu_inputs = tree_cons (gnu_constr, gnu_value, gnu_inputs);
5254 Next_Asm_Input ();
5257 Clobber_Setup (gnat_node);
5258 while ((clobber = Clobber_Get_Next ()))
5259 gnu_clobbers
5260 = tree_cons (NULL_TREE,
5261 build_string (strlen (clobber) + 1, clobber),
5262 gnu_clobbers);
5264 /* Then perform some standard checking and processing on the
5265 operands. In particular, mark them addressable if needed. */
5266 gnu_outputs = nreverse (gnu_outputs);
5267 noutputs = list_length (gnu_outputs);
5268 gnu_inputs = nreverse (gnu_inputs);
5269 ninputs = list_length (gnu_inputs);
5270 oconstraints
5271 = (const char **) alloca (noutputs * sizeof (const char *));
5273 for (i = 0, tail = gnu_outputs; tail; ++i, tail = TREE_CHAIN (tail))
5275 tree output = TREE_VALUE (tail);
5276 constraint
5277 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
5278 oconstraints[i] = constraint;
5280 if (parse_output_constraint (&constraint, i, ninputs, noutputs,
5281 &allows_mem, &allows_reg, &fake))
5283 /* If the operand is going to end up in memory,
5284 mark it addressable. Note that we don't test
5285 allows_mem like in the input case below; this
5286 is modelled on the C front-end. */
5287 if (!allows_reg
5288 && !gnat_mark_addressable (output))
5289 output = error_mark_node;
5291 else
5292 output = error_mark_node;
5294 TREE_VALUE (tail) = output;
5297 for (i = 0, tail = gnu_inputs; tail; ++i, tail = TREE_CHAIN (tail))
5299 tree input = TREE_VALUE (tail);
5300 constraint
5301 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
5303 if (parse_input_constraint (&constraint, i, ninputs, noutputs,
5304 0, oconstraints,
5305 &allows_mem, &allows_reg))
5307 /* If the operand is going to end up in memory,
5308 mark it addressable. */
5309 if (!allows_reg && allows_mem
5310 && !gnat_mark_addressable (input))
5311 input = error_mark_node;
5313 else
5314 input = error_mark_node;
5316 TREE_VALUE (tail) = input;
5319 gnu_result = build5 (ASM_EXPR, void_type_node,
5320 gnu_template, gnu_outputs,
5321 gnu_inputs, gnu_clobbers, NULL_TREE);
5322 ASM_VOLATILE_P (gnu_result) = Is_Asm_Volatile (gnat_node);
5324 else
5325 gnu_result = alloc_stmt_list ();
5327 break;
5329 /****************/
5330 /* Added Nodes */
5331 /****************/
5333 case N_Freeze_Entity:
5334 start_stmt_group ();
5335 process_freeze_entity (gnat_node);
5336 process_decls (Actions (gnat_node), Empty, Empty, true, true);
5337 gnu_result = end_stmt_group ();
5338 break;
5340 case N_Itype_Reference:
5341 if (!present_gnu_tree (Itype (gnat_node)))
5342 process_type (Itype (gnat_node));
5344 gnu_result = alloc_stmt_list ();
5345 break;
5347 case N_Free_Statement:
5348 if (!type_annotate_only)
5350 tree gnu_ptr = gnat_to_gnu (Expression (gnat_node));
5351 tree gnu_ptr_type = TREE_TYPE (gnu_ptr);
5352 tree gnu_obj_type;
5353 tree gnu_actual_obj_type = 0;
5354 tree gnu_obj_size;
5356 /* If this is a thin pointer, we must dereference it to create
5357 a fat pointer, then go back below to a thin pointer. The
5358 reason for this is that we need a fat pointer someplace in
5359 order to properly compute the size. */
5360 if (TYPE_IS_THIN_POINTER_P (TREE_TYPE (gnu_ptr)))
5361 gnu_ptr = build_unary_op (ADDR_EXPR, NULL_TREE,
5362 build_unary_op (INDIRECT_REF, NULL_TREE,
5363 gnu_ptr));
5365 /* If this is an unconstrained array, we know the object must
5366 have been allocated with the template in front of the object.
5367 So pass the template address, but get the total size. Do this
5368 by converting to a thin pointer. */
5369 if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
5370 gnu_ptr
5371 = convert (build_pointer_type
5372 (TYPE_OBJECT_RECORD_TYPE
5373 (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
5374 gnu_ptr);
5376 gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
5378 if (Present (Actual_Designated_Subtype (gnat_node)))
5380 gnu_actual_obj_type
5381 = gnat_to_gnu_type (Actual_Designated_Subtype (gnat_node));
5383 if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type))
5384 gnu_actual_obj_type
5385 = build_unc_object_type_from_ptr (gnu_ptr_type,
5386 gnu_actual_obj_type,
5387 get_identifier
5388 ("DEALLOC"));
5390 else
5391 gnu_actual_obj_type = gnu_obj_type;
5393 gnu_obj_size = TYPE_SIZE_UNIT (gnu_actual_obj_type);
5395 if (TREE_CODE (gnu_obj_type) == RECORD_TYPE
5396 && TYPE_CONTAINS_TEMPLATE_P (gnu_obj_type))
5398 tree gnu_char_ptr_type
5399 = build_pointer_type (unsigned_char_type_node);
5400 tree gnu_pos = byte_position (TYPE_FIELDS (gnu_obj_type));
5401 gnu_ptr = convert (gnu_char_ptr_type, gnu_ptr);
5402 gnu_ptr = build_binary_op (POINTER_PLUS_EXPR, gnu_char_ptr_type,
5403 gnu_ptr, gnu_pos);
5406 gnu_result
5407 = build_call_alloc_dealloc (gnu_ptr, gnu_obj_size, gnu_obj_type,
5408 Procedure_To_Call (gnat_node),
5409 Storage_Pool (gnat_node),
5410 gnat_node);
5412 break;
5414 case N_Raise_Constraint_Error:
5415 case N_Raise_Program_Error:
5416 case N_Raise_Storage_Error:
5417 if (type_annotate_only)
5419 gnu_result = alloc_stmt_list ();
5420 break;
5423 gnu_result_type = get_unpadded_type (Etype (gnat_node));
5424 gnu_result
5425 = build_call_raise (UI_To_Int (Reason (gnat_node)), gnat_node, kind);
5427 /* If the type is VOID, this is a statement, so we need to
5428 generate the code for the call. Handle a Condition, if there
5429 is one. */
5430 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
5432 set_expr_location_from_node (gnu_result, gnat_node);
5434 if (Present (Condition (gnat_node)))
5435 gnu_result = build3 (COND_EXPR, void_type_node,
5436 gnat_to_gnu (Condition (gnat_node)),
5437 gnu_result, alloc_stmt_list ());
5439 else
5440 gnu_result = build1 (NULL_EXPR, gnu_result_type, gnu_result);
5441 break;
5443 case N_Validate_Unchecked_Conversion:
5445 Entity_Id gnat_target_type = Target_Type (gnat_node);
5446 tree gnu_source_type = gnat_to_gnu_type (Source_Type (gnat_node));
5447 tree gnu_target_type = gnat_to_gnu_type (gnat_target_type);
5449 /* No need for any warning in this case. */
5450 if (!flag_strict_aliasing)
5453 /* If the result is a pointer type, see if we are either converting
5454 from a non-pointer or from a pointer to a type with a different
5455 alias set and warn if so. If the result is defined in the same
5456 unit as this unchecked conversion, we can allow this because we
5457 can know to make the pointer type behave properly. */
5458 else if (POINTER_TYPE_P (gnu_target_type)
5459 && !In_Same_Source_Unit (gnat_target_type, gnat_node)
5460 && !No_Strict_Aliasing (Underlying_Type (gnat_target_type)))
5462 tree gnu_source_desig_type = POINTER_TYPE_P (gnu_source_type)
5463 ? TREE_TYPE (gnu_source_type)
5464 : NULL_TREE;
5465 tree gnu_target_desig_type = TREE_TYPE (gnu_target_type);
5467 if ((TYPE_DUMMY_P (gnu_target_desig_type)
5468 || get_alias_set (gnu_target_desig_type) != 0)
5469 && (!POINTER_TYPE_P (gnu_source_type)
5470 || (TYPE_DUMMY_P (gnu_source_desig_type)
5471 != TYPE_DUMMY_P (gnu_target_desig_type))
5472 || (TYPE_DUMMY_P (gnu_source_desig_type)
5473 && gnu_source_desig_type != gnu_target_desig_type)
5474 || !alias_sets_conflict_p
5475 (get_alias_set (gnu_source_desig_type),
5476 get_alias_set (gnu_target_desig_type))))
5478 post_error_ne
5479 ("?possible aliasing problem for type&",
5480 gnat_node, Target_Type (gnat_node));
5481 post_error
5482 ("\\?use -fno-strict-aliasing switch for references",
5483 gnat_node);
5484 post_error_ne
5485 ("\\?or use `pragma No_Strict_Aliasing (&);`",
5486 gnat_node, Target_Type (gnat_node));
5490 /* But if the result is a fat pointer type, we have no mechanism to
5491 do that, so we unconditionally warn in problematic cases. */
5492 else if (TYPE_IS_FAT_POINTER_P (gnu_target_type))
5494 tree gnu_source_array_type
5495 = TYPE_IS_FAT_POINTER_P (gnu_source_type)
5496 ? TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_source_type)))
5497 : NULL_TREE;
5498 tree gnu_target_array_type
5499 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (gnu_target_type)));
5501 if ((TYPE_DUMMY_P (gnu_target_array_type)
5502 || get_alias_set (gnu_target_array_type) != 0)
5503 && (!TYPE_IS_FAT_POINTER_P (gnu_source_type)
5504 || (TYPE_DUMMY_P (gnu_source_array_type)
5505 != TYPE_DUMMY_P (gnu_target_array_type))
5506 || (TYPE_DUMMY_P (gnu_source_array_type)
5507 && gnu_source_array_type != gnu_target_array_type)
5508 || !alias_sets_conflict_p
5509 (get_alias_set (gnu_source_array_type),
5510 get_alias_set (gnu_target_array_type))))
5512 post_error_ne
5513 ("?possible aliasing problem for type&",
5514 gnat_node, Target_Type (gnat_node));
5515 post_error
5516 ("\\?use -fno-strict-aliasing switch for references",
5517 gnat_node);
5521 gnu_result = alloc_stmt_list ();
5522 break;
5524 default:
5525 /* SCIL nodes require no processing for GCC. Other nodes should only
5526 be present when annotating types. */
5527 gcc_assert (IN (kind, N_SCIL_Node) || type_annotate_only);
5528 gnu_result = alloc_stmt_list ();
5531 /* If we pushed the processing of the elaboration routine, pop it back. */
5532 if (went_into_elab_proc)
5533 current_function_decl = NULL_TREE;
5535 /* When not optimizing, turn boolean rvalues B into B != false tests
5536 so that the code just below can put the location information of the
5537 reference to B on the inequality operator for better debug info. */
5538 if (!optimize
5539 && (kind == N_Identifier
5540 || kind == N_Expanded_Name
5541 || kind == N_Explicit_Dereference
5542 || kind == N_Function_Call
5543 || kind == N_Indexed_Component
5544 || kind == N_Selected_Component)
5545 && TREE_CODE (get_base_type (gnu_result_type)) == BOOLEAN_TYPE
5546 && !lvalue_required_p (gnat_node, gnu_result_type, false, false, false))
5547 gnu_result = build_binary_op (NE_EXPR, gnu_result_type,
5548 convert (gnu_result_type, gnu_result),
5549 convert (gnu_result_type,
5550 boolean_false_node));
5552 /* Set the location information on the result if it is a real expression.
5553 References can be reused for multiple GNAT nodes and they would get
5554 the location information of their last use. Note that we may have
5555 no result if we tried to build a CALL_EXPR node to a procedure with
5556 no side-effects and optimization is enabled. */
5557 if (gnu_result
5558 && EXPR_P (gnu_result)
5559 && TREE_CODE (gnu_result) != NOP_EXPR
5560 && !REFERENCE_CLASS_P (gnu_result)
5561 && !EXPR_HAS_LOCATION (gnu_result))
5562 set_expr_location_from_node (gnu_result, gnat_node);
5564 /* If we're supposed to return something of void_type, it means we have
5565 something we're elaborating for effect, so just return. */
5566 if (TREE_CODE (gnu_result_type) == VOID_TYPE)
5567 return gnu_result;
5569 /* If the result is a constant that overflowed, raise Constraint_Error. */
5570 if (TREE_CODE (gnu_result) == INTEGER_CST && TREE_OVERFLOW (gnu_result))
5572 post_error ("Constraint_Error will be raised at run-time?", gnat_node);
5573 gnu_result
5574 = build1 (NULL_EXPR, gnu_result_type,
5575 build_call_raise (CE_Overflow_Check_Failed, gnat_node,
5576 N_Raise_Constraint_Error));
5579 /* If our result has side-effects and is of an unconstrained type,
5580 make a SAVE_EXPR so that we can be sure it will only be referenced
5581 once. Note we must do this before any conversions. */
5582 if (TREE_SIDE_EFFECTS (gnu_result)
5583 && (TREE_CODE (gnu_result_type) == UNCONSTRAINED_ARRAY_TYPE
5584 || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))))
5585 gnu_result = gnat_stabilize_reference (gnu_result, false, NULL);
5587 /* Now convert the result to the result type, unless we are in one of the
5588 following cases:
5590 1. If this is the Name of an assignment statement or a parameter of
5591 a procedure call, return the result almost unmodified since the
5592 RHS will have to be converted to our type in that case, unless
5593 the result type has a simpler size. Likewise if there is just
5594 a no-op unchecked conversion in-between. Similarly, don't convert
5595 integral types that are the operands of an unchecked conversion
5596 since we need to ignore those conversions (for 'Valid).
5598 2. If we have a label (which doesn't have any well-defined type), a
5599 field or an error, return the result almost unmodified. Also don't
5600 do the conversion if the result type involves a PLACEHOLDER_EXPR in
5601 its size since those are the cases where the front end may have the
5602 type wrong due to "instantiating" the unconstrained record with
5603 discriminant values. Similarly, if the two types are record types
5604 with the same name don't convert. This will be the case when we are
5605 converting from a packable version of a type to its original type and
5606 we need those conversions to be NOPs in order for assignments into
5607 these types to work properly.
5609 3. If the type is void or if we have no result, return error_mark_node
5610 to show we have no result.
5612 4. Finally, if the type of the result is already correct. */
5614 if (Present (Parent (gnat_node))
5615 && ((Nkind (Parent (gnat_node)) == N_Assignment_Statement
5616 && Name (Parent (gnat_node)) == gnat_node)
5617 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
5618 && unchecked_conversion_nop (Parent (gnat_node)))
5619 || (Nkind (Parent (gnat_node)) == N_Procedure_Call_Statement
5620 && Name (Parent (gnat_node)) != gnat_node)
5621 || Nkind (Parent (gnat_node)) == N_Parameter_Association
5622 || (Nkind (Parent (gnat_node)) == N_Unchecked_Type_Conversion
5623 && !AGGREGATE_TYPE_P (gnu_result_type)
5624 && !AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))))
5625 && !(TYPE_SIZE (gnu_result_type)
5626 && TYPE_SIZE (TREE_TYPE (gnu_result))
5627 && (AGGREGATE_TYPE_P (gnu_result_type)
5628 == AGGREGATE_TYPE_P (TREE_TYPE (gnu_result)))
5629 && ((TREE_CODE (TYPE_SIZE (gnu_result_type)) == INTEGER_CST
5630 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (gnu_result)))
5631 != INTEGER_CST))
5632 || (TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
5633 && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))
5634 && (CONTAINS_PLACEHOLDER_P
5635 (TYPE_SIZE (TREE_TYPE (gnu_result))))))
5636 && !(TREE_CODE (gnu_result_type) == RECORD_TYPE
5637 && TYPE_JUSTIFIED_MODULAR_P (gnu_result_type))))
5639 /* Remove padding only if the inner object is of self-referential
5640 size: in that case it must be an object of unconstrained type
5641 with a default discriminant and we want to avoid copying too
5642 much data. */
5643 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result))
5644 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS
5645 (TREE_TYPE (gnu_result))))))
5646 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
5647 gnu_result);
5650 else if (TREE_CODE (gnu_result) == LABEL_DECL
5651 || TREE_CODE (gnu_result) == FIELD_DECL
5652 || TREE_CODE (gnu_result) == ERROR_MARK
5653 || (TYPE_SIZE (gnu_result_type)
5654 && TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST
5655 && TREE_CODE (gnu_result) != INDIRECT_REF
5656 && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type)))
5657 || ((TYPE_NAME (gnu_result_type)
5658 == TYPE_NAME (TREE_TYPE (gnu_result)))
5659 && TREE_CODE (gnu_result_type) == RECORD_TYPE
5660 && TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE))
5662 /* Remove any padding. */
5663 if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
5664 gnu_result = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
5665 gnu_result);
5668 else if (gnu_result == error_mark_node || gnu_result_type == void_type_node)
5669 gnu_result = error_mark_node;
5671 else if (gnu_result_type != TREE_TYPE (gnu_result))
5672 gnu_result = convert (gnu_result_type, gnu_result);
5674 /* We don't need any NOP_EXPR or NON_LVALUE_EXPR on the result. */
5675 while ((TREE_CODE (gnu_result) == NOP_EXPR
5676 || TREE_CODE (gnu_result) == NON_LVALUE_EXPR)
5677 && TREE_TYPE (TREE_OPERAND (gnu_result, 0)) == TREE_TYPE (gnu_result))
5678 gnu_result = TREE_OPERAND (gnu_result, 0);
5680 return gnu_result;
5683 /* Subroutine of above to push the exception label stack. GNU_STACK is
5684 a pointer to the stack to update and GNAT_LABEL, if present, is the
5685 label to push onto the stack. */
5687 static void
5688 push_exception_label_stack (tree *gnu_stack, Entity_Id gnat_label)
5690 tree gnu_label = (Present (gnat_label)
5691 ? gnat_to_gnu_entity (gnat_label, NULL_TREE, 0)
5692 : NULL_TREE);
5694 *gnu_stack = tree_cons (NULL_TREE, gnu_label, *gnu_stack);
5697 /* Record the current code position in GNAT_NODE. */
5699 static void
5700 record_code_position (Node_Id gnat_node)
5702 tree stmt_stmt = build1 (STMT_STMT, void_type_node, NULL_TREE);
5704 add_stmt_with_node (stmt_stmt, gnat_node);
5705 save_gnu_tree (gnat_node, stmt_stmt, true);
5708 /* Insert the code for GNAT_NODE at the position saved for that node. */
5710 static void
5711 insert_code_for (Node_Id gnat_node)
5713 STMT_STMT_STMT (get_gnu_tree (gnat_node)) = gnat_to_gnu (gnat_node);
5714 save_gnu_tree (gnat_node, NULL_TREE, true);
5717 /* Start a new statement group chained to the previous group. */
5719 void
5720 start_stmt_group (void)
5722 struct stmt_group *group = stmt_group_free_list;
5724 /* First see if we can get one from the free list. */
5725 if (group)
5726 stmt_group_free_list = group->previous;
5727 else
5728 group = (struct stmt_group *) ggc_alloc (sizeof (struct stmt_group));
5730 group->previous = current_stmt_group;
5731 group->stmt_list = group->block = group->cleanups = NULL_TREE;
5732 current_stmt_group = group;
5735 /* Add GNU_STMT to the current statement group. */
5737 void
5738 add_stmt (tree gnu_stmt)
5740 append_to_statement_list (gnu_stmt, &current_stmt_group->stmt_list);
5743 /* Similar, but set the location of GNU_STMT to that of GNAT_NODE. */
5745 void
5746 add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node)
5748 if (Present (gnat_node))
5749 set_expr_location_from_node (gnu_stmt, gnat_node);
5750 add_stmt (gnu_stmt);
5753 /* Add a declaration statement for GNU_DECL to the current statement group.
5754 Get SLOC from Entity_Id. */
5756 void
5757 add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
5759 tree type = TREE_TYPE (gnu_decl);
5760 tree gnu_stmt, gnu_init, t;
5762 /* If this is a variable that Gigi is to ignore, we may have been given
5763 an ERROR_MARK. So test for it. We also might have been given a
5764 reference for a renaming. So only do something for a decl. Also
5765 ignore a TYPE_DECL for an UNCONSTRAINED_ARRAY_TYPE. */
5766 if (!DECL_P (gnu_decl)
5767 || (TREE_CODE (gnu_decl) == TYPE_DECL
5768 && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE))
5769 return;
5771 gnu_stmt = build1 (DECL_EXPR, void_type_node, gnu_decl);
5773 /* If we are global, we don't want to actually output the DECL_EXPR for
5774 this decl since we already have evaluated the expressions in the
5775 sizes and positions as globals and doing it again would be wrong. */
5776 if (global_bindings_p ())
5778 /* Mark everything as used to prevent node sharing with subprograms.
5779 Note that walk_tree knows how to deal with TYPE_DECL, but neither
5780 VAR_DECL nor CONST_DECL. This appears to be somewhat arbitrary. */
5781 MARK_VISITED (gnu_stmt);
5782 if (TREE_CODE (gnu_decl) == VAR_DECL
5783 || TREE_CODE (gnu_decl) == CONST_DECL)
5785 MARK_VISITED (DECL_SIZE (gnu_decl));
5786 MARK_VISITED (DECL_SIZE_UNIT (gnu_decl));
5787 MARK_VISITED (DECL_INITIAL (gnu_decl));
5789 /* In any case, we have to deal with our own TYPE_ADA_SIZE field. */
5790 else if (TREE_CODE (gnu_decl) == TYPE_DECL
5791 && ((TREE_CODE (type) == RECORD_TYPE
5792 && !TYPE_FAT_POINTER_P (type))
5793 || TREE_CODE (type) == UNION_TYPE
5794 || TREE_CODE (type) == QUAL_UNION_TYPE))
5795 MARK_VISITED (TYPE_ADA_SIZE (type));
5797 else
5798 add_stmt_with_node (gnu_stmt, gnat_entity);
5800 /* If this is a variable and an initializer is attached to it, it must be
5801 valid for the context. Similar to init_const in create_var_decl_1. */
5802 if (TREE_CODE (gnu_decl) == VAR_DECL
5803 && (gnu_init = DECL_INITIAL (gnu_decl)) != NULL_TREE
5804 && (!gnat_types_compatible_p (type, TREE_TYPE (gnu_init))
5805 || (TREE_STATIC (gnu_decl)
5806 && !initializer_constant_valid_p (gnu_init,
5807 TREE_TYPE (gnu_init)))))
5809 /* If GNU_DECL has a padded type, convert it to the unpadded
5810 type so the assignment is done properly. */
5811 if (TYPE_IS_PADDING_P (type))
5812 t = convert (TREE_TYPE (TYPE_FIELDS (type)), gnu_decl);
5813 else
5814 t = gnu_decl;
5816 gnu_stmt = build_binary_op (INIT_EXPR, NULL_TREE, t, gnu_init);
5818 DECL_INITIAL (gnu_decl) = NULL_TREE;
5819 if (TREE_READONLY (gnu_decl))
5821 TREE_READONLY (gnu_decl) = 0;
5822 DECL_READONLY_ONCE_ELAB (gnu_decl) = 1;
5825 add_stmt_with_node (gnu_stmt, gnat_entity);
5829 /* Callback for walk_tree to mark the visited trees rooted at *TP. */
5831 static tree
5832 mark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
5834 tree t = *tp;
5836 if (TREE_VISITED (t))
5837 *walk_subtrees = 0;
5839 /* Don't mark a dummy type as visited because we want to mark its sizes
5840 and fields once it's filled in. */
5841 else if (!TYPE_IS_DUMMY_P (t))
5842 TREE_VISITED (t) = 1;
5844 if (TYPE_P (t))
5845 TYPE_SIZES_GIMPLIFIED (t) = 1;
5847 return NULL_TREE;
5850 /* Mark nodes rooted at T with TREE_VISITED and types as having their
5851 sized gimplified. We use this to indicate all variable sizes and
5852 positions in global types may not be shared by any subprogram. */
5854 void
5855 mark_visited (tree t)
5857 walk_tree (&t, mark_visited_r, NULL, NULL);
5860 /* Utility function to unshare expressions wrapped up in a SAVE_EXPR. */
5862 static tree
5863 unshare_save_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
5864 void *data ATTRIBUTE_UNUSED)
5866 tree t = *tp;
5868 if (TREE_CODE (t) == SAVE_EXPR)
5869 TREE_OPERAND (t, 0) = unshare_expr (TREE_OPERAND (t, 0));
5871 return NULL_TREE;
5874 /* Add GNU_CLEANUP, a cleanup action, to the current code group and
5875 set its location to that of GNAT_NODE if present. */
5877 static void
5878 add_cleanup (tree gnu_cleanup, Node_Id gnat_node)
5880 if (Present (gnat_node))
5881 set_expr_location_from_node (gnu_cleanup, gnat_node);
5882 append_to_statement_list (gnu_cleanup, &current_stmt_group->cleanups);
5885 /* Set the BLOCK node corresponding to the current code group to GNU_BLOCK. */
5887 void
5888 set_block_for_group (tree gnu_block)
5890 gcc_assert (!current_stmt_group->block);
5891 current_stmt_group->block = gnu_block;
5894 /* Return code corresponding to the current code group. It is normally
5895 a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
5896 BLOCK or cleanups were set. */
5898 tree
5899 end_stmt_group (void)
5901 struct stmt_group *group = current_stmt_group;
5902 tree gnu_retval = group->stmt_list;
5904 /* If this is a null list, allocate a new STATEMENT_LIST. Then, if there
5905 are cleanups, make a TRY_FINALLY_EXPR. Last, if there is a BLOCK,
5906 make a BIND_EXPR. Note that we nest in that because the cleanup may
5907 reference variables in the block. */
5908 if (gnu_retval == NULL_TREE)
5909 gnu_retval = alloc_stmt_list ();
5911 if (group->cleanups)
5912 gnu_retval = build2 (TRY_FINALLY_EXPR, void_type_node, gnu_retval,
5913 group->cleanups);
5915 if (current_stmt_group->block)
5916 gnu_retval = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (group->block),
5917 gnu_retval, group->block);
5919 /* Remove this group from the stack and add it to the free list. */
5920 current_stmt_group = group->previous;
5921 group->previous = stmt_group_free_list;
5922 stmt_group_free_list = group;
5924 return gnu_retval;
5927 /* Add a list of statements from GNAT_LIST, a possibly-empty list of
5928 statements.*/
5930 static void
5931 add_stmt_list (List_Id gnat_list)
5933 Node_Id gnat_node;
5935 if (Present (gnat_list))
5936 for (gnat_node = First (gnat_list); Present (gnat_node);
5937 gnat_node = Next (gnat_node))
5938 add_stmt (gnat_to_gnu (gnat_node));
5941 /* Build a tree from GNAT_LIST, a possibly-empty list of statements.
5942 If BINDING_P is true, push and pop a binding level around the list. */
5944 static tree
5945 build_stmt_group (List_Id gnat_list, bool binding_p)
5947 start_stmt_group ();
5948 if (binding_p)
5949 gnat_pushlevel ();
5951 add_stmt_list (gnat_list);
5952 if (binding_p)
5953 gnat_poplevel ();
5955 return end_stmt_group ();
5958 /* Push and pop routines for stacks. We keep a free list around so we
5959 don't waste tree nodes. */
5961 static void
5962 push_stack (tree *gnu_stack_ptr, tree gnu_purpose, tree gnu_value)
5964 tree gnu_node = gnu_stack_free_list;
5966 if (gnu_node)
5968 gnu_stack_free_list = TREE_CHAIN (gnu_node);
5969 TREE_CHAIN (gnu_node) = *gnu_stack_ptr;
5970 TREE_PURPOSE (gnu_node) = gnu_purpose;
5971 TREE_VALUE (gnu_node) = gnu_value;
5973 else
5974 gnu_node = tree_cons (gnu_purpose, gnu_value, *gnu_stack_ptr);
5976 *gnu_stack_ptr = gnu_node;
5979 static void
5980 pop_stack (tree *gnu_stack_ptr)
5982 tree gnu_node = *gnu_stack_ptr;
5984 *gnu_stack_ptr = TREE_CHAIN (gnu_node);
5985 TREE_CHAIN (gnu_node) = gnu_stack_free_list;
5986 gnu_stack_free_list = gnu_node;
5989 /* Generate GIMPLE in place for the expression at *EXPR_P. */
5992 gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
5993 gimple_seq *post_p ATTRIBUTE_UNUSED)
5995 tree expr = *expr_p;
5996 tree op;
5998 if (IS_ADA_STMT (expr))
5999 return gnat_gimplify_stmt (expr_p);
6001 switch (TREE_CODE (expr))
6003 case NULL_EXPR:
6004 /* If this is for a scalar, just make a VAR_DECL for it. If for
6005 an aggregate, get a null pointer of the appropriate type and
6006 dereference it. */
6007 if (AGGREGATE_TYPE_P (TREE_TYPE (expr)))
6008 *expr_p = build1 (INDIRECT_REF, TREE_TYPE (expr),
6009 convert (build_pointer_type (TREE_TYPE (expr)),
6010 integer_zero_node));
6011 else
6013 *expr_p = create_tmp_var (TREE_TYPE (expr), NULL);
6014 TREE_NO_WARNING (*expr_p) = 1;
6017 gimplify_and_add (TREE_OPERAND (expr, 0), pre_p);
6018 return GS_OK;
6020 case UNCONSTRAINED_ARRAY_REF:
6021 /* We should only do this if we are just elaborating for side-effects,
6022 but we can't know that yet. */
6023 *expr_p = TREE_OPERAND (*expr_p, 0);
6024 return GS_OK;
6026 case ADDR_EXPR:
6027 op = TREE_OPERAND (expr, 0);
6029 if (TREE_CODE (op) == CONSTRUCTOR)
6031 /* If we are taking the address of a constant CONSTRUCTOR, make sure
6032 it is put into static memory. We know it's going to be read-only
6033 given the semantics we have and it must be in static memory when
6034 the reference is in an elaboration procedure. */
6035 if (TREE_CONSTANT (op))
6037 tree new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
6038 TREE_ADDRESSABLE (new_var) = 1;
6039 gimple_add_tmp_var (new_var);
6041 TREE_READONLY (new_var) = 1;
6042 TREE_STATIC (new_var) = 1;
6043 DECL_INITIAL (new_var) = op;
6045 TREE_OPERAND (expr, 0) = new_var;
6046 recompute_tree_invariant_for_addr_expr (expr);
6049 /* Otherwise explicitly create the local temporary. That's required
6050 if the type is passed by reference. */
6051 else
6053 tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
6054 TREE_ADDRESSABLE (new_var) = 1;
6055 gimple_add_tmp_var (new_var);
6057 mod = build2 (INIT_EXPR, TREE_TYPE (new_var), new_var, op);
6058 gimplify_and_add (mod, pre_p);
6060 TREE_OPERAND (expr, 0) = new_var;
6061 recompute_tree_invariant_for_addr_expr (expr);
6064 return GS_ALL_DONE;
6067 return GS_UNHANDLED;
6069 case DECL_EXPR:
6070 op = DECL_EXPR_DECL (expr);
6072 /* The expressions for the RM bounds must be gimplified to ensure that
6073 they are properly elaborated. See gimplify_decl_expr. */
6074 if ((TREE_CODE (op) == TYPE_DECL || TREE_CODE (op) == VAR_DECL)
6075 && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (op)))
6076 switch (TREE_CODE (TREE_TYPE (op)))
6078 case INTEGER_TYPE:
6079 case ENUMERAL_TYPE:
6080 case BOOLEAN_TYPE:
6081 case REAL_TYPE:
6083 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (op)), t, val;
6085 val = TYPE_RM_MIN_VALUE (type);
6086 if (val)
6088 gimplify_one_sizepos (&val, pre_p);
6089 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
6090 SET_TYPE_RM_MIN_VALUE (t, val);
6093 val = TYPE_RM_MAX_VALUE (type);
6094 if (val)
6096 gimplify_one_sizepos (&val, pre_p);
6097 for (t = type; t; t = TYPE_NEXT_VARIANT (t))
6098 SET_TYPE_RM_MAX_VALUE (t, val);
6102 break;
6104 default:
6105 break;
6108 /* ... fall through ... */
6110 default:
6111 return GS_UNHANDLED;
6115 /* Generate GIMPLE in place for the statement at *STMT_P. */
6117 static enum gimplify_status
6118 gnat_gimplify_stmt (tree *stmt_p)
6120 tree stmt = *stmt_p;
6122 switch (TREE_CODE (stmt))
6124 case STMT_STMT:
6125 *stmt_p = STMT_STMT_STMT (stmt);
6126 return GS_OK;
6128 case LOOP_STMT:
6130 tree gnu_start_label = create_artificial_label (input_location);
6131 tree gnu_cond = LOOP_STMT_COND (stmt);
6132 tree gnu_update = LOOP_STMT_UPDATE (stmt);
6133 tree gnu_end_label = LOOP_STMT_LABEL (stmt);
6134 tree t;
6136 /* Build the condition expression from the test, if any. */
6137 if (gnu_cond)
6138 gnu_cond
6139 = build3 (COND_EXPR, void_type_node, gnu_cond, alloc_stmt_list (),
6140 build1 (GOTO_EXPR, void_type_node, gnu_end_label));
6142 /* Set to emit the statements of the loop. */
6143 *stmt_p = NULL_TREE;
6145 /* We first emit the start label and then a conditional jump to the
6146 end label if there's a top condition, then the update if it's at
6147 the top, then the body of the loop, then a conditional jump to
6148 the end label if there's a bottom condition, then the update if
6149 it's at the bottom, and finally a jump to the start label and the
6150 definition of the end label. */
6151 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
6152 gnu_start_label),
6153 stmt_p);
6155 if (gnu_cond && !LOOP_STMT_BOTTOM_COND_P (stmt))
6156 append_to_statement_list (gnu_cond, stmt_p);
6158 if (gnu_update && LOOP_STMT_TOP_UPDATE_P (stmt))
6159 append_to_statement_list (gnu_update, stmt_p);
6161 append_to_statement_list (LOOP_STMT_BODY (stmt), stmt_p);
6163 if (gnu_cond && LOOP_STMT_BOTTOM_COND_P (stmt))
6164 append_to_statement_list (gnu_cond, stmt_p);
6166 if (gnu_update && !LOOP_STMT_TOP_UPDATE_P (stmt))
6167 append_to_statement_list (gnu_update, stmt_p);
6169 t = build1 (GOTO_EXPR, void_type_node, gnu_start_label);
6170 SET_EXPR_LOCATION (t, DECL_SOURCE_LOCATION (gnu_end_label));
6171 append_to_statement_list (t, stmt_p);
6173 append_to_statement_list (build1 (LABEL_EXPR, void_type_node,
6174 gnu_end_label),
6175 stmt_p);
6176 return GS_OK;
6179 case EXIT_STMT:
6180 /* Build a statement to jump to the corresponding end label, then
6181 see if it needs to be conditional. */
6182 *stmt_p = build1 (GOTO_EXPR, void_type_node, EXIT_STMT_LABEL (stmt));
6183 if (EXIT_STMT_COND (stmt))
6184 *stmt_p = build3 (COND_EXPR, void_type_node,
6185 EXIT_STMT_COND (stmt), *stmt_p, alloc_stmt_list ());
6186 return GS_OK;
6188 default:
6189 gcc_unreachable ();
6193 /* Force references to each of the entities in packages withed by GNAT_NODE.
6194 Operate recursively but check that we aren't elaborating something more
6195 than once.
6197 This routine is exclusively called in type_annotate mode, to compute DDA
6198 information for types in withed units, for ASIS use. */
6200 static void
6201 elaborate_all_entities (Node_Id gnat_node)
6203 Entity_Id gnat_with_clause, gnat_entity;
6205 /* Process each unit only once. As we trace the context of all relevant
6206 units transitively, including generic bodies, we may encounter the
6207 same generic unit repeatedly. */
6208 if (!present_gnu_tree (gnat_node))
6209 save_gnu_tree (gnat_node, integer_zero_node, true);
6211 /* Save entities in all context units. A body may have an implicit_with
6212 on its own spec, if the context includes a child unit, so don't save
6213 the spec twice. */
6214 for (gnat_with_clause = First (Context_Items (gnat_node));
6215 Present (gnat_with_clause);
6216 gnat_with_clause = Next (gnat_with_clause))
6217 if (Nkind (gnat_with_clause) == N_With_Clause
6218 && !present_gnu_tree (Library_Unit (gnat_with_clause))
6219 && Library_Unit (gnat_with_clause) != Library_Unit (Cunit (Main_Unit)))
6221 elaborate_all_entities (Library_Unit (gnat_with_clause));
6223 if (Ekind (Entity (Name (gnat_with_clause))) == E_Package)
6225 for (gnat_entity = First_Entity (Entity (Name (gnat_with_clause)));
6226 Present (gnat_entity);
6227 gnat_entity = Next_Entity (gnat_entity))
6228 if (Is_Public (gnat_entity)
6229 && Convention (gnat_entity) != Convention_Intrinsic
6230 && Ekind (gnat_entity) != E_Package
6231 && Ekind (gnat_entity) != E_Package_Body
6232 && Ekind (gnat_entity) != E_Operator
6233 && !(IN (Ekind (gnat_entity), Type_Kind)
6234 && !Is_Frozen (gnat_entity))
6235 && !((Ekind (gnat_entity) == E_Procedure
6236 || Ekind (gnat_entity) == E_Function)
6237 && Is_Intrinsic_Subprogram (gnat_entity))
6238 && !IN (Ekind (gnat_entity), Named_Kind)
6239 && !IN (Ekind (gnat_entity), Generic_Unit_Kind))
6240 gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
6242 else if (Ekind (Entity (Name (gnat_with_clause))) == E_Generic_Package)
6244 Node_Id gnat_body
6245 = Corresponding_Body (Unit (Library_Unit (gnat_with_clause)));
6247 /* Retrieve compilation unit node of generic body. */
6248 while (Present (gnat_body)
6249 && Nkind (gnat_body) != N_Compilation_Unit)
6250 gnat_body = Parent (gnat_body);
6252 /* If body is available, elaborate its context. */
6253 if (Present (gnat_body))
6254 elaborate_all_entities (gnat_body);
6258 if (Nkind (Unit (gnat_node)) == N_Package_Body)
6259 elaborate_all_entities (Library_Unit (gnat_node));
6262 /* Do the processing of GNAT_NODE, an N_Freeze_Entity. */
6264 static void
6265 process_freeze_entity (Node_Id gnat_node)
6267 const Entity_Id gnat_entity = Entity (gnat_node);
6268 const Entity_Kind kind = Ekind (gnat_entity);
6269 tree gnu_old, gnu_new;
6271 /* If this is a package, we need to generate code for the package. */
6272 if (kind == E_Package)
6274 insert_code_for
6275 (Parent (Corresponding_Body
6276 (Parent (Declaration_Node (gnat_entity)))));
6277 return;
6280 /* Don't do anything for class-wide types as they are always transformed
6281 into their root type. */
6282 if (kind == E_Class_Wide_Type)
6283 return;
6285 /* Check for an old definition. This freeze node might be for an Itype. */
6286 gnu_old
6287 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : NULL_TREE;
6289 /* If this entity has an address representation clause, GNU_OLD is the
6290 address, so discard it here. */
6291 if (Present (Address_Clause (gnat_entity)))
6292 gnu_old = NULL_TREE;
6294 /* Don't do anything for subprograms that may have been elaborated before
6295 their freeze nodes. This can happen, for example, because of an inner
6296 call in an instance body or because of previous compilation of a spec
6297 for inlining purposes. */
6298 if (gnu_old
6299 && ((TREE_CODE (gnu_old) == FUNCTION_DECL
6300 && (kind == E_Function || kind == E_Procedure))
6301 || (TREE_CODE (TREE_TYPE (gnu_old)) == FUNCTION_TYPE
6302 && kind == E_Subprogram_Type)))
6303 return;
6305 /* If we have a non-dummy type old tree, we have nothing to do, except
6306 aborting if this is the public view of a private type whose full view was
6307 not delayed, as this node was never delayed as it should have been. We
6308 let this happen for concurrent types and their Corresponding_Record_Type,
6309 however, because each might legitimately be elaborated before its own
6310 freeze node, e.g. while processing the other. */
6311 if (gnu_old
6312 && !(TREE_CODE (gnu_old) == TYPE_DECL
6313 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old))))
6315 gcc_assert ((IN (kind, Incomplete_Or_Private_Kind)
6316 && Present (Full_View (gnat_entity))
6317 && No (Freeze_Node (Full_View (gnat_entity))))
6318 || Is_Concurrent_Type (gnat_entity)
6319 || (IN (kind, Record_Kind)
6320 && Is_Concurrent_Record_Type (gnat_entity)));
6321 return;
6324 /* Reset the saved tree, if any, and elaborate the object or type for real.
6325 If there is a full view, elaborate it and use the result. And, if this
6326 is the root type of a class-wide type, reuse it for the latter. */
6327 if (gnu_old)
6329 save_gnu_tree (gnat_entity, NULL_TREE, false);
6330 if (IN (kind, Incomplete_Or_Private_Kind)
6331 && Present (Full_View (gnat_entity))
6332 && present_gnu_tree (Full_View (gnat_entity)))
6333 save_gnu_tree (Full_View (gnat_entity), NULL_TREE, false);
6334 if (IN (kind, Type_Kind)
6335 && Present (Class_Wide_Type (gnat_entity))
6336 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
6337 save_gnu_tree (Class_Wide_Type (gnat_entity), NULL_TREE, false);
6340 if (IN (kind, Incomplete_Or_Private_Kind)
6341 && Present (Full_View (gnat_entity)))
6343 gnu_new = gnat_to_gnu_entity (Full_View (gnat_entity), NULL_TREE, 1);
6345 /* Propagate back-annotations from full view to partial view. */
6346 if (Unknown_Alignment (gnat_entity))
6347 Set_Alignment (gnat_entity, Alignment (Full_View (gnat_entity)));
6349 if (Unknown_Esize (gnat_entity))
6350 Set_Esize (gnat_entity, Esize (Full_View (gnat_entity)));
6352 if (Unknown_RM_Size (gnat_entity))
6353 Set_RM_Size (gnat_entity, RM_Size (Full_View (gnat_entity)));
6355 /* The above call may have defined this entity (the simplest example
6356 of this is when we have a private enumeral type since the bounds
6357 will have the public view). */
6358 if (!present_gnu_tree (gnat_entity))
6359 save_gnu_tree (gnat_entity, gnu_new, false);
6361 else
6363 tree gnu_init
6364 = (Nkind (Declaration_Node (gnat_entity)) == N_Object_Declaration
6365 && present_gnu_tree (Declaration_Node (gnat_entity)))
6366 ? get_gnu_tree (Declaration_Node (gnat_entity)) : NULL_TREE;
6368 gnu_new = gnat_to_gnu_entity (gnat_entity, gnu_init, 1);
6371 if (IN (kind, Type_Kind)
6372 && Present (Class_Wide_Type (gnat_entity))
6373 && Root_Type (Class_Wide_Type (gnat_entity)) == gnat_entity)
6374 save_gnu_tree (Class_Wide_Type (gnat_entity), gnu_new, false);
6376 /* If we've made any pointers to the old version of this type, we
6377 have to update them. */
6378 if (gnu_old)
6379 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
6380 TREE_TYPE (gnu_new));
6383 /* Elaborate decls in the lists GNAT_DECLS and GNAT_DECLS2, if present.
6384 We make two passes, one to elaborate anything other than bodies (but
6385 we declare a function if there was no spec). The second pass
6386 elaborates the bodies.
6388 GNAT_END_LIST gives the element in the list past the end. Normally,
6389 this is Empty, but can be First_Real_Statement for a
6390 Handled_Sequence_Of_Statements.
6392 We make a complete pass through both lists if PASS1P is true, then make
6393 the second pass over both lists if PASS2P is true. The lists usually
6394 correspond to the public and private parts of a package. */
6396 static void
6397 process_decls (List_Id gnat_decls, List_Id gnat_decls2,
6398 Node_Id gnat_end_list, bool pass1p, bool pass2p)
6400 List_Id gnat_decl_array[2];
6401 Node_Id gnat_decl;
6402 int i;
6404 gnat_decl_array[0] = gnat_decls, gnat_decl_array[1] = gnat_decls2;
6406 if (pass1p)
6407 for (i = 0; i <= 1; i++)
6408 if (Present (gnat_decl_array[i]))
6409 for (gnat_decl = First (gnat_decl_array[i]);
6410 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
6412 /* For package specs, we recurse inside the declarations,
6413 thus taking the two pass approach inside the boundary. */
6414 if (Nkind (gnat_decl) == N_Package_Declaration
6415 && (Nkind (Specification (gnat_decl)
6416 == N_Package_Specification)))
6417 process_decls (Visible_Declarations (Specification (gnat_decl)),
6418 Private_Declarations (Specification (gnat_decl)),
6419 Empty, true, false);
6421 /* Similarly for any declarations in the actions of a
6422 freeze node. */
6423 else if (Nkind (gnat_decl) == N_Freeze_Entity)
6425 process_freeze_entity (gnat_decl);
6426 process_decls (Actions (gnat_decl), Empty, Empty, true, false);
6429 /* Package bodies with freeze nodes get their elaboration deferred
6430 until the freeze node, but the code must be placed in the right
6431 place, so record the code position now. */
6432 else if (Nkind (gnat_decl) == N_Package_Body
6433 && Present (Freeze_Node (Corresponding_Spec (gnat_decl))))
6434 record_code_position (gnat_decl);
6436 else if (Nkind (gnat_decl) == N_Package_Body_Stub
6437 && Present (Library_Unit (gnat_decl))
6438 && Present (Freeze_Node
6439 (Corresponding_Spec
6440 (Proper_Body (Unit
6441 (Library_Unit (gnat_decl)))))))
6442 record_code_position
6443 (Proper_Body (Unit (Library_Unit (gnat_decl))));
6445 /* We defer most subprogram bodies to the second pass. */
6446 else if (Nkind (gnat_decl) == N_Subprogram_Body)
6448 if (Acts_As_Spec (gnat_decl))
6450 Node_Id gnat_subprog_id = Defining_Entity (gnat_decl);
6452 if (Ekind (gnat_subprog_id) != E_Generic_Procedure
6453 && Ekind (gnat_subprog_id) != E_Generic_Function)
6454 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
6458 /* For bodies and stubs that act as their own specs, the entity
6459 itself must be elaborated in the first pass, because it may
6460 be used in other declarations. */
6461 else if (Nkind (gnat_decl) == N_Subprogram_Body_Stub)
6463 Node_Id gnat_subprog_id
6464 = Defining_Entity (Specification (gnat_decl));
6466 if (Ekind (gnat_subprog_id) != E_Subprogram_Body
6467 && Ekind (gnat_subprog_id) != E_Generic_Procedure
6468 && Ekind (gnat_subprog_id) != E_Generic_Function)
6469 gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE, 1);
6472 /* Concurrent stubs stand for the corresponding subprogram bodies,
6473 which are deferred like other bodies. */
6474 else if (Nkind (gnat_decl) == N_Task_Body_Stub
6475 || Nkind (gnat_decl) == N_Protected_Body_Stub)
6478 else
6479 add_stmt (gnat_to_gnu (gnat_decl));
6482 /* Here we elaborate everything we deferred above except for package bodies,
6483 which are elaborated at their freeze nodes. Note that we must also
6484 go inside things (package specs and freeze nodes) the first pass did. */
6485 if (pass2p)
6486 for (i = 0; i <= 1; i++)
6487 if (Present (gnat_decl_array[i]))
6488 for (gnat_decl = First (gnat_decl_array[i]);
6489 gnat_decl != gnat_end_list; gnat_decl = Next (gnat_decl))
6491 if (Nkind (gnat_decl) == N_Subprogram_Body
6492 || Nkind (gnat_decl) == N_Subprogram_Body_Stub
6493 || Nkind (gnat_decl) == N_Task_Body_Stub
6494 || Nkind (gnat_decl) == N_Protected_Body_Stub)
6495 add_stmt (gnat_to_gnu (gnat_decl));
6497 else if (Nkind (gnat_decl) == N_Package_Declaration
6498 && (Nkind (Specification (gnat_decl)
6499 == N_Package_Specification)))
6500 process_decls (Visible_Declarations (Specification (gnat_decl)),
6501 Private_Declarations (Specification (gnat_decl)),
6502 Empty, false, true);
6504 else if (Nkind (gnat_decl) == N_Freeze_Entity)
6505 process_decls (Actions (gnat_decl), Empty, Empty, false, true);
6509 /* Make a unary operation of kind CODE using build_unary_op, but guard
6510 the operation by an overflow check. CODE can be one of NEGATE_EXPR
6511 or ABS_EXPR. GNU_TYPE is the type desired for the result. Usually
6512 the operation is to be performed in that type. GNAT_NODE is the gnat
6513 node conveying the source location for which the error should be
6514 signaled. */
6516 static tree
6517 build_unary_op_trapv (enum tree_code code, tree gnu_type, tree operand,
6518 Node_Id gnat_node)
6520 gcc_assert (code == NEGATE_EXPR || code == ABS_EXPR);
6522 operand = gnat_protect_expr (operand);
6524 return emit_check (build_binary_op (EQ_EXPR, boolean_type_node,
6525 operand, TYPE_MIN_VALUE (gnu_type)),
6526 build_unary_op (code, gnu_type, operand),
6527 CE_Overflow_Check_Failed, gnat_node);
6530 /* Make a binary operation of kind CODE using build_binary_op, but guard
6531 the operation by an overflow check. CODE can be one of PLUS_EXPR,
6532 MINUS_EXPR or MULT_EXPR. GNU_TYPE is the type desired for the result.
6533 Usually the operation is to be performed in that type. GNAT_NODE is
6534 the GNAT node conveying the source location for which the error should
6535 be signaled. */
6537 static tree
6538 build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left,
6539 tree right, Node_Id gnat_node)
6541 tree lhs = gnat_protect_expr (left);
6542 tree rhs = gnat_protect_expr (right);
6543 tree type_max = TYPE_MAX_VALUE (gnu_type);
6544 tree type_min = TYPE_MIN_VALUE (gnu_type);
6545 tree gnu_expr;
6546 tree tmp1, tmp2;
6547 tree zero = convert (gnu_type, integer_zero_node);
6548 tree rhs_lt_zero;
6549 tree check_pos;
6550 tree check_neg;
6551 tree check;
6552 int precision = TYPE_PRECISION (gnu_type);
6554 gcc_assert (!(precision & (precision - 1))); /* ensure power of 2 */
6556 /* Prefer a constant or known-positive rhs to simplify checks. */
6557 if (!TREE_CONSTANT (rhs)
6558 && commutative_tree_code (code)
6559 && (TREE_CONSTANT (lhs) || (!tree_expr_nonnegative_p (rhs)
6560 && tree_expr_nonnegative_p (lhs))))
6562 tree tmp = lhs;
6563 lhs = rhs;
6564 rhs = tmp;
6567 rhs_lt_zero = tree_expr_nonnegative_p (rhs)
6568 ? boolean_false_node
6569 : build_binary_op (LT_EXPR, boolean_type_node, rhs, zero);
6571 /* ??? Should use more efficient check for operand_equal_p (lhs, rhs, 0) */
6573 /* Try a few strategies that may be cheaper than the general
6574 code at the end of the function, if the rhs is not known.
6575 The strategies are:
6576 - Call library function for 64-bit multiplication (complex)
6577 - Widen, if input arguments are sufficiently small
6578 - Determine overflow using wrapped result for addition/subtraction. */
6580 if (!TREE_CONSTANT (rhs))
6582 /* Even for add/subtract double size to get another base type. */
6583 int needed_precision = precision * 2;
6585 if (code == MULT_EXPR && precision == 64)
6587 tree int_64 = gnat_type_for_size (64, 0);
6589 return convert (gnu_type, build_call_2_expr (mulv64_decl,
6590 convert (int_64, lhs),
6591 convert (int_64, rhs)));
6594 else if (needed_precision <= BITS_PER_WORD
6595 || (code == MULT_EXPR
6596 && needed_precision <= LONG_LONG_TYPE_SIZE))
6598 tree wide_type = gnat_type_for_size (needed_precision, 0);
6600 tree wide_result = build_binary_op (code, wide_type,
6601 convert (wide_type, lhs),
6602 convert (wide_type, rhs));
6604 tree check = build_binary_op
6605 (TRUTH_ORIF_EXPR, boolean_type_node,
6606 build_binary_op (LT_EXPR, boolean_type_node, wide_result,
6607 convert (wide_type, type_min)),
6608 build_binary_op (GT_EXPR, boolean_type_node, wide_result,
6609 convert (wide_type, type_max)));
6611 tree result = convert (gnu_type, wide_result);
6613 return
6614 emit_check (check, result, CE_Overflow_Check_Failed, gnat_node);
6617 else if (code == PLUS_EXPR || code == MINUS_EXPR)
6619 tree unsigned_type = gnat_type_for_size (precision, 1);
6620 tree wrapped_expr = convert
6621 (gnu_type, build_binary_op (code, unsigned_type,
6622 convert (unsigned_type, lhs),
6623 convert (unsigned_type, rhs)));
6625 tree result = convert
6626 (gnu_type, build_binary_op (code, gnu_type, lhs, rhs));
6628 /* Overflow when (rhs < 0) ^ (wrapped_expr < lhs)), for addition
6629 or when (rhs < 0) ^ (wrapped_expr > lhs) for subtraction. */
6630 tree check = build_binary_op
6631 (TRUTH_XOR_EXPR, boolean_type_node, rhs_lt_zero,
6632 build_binary_op (code == PLUS_EXPR ? LT_EXPR : GT_EXPR,
6633 boolean_type_node, wrapped_expr, lhs));
6635 return
6636 emit_check (check, result, CE_Overflow_Check_Failed, gnat_node);
6640 switch (code)
6642 case PLUS_EXPR:
6643 /* When rhs >= 0, overflow when lhs > type_max - rhs. */
6644 check_pos = build_binary_op (GT_EXPR, boolean_type_node, lhs,
6645 build_binary_op (MINUS_EXPR, gnu_type,
6646 type_max, rhs)),
6648 /* When rhs < 0, overflow when lhs < type_min - rhs. */
6649 check_neg = build_binary_op (LT_EXPR, boolean_type_node, lhs,
6650 build_binary_op (MINUS_EXPR, gnu_type,
6651 type_min, rhs));
6652 break;
6654 case MINUS_EXPR:
6655 /* When rhs >= 0, overflow when lhs < type_min + rhs. */
6656 check_pos = build_binary_op (LT_EXPR, boolean_type_node, lhs,
6657 build_binary_op (PLUS_EXPR, gnu_type,
6658 type_min, rhs)),
6660 /* When rhs < 0, overflow when lhs > type_max + rhs. */
6661 check_neg = build_binary_op (GT_EXPR, boolean_type_node, lhs,
6662 build_binary_op (PLUS_EXPR, gnu_type,
6663 type_max, rhs));
6664 break;
6666 case MULT_EXPR:
6667 /* The check here is designed to be efficient if the rhs is constant,
6668 but it will work for any rhs by using integer division.
6669 Four different check expressions determine wether X * C overflows,
6670 depending on C.
6671 C == 0 => false
6672 C > 0 => X > type_max / C || X < type_min / C
6673 C == -1 => X == type_min
6674 C < -1 => X > type_min / C || X < type_max / C */
6676 tmp1 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_max, rhs);
6677 tmp2 = build_binary_op (TRUNC_DIV_EXPR, gnu_type, type_min, rhs);
6679 check_pos
6680 = build_binary_op (TRUTH_ANDIF_EXPR, boolean_type_node,
6681 build_binary_op (NE_EXPR, boolean_type_node, zero,
6682 rhs),
6683 build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6684 build_binary_op (GT_EXPR,
6685 boolean_type_node,
6686 lhs, tmp1),
6687 build_binary_op (LT_EXPR,
6688 boolean_type_node,
6689 lhs, tmp2)));
6691 check_neg
6692 = fold_build3 (COND_EXPR, boolean_type_node,
6693 build_binary_op (EQ_EXPR, boolean_type_node, rhs,
6694 build_int_cst (gnu_type, -1)),
6695 build_binary_op (EQ_EXPR, boolean_type_node, lhs,
6696 type_min),
6697 build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6698 build_binary_op (GT_EXPR,
6699 boolean_type_node,
6700 lhs, tmp2),
6701 build_binary_op (LT_EXPR,
6702 boolean_type_node,
6703 lhs, tmp1)));
6704 break;
6706 default:
6707 gcc_unreachable();
6710 gnu_expr = build_binary_op (code, gnu_type, lhs, rhs);
6712 /* If we can fold the expression to a constant, just return it.
6713 The caller will deal with overflow, no need to generate a check. */
6714 if (TREE_CONSTANT (gnu_expr))
6715 return gnu_expr;
6717 check = fold_build3 (COND_EXPR, boolean_type_node, rhs_lt_zero, check_neg,
6718 check_pos);
6720 return emit_check (check, gnu_expr, CE_Overflow_Check_Failed, gnat_node);
6723 /* Emit code for a range check. GNU_EXPR is the expression to be checked,
6724 GNAT_RANGE_TYPE the gnat type or subtype containing the bounds against
6725 which we have to check. GNAT_NODE is the GNAT node conveying the source
6726 location for which the error should be signaled. */
6728 static tree
6729 emit_range_check (tree gnu_expr, Entity_Id gnat_range_type, Node_Id gnat_node)
6731 tree gnu_range_type = get_unpadded_type (gnat_range_type);
6732 tree gnu_low = TYPE_MIN_VALUE (gnu_range_type);
6733 tree gnu_high = TYPE_MAX_VALUE (gnu_range_type);
6734 tree gnu_compare_type = get_base_type (TREE_TYPE (gnu_expr));
6736 /* If GNU_EXPR has GNAT_RANGE_TYPE as its base type, no check is needed.
6737 This can for example happen when translating 'Val or 'Value. */
6738 if (gnu_compare_type == gnu_range_type)
6739 return gnu_expr;
6741 /* If GNU_EXPR has an integral type that is narrower than GNU_RANGE_TYPE,
6742 we can't do anything since we might be truncating the bounds. No
6743 check is needed in this case. */
6744 if (INTEGRAL_TYPE_P (TREE_TYPE (gnu_expr))
6745 && (TYPE_PRECISION (gnu_compare_type)
6746 < TYPE_PRECISION (get_base_type (gnu_range_type))))
6747 return gnu_expr;
6749 /* Checked expressions must be evaluated only once. */
6750 gnu_expr = gnat_protect_expr (gnu_expr);
6752 /* Note that the form of the check is
6753 (not (expr >= lo)) or (not (expr <= hi))
6754 the reason for this slightly convoluted form is that NaNs
6755 are not considered to be in range in the float case. */
6756 return emit_check
6757 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6758 invert_truthvalue
6759 (build_binary_op (GE_EXPR, boolean_type_node,
6760 convert (gnu_compare_type, gnu_expr),
6761 convert (gnu_compare_type, gnu_low))),
6762 invert_truthvalue
6763 (build_binary_op (LE_EXPR, boolean_type_node,
6764 convert (gnu_compare_type, gnu_expr),
6765 convert (gnu_compare_type,
6766 gnu_high)))),
6767 gnu_expr, CE_Range_Check_Failed, gnat_node);
6770 /* Emit code for an index check. GNU_ARRAY_OBJECT is the array object which
6771 we are about to index, GNU_EXPR is the index expression to be checked,
6772 GNU_LOW and GNU_HIGH are the lower and upper bounds against which GNU_EXPR
6773 has to be checked. Note that for index checking we cannot simply use the
6774 emit_range_check function (although very similar code needs to be generated
6775 in both cases) since for index checking the array type against which we are
6776 checking the indices may be unconstrained and consequently we need to get
6777 the actual index bounds from the array object itself (GNU_ARRAY_OBJECT).
6778 The place where we need to do that is in subprograms having unconstrained
6779 array formal parameters. GNAT_NODE is the GNAT node conveying the source
6780 location for which the error should be signaled. */
6782 static tree
6783 emit_index_check (tree gnu_array_object, tree gnu_expr, tree gnu_low,
6784 tree gnu_high, Node_Id gnat_node)
6786 tree gnu_expr_check;
6788 /* Checked expressions must be evaluated only once. */
6789 gnu_expr = gnat_protect_expr (gnu_expr);
6791 /* Must do this computation in the base type in case the expression's
6792 type is an unsigned subtypes. */
6793 gnu_expr_check = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
6795 /* If GNU_LOW or GNU_HIGH are a PLACEHOLDER_EXPR, qualify them by
6796 the object we are handling. */
6797 gnu_low = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_low, gnu_array_object);
6798 gnu_high = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_high, gnu_array_object);
6800 return emit_check
6801 (build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node,
6802 build_binary_op (LT_EXPR, boolean_type_node,
6803 gnu_expr_check,
6804 convert (TREE_TYPE (gnu_expr_check),
6805 gnu_low)),
6806 build_binary_op (GT_EXPR, boolean_type_node,
6807 gnu_expr_check,
6808 convert (TREE_TYPE (gnu_expr_check),
6809 gnu_high))),
6810 gnu_expr, CE_Index_Check_Failed, gnat_node);
6813 /* GNU_COND contains the condition corresponding to an access, discriminant or
6814 range check of value GNU_EXPR. Build a COND_EXPR that returns GNU_EXPR if
6815 GNU_COND is false and raises a CONSTRAINT_ERROR if GNU_COND is true.
6816 REASON is the code that says why the exception was raised. GNAT_NODE is
6817 the GNAT node conveying the source location for which the error should be
6818 signaled. */
6820 static tree
6821 emit_check (tree gnu_cond, tree gnu_expr, int reason, Node_Id gnat_node)
6823 tree gnu_call
6824 = build_call_raise (reason, gnat_node, N_Raise_Constraint_Error);
6825 tree gnu_result
6826 = fold_build3 (COND_EXPR, TREE_TYPE (gnu_expr), gnu_cond,
6827 build2 (COMPOUND_EXPR, TREE_TYPE (gnu_expr), gnu_call,
6828 convert (TREE_TYPE (gnu_expr), integer_zero_node)),
6829 gnu_expr);
6831 /* GNU_RESULT has side effects if and only if GNU_EXPR has:
6832 we don't need to evaluate it just for the check. */
6833 TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr);
6835 return gnu_result;
6838 /* Return an expression that converts GNU_EXPR to GNAT_TYPE, doing overflow
6839 checks if OVERFLOW_P is true and range checks if RANGE_P is true.
6840 GNAT_TYPE is known to be an integral type. If TRUNCATE_P true, do a
6841 float to integer conversion with truncation; otherwise round.
6842 GNAT_NODE is the GNAT node conveying the source location for which the
6843 error should be signaled. */
6845 static tree
6846 convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp,
6847 bool rangep, bool truncatep, Node_Id gnat_node)
6849 tree gnu_type = get_unpadded_type (gnat_type);
6850 tree gnu_in_type = TREE_TYPE (gnu_expr);
6851 tree gnu_in_basetype = get_base_type (gnu_in_type);
6852 tree gnu_base_type = get_base_type (gnu_type);
6853 tree gnu_result = gnu_expr;
6855 /* If we are not doing any checks, the output is an integral type, and
6856 the input is not a floating type, just do the conversion. This
6857 shortcut is required to avoid problems with packed array types
6858 and simplifies code in all cases anyway. */
6859 if (!rangep && !overflowp && INTEGRAL_TYPE_P (gnu_base_type)
6860 && !FLOAT_TYPE_P (gnu_in_type))
6861 return convert (gnu_type, gnu_expr);
6863 /* First convert the expression to its base type. This
6864 will never generate code, but makes the tests below much simpler.
6865 But don't do this if converting from an integer type to an unconstrained
6866 array type since then we need to get the bounds from the original
6867 (unpacked) type. */
6868 if (TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE)
6869 gnu_result = convert (gnu_in_basetype, gnu_result);
6871 /* If overflow checks are requested, we need to be sure the result will
6872 fit in the output base type. But don't do this if the input
6873 is integer and the output floating-point. */
6874 if (overflowp
6875 && !(FLOAT_TYPE_P (gnu_base_type) && INTEGRAL_TYPE_P (gnu_in_basetype)))
6877 /* Ensure GNU_EXPR only gets evaluated once. */
6878 tree gnu_input = gnat_protect_expr (gnu_result);
6879 tree gnu_cond = integer_zero_node;
6880 tree gnu_in_lb = TYPE_MIN_VALUE (gnu_in_basetype);
6881 tree gnu_in_ub = TYPE_MAX_VALUE (gnu_in_basetype);
6882 tree gnu_out_lb = TYPE_MIN_VALUE (gnu_base_type);
6883 tree gnu_out_ub = TYPE_MAX_VALUE (gnu_base_type);
6885 /* Convert the lower bounds to signed types, so we're sure we're
6886 comparing them properly. Likewise, convert the upper bounds
6887 to unsigned types. */
6888 if (INTEGRAL_TYPE_P (gnu_in_basetype) && TYPE_UNSIGNED (gnu_in_basetype))
6889 gnu_in_lb = convert (gnat_signed_type (gnu_in_basetype), gnu_in_lb);
6891 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6892 && !TYPE_UNSIGNED (gnu_in_basetype))
6893 gnu_in_ub = convert (gnat_unsigned_type (gnu_in_basetype), gnu_in_ub);
6895 if (INTEGRAL_TYPE_P (gnu_base_type) && TYPE_UNSIGNED (gnu_base_type))
6896 gnu_out_lb = convert (gnat_signed_type (gnu_base_type), gnu_out_lb);
6898 if (INTEGRAL_TYPE_P (gnu_base_type) && !TYPE_UNSIGNED (gnu_base_type))
6899 gnu_out_ub = convert (gnat_unsigned_type (gnu_base_type), gnu_out_ub);
6901 /* Check each bound separately and only if the result bound
6902 is tighter than the bound on the input type. Note that all the
6903 types are base types, so the bounds must be constant. Also,
6904 the comparison is done in the base type of the input, which
6905 always has the proper signedness. First check for input
6906 integer (which means output integer), output float (which means
6907 both float), or mixed, in which case we always compare.
6908 Note that we have to do the comparison which would *fail* in the
6909 case of an error since if it's an FP comparison and one of the
6910 values is a NaN or Inf, the comparison will fail. */
6911 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6912 ? tree_int_cst_lt (gnu_in_lb, gnu_out_lb)
6913 : (FLOAT_TYPE_P (gnu_base_type)
6914 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_in_lb),
6915 TREE_REAL_CST (gnu_out_lb))
6916 : 1))
6917 gnu_cond
6918 = invert_truthvalue
6919 (build_binary_op (GE_EXPR, boolean_type_node,
6920 gnu_input, convert (gnu_in_basetype,
6921 gnu_out_lb)));
6923 if (INTEGRAL_TYPE_P (gnu_in_basetype)
6924 ? tree_int_cst_lt (gnu_out_ub, gnu_in_ub)
6925 : (FLOAT_TYPE_P (gnu_base_type)
6926 ? REAL_VALUES_LESS (TREE_REAL_CST (gnu_out_ub),
6927 TREE_REAL_CST (gnu_in_lb))
6928 : 1))
6929 gnu_cond
6930 = build_binary_op (TRUTH_ORIF_EXPR, boolean_type_node, gnu_cond,
6931 invert_truthvalue
6932 (build_binary_op (LE_EXPR, boolean_type_node,
6933 gnu_input,
6934 convert (gnu_in_basetype,
6935 gnu_out_ub))));
6937 if (!integer_zerop (gnu_cond))
6938 gnu_result = emit_check (gnu_cond, gnu_input,
6939 CE_Overflow_Check_Failed, gnat_node);
6942 /* Now convert to the result base type. If this is a non-truncating
6943 float-to-integer conversion, round. */
6944 if (INTEGRAL_TYPE_P (gnu_base_type) && FLOAT_TYPE_P (gnu_in_basetype)
6945 && !truncatep)
6947 REAL_VALUE_TYPE half_minus_pred_half, pred_half;
6948 tree gnu_conv, gnu_zero, gnu_comp, calc_type;
6949 tree gnu_pred_half, gnu_add_pred_half, gnu_subtract_pred_half;
6950 const struct real_format *fmt;
6952 /* The following calculations depend on proper rounding to even
6953 of each arithmetic operation. In order to prevent excess
6954 precision from spoiling this property, use the widest hardware
6955 floating-point type if FP_ARITH_MAY_WIDEN is true. */
6956 calc_type
6957 = FP_ARITH_MAY_WIDEN ? longest_float_type_node : gnu_in_basetype;
6959 /* FIXME: Should not have padding in the first place. */
6960 if (TYPE_IS_PADDING_P (calc_type))
6961 calc_type = TREE_TYPE (TYPE_FIELDS (calc_type));
6963 /* Compute the exact value calc_type'Pred (0.5) at compile time. */
6964 fmt = REAL_MODE_FORMAT (TYPE_MODE (calc_type));
6965 real_2expN (&half_minus_pred_half, -(fmt->p) - 1, TYPE_MODE (calc_type));
6966 REAL_ARITHMETIC (pred_half, MINUS_EXPR, dconsthalf,
6967 half_minus_pred_half);
6968 gnu_pred_half = build_real (calc_type, pred_half);
6970 /* If the input is strictly negative, subtract this value
6971 and otherwise add it from the input. For 0.5, the result
6972 is exactly between 1.0 and the machine number preceding 1.0
6973 (for calc_type). Since the last bit of 1.0 is even, this 0.5
6974 will round to 1.0, while all other number with an absolute
6975 value less than 0.5 round to 0.0. For larger numbers exactly
6976 halfway between integers, rounding will always be correct as
6977 the true mathematical result will be closer to the higher
6978 integer compared to the lower one. So, this constant works
6979 for all floating-point numbers.
6981 The reason to use the same constant with subtract/add instead
6982 of a positive and negative constant is to allow the comparison
6983 to be scheduled in parallel with retrieval of the constant and
6984 conversion of the input to the calc_type (if necessary). */
6986 gnu_zero = convert (gnu_in_basetype, integer_zero_node);
6987 gnu_result = gnat_protect_expr (gnu_result);
6988 gnu_conv = convert (calc_type, gnu_result);
6989 gnu_comp
6990 = fold_build2 (GE_EXPR, boolean_type_node, gnu_result, gnu_zero);
6991 gnu_add_pred_half
6992 = fold_build2 (PLUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
6993 gnu_subtract_pred_half
6994 = fold_build2 (MINUS_EXPR, calc_type, gnu_conv, gnu_pred_half);
6995 gnu_result = fold_build3 (COND_EXPR, calc_type, gnu_comp,
6996 gnu_add_pred_half, gnu_subtract_pred_half);
6999 if (TREE_CODE (gnu_base_type) == INTEGER_TYPE
7000 && TYPE_HAS_ACTUAL_BOUNDS_P (gnu_base_type)
7001 && TREE_CODE (gnu_result) == UNCONSTRAINED_ARRAY_REF)
7002 gnu_result = unchecked_convert (gnu_base_type, gnu_result, false);
7003 else
7004 gnu_result = convert (gnu_base_type, gnu_result);
7006 /* Finally, do the range check if requested. Note that if the result type
7007 is a modular type, the range check is actually an overflow check. */
7008 if (rangep
7009 || (TREE_CODE (gnu_base_type) == INTEGER_TYPE
7010 && TYPE_MODULAR_P (gnu_base_type) && overflowp))
7011 gnu_result = emit_range_check (gnu_result, gnat_type, gnat_node);
7013 return convert (gnu_type, gnu_result);
7016 /* Return true if TYPE is a smaller form of ORIG_TYPE. */
7018 static bool
7019 smaller_form_type_p (tree type, tree orig_type)
7021 tree size, osize;
7023 /* We're not interested in variants here. */
7024 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig_type))
7025 return false;
7027 /* Like a variant, a packable version keeps the original TYPE_NAME. */
7028 if (TYPE_NAME (type) != TYPE_NAME (orig_type))
7029 return false;
7031 size = TYPE_SIZE (type);
7032 osize = TYPE_SIZE (orig_type);
7034 if (!(TREE_CODE (size) == INTEGER_CST && TREE_CODE (osize) == INTEGER_CST))
7035 return false;
7037 return tree_int_cst_lt (size, osize) != 0;
7040 /* Return true if GNU_EXPR can be directly addressed. This is the case
7041 unless it is an expression involving computation or if it involves a
7042 reference to a bitfield or to an object not sufficiently aligned for
7043 its type. If GNU_TYPE is non-null, return true only if GNU_EXPR can
7044 be directly addressed as an object of this type.
7046 *** Notes on addressability issues in the Ada compiler ***
7048 This predicate is necessary in order to bridge the gap between Gigi
7049 and the middle-end about addressability of GENERIC trees. A tree
7050 is said to be addressable if it can be directly addressed, i.e. if
7051 its address can be taken, is a multiple of the type's alignment on
7052 strict-alignment architectures and returns the first storage unit
7053 assigned to the object represented by the tree.
7055 In the C family of languages, everything is in practice addressable
7056 at the language level, except for bit-fields. This means that these
7057 compilers will take the address of any tree that doesn't represent
7058 a bit-field reference and expect the result to be the first storage
7059 unit assigned to the object. Even in cases where this will result
7060 in unaligned accesses at run time, nothing is supposed to be done
7061 and the program is considered as erroneous instead (see PR c/18287).
7063 The implicit assumptions made in the middle-end are in keeping with
7064 the C viewpoint described above:
7065 - the address of a bit-field reference is supposed to be never
7066 taken; the compiler (generally) will stop on such a construct,
7067 - any other tree is addressable if it is formally addressable,
7068 i.e. if it is formally allowed to be the operand of ADDR_EXPR.
7070 In Ada, the viewpoint is the opposite one: nothing is addressable
7071 at the language level unless explicitly declared so. This means
7072 that the compiler will both make sure that the trees representing
7073 references to addressable ("aliased" in Ada parlance) objects are
7074 addressable and make no real attempts at ensuring that the trees
7075 representing references to non-addressable objects are addressable.
7077 In the first case, Ada is effectively equivalent to C and handing
7078 down the direct result of applying ADDR_EXPR to these trees to the
7079 middle-end works flawlessly. In the second case, Ada cannot afford
7080 to consider the program as erroneous if the address of trees that
7081 are not addressable is requested for technical reasons, unlike C;
7082 as a consequence, the Ada compiler must arrange for either making
7083 sure that this address is not requested in the middle-end or for
7084 compensating by inserting temporaries if it is requested in Gigi.
7086 The first goal can be achieved because the middle-end should not
7087 request the address of non-addressable trees on its own; the only
7088 exception is for the invocation of low-level block operations like
7089 memcpy, for which the addressability requirements are lower since
7090 the type's alignment can be disregarded. In practice, this means
7091 that Gigi must make sure that such operations cannot be applied to
7092 non-BLKmode bit-fields.
7094 The second goal is achieved by means of the addressable_p predicate
7095 and by inserting SAVE_EXPRs around trees deemed non-addressable.
7096 They will be turned during gimplification into proper temporaries
7097 whose address will be used in lieu of that of the original tree. */
7099 static bool
7100 addressable_p (tree gnu_expr, tree gnu_type)
7102 /* For an integral type, the size of the actual type of the object may not
7103 be greater than that of the expected type, otherwise an indirect access
7104 in the latter type wouldn't correctly set all the bits of the object. */
7105 if (gnu_type
7106 && INTEGRAL_TYPE_P (gnu_type)
7107 && smaller_form_type_p (gnu_type, TREE_TYPE (gnu_expr)))
7108 return false;
7110 /* The size of the actual type of the object may not be smaller than that
7111 of the expected type, otherwise an indirect access in the latter type
7112 would be larger than the object. But only record types need to be
7113 considered in practice for this case. */
7114 if (gnu_type
7115 && TREE_CODE (gnu_type) == RECORD_TYPE
7116 && smaller_form_type_p (TREE_TYPE (gnu_expr), gnu_type))
7117 return false;
7119 switch (TREE_CODE (gnu_expr))
7121 case VAR_DECL:
7122 case PARM_DECL:
7123 case FUNCTION_DECL:
7124 case RESULT_DECL:
7125 /* All DECLs are addressable: if they are in a register, we can force
7126 them to memory. */
7127 return true;
7129 case UNCONSTRAINED_ARRAY_REF:
7130 case INDIRECT_REF:
7131 /* Taking the address of a dereference yields the original pointer. */
7132 return true;
7134 case STRING_CST:
7135 case INTEGER_CST:
7136 /* Taking the address yields a pointer to the constant pool. */
7137 return true;
7139 case CONSTRUCTOR:
7140 /* Taking the address of a static constructor yields a pointer to the
7141 tree constant pool. */
7142 return TREE_STATIC (gnu_expr) ? true : false;
7144 case NULL_EXPR:
7145 case SAVE_EXPR:
7146 case CALL_EXPR:
7147 case PLUS_EXPR:
7148 case MINUS_EXPR:
7149 case BIT_IOR_EXPR:
7150 case BIT_XOR_EXPR:
7151 case BIT_AND_EXPR:
7152 case BIT_NOT_EXPR:
7153 /* All rvalues are deemed addressable since taking their address will
7154 force a temporary to be created by the middle-end. */
7155 return true;
7157 case COMPOUND_EXPR:
7158 /* The address of a compound expression is that of its 2nd operand. */
7159 return addressable_p (TREE_OPERAND (gnu_expr, 1), gnu_type);
7161 case COND_EXPR:
7162 /* We accept &COND_EXPR as soon as both operands are addressable and
7163 expect the outcome to be the address of the selected operand. */
7164 return (addressable_p (TREE_OPERAND (gnu_expr, 1), NULL_TREE)
7165 && addressable_p (TREE_OPERAND (gnu_expr, 2), NULL_TREE));
7167 case COMPONENT_REF:
7168 return (((!DECL_BIT_FIELD (TREE_OPERAND (gnu_expr, 1))
7169 /* Even with DECL_BIT_FIELD cleared, we have to ensure that
7170 the field is sufficiently aligned, in case it is subject
7171 to a pragma Component_Alignment. But we don't need to
7172 check the alignment of the containing record, as it is
7173 guaranteed to be not smaller than that of its most
7174 aligned field that is not a bit-field. */
7175 && (!STRICT_ALIGNMENT
7176 || DECL_ALIGN (TREE_OPERAND (gnu_expr, 1))
7177 >= TYPE_ALIGN (TREE_TYPE (gnu_expr))))
7178 /* The field of a padding record is always addressable. */
7179 || TYPE_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))))
7180 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
7182 case ARRAY_REF: case ARRAY_RANGE_REF:
7183 case REALPART_EXPR: case IMAGPART_EXPR:
7184 case NOP_EXPR:
7185 return addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE);
7187 case CONVERT_EXPR:
7188 return (AGGREGATE_TYPE_P (TREE_TYPE (gnu_expr))
7189 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
7191 case VIEW_CONVERT_EXPR:
7193 /* This is addressable if we can avoid a copy. */
7194 tree type = TREE_TYPE (gnu_expr);
7195 tree inner_type = TREE_TYPE (TREE_OPERAND (gnu_expr, 0));
7196 return (((TYPE_MODE (type) == TYPE_MODE (inner_type)
7197 && (!STRICT_ALIGNMENT
7198 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
7199 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT))
7200 || ((TYPE_MODE (type) == BLKmode
7201 || TYPE_MODE (inner_type) == BLKmode)
7202 && (!STRICT_ALIGNMENT
7203 || TYPE_ALIGN (type) <= TYPE_ALIGN (inner_type)
7204 || TYPE_ALIGN (inner_type) >= BIGGEST_ALIGNMENT
7205 || TYPE_ALIGN_OK (type)
7206 || TYPE_ALIGN_OK (inner_type))))
7207 && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));
7210 default:
7211 return false;
7215 /* Do the processing for the declaration of a GNAT_ENTITY, a type. If
7216 a separate Freeze node exists, delay the bulk of the processing. Otherwise
7217 make a GCC type for GNAT_ENTITY and set up the correspondence. */
7219 void
7220 process_type (Entity_Id gnat_entity)
7222 tree gnu_old
7223 = present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity) : 0;
7224 tree gnu_new;
7226 /* If we are to delay elaboration of this type, just do any
7227 elaborations needed for expressions within the declaration and
7228 make a dummy type entry for this node and its Full_View (if
7229 any) in case something points to it. Don't do this if it
7230 has already been done (the only way that can happen is if
7231 the private completion is also delayed). */
7232 if (Present (Freeze_Node (gnat_entity))
7233 || (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
7234 && Present (Full_View (gnat_entity))
7235 && Freeze_Node (Full_View (gnat_entity))
7236 && !present_gnu_tree (Full_View (gnat_entity))))
7238 elaborate_entity (gnat_entity);
7240 if (!gnu_old)
7242 tree gnu_decl = TYPE_STUB_DECL (make_dummy_type (gnat_entity));
7243 save_gnu_tree (gnat_entity, gnu_decl, false);
7244 if (IN (Ekind (gnat_entity), Incomplete_Or_Private_Kind)
7245 && Present (Full_View (gnat_entity)))
7246 save_gnu_tree (Full_View (gnat_entity), gnu_decl, false);
7249 return;
7252 /* If we saved away a dummy type for this node it means that this
7253 made the type that corresponds to the full type of an incomplete
7254 type. Clear that type for now and then update the type in the
7255 pointers. */
7256 if (gnu_old)
7258 gcc_assert (TREE_CODE (gnu_old) == TYPE_DECL
7259 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_old)));
7261 save_gnu_tree (gnat_entity, NULL_TREE, false);
7264 /* Now fully elaborate the type. */
7265 gnu_new = gnat_to_gnu_entity (gnat_entity, NULL_TREE, 1);
7266 gcc_assert (TREE_CODE (gnu_new) == TYPE_DECL);
7268 /* If we have an old type and we've made pointers to this type,
7269 update those pointers. */
7270 if (gnu_old)
7271 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_old)),
7272 TREE_TYPE (gnu_new));
7274 /* If this is a record type corresponding to a task or protected type
7275 that is a completion of an incomplete type, perform a similar update
7276 on the type. ??? Including protected types here is a guess. */
7277 if (IN (Ekind (gnat_entity), Record_Kind)
7278 && Is_Concurrent_Record_Type (gnat_entity)
7279 && present_gnu_tree (Corresponding_Concurrent_Type (gnat_entity)))
7281 tree gnu_task_old
7282 = get_gnu_tree (Corresponding_Concurrent_Type (gnat_entity));
7284 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
7285 NULL_TREE, false);
7286 save_gnu_tree (Corresponding_Concurrent_Type (gnat_entity),
7287 gnu_new, false);
7289 update_pointer_to (TYPE_MAIN_VARIANT (TREE_TYPE (gnu_task_old)),
7290 TREE_TYPE (gnu_new));
7294 /* GNAT_ENTITY is the type of the resulting constructors,
7295 GNAT_ASSOC is the front of the Component_Associations of an N_Aggregate,
7296 and GNU_TYPE is the GCC type of the corresponding record.
7298 Return a CONSTRUCTOR to build the record. */
7300 static tree
7301 assoc_to_constructor (Entity_Id gnat_entity, Node_Id gnat_assoc, tree gnu_type)
7303 tree gnu_list, gnu_result;
7305 /* We test for GNU_FIELD being empty in the case where a variant
7306 was the last thing since we don't take things off GNAT_ASSOC in
7307 that case. We check GNAT_ASSOC in case we have a variant, but it
7308 has no fields. */
7310 for (gnu_list = NULL_TREE; Present (gnat_assoc);
7311 gnat_assoc = Next (gnat_assoc))
7313 Node_Id gnat_field = First (Choices (gnat_assoc));
7314 tree gnu_field = gnat_to_gnu_field_decl (Entity (gnat_field));
7315 tree gnu_expr = gnat_to_gnu (Expression (gnat_assoc));
7317 /* The expander is supposed to put a single component selector name
7318 in every record component association. */
7319 gcc_assert (No (Next (gnat_field)));
7321 /* Ignore fields that have Corresponding_Discriminants since we'll
7322 be setting that field in the parent. */
7323 if (Present (Corresponding_Discriminant (Entity (gnat_field)))
7324 && Is_Tagged_Type (Scope (Entity (gnat_field))))
7325 continue;
7327 /* Also ignore discriminants of Unchecked_Unions. */
7328 else if (Is_Unchecked_Union (gnat_entity)
7329 && Ekind (Entity (gnat_field)) == E_Discriminant)
7330 continue;
7332 /* Before assigning a value in an aggregate make sure range checks
7333 are done if required. Then convert to the type of the field. */
7334 if (Do_Range_Check (Expression (gnat_assoc)))
7335 gnu_expr = emit_range_check (gnu_expr, Etype (gnat_field), Empty);
7337 gnu_expr = convert (TREE_TYPE (gnu_field), gnu_expr);
7339 /* Add the field and expression to the list. */
7340 gnu_list = tree_cons (gnu_field, gnu_expr, gnu_list);
7343 gnu_result = extract_values (gnu_list, gnu_type);
7345 #ifdef ENABLE_CHECKING
7347 tree gnu_field;
7349 /* Verify every entry in GNU_LIST was used. */
7350 for (gnu_field = gnu_list; gnu_field; gnu_field = TREE_CHAIN (gnu_field))
7351 gcc_assert (TREE_ADDRESSABLE (gnu_field));
7353 #endif
7355 return gnu_result;
7358 /* Build a possibly nested constructor for array aggregates. GNAT_EXPR is
7359 the first element of an array aggregate. It may itself be an aggregate.
7360 GNU_ARRAY_TYPE is the GCC type corresponding to the array aggregate.
7361 GNAT_COMPONENT_TYPE is the type of the array component; it is needed
7362 for range checking. */
7364 static tree
7365 pos_to_constructor (Node_Id gnat_expr, tree gnu_array_type,
7366 Entity_Id gnat_component_type)
7368 tree gnu_expr_list = NULL_TREE;
7369 tree gnu_index = TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_array_type));
7370 tree gnu_expr;
7372 for ( ; Present (gnat_expr); gnat_expr = Next (gnat_expr))
7374 /* If the expression is itself an array aggregate then first build the
7375 innermost constructor if it is part of our array (multi-dimensional
7376 case). */
7377 if (Nkind (gnat_expr) == N_Aggregate
7378 && TREE_CODE (TREE_TYPE (gnu_array_type)) == ARRAY_TYPE
7379 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_array_type)))
7380 gnu_expr = pos_to_constructor (First (Expressions (gnat_expr)),
7381 TREE_TYPE (gnu_array_type),
7382 gnat_component_type);
7383 else
7385 gnu_expr = gnat_to_gnu (gnat_expr);
7387 /* Before assigning the element to the array, make sure it is
7388 in range. */
7389 if (Do_Range_Check (gnat_expr))
7390 gnu_expr = emit_range_check (gnu_expr, gnat_component_type, Empty);
7393 gnu_expr_list
7394 = tree_cons (gnu_index, convert (TREE_TYPE (gnu_array_type), gnu_expr),
7395 gnu_expr_list);
7397 gnu_index = int_const_binop (PLUS_EXPR, gnu_index, integer_one_node, 0);
7400 return gnat_build_constructor (gnu_array_type, nreverse (gnu_expr_list));
7403 /* Subroutine of assoc_to_constructor: VALUES is a list of field associations,
7404 some of which are from RECORD_TYPE. Return a CONSTRUCTOR consisting
7405 of the associations that are from RECORD_TYPE. If we see an internal
7406 record, make a recursive call to fill it in as well. */
7408 static tree
7409 extract_values (tree values, tree record_type)
7411 tree result = NULL_TREE;
7412 tree field, tem;
7414 for (field = TYPE_FIELDS (record_type); field; field = TREE_CHAIN (field))
7416 tree value = 0;
7418 /* _Parent is an internal field, but may have values in the aggregate,
7419 so check for values first. */
7420 if ((tem = purpose_member (field, values)))
7422 value = TREE_VALUE (tem);
7423 TREE_ADDRESSABLE (tem) = 1;
7426 else if (DECL_INTERNAL_P (field))
7428 value = extract_values (values, TREE_TYPE (field));
7429 if (TREE_CODE (value) == CONSTRUCTOR
7430 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (value)))
7431 value = 0;
7433 else
7434 /* If we have a record subtype, the names will match, but not the
7435 actual FIELD_DECLs. */
7436 for (tem = values; tem; tem = TREE_CHAIN (tem))
7437 if (DECL_NAME (TREE_PURPOSE (tem)) == DECL_NAME (field))
7439 value = convert (TREE_TYPE (field), TREE_VALUE (tem));
7440 TREE_ADDRESSABLE (tem) = 1;
7443 if (!value)
7444 continue;
7446 result = tree_cons (field, value, result);
7449 return gnat_build_constructor (record_type, nreverse (result));
7452 /* EXP is to be treated as an array or record. Handle the cases when it is
7453 an access object and perform the required dereferences. */
7455 static tree
7456 maybe_implicit_deref (tree exp)
7458 /* If the type is a pointer, dereference it. */
7459 if (POINTER_TYPE_P (TREE_TYPE (exp))
7460 || TYPE_IS_FAT_POINTER_P (TREE_TYPE (exp)))
7461 exp = build_unary_op (INDIRECT_REF, NULL_TREE, exp);
7463 /* If we got a padded type, remove it too. */
7464 if (TYPE_IS_PADDING_P (TREE_TYPE (exp)))
7465 exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
7467 return exp;
7470 /* Convert SLOC into LOCUS. Return true if SLOC corresponds to a source code
7471 location and false if it doesn't. In the former case, set the Gigi global
7472 variable REF_FILENAME to the simple debug file name as given by sinput. */
7474 bool
7475 Sloc_to_locus (Source_Ptr Sloc, location_t *locus)
7477 if (Sloc == No_Location)
7478 return false;
7480 if (Sloc <= Standard_Location)
7482 *locus = BUILTINS_LOCATION;
7483 return false;
7485 else
7487 Source_File_Index file = Get_Source_File_Index (Sloc);
7488 Logical_Line_Number line = Get_Logical_Line_Number (Sloc);
7489 Column_Number column = Get_Column_Number (Sloc);
7490 struct line_map *map = &line_table->maps[file - 1];
7492 /* Translate the location according to the line-map.h formula. */
7493 *locus = map->start_location
7494 + ((line - map->to_line) << map->column_bits)
7495 + (column & ((1 << map->column_bits) - 1));
7498 ref_filename
7499 = IDENTIFIER_POINTER
7500 (get_identifier
7501 (Get_Name_String (Debug_Source_Name (Get_Source_File_Index (Sloc)))));;
7503 return true;
7506 /* Similar to set_expr_location, but start with the Sloc of GNAT_NODE and
7507 don't do anything if it doesn't correspond to a source location. */
7509 static void
7510 set_expr_location_from_node (tree node, Node_Id gnat_node)
7512 location_t locus;
7514 if (!Sloc_to_locus (Sloc (gnat_node), &locus))
7515 return;
7517 SET_EXPR_LOCATION (node, locus);
7520 /* Return a colon-separated list of encodings contained in encoded Ada
7521 name. */
7523 static const char *
7524 extract_encoding (const char *name)
7526 char *encoding = GGC_NEWVEC (char, strlen (name));
7527 get_encoding (name, encoding);
7528 return encoding;
7531 /* Extract the Ada name from an encoded name. */
7533 static const char *
7534 decode_name (const char *name)
7536 char *decoded = GGC_NEWVEC (char, strlen (name) * 2 + 60);
7537 __gnat_decode (name, decoded, 0);
7538 return decoded;
7541 /* Post an error message. MSG is the error message, properly annotated.
7542 NODE is the node at which to post the error and the node to use for the
7543 '&' substitution. */
7545 void
7546 post_error (const char *msg, Node_Id node)
7548 String_Template temp;
7549 Fat_Pointer fp;
7551 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
7552 fp.Array = msg, fp.Bounds = &temp;
7553 if (Present (node))
7554 Error_Msg_N (fp, node);
7557 /* Similar to post_error, but NODE is the node at which to post the error and
7558 ENT is the node to use for the '&' substitution. */
7560 void
7561 post_error_ne (const char *msg, Node_Id node, Entity_Id ent)
7563 String_Template temp;
7564 Fat_Pointer fp;
7566 temp.Low_Bound = 1, temp.High_Bound = strlen (msg);
7567 fp.Array = msg, fp.Bounds = &temp;
7568 if (Present (node))
7569 Error_Msg_NE (fp, node, ent);
7572 /* Similar to post_error_ne, but NUM is the number to use for the '^'. */
7574 void
7575 post_error_ne_num (const char *msg, Node_Id node, Entity_Id ent, int num)
7577 Error_Msg_Uint_1 = UI_From_Int (num);
7578 post_error_ne (msg, node, ent);
7581 /* Similar to post_error_ne, but T is a GCC tree representing the number to
7582 write. If T represents a constant, the text inside curly brackets in
7583 MSG will be output (presumably including a '^'). Otherwise it will not
7584 be output and the text inside square brackets will be output instead. */
7586 void
7587 post_error_ne_tree (const char *msg, Node_Id node, Entity_Id ent, tree t)
7589 char *new_msg = XALLOCAVEC (char, strlen (msg) + 1);
7590 char start_yes, end_yes, start_no, end_no;
7591 const char *p;
7592 char *q;
7594 if (TREE_CODE (t) == INTEGER_CST)
7596 Error_Msg_Uint_1 = UI_From_gnu (t);
7597 start_yes = '{', end_yes = '}', start_no = '[', end_no = ']';
7599 else
7600 start_yes = '[', end_yes = ']', start_no = '{', end_no = '}';
7602 for (p = msg, q = new_msg; *p; p++)
7604 if (*p == start_yes)
7605 for (p++; *p != end_yes; p++)
7606 *q++ = *p;
7607 else if (*p == start_no)
7608 for (p++; *p != end_no; p++)
7610 else
7611 *q++ = *p;
7614 *q = 0;
7616 post_error_ne (new_msg, node, ent);
7619 /* Similar to post_error_ne_tree, but NUM is a second integer to write. */
7621 void
7622 post_error_ne_tree_2 (const char *msg, Node_Id node, Entity_Id ent, tree t,
7623 int num)
7625 Error_Msg_Uint_2 = UI_From_Int (num);
7626 post_error_ne_tree (msg, node, ent, t);
7629 /* Initialize the table that maps GNAT codes to GCC codes for simple
7630 binary and unary operations. */
7632 static void
7633 init_code_table (void)
7635 gnu_codes[N_And_Then] = TRUTH_ANDIF_EXPR;
7636 gnu_codes[N_Or_Else] = TRUTH_ORIF_EXPR;
7638 gnu_codes[N_Op_And] = TRUTH_AND_EXPR;
7639 gnu_codes[N_Op_Or] = TRUTH_OR_EXPR;
7640 gnu_codes[N_Op_Xor] = TRUTH_XOR_EXPR;
7641 gnu_codes[N_Op_Eq] = EQ_EXPR;
7642 gnu_codes[N_Op_Ne] = NE_EXPR;
7643 gnu_codes[N_Op_Lt] = LT_EXPR;
7644 gnu_codes[N_Op_Le] = LE_EXPR;
7645 gnu_codes[N_Op_Gt] = GT_EXPR;
7646 gnu_codes[N_Op_Ge] = GE_EXPR;
7647 gnu_codes[N_Op_Add] = PLUS_EXPR;
7648 gnu_codes[N_Op_Subtract] = MINUS_EXPR;
7649 gnu_codes[N_Op_Multiply] = MULT_EXPR;
7650 gnu_codes[N_Op_Mod] = FLOOR_MOD_EXPR;
7651 gnu_codes[N_Op_Rem] = TRUNC_MOD_EXPR;
7652 gnu_codes[N_Op_Minus] = NEGATE_EXPR;
7653 gnu_codes[N_Op_Abs] = ABS_EXPR;
7654 gnu_codes[N_Op_Not] = TRUTH_NOT_EXPR;
7655 gnu_codes[N_Op_Rotate_Left] = LROTATE_EXPR;
7656 gnu_codes[N_Op_Rotate_Right] = RROTATE_EXPR;
7657 gnu_codes[N_Op_Shift_Left] = LSHIFT_EXPR;
7658 gnu_codes[N_Op_Shift_Right] = RSHIFT_EXPR;
7659 gnu_codes[N_Op_Shift_Right_Arithmetic] = RSHIFT_EXPR;
7662 /* Return a label to branch to for the exception type in KIND or NULL_TREE
7663 if none. */
7665 tree
7666 get_exception_label (char kind)
7668 if (kind == N_Raise_Constraint_Error)
7669 return TREE_VALUE (gnu_constraint_error_label_stack);
7670 else if (kind == N_Raise_Storage_Error)
7671 return TREE_VALUE (gnu_storage_error_label_stack);
7672 else if (kind == N_Raise_Program_Error)
7673 return TREE_VALUE (gnu_program_error_label_stack);
7674 else
7675 return NULL_TREE;
7678 #include "gt-ada-trans.h"