OSDN Git Service

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