OSDN Git Service

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