OSDN Git Service

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