OSDN Git Service

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