OSDN Git Service

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