OSDN Git Service

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