OSDN Git Service

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