OSDN Git Service

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