OSDN Git Service

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