OSDN Git Service

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