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