OSDN Git Service

* gcc-interface/trans.c (gigi): Set DECL_IGNORED_P on EH functions.
[pf3gnuchains/gcc-fork.git] / gcc / ada / gcc-interface / trans.c
1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                                T R A N S                                 *
6  *                                                                          *
7  *                          C Implementation File                           *
8  *                                                                          *
9  *          Copyright (C) 1992-2010, Free Software Foundation, Inc.         *
10  *                                                                          *
11  * GNAT is free software;  you can  redistribute it  and/or modify it under *
12  * terms of the  GNU General Public License as published  by the Free Soft- *
13  * ware  Foundation;  either version 3,  or (at your option) any later ver- *
14  * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
15  * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
16  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License *
17  * for  more details.  You should have  received  a copy of the GNU General *
18  * Public License  distributed  with GNAT;  see file  COPYING3.  If not see *
19  * <http://www.gnu.org/licenses/>.                                          *
20  *                                                                          *
21  * GNAT was originally developed  by the GNAT team at  New York University. *
22  * Extensive contributions were provided by Ada Core Technologies Inc.      *
23  *                                                                          *
24  ****************************************************************************/
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "tree.h"
31 #include "flags.h"
32 #include "expr.h"
33 #include "ggc.h"
34 #include "output.h"
35 #include "tree-iterator.h"
36 #include "gimple.h"
37
38 #include "ada.h"
39 #include "adadecode.h"
40 #include "types.h"
41 #include "atree.h"
42 #include "elists.h"
43 #include "namet.h"
44 #include "nlists.h"
45 #include "snames.h"
46 #include "stringt.h"
47 #include "uintp.h"
48 #include "urealp.h"
49 #include "fe.h"
50 #include "sinfo.h"
51 #include "einfo.h"
52 #include "gadaint.h"
53 #include "ada-tree.h"
54 #include "gigi.h"
55
56 /* We should avoid allocating more than ALLOCA_THRESHOLD bytes via alloca,
57    for fear of running out of stack space.  If we need more, we use xmalloc
58    instead.  */
59 #define ALLOCA_THRESHOLD 1000
60
61 /* Let code below know whether we are targetting VMS without need of
62    intrusive preprocessor directives.  */
63 #ifndef TARGET_ABI_OPEN_VMS
64 #define TARGET_ABI_OPEN_VMS 0
65 #endif
66
67 /* For efficient float-to-int rounding, it is necessary to know whether
68    floating-point arithmetic may use wider intermediate results.  When
69    FP_ARITH_MAY_WIDEN is not defined, be conservative and only assume
70    that arithmetic does not widen if double precision is emulated.  */
71 #ifndef FP_ARITH_MAY_WIDEN
72 #if defined(HAVE_extendsfdf2)
73 #define FP_ARITH_MAY_WIDEN HAVE_extendsfdf2
74 #else
75 #define FP_ARITH_MAY_WIDEN 0
76 #endif
77 #endif
78
79 /* Pointers to front-end tables accessed through macros.  */
80 struct Node *Nodes_Ptr;
81 Node_Id *Next_Node_Ptr;
82 Node_Id *Prev_Node_Ptr;
83 struct Elist_Header *Elists_Ptr;
84 struct Elmt_Item *Elmts_Ptr;
85 struct String_Entry *Strings_Ptr;
86 Char_Code *String_Chars_Ptr;
87 struct List_Header *List_Headers_Ptr;
88
89 /* Highest number in the front-end node table.  */
90 int max_gnat_nodes;
91
92 /* Current node being treated, in case abort called.  */
93 Node_Id error_gnat_node;
94
95 /* True when gigi is being called on an analyzed but unexpanded
96    tree, and the only purpose of the call is to properly annotate
97    types with representation information.  */
98 bool type_annotate_only;
99
100 /* Current filename without path.  */
101 const char *ref_filename;
102
103 /* When not optimizing, we cache the 'First, 'Last and 'Length attributes
104    of unconstrained array IN parameters to avoid emitting a great deal of
105    redundant instructions to recompute them each time.  */
106 struct GTY (()) parm_attr_d {
107   int id; /* GTY doesn't like Entity_Id.  */
108   int dim;
109   tree first;
110   tree last;
111   tree length;
112 };
113
114 typedef struct parm_attr_d *parm_attr;
115
116 DEF_VEC_P(parm_attr);
117 DEF_VEC_ALLOC_P(parm_attr,gc);
118
119 struct GTY(()) language_function {
120   VEC(parm_attr,gc) *parm_attr_cache;
121 };
122
123 #define f_parm_attr_cache \
124   DECL_STRUCT_FUNCTION (current_function_decl)->language->parm_attr_cache
125
126 /* A structure used to gather together information about a statement group.
127    We use this to gather related statements, for example the "then" part
128    of a IF.  In the case where it represents a lexical scope, we may also
129    have a BLOCK node corresponding to it and/or cleanups.  */
130
131 struct GTY((chain_next ("%h.previous"))) stmt_group {
132   struct stmt_group *previous;  /* Previous code group.  */
133   tree stmt_list;               /* List of statements for this code group.  */
134   tree block;                   /* BLOCK for this code group, if any.  */
135   tree cleanups;                /* Cleanups for this code group, if any.  */
136 };
137
138 static GTY(()) struct stmt_group *current_stmt_group;
139
140 /* List of unused struct stmt_group nodes.  */
141 static GTY((deletable)) struct stmt_group *stmt_group_free_list;
142
143 /* A structure used to record information on elaboration procedures
144    we've made and need to process.
145
146    ??? gnat_node should be Node_Id, but gengtype gets confused.  */
147
148 struct GTY((chain_next ("%h.next"))) elab_info {
149   struct elab_info *next;       /* Pointer to next in chain.  */
150   tree elab_proc;               /* Elaboration procedure.  */
151   int gnat_node;                /* The N_Compilation_Unit.  */
152 };
153
154 static GTY(()) struct elab_info *elab_info_list;
155
156 /* Free list of TREE_LIST nodes used for stacks.  */
157 static GTY((deletable)) tree gnu_stack_free_list;
158
159 /* List of TREE_LIST nodes representing a stack of exception pointer
160    variables.  TREE_VALUE is the VAR_DECL that stores the address of
161    the raised exception.  Nonzero means we are in an exception
162    handler.  Not used in the zero-cost case.  */
163 static GTY(()) tree gnu_except_ptr_stack;
164
165 /* List of TREE_LIST nodes used to store the current elaboration procedure
166    decl.  TREE_VALUE is the decl.  */
167 static GTY(()) tree gnu_elab_proc_stack;
168
169 /* Variable that stores a list of labels to be used as a goto target instead of
170    a return in some functions.  See processing for N_Subprogram_Body.  */
171 static GTY(()) tree gnu_return_label_stack;
172
173 /* List of TREE_LIST nodes representing a stack of LOOP_STMT nodes.
174    TREE_VALUE of each entry is the label of the corresponding LOOP_STMT.  */
175 static GTY(()) tree gnu_loop_label_stack;
176
177 /* List of TREE_LIST nodes representing labels for switch statements.
178    TREE_VALUE of each entry is the label at the end of the switch.  */
179 static GTY(()) tree gnu_switch_label_stack;
180
181 /* List of TREE_LIST nodes containing the stacks for N_{Push,Pop}_*_Label.  */
182 static GTY(()) tree gnu_constraint_error_label_stack;
183 static GTY(()) tree gnu_storage_error_label_stack;
184 static GTY(()) tree gnu_program_error_label_stack;
185
186 /* Map GNAT tree codes to GCC tree codes for simple expressions.  */
187 static enum tree_code gnu_codes[Number_Node_Kinds];
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, Node_Id);
206 static tree emit_index_check (tree, tree, tree, tree, Node_Id);
207 static tree emit_check (tree, tree, int, Node_Id);
208 static tree build_unary_op_trapv (enum tree_code, tree, tree, Node_Id);
209 static tree build_binary_op_trapv (enum tree_code, tree, tree, tree, Node_Id);
210 static tree convert_with_check (Entity_Id, tree, bool, bool, bool, Node_Id);
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 void set_expr_location_from_node (tree, Node_Id);
218 static int lvalue_required_p (Node_Id, tree, bool, bool, bool);
219
220 /* Hooks for debug info back-ends, only supported and used in a restricted set
221    of configurations.  */
222 static const char *extract_encoding (const char *) ATTRIBUTE_UNUSED;
223 static const char *decode_name (const char *) ATTRIBUTE_UNUSED;
224 \f
225 /* This is the main program of the back-end.  It sets up all the table
226    structures and then generates code.  */
227
228 void
229 gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
230       struct Node *nodes_ptr, Node_Id *next_node_ptr, Node_Id *prev_node_ptr,
231       struct Elist_Header *elists_ptr, struct Elmt_Item *elmts_ptr,
232       struct String_Entry *strings_ptr, Char_Code *string_chars_ptr,
233       struct List_Header *list_headers_ptr, Nat number_file,
234       struct File_Info_Type *file_info_ptr, Entity_Id standard_boolean,
235       Entity_Id standard_integer, Entity_Id standard_long_long_float,
236       Entity_Id standard_exception_type, Int gigi_operating_mode)
237 {
238   Entity_Id gnat_literal;
239   tree long_long_float_type, exception_type, t;
240   tree int64_type = gnat_type_for_size (64, 0);
241   struct elab_info *info;
242   int i;
243
244   max_gnat_nodes = max_gnat_node;
245
246   Nodes_Ptr = nodes_ptr;
247   Next_Node_Ptr = next_node_ptr;
248   Prev_Node_Ptr = prev_node_ptr;
249   Elists_Ptr = elists_ptr;
250   Elmts_Ptr = elmts_ptr;
251   Strings_Ptr = strings_ptr;
252   String_Chars_Ptr = string_chars_ptr;
253   List_Headers_Ptr = list_headers_ptr;
254
255   type_annotate_only = (gigi_operating_mode == 1);
256
257   gcc_assert (Nkind (gnat_root) == N_Compilation_Unit);
258
259   /* Declare the name of the compilation unit as the first global
260      name in order to make the middle-end fully deterministic.  */
261   t = create_concat_name (Defining_Entity (Unit (gnat_root)), NULL);
262   first_global_object_name = ggc_strdup (IDENTIFIER_POINTER (t));
263
264   for (i = 0; i < number_file; i++)
265     {
266       /* Use the identifier table to make a permanent copy of the filename as
267          the name table gets reallocated after Gigi returns but before all the
268          debugging information is output.  The __gnat_to_canonical_file_spec
269          call translates filenames from pragmas Source_Reference that contain
270          host style syntax not understood by gdb.  */
271       const char *filename
272         = IDENTIFIER_POINTER
273            (get_identifier
274             (__gnat_to_canonical_file_spec
275              (Get_Name_String (file_info_ptr[i].File_Name))));
276
277       /* We rely on the order isomorphism between files and line maps.  */
278       gcc_assert ((int) line_table->used == i);
279
280       /* We create the line map for a source file at once, with a fixed number
281          of columns chosen to avoid jumping over the next power of 2.  */
282       linemap_add (line_table, LC_ENTER, 0, filename, 1);
283       linemap_line_start (line_table, file_info_ptr[i].Num_Source_Lines, 252);
284       linemap_position_for_column (line_table, 252 - 1);
285       linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
286     }
287
288   /* Initialize ourselves.  */
289   init_code_table ();
290   init_gnat_to_gnu ();
291   init_dummy_type ();
292
293   /* If we are just annotating types, give VOID_TYPE zero sizes to avoid
294      errors.  */
295   if (type_annotate_only)
296     {
297       TYPE_SIZE (void_type_node) = bitsize_zero_node;
298       TYPE_SIZE_UNIT (void_type_node) = size_zero_node;
299     }
300
301   /* If the GNU type extensions to DWARF are available, setup the hooks.  */
302 #if defined (DWARF2_DEBUGGING_INFO) && defined (DWARF2_GNU_TYPE_EXTENSIONS)
303   /* We condition the name demangling and the generation of type encoding
304      strings on -gdwarf+ and always set descriptive types on.  */
305   if (use_gnu_debug_info_extensions)
306     {
307       dwarf2out_set_type_encoding_func (extract_encoding);
308       dwarf2out_set_demangle_name_func (decode_name);
309     }
310   dwarf2out_set_descriptive_type_func (get_parallel_type);
311 #endif
312
313   /* Enable GNAT stack checking method if needed */
314   if (!Stack_Check_Probes_On_Target)
315     set_stack_check_libfunc (gen_rtx_SYMBOL_REF (Pmode, "_gnat_stack_check"));
316
317   /* Retrieve alignment settings.  */
318   double_float_alignment = get_target_double_float_alignment ();
319   double_scalar_alignment = get_target_double_scalar_alignment ();
320
321   /* Record the builtin types.  Define `integer' and `unsigned char' first so
322      that dbx will output them first.  */
323   record_builtin_type ("integer", integer_type_node);
324   record_builtin_type ("unsigned char", char_type_node);
325   record_builtin_type ("long integer", long_integer_type_node);
326   unsigned_type_node = gnat_type_for_size (INT_TYPE_SIZE, 1);
327   record_builtin_type ("unsigned int", unsigned_type_node);
328   record_builtin_type (SIZE_TYPE, sizetype);
329   record_builtin_type ("boolean", boolean_type_node);
330   record_builtin_type ("void", void_type_node);
331
332   /* Save the type we made for integer as the type for Standard.Integer.  */
333   save_gnu_tree (Base_Type (standard_integer), TYPE_NAME (integer_type_node),
334                  false);
335
336   /* Save the type we made for boolean as the type for Standard.Boolean.  */
337   save_gnu_tree (Base_Type (standard_boolean), TYPE_NAME (boolean_type_node),
338                  false);
339   gnat_literal = First_Literal (Base_Type (standard_boolean));
340   t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
341   gcc_assert (t == boolean_false_node);
342   t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
343                        boolean_type_node, t, true, false, false, false,
344                        NULL, gnat_literal);
345   DECL_IGNORED_P (t) = 1;
346   save_gnu_tree (gnat_literal, t, false);
347   gnat_literal = Next_Literal (gnat_literal);
348   t = UI_To_gnu (Enumeration_Rep (gnat_literal), boolean_type_node);
349   gcc_assert (t == boolean_true_node);
350   t = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
351                        boolean_type_node, t, true, false, false, false,
352                        NULL, gnat_literal);
353   DECL_IGNORED_P (t) = 1;
354   save_gnu_tree (gnat_literal, t, false);
355
356   void_ftype = build_function_type (void_type_node, NULL_TREE);
357   ptr_void_ftype = build_pointer_type (void_ftype);
358
359   /* Now declare runtime functions.  */
360   t = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
361
362   /* malloc is a function declaration tree for a function to allocate
363      memory.  */
364   malloc_decl
365     = create_subprog_decl (get_identifier ("__gnat_malloc"), NULL_TREE,
366                            build_function_type (ptr_void_type_node,
367                                                 tree_cons (NULL_TREE,
368                                                            sizetype, t)),
369                            NULL_TREE, false, true, true, NULL, Empty);
370   DECL_IS_MALLOC (malloc_decl) = 1;
371
372   /* malloc32 is a function declaration tree for a function to allocate
373      32-bit memory on a 64-bit system.  Needed only on 64-bit VMS.  */
374   malloc32_decl
375     = create_subprog_decl (get_identifier ("__gnat_malloc32"), NULL_TREE,
376                            build_function_type (ptr_void_type_node,
377                                                 tree_cons (NULL_TREE,
378                                                            sizetype, t)),
379                            NULL_TREE, false, true, true, NULL, Empty);
380   DECL_IS_MALLOC (malloc32_decl) = 1;
381
382   /* free is a function declaration tree for a function to free memory.  */
383   free_decl
384     = create_subprog_decl (get_identifier ("__gnat_free"), NULL_TREE,
385                            build_function_type (void_type_node,
386                                                 tree_cons (NULL_TREE,
387                                                            ptr_void_type_node,
388                                                            t)),
389                            NULL_TREE, false, true, true, NULL, Empty);
390
391   /* This is used for 64-bit multiplication with overflow checking.  */
392   mulv64_decl
393     = create_subprog_decl (get_identifier ("__gnat_mulv64"), NULL_TREE,
394                            build_function_type_list (int64_type, int64_type,
395                                                      int64_type, NULL_TREE),
396                            NULL_TREE, false, true, true, NULL, Empty);
397
398   /* Name of the _Parent field in tagged record types.  */
399   parent_name_id = get_identifier (Get_Name_String (Name_uParent));
400
401   /* Make the types and functions used for exception processing.  */
402   jmpbuf_type
403     = build_array_type (gnat_type_for_mode (Pmode, 0),
404                         build_index_type (size_int (5)));
405   record_builtin_type ("JMPBUF_T", jmpbuf_type);
406   jmpbuf_ptr_type = build_pointer_type (jmpbuf_type);
407
408   /* Functions to get and set the jumpbuf pointer for the current thread.  */
409   get_jmpbuf_decl
410     = create_subprog_decl
411     (get_identifier ("system__soft_links__get_jmpbuf_address_soft"),
412      NULL_TREE, build_function_type (jmpbuf_ptr_type, NULL_TREE),
413      NULL_TREE, false, true, true, NULL, Empty);
414   /* Avoid creating superfluous edges to __builtin_setjmp receivers.  */
415   DECL_PURE_P (get_jmpbuf_decl) = 1;
416   DECL_IGNORED_P (get_jmpbuf_decl) = 1;
417
418   set_jmpbuf_decl
419     = create_subprog_decl
420     (get_identifier ("system__soft_links__set_jmpbuf_address_soft"),
421      NULL_TREE,
422      build_function_type (void_type_node,
423                           tree_cons (NULL_TREE, jmpbuf_ptr_type, t)),
424      NULL_TREE, false, true, true, NULL, Empty);
425   DECL_IGNORED_P (set_jmpbuf_decl) = 1;
426
427   /* setjmp returns an integer and has one operand, which is a pointer to
428      a jmpbuf.  */
429   setjmp_decl
430     = create_subprog_decl
431       (get_identifier ("__builtin_setjmp"), NULL_TREE,
432        build_function_type (integer_type_node,
433                             tree_cons (NULL_TREE,  jmpbuf_ptr_type, t)),
434        NULL_TREE, false, true, true, NULL, Empty);
435   DECL_BUILT_IN_CLASS (setjmp_decl) = BUILT_IN_NORMAL;
436   DECL_FUNCTION_CODE (setjmp_decl) = BUILT_IN_SETJMP;
437
438   /* update_setjmp_buf updates a setjmp buffer from the current stack pointer
439      address.  */
440   update_setjmp_buf_decl
441     = create_subprog_decl
442       (get_identifier ("__builtin_update_setjmp_buf"), NULL_TREE,
443        build_function_type (void_type_node,
444                             tree_cons (NULL_TREE,  jmpbuf_ptr_type, t)),
445        NULL_TREE, false, true, true, NULL, Empty);
446   DECL_BUILT_IN_CLASS (update_setjmp_buf_decl) = BUILT_IN_NORMAL;
447   DECL_FUNCTION_CODE (update_setjmp_buf_decl) = BUILT_IN_UPDATE_SETJMP_BUF;
448
449   /* Hooks to call when entering/leaving an exception handler.  */
450   begin_handler_decl
451     = create_subprog_decl (get_identifier ("__gnat_begin_handler"), NULL_TREE,
452                            build_function_type (void_type_node,
453                                                 tree_cons (NULL_TREE,
454                                                            ptr_void_type_node,
455                                                            t)),
456                            NULL_TREE, false, true, true, NULL, Empty);
457   DECL_IGNORED_P (begin_handler_decl) = 1;
458
459   end_handler_decl
460     = create_subprog_decl (get_identifier ("__gnat_end_handler"), NULL_TREE,
461                            build_function_type (void_type_node,
462                                                 tree_cons (NULL_TREE,
463                                                            ptr_void_type_node,
464                                                            t)),
465                            NULL_TREE, false, true, true, NULL, Empty);
466   DECL_IGNORED_P (end_handler_decl) = 1;
467
468   /* If in no exception handlers mode, all raise statements are redirected to
469      __gnat_last_chance_handler.  No need to redefine raise_nodefer_decl since
470      this procedure will never be called in this mode.  */
471   if (No_Exception_Handlers_Set ())
472     {
473       tree decl
474         = create_subprog_decl
475           (get_identifier ("__gnat_last_chance_handler"), NULL_TREE,
476            build_function_type (void_type_node,
477                                 tree_cons (NULL_TREE,
478                                            build_pointer_type (char_type_node),
479                                            tree_cons (NULL_TREE,
480                                                       integer_type_node,
481                                                       t))),
482            NULL_TREE, false, true, true, NULL, Empty);
483
484       for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
485         gnat_raise_decls[i] = decl;
486     }
487   else
488     /* Otherwise, make one decl for each exception reason.  */
489     for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
490       {
491         char name[17];
492
493         sprintf (name, "__gnat_rcheck_%.2d", i);
494         gnat_raise_decls[i]
495           = create_subprog_decl
496             (get_identifier (name), NULL_TREE,
497              build_function_type (void_type_node,
498                                   tree_cons (NULL_TREE,
499                                              build_pointer_type
500                                              (char_type_node),
501                                              tree_cons (NULL_TREE,
502                                                         integer_type_node,
503                                                         t))),
504              NULL_TREE, false, true, true, NULL, Empty);
505       }
506
507   for (i = 0; i < (int) ARRAY_SIZE (gnat_raise_decls); i++)
508     {
509       TREE_THIS_VOLATILE (gnat_raise_decls[i]) = 1;
510       TREE_SIDE_EFFECTS (gnat_raise_decls[i]) = 1;
511       TREE_TYPE (gnat_raise_decls[i])
512         = build_qualified_type (TREE_TYPE (gnat_raise_decls[i]),
513                                 TYPE_QUAL_VOLATILE);
514     }
515
516   /* Set the types that GCC and Gigi use from the front end.  We would
517      like to do this for char_type_node, but it needs to correspond to
518      the C char type.  */
519   exception_type
520     = gnat_to_gnu_entity (Base_Type (standard_exception_type),  NULL_TREE, 0);
521   except_type_node = TREE_TYPE (exception_type);
522
523   /* Make other functions used for exception processing.  */
524   get_excptr_decl
525     = create_subprog_decl
526     (get_identifier ("system__soft_links__get_gnat_exception"),
527      NULL_TREE,
528      build_function_type (build_pointer_type (except_type_node), NULL_TREE),
529      NULL_TREE, false, true, true, NULL, Empty);
530   /* Avoid creating superfluous edges to __builtin_setjmp receivers.  */
531   DECL_PURE_P (get_excptr_decl) = 1;
532
533   raise_nodefer_decl
534     = create_subprog_decl
535       (get_identifier ("__gnat_raise_nodefer_with_msg"), NULL_TREE,
536        build_function_type (void_type_node,
537                             tree_cons (NULL_TREE,
538                                        build_pointer_type (except_type_node),
539                                        t)),
540        NULL_TREE, false, true, true, NULL, Empty);
541
542   /* Indicate that these never return.  */
543   TREE_THIS_VOLATILE (raise_nodefer_decl) = 1;
544   TREE_SIDE_EFFECTS (raise_nodefer_decl) = 1;
545   TREE_TYPE (raise_nodefer_decl)
546     = build_qualified_type (TREE_TYPE (raise_nodefer_decl),
547                             TYPE_QUAL_VOLATILE);
548
549   /* Build the special descriptor type and its null node if needed.  */
550   if (TARGET_VTABLE_USES_DESCRIPTORS)
551     {
552       tree null_node = fold_convert (ptr_void_ftype, null_pointer_node);
553       tree field_list = NULL_TREE, null_list = NULL_TREE;
554       int j;
555
556       fdesc_type_node = make_node (RECORD_TYPE);
557
558       for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; j++)
559         {
560           tree field = create_field_decl (NULL_TREE, ptr_void_ftype,
561                                           fdesc_type_node, 0, 0, 0, 1);
562           TREE_CHAIN (field) = field_list;
563           field_list = field;
564           null_list = tree_cons (field, null_node, null_list);
565         }
566
567       finish_record_type (fdesc_type_node, nreverse (field_list), 0, false);
568       record_builtin_type ("descriptor", fdesc_type_node);
569       null_fdesc_node = gnat_build_constructor (fdesc_type_node, null_list);
570     }
571
572   long_long_float_type
573     = gnat_to_gnu_entity (Base_Type (standard_long_long_float), NULL_TREE, 0);
574
575   if (TREE_CODE (TREE_TYPE (long_long_float_type)) == INTEGER_TYPE)
576     {
577       /* In this case, the builtin floating point types are VAX float,
578          so make up a type for use.  */
579       longest_float_type_node = make_node (REAL_TYPE);
580       TYPE_PRECISION (longest_float_type_node) = LONG_DOUBLE_TYPE_SIZE;
581       layout_type (longest_float_type_node);
582       record_builtin_type ("longest float type", longest_float_type_node);
583     }
584   else
585     longest_float_type_node = TREE_TYPE (long_long_float_type);
586
587   /* Dummy objects to materialize "others" and "all others" in the exception
588      tables.  These are exported by a-exexpr.adb, so see this unit for the
589      types to use.  */
590   others_decl
591     = create_var_decl (get_identifier ("OTHERS"),
592                        get_identifier ("__gnat_others_value"),
593                        integer_type_node, 0, 1, 0, 1, 1, 0, Empty);
594
595   all_others_decl
596     = create_var_decl (get_identifier ("ALL_OTHERS"),
597                        get_identifier ("__gnat_all_others_value"),
598                        integer_type_node, 0, 1, 0, 1, 1, 0, Empty);
599
600   main_identifier_node = get_identifier ("main");
601
602   /* Install the builtins we might need, either internally or as
603      user available facilities for Intrinsic imports.  */
604   gnat_install_builtins ();
605
606   gnu_except_ptr_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
607   gnu_constraint_error_label_stack
608     = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
609   gnu_storage_error_label_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
610   gnu_program_error_label_stack = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
611
612   /* Process any Pragma Ident for the main unit.  */
613 #ifdef ASM_OUTPUT_IDENT
614   if (Present (Ident_String (Main_Unit)))
615     ASM_OUTPUT_IDENT
616       (asm_out_file,
617        TREE_STRING_POINTER (gnat_to_gnu (Ident_String (Main_Unit))));
618 #endif
619
620   /* If we are using the GCC exception mechanism, let GCC know.  */
621   if (Exception_Mechanism == Back_End_Exceptions)
622     gnat_init_gcc_eh ();
623
624   /* Now translate the compilation unit proper.  */
625   Compilation_Unit_to_gnu (gnat_root);
626
627   /* Finally see if we have any elaboration procedures to deal with.  */
628   for (info = elab_info_list; info; info = info->next)
629     {
630       tree gnu_body = DECL_SAVED_TREE (info->elab_proc), gnu_stmts;
631
632       /* Unshare SAVE_EXPRs between subprograms.  These are not unshared by
633          the gimplifier for obvious reasons, but it turns out that we need to
634          unshare them for the global level because of SAVE_EXPRs made around
635          checks for global objects and around allocators for global objects
636          of variable size, in order to prevent node sharing in the underlying
637          expression.  Note that this implicitly assumes that the SAVE_EXPR
638          nodes themselves are not shared between subprograms, which would be
639          an upstream bug for which we would not change the outcome.  */
640       walk_tree_without_duplicates (&gnu_body, unshare_save_expr, NULL);
641
642       /* We should have a BIND_EXPR but it may not have any statements in it.
643          If it doesn't have any, we have nothing to do except for setting the
644          flag on the GNAT node.  Otherwise, process the function as others.  */
645       gnu_stmts = gnu_body;
646       if (TREE_CODE (gnu_stmts) == BIND_EXPR)
647         gnu_stmts = BIND_EXPR_BODY (gnu_stmts);
648       if (!gnu_stmts || !STATEMENT_LIST_HEAD (gnu_stmts))
649         Set_Has_No_Elaboration_Code (info->gnat_node, 1);
650       else
651         {
652           begin_subprog_body (info->elab_proc);
653           end_subprog_body (gnu_body);
654         }
655     }
656
657   /* We cannot track the location of errors past this point.  */
658   error_gnat_node = Empty;
659 }
660 \f
661 /* Return a positive value if an lvalue is required for GNAT_NODE, which is
662    an N_Attribute_Reference.  */
663
664 static int
665 lvalue_required_for_attribute_p (Node_Id gnat_node)
666 {
667   switch (Get_Attribute_Id (Attribute_Name (gnat_node)))
668     {
669     case Attr_Pos:
670     case Attr_Val:
671     case Attr_Pred:
672     case Attr_Succ:
673     case Attr_First:
674     case Attr_Last:
675     case Attr_Range_Length:
676     case Attr_Length:
677     case Attr_Object_Size:
678     case Attr_Value_Size:
679     case Attr_Component_Size:
680     case Attr_Max_Size_In_Storage_Elements:
681     case Attr_Min:
682     case Attr_Max:
683     case Attr_Null_Parameter:
684     case Attr_Passed_By_Reference:
685     case Attr_Mechanism_Code:
686       return 0;
687
688     case Attr_Address:
689     case Attr_Access:
690     case Attr_Unchecked_Access:
691     case Attr_Unrestricted_Access:
692     case Attr_Code_Address:
693     case Attr_Pool_Address:
694     case Attr_Size:
695     case Attr_Alignment:
696     case Attr_Bit_Position:
697     case Attr_Position:
698     case Attr_First_Bit:
699     case Attr_Last_Bit:
700     case Attr_Bit:
701     default:
702       return 1;
703     }
704 }
705
706 /* Return a positive value if an lvalue is required for GNAT_NODE.  GNU_TYPE
707    is the type that will be used for GNAT_NODE in the translated GNU tree.
708    CONSTANT indicates whether the underlying object represented by GNAT_NODE
709    is constant in the Ada sense.  If it is, ADDRESS_OF_CONSTANT indicates
710    whether its value is the address of a constant and ALIASED whether it is
711    aliased.  If it isn't, ADDRESS_OF_CONSTANT and ALIASED are ignored.
712
713    The function climbs up the GNAT tree starting from the node and returns 1
714    upon encountering a node that effectively requires an lvalue downstream.
715    It returns int instead of bool to facilitate usage in non-purely binary
716    logic contexts.  */
717
718 static int
719 lvalue_required_p (Node_Id gnat_node, tree gnu_type, bool constant,
720                    bool address_of_constant, bool aliased)
721 {
722   Node_Id gnat_parent = Parent (gnat_node), gnat_temp;
723
724   switch (Nkind (gnat_parent))
725     {
726     case N_Reference:
727       return 1;
728
729     case N_Attribute_Reference:
730       return lvalue_required_for_attribute_p (gnat_parent);
731
732     case N_Parameter_Association:
733     case N_Function_Call:
734     case N_Procedure_Call_Statement:
735       /* If the parameter is by reference, an lvalue is required.  */
736       return (!constant
737               || must_pass_by_ref (gnu_type)
738               || default_pass_by_ref (gnu_type));
739
740     case N_Indexed_Component:
741       /* Only the array expression can require an lvalue.  */
742       if (Prefix (gnat_parent) != gnat_node)
743         return 0;
744
745       /* ??? Consider that referencing an indexed component with a
746          non-constant index forces the whole aggregate to memory.
747          Note that N_Integer_Literal is conservative, any static
748          expression in the RM sense could probably be accepted.  */
749       for (gnat_temp = First (Expressions (gnat_parent));
750            Present (gnat_temp);
751            gnat_temp = Next (gnat_temp))
752         if (Nkind (gnat_temp) != N_Integer_Literal)
753           return 1;
754
755       /* ... fall through ... */
756
757     case N_Slice:
758       /* Only the array expression can require an lvalue.  */
759       if (Prefix (gnat_parent) != gnat_node)
760         return 0;
761
762       aliased |= Has_Aliased_Components (Etype (gnat_node));
763       return lvalue_required_p (gnat_parent, gnu_type, constant,
764                                 address_of_constant, aliased);
765
766     case N_Selected_Component:
767       aliased |= Is_Aliased (Entity (Selector_Name (gnat_parent)));
768       return lvalue_required_p (gnat_parent, gnu_type, constant,
769                                 address_of_constant, aliased);
770
771     case N_Object_Renaming_Declaration:
772       /* We need to make a real renaming only if the constant object is
773          aliased or if we may use a renaming pointer; otherwise we can
774          optimize and return the rvalue.  We make an exception if the object
775          is an identifier since in this case the rvalue can be propagated
776          attached to the CONST_DECL.  */
777       return (!constant
778               || aliased
779               /* This should match the constant case of the renaming code.  */
780               || Is_Composite_Type
781                  (Underlying_Type (Etype (Name (gnat_parent))))
782               || Nkind (Name (gnat_parent)) == N_Identifier);
783
784     case N_Object_Declaration:
785       /* We cannot use a constructor if this is an atomic object because
786          the actual assignment might end up being done component-wise.  */
787       return (!constant
788               ||(Is_Composite_Type (Underlying_Type (Etype (gnat_node)))
789                  && Is_Atomic (Defining_Entity (gnat_parent)))
790               /* We don't use a constructor if this is a class-wide object
791                  because the effective type of the object is the equivalent
792                  type of the class-wide subtype and it smashes most of the
793                  data into an array of bytes to which we cannot convert.  */
794               || Ekind ((Etype (Defining_Entity (gnat_parent))))
795                  == E_Class_Wide_Subtype);
796
797     case N_Assignment_Statement:
798       /* We cannot use a constructor if the LHS is an atomic object because
799          the actual assignment might end up being done component-wise.  */
800       return (!constant
801               || Name (gnat_parent) == gnat_node
802               || (Is_Composite_Type (Underlying_Type (Etype (gnat_node)))
803                   && Is_Atomic (Entity (Name (gnat_parent)))));
804
805     case N_Type_Conversion:
806     case N_Qualified_Expression:
807       /* We must look through all conversions for composite types because we
808          may need to bypass an intermediate conversion to a narrower record
809          type that is generated for a formal conversion, e.g. the conversion
810          to the root type of a hierarchy of tagged types generated for the
811          formal conversion to the class-wide type.  */
812       if (!Is_Composite_Type (Underlying_Type (Etype (gnat_node))))
813         return 0;
814
815       /* ... fall through ... */
816
817     case N_Unchecked_Type_Conversion:
818       return (!constant
819               || lvalue_required_p (gnat_parent,
820                                     get_unpadded_type (Etype (gnat_parent)),
821                                     constant, address_of_constant, aliased));
822
823     case N_Allocator:
824       /* We should only reach here through the N_Qualified_Expression case
825          and, therefore, only for composite types.  Force an lvalue since
826          a block-copy to the newly allocated area of memory is made.  */
827       return 1;
828
829    case N_Explicit_Dereference:
830       /* We look through dereferences for address of constant because we need
831          to handle the special cases listed above.  */
832       if (constant && address_of_constant)
833         return lvalue_required_p (gnat_parent,
834                                   get_unpadded_type (Etype (gnat_parent)),
835                                   true, false, true);
836
837       /* ... fall through ... */
838
839     default:
840       return 0;
841     }
842
843   gcc_unreachable ();
844 }
845
846 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Identifier,
847    to a GCC tree, which is returned.  GNU_RESULT_TYPE_P is a pointer
848    to where we should place the result type.  */
849
850 static tree
851 Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
852 {
853   Node_Id gnat_temp, gnat_temp_type;
854   tree gnu_result, gnu_result_type;
855
856   /* Whether we should require an lvalue for GNAT_NODE.  Needed in
857      specific circumstances only, so evaluated lazily.  < 0 means
858      unknown, > 0 means known true, 0 means known false.  */
859   int require_lvalue = -1;
860
861   /* If GNAT_NODE is a constant, whether we should use the initialization
862      value instead of the constant entity, typically for scalars with an
863      address clause when the parent doesn't require an lvalue.  */
864   bool use_constant_initializer = false;
865
866   /* If the Etype of this node does not equal the Etype of the Entity,
867      something is wrong with the entity map, probably in generic
868      instantiation. However, this does not apply to types. Since we sometime
869      have strange Ekind's, just do this test for objects. Also, if the Etype of
870      the Entity is private, the Etype of the N_Identifier is allowed to be the
871      full type and also we consider a packed array type to be the same as the
872      original type. Similarly, a class-wide type is equivalent to a subtype of
873      itself. Finally, if the types are Itypes, one may be a copy of the other,
874      which is also legal.  */
875   gnat_temp = (Nkind (gnat_node) == N_Defining_Identifier
876                ? gnat_node : Entity (gnat_node));
877   gnat_temp_type = Etype (gnat_temp);
878
879   gcc_assert (Etype (gnat_node) == gnat_temp_type
880               || (Is_Packed (gnat_temp_type)
881                   && Etype (gnat_node) == Packed_Array_Type (gnat_temp_type))
882               || (Is_Class_Wide_Type (Etype (gnat_node)))
883               || (IN (Ekind (gnat_temp_type), Private_Kind)
884                   && Present (Full_View (gnat_temp_type))
885                   && ((Etype (gnat_node) == Full_View (gnat_temp_type))
886                       || (Is_Packed (Full_View (gnat_temp_type))
887                           && (Etype (gnat_node)
888                               == Packed_Array_Type (Full_View
889                                                     (gnat_temp_type))))))
890               || (Is_Itype (Etype (gnat_node)) && Is_Itype (gnat_temp_type))
891               || !(Ekind (gnat_temp) == E_Variable
892                    || Ekind (gnat_temp) == E_Component
893                    || Ekind (gnat_temp) == E_Constant
894                    || Ekind (gnat_temp) == E_Loop_Parameter
895                    || IN (Ekind (gnat_temp), Formal_Kind)));
896
897   /* If this is a reference to a deferred constant whose partial view is an
898      unconstrained private type, the proper type is on the full view of the
899      constant, not on the full view of the type, which may be unconstrained.
900
901      This may be a reference to a type, for example in the prefix of the
902      attribute Position, generated for dispatching code (see Make_DT in
903      exp_disp,adb). In that case we need the type itself, not is parent,
904      in particular if it is a derived type  */
905   if (Is_Private_Type (gnat_temp_type)
906       && Has_Unknown_Discriminants (gnat_temp_type)
907       && Ekind (gnat_temp) == E_Constant
908       && Present (Full_View (gnat_temp)))
909     {
910       gnat_temp = Full_View (gnat_temp);
911       gnat_temp_type = Etype (gnat_temp);
912     }
913   else
914     {
915       /* We want to use the Actual_Subtype if it has already been elaborated,
916          otherwise the Etype.  Avoid using Actual_Subtype for packed arrays to
917          simplify things.  */
918       if ((Ekind (gnat_temp) == E_Constant
919            || Ekind (gnat_temp) == E_Variable || Is_Formal (gnat_temp))
920           && !(Is_Array_Type (Etype (gnat_temp))
921                && Present (Packed_Array_Type (Etype (gnat_temp))))
922           && Present (Actual_Subtype (gnat_temp))
923           && present_gnu_tree (Actual_Subtype (gnat_temp)))
924         gnat_temp_type = Actual_Subtype (gnat_temp);
925       else
926         gnat_temp_type = Etype (gnat_node);
927     }
928
929   /* Expand the type of this identifier first, in case it is an enumeral
930      literal, which only get made when the type is expanded.  There is no
931      order-of-elaboration issue here.  */
932   gnu_result_type = get_unpadded_type (gnat_temp_type);
933
934   /* If this is a non-imported scalar constant with an address clause,
935      retrieve the value instead of a pointer to be dereferenced unless
936      an lvalue is required.  This is generally more efficient and actually
937      required if this is a static expression because it might be used
938      in a context where a dereference is inappropriate, such as a case
939      statement alternative or a record discriminant.  There is no possible
940      volatile-ness short-circuit here since Volatile constants must bei
941      imported per C.6.  */
942   if (Ekind (gnat_temp) == E_Constant
943       && Is_Scalar_Type (gnat_temp_type)
944       && !Is_Imported (gnat_temp)
945       && Present (Address_Clause (gnat_temp)))
946     {
947       require_lvalue = lvalue_required_p (gnat_node, gnu_result_type, true,
948                                           false, Is_Aliased (gnat_temp));
949       use_constant_initializer = !require_lvalue;
950     }
951
952   if (use_constant_initializer)
953     {
954       /* If this is a deferred constant, the initializer is attached to
955          the full view.  */
956       if (Present (Full_View (gnat_temp)))
957         gnat_temp = Full_View (gnat_temp);
958
959       gnu_result = gnat_to_gnu (Expression (Declaration_Node (gnat_temp)));
960     }
961   else
962     gnu_result = gnat_to_gnu_entity (gnat_temp, NULL_TREE, 0);
963
964   /* If we are in an exception handler, force this variable into memory to
965      ensure optimization does not remove stores that appear redundant but are
966      actually needed in case an exception occurs.
967
968      ??? Note that we need not do this if the variable is declared within the
969      handler, only if it is referenced in the handler and declared in an
970      enclosing block, but we have no way of testing that right now.
971
972      ??? We used to essentially set the TREE_ADDRESSABLE flag on the variable
973      here, but it can now be removed by the Tree aliasing machinery if the
974      address of the variable is never taken.  All we can do is to make the
975      variable volatile, which might incur the generation of temporaries just
976      to access the memory in some circumstances.  This can be avoided for
977      variables of non-constant size because they are automatically allocated
978      to memory.  There might be no way of allocating a proper temporary for
979      them in any case.  We only do this for SJLJ though.  */
980   if (TREE_VALUE (gnu_except_ptr_stack)
981       && TREE_CODE (gnu_result) == VAR_DECL
982       && TREE_CODE (DECL_SIZE_UNIT (gnu_result)) == INTEGER_CST)
983     TREE_THIS_VOLATILE (gnu_result) = TREE_SIDE_EFFECTS (gnu_result) = 1;
984
985   /* Some objects (such as parameters passed by reference, globals of
986      variable size, and renamed objects) actually represent the address
987      of the object.  In that case, we must do the dereference.  Likewise,
988      deal with parameters to foreign convention subprograms.  */
989   if (DECL_P (gnu_result)
990       && (DECL_BY_REF_P (gnu_result)
991           || (TREE_CODE (gnu_result) == PARM_DECL
992               && DECL_BY_COMPONENT_PTR_P (gnu_result))))
993     {
994       const bool read_only = DECL_POINTS_TO_READONLY_P (gnu_result);
995       tree renamed_obj;
996
997       if (TREE_CODE (gnu_result) == PARM_DECL
998           && DECL_BY_COMPONENT_PTR_P (gnu_result))
999         gnu_result
1000           = build_unary_op (INDIRECT_REF, NULL_TREE,
1001                             convert (build_pointer_type (gnu_result_type),
1002                                      gnu_result));
1003
1004       /* If it's a renaming pointer and we are at the right binding level,
1005          we can reference the renamed object directly, since the renamed
1006          expression has been protected against multiple evaluations.  */
1007       else if (TREE_CODE (gnu_result) == VAR_DECL
1008                && (renamed_obj = DECL_RENAMED_OBJECT (gnu_result))
1009                && (!DECL_RENAMING_GLOBAL_P (gnu_result)
1010                    || global_bindings_p ()))
1011         gnu_result = renamed_obj;
1012
1013       /* Return the underlying CST for a CONST_DECL like a few lines below,
1014          after dereferencing in this case.  */
1015       else if (TREE_CODE (gnu_result) == CONST_DECL)
1016         gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE,
1017                                      DECL_INITIAL (gnu_result));
1018
1019       else
1020         gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
1021
1022       if (read_only)
1023         TREE_READONLY (gnu_result) = 1;
1024     }
1025
1026   /* The GNAT tree has the type of a function as the type of its result.  Also
1027      use the type of the result if the Etype is a subtype which is nominally
1028      unconstrained.  But remove any padding from the resulting type.  */
1029   if (TREE_CODE (TREE_TYPE (gnu_result)) == FUNCTION_TYPE
1030       || Is_Constr_Subt_For_UN_Aliased (gnat_temp_type))
1031     {
1032       gnu_result_type = TREE_TYPE (gnu_result);
1033       if (TYPE_IS_PADDING_P (gnu_result_type))
1034         gnu_result_type = TREE_TYPE (TYPE_FIELDS (gnu_result_type));
1035     }
1036
1037   /* If we have a constant declaration and its initializer at hand,
1038      try to return the latter to avoid the need to call fold in lots
1039      of places and the need of elaboration code if this Id is used as
1040      an initializer itself.  */
1041   if (TREE_CONSTANT (gnu_result)
1042       && DECL_P (gnu_result)
1043       && DECL_INITIAL (gnu_result))
1044     {
1045       bool constant_only = (TREE_CODE (gnu_result) == CONST_DECL
1046                             && !DECL_CONST_CORRESPONDING_VAR (gnu_result));
1047       bool address_of_constant = (TREE_CODE (gnu_result) == CONST_DECL
1048                                   && DECL_CONST_ADDRESS_P (gnu_result));
1049
1050       /* If there is a (corresponding) variable or this is the address of a
1051          constant, we only want to return the initializer if an lvalue isn't
1052          required.  Evaluate this now if we have not already done so.  */
1053       if ((!constant_only || address_of_constant) && require_lvalue < 0)
1054         require_lvalue
1055           = lvalue_required_p (gnat_node, gnu_result_type, true,
1056                                address_of_constant, Is_Aliased (gnat_temp));
1057
1058       if ((constant_only && !address_of_constant) || !require_lvalue)
1059         gnu_result = unshare_expr (DECL_INITIAL (gnu_result));
1060     }
1061
1062   *gnu_result_type_p = gnu_result_type;
1063   return gnu_result;
1064 }
1065 \f
1066 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Pragma.  Return
1067    any statements we generate.  */
1068
1069 static tree
1070 Pragma_to_gnu (Node_Id gnat_node)
1071 {
1072   Node_Id gnat_temp;
1073   tree gnu_result = alloc_stmt_list ();
1074
1075   /* Check for (and ignore) unrecognized pragma and do nothing if we are just
1076      annotating types.  */
1077   if (type_annotate_only
1078       || !Is_Pragma_Name (Chars (Pragma_Identifier (gnat_node))))
1079     return gnu_result;
1080
1081   switch (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_node))))
1082     {
1083     case Pragma_Inspection_Point:
1084       /* Do nothing at top level: all such variables are already viewable.  */
1085       if (global_bindings_p ())
1086         break;
1087
1088       for (gnat_temp = First (Pragma_Argument_Associations (gnat_node));
1089            Present (gnat_temp);
1090            gnat_temp = Next (gnat_temp))
1091         {
1092           Node_Id gnat_expr = Expression (gnat_temp);
1093           tree gnu_expr = gnat_to_gnu (gnat_expr);
1094           int use_address;
1095           enum machine_mode mode;
1096           tree asm_constraint = NULL_TREE;
1097 #ifdef ASM_COMMENT_START
1098           char *comment;
1099 #endif
1100
1101           if (TREE_CODE (gnu_expr) == UNCONSTRAINED_ARRAY_REF)
1102             gnu_expr = TREE_OPERAND (gnu_expr, 0);
1103
1104           /* Use the value only if it fits into a normal register,
1105              otherwise use the address.  */
1106           mode = TYPE_MODE (TREE_TYPE (gnu_expr));
1107           use_address = ((GET_MODE_CLASS (mode) != MODE_INT
1108                           && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1109                          || GET_MODE_SIZE (mode) > UNITS_PER_WORD);
1110
1111           if (use_address)
1112             gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr);
1113
1114 #ifdef ASM_COMMENT_START
1115           comment = concat (ASM_COMMENT_START,
1116                             " inspection point: ",
1117                             Get_Name_String (Chars (gnat_expr)),
1118                             use_address ? " address" : "",
1119                             " is in %0",
1120                             NULL);
1121           asm_constraint = build_string (strlen (comment), comment);
1122           free (comment);
1123 #endif
1124           gnu_expr = build5 (ASM_EXPR, void_type_node,
1125                              asm_constraint,
1126                              NULL_TREE,
1127                              tree_cons
1128                              (build_tree_list (NULL_TREE,
1129                                                build_string (1, "g")),
1130                               gnu_expr, NULL_TREE),
1131                              NULL_TREE, NULL_TREE);
1132           ASM_VOLATILE_P (gnu_expr) = 1;
1133           set_expr_location_from_node (gnu_expr, gnat_node);
1134           append_to_statement_list (gnu_expr, &gnu_result);
1135         }
1136       break;
1137
1138     case Pragma_Optimize:
1139       switch (Chars (Expression
1140                      (First (Pragma_Argument_Associations (gnat_node)))))
1141         {
1142         case Name_Time:  case Name_Space:
1143           if (!optimize)
1144             post_error ("insufficient -O value?", gnat_node);
1145           break;
1146
1147         case Name_Off:
1148           if (optimize)
1149             post_error ("must specify -O0?", gnat_node);
1150           break;
1151
1152         default:
1153           gcc_unreachable ();
1154         }
1155       break;
1156
1157     case Pragma_Reviewable:
1158       if (write_symbols == NO_DEBUG)
1159         post_error ("must specify -g?", gnat_node);
1160       break;
1161     }
1162
1163   return gnu_result;
1164 }
1165 \f
1166 /* Subroutine of gnat_to_gnu to translate GNAT_NODE, an N_Attribute node,
1167    to a GCC tree, which is returned.  GNU_RESULT_TYPE_P is a pointer to
1168    where we should place the result type.  ATTRIBUTE is the attribute ID.  */
1169
1170 static tree
1171 Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
1172 {
1173   tree gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
1174   tree gnu_type = TREE_TYPE (gnu_prefix);
1175   tree gnu_expr, gnu_result_type, gnu_result = error_mark_node;
1176   bool prefix_unused = false;
1177
1178   /* If the input is a NULL_EXPR, make a new one.  */
1179   if (TREE_CODE (gnu_prefix) == NULL_EXPR)
1180     {
1181       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1182       *gnu_result_type_p = gnu_result_type;
1183       return build1 (NULL_EXPR, gnu_result_type, TREE_OPERAND (gnu_prefix, 0));
1184     }
1185
1186   switch (attribute)
1187     {
1188     case Attr_Pos:
1189     case Attr_Val:
1190       /* These are just conversions since representation clauses for
1191          enumeration types are handled in the front-end.  */
1192       {
1193         bool checkp = Do_Range_Check (First (Expressions (gnat_node)));
1194         gnu_result = gnat_to_gnu (First (Expressions (gnat_node)));
1195         gnu_result_type = get_unpadded_type (Etype (gnat_node));
1196         gnu_result = convert_with_check (Etype (gnat_node), gnu_result,
1197                                          checkp, checkp, true, gnat_node);
1198       }
1199       break;
1200
1201     case Attr_Pred:
1202     case Attr_Succ:
1203       /* These just add or subtract the constant 1 since representation
1204          clauses for enumeration types are handled in the front-end.  */
1205       gnu_expr = gnat_to_gnu (First (Expressions (gnat_node)));
1206       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1207
1208       if (Do_Range_Check (First (Expressions (gnat_node))))
1209         {
1210           gnu_expr = gnat_protect_expr (gnu_expr);
1211           gnu_expr
1212             = emit_check
1213               (build_binary_op (EQ_EXPR, integer_type_node,
1214                                 gnu_expr,
1215                                 attribute == Attr_Pred
1216                                 ? TYPE_MIN_VALUE (gnu_result_type)
1217                                 : TYPE_MAX_VALUE (gnu_result_type)),
1218                gnu_expr, CE_Range_Check_Failed, gnat_node);
1219         }
1220
1221       gnu_result
1222         = build_binary_op (attribute == Attr_Pred ? MINUS_EXPR : PLUS_EXPR,
1223                            gnu_result_type, gnu_expr,
1224                            convert (gnu_result_type, integer_one_node));
1225       break;
1226
1227     case Attr_Address:
1228     case Attr_Unrestricted_Access:
1229       /* Conversions don't change addresses but can cause us to miss the
1230          COMPONENT_REF case below, so strip them off.  */
1231       gnu_prefix = remove_conversions (gnu_prefix,
1232                                        !Must_Be_Byte_Aligned (gnat_node));
1233
1234       /* If we are taking 'Address of an unconstrained object, this is the
1235          pointer to the underlying array.  */
1236       if (attribute == Attr_Address)
1237         gnu_prefix = maybe_unconstrained_array (gnu_prefix);
1238
1239       /* If we are building a static dispatch table, we have to honor
1240          TARGET_VTABLE_USES_DESCRIPTORS if we want to be compatible
1241          with the C++ ABI.  We do it in the non-static case as well,
1242          see gnat_to_gnu_entity, case E_Access_Subprogram_Type.  */
1243       else if (TARGET_VTABLE_USES_DESCRIPTORS
1244                && Is_Dispatch_Table_Entity (Etype (gnat_node)))
1245         {
1246           tree gnu_field, gnu_list = NULL_TREE, t;
1247           /* Descriptors can only be built here for top-level functions.  */
1248           bool build_descriptor = (global_bindings_p () != 0);
1249           int i;
1250
1251           gnu_result_type = get_unpadded_type (Etype (gnat_node));
1252
1253           /* If we're not going to build the descriptor, we have to retrieve
1254              the one which will be built by the linker (or by the compiler
1255              later if a static chain is requested).  */
1256           if (!build_descriptor)
1257             {
1258               gnu_result = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_prefix);
1259               gnu_result = fold_convert (build_pointer_type (gnu_result_type),
1260                                          gnu_result);
1261               gnu_result = build1 (INDIRECT_REF, gnu_result_type, gnu_result);
1262             }
1263
1264           for (gnu_field = TYPE_FIELDS (gnu_result_type), i = 0;
1265                i < TARGET_VTABLE_USES_DESCRIPTORS;
1266                gnu_field = TREE_CHAIN (gnu_field), i++)
1267             {
1268               if (build_descriptor)
1269                 {
1270                   t = build2 (FDESC_EXPR, TREE_TYPE (gnu_field), gnu_prefix,
1271                               build_int_cst (NULL_TREE, i));
1272                   TREE_CONSTANT (t) = 1;
1273                 }
1274               else
1275                 t = build3 (COMPONENT_REF, ptr_void_ftype, gnu_result,
1276                             gnu_field, NULL_TREE);
1277
1278               gnu_list = tree_cons (gnu_field, t, gnu_list);
1279             }
1280
1281           gnu_result = gnat_build_constructor (gnu_result_type, gnu_list);
1282           break;
1283         }
1284
1285       /* ... fall through ... */
1286
1287     case Attr_Access:
1288     case Attr_Unchecked_Access:
1289     case Attr_Code_Address:
1290       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1291       gnu_result
1292         = build_unary_op (((attribute == Attr_Address
1293                             || attribute == Attr_Unrestricted_Access)
1294                            && !Must_Be_Byte_Aligned (gnat_node))
1295                           ? ATTR_ADDR_EXPR : ADDR_EXPR,
1296                           gnu_result_type, gnu_prefix);
1297
1298       /* For 'Code_Address, find an inner ADDR_EXPR and mark it so that we
1299          don't try to build a trampoline.  */
1300       if (attribute == Attr_Code_Address)
1301         {
1302           for (gnu_expr = gnu_result;
1303                CONVERT_EXPR_P (gnu_expr);
1304                gnu_expr = TREE_OPERAND (gnu_expr, 0))
1305             TREE_CONSTANT (gnu_expr) = 1;
1306
1307           if (TREE_CODE (gnu_expr) == ADDR_EXPR)
1308             TREE_NO_TRAMPOLINE (gnu_expr) = TREE_CONSTANT (gnu_expr) = 1;
1309         }
1310
1311       /* For other address attributes applied to a nested function,
1312          find an inner ADDR_EXPR and annotate it so that we can issue
1313          a useful warning with -Wtrampolines.  */
1314       else if (TREE_CODE (TREE_TYPE (gnu_prefix)) == FUNCTION_TYPE)
1315         {
1316           for (gnu_expr = gnu_result;
1317                CONVERT_EXPR_P (gnu_expr);
1318                gnu_expr = TREE_OPERAND (gnu_expr, 0))
1319             ;
1320
1321           if (TREE_CODE (gnu_expr) == ADDR_EXPR
1322               && decl_function_context (TREE_OPERAND (gnu_expr, 0)))
1323             {
1324               set_expr_location_from_node (gnu_expr, gnat_node);
1325
1326               /* Check that we're not violating the No_Implicit_Dynamic_Code
1327                  restriction.  Be conservative if we don't know anything
1328                  about the trampoline strategy for the target.  */
1329               Check_Implicit_Dynamic_Code_Allowed (gnat_node);
1330             }
1331         }
1332       break;
1333
1334     case Attr_Pool_Address:
1335       {
1336         tree gnu_obj_type;
1337         tree gnu_ptr = gnu_prefix;
1338
1339         gnu_result_type = get_unpadded_type (Etype (gnat_node));
1340
1341         /* If this is an unconstrained array, we know the object has been
1342            allocated with the template in front of the object.  So compute
1343            the template address.  */
1344         if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_ptr)))
1345           gnu_ptr
1346             = convert (build_pointer_type
1347                        (TYPE_OBJECT_RECORD_TYPE
1348                         (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (gnu_ptr)))),
1349                        gnu_ptr);
1350
1351         gnu_obj_type = TREE_TYPE (TREE_TYPE (gnu_ptr));
1352         if (TREE_CODE (gnu_obj_type) == RECORD_TYPE
1353             && TYPE_CONTAINS_TEMPLATE_P (gnu_obj_type))
1354           {
1355             tree gnu_char_ptr_type = build_pointer_type (char_type_node);
1356             tree gnu_pos = byte_position (TYPE_FIELDS (gnu_obj_type));
1357             tree gnu_byte_offset
1358               = convert (sizetype,
1359                          size_diffop (size_zero_node, gnu_pos));
1360             gnu_byte_offset = fold_build1 (NEGATE_EXPR, sizetype, gnu_byte_offset);
1361
1362             gnu_ptr = convert (gnu_char_ptr_type, gnu_ptr);
1363             gnu_ptr = build_binary_op (POINTER_PLUS_EXPR, gnu_char_ptr_type,
1364                                        gnu_ptr, gnu_byte_offset);
1365           }
1366
1367         gnu_result = convert (gnu_result_type, gnu_ptr);
1368       }
1369       break;
1370
1371     case Attr_Size:
1372     case Attr_Object_Size:
1373     case Attr_Value_Size:
1374     case Attr_Max_Size_In_Storage_Elements:
1375       gnu_expr = gnu_prefix;
1376
1377       /* Remove NOPs and conversions between original and packable version
1378          from GNU_EXPR, and conversions from GNU_PREFIX.  We use GNU_EXPR
1379          to see if a COMPONENT_REF was involved.  */
1380       while (TREE_CODE (gnu_expr) == NOP_EXPR
1381              || (TREE_CODE (gnu_expr) == VIEW_CONVERT_EXPR
1382                  && TREE_CODE (TREE_TYPE (gnu_expr)) == RECORD_TYPE
1383                  && TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))
1384                     == RECORD_TYPE
1385                  && TYPE_NAME (TREE_TYPE (gnu_expr))
1386                     == TYPE_NAME (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))))
1387         gnu_expr = TREE_OPERAND (gnu_expr, 0);
1388
1389       gnu_prefix = remove_conversions (gnu_prefix, true);
1390       prefix_unused = true;
1391       gnu_type = TREE_TYPE (gnu_prefix);
1392
1393       /* Replace an unconstrained array type with the type of the underlying
1394          array.  We can't do this with a call to maybe_unconstrained_array
1395          since we may have a TYPE_DECL.  For 'Max_Size_In_Storage_Elements,
1396          use the record type that will be used to allocate the object and its
1397          template.  */
1398       if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1399         {
1400           gnu_type = TYPE_OBJECT_RECORD_TYPE (gnu_type);
1401           if (attribute != Attr_Max_Size_In_Storage_Elements)
1402             gnu_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
1403         }
1404
1405       /* If we're looking for the size of a field, return the field size.
1406          Otherwise, if the prefix is an object, or if we're looking for
1407          'Object_Size or 'Max_Size_In_Storage_Elements, the result is the
1408          GCC size of the type.  Otherwise, it is the RM size of the type.  */
1409       if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1410         gnu_result = DECL_SIZE (TREE_OPERAND (gnu_prefix, 1));
1411       else if (TREE_CODE (gnu_prefix) != TYPE_DECL
1412                || attribute == Attr_Object_Size
1413                || attribute == Attr_Max_Size_In_Storage_Elements)
1414         {
1415           /* If the prefix is an object of a padded type, the GCC size isn't
1416              relevant to the programmer.  Normally what we want is the RM size,
1417              which was set from the specified size, but if it was not set, we
1418              want the size of the field.  Using the MAX of those two produces
1419              the right result in all cases.  Don't use the size of the field
1420              if it's self-referential, since that's never what's wanted.  */
1421           if (TREE_CODE (gnu_prefix) != TYPE_DECL
1422               && TYPE_IS_PADDING_P (gnu_type)
1423               && TREE_CODE (gnu_expr) == COMPONENT_REF)
1424             {
1425               gnu_result = rm_size (gnu_type);
1426               if (!CONTAINS_PLACEHOLDER_P
1427                    (DECL_SIZE (TREE_OPERAND (gnu_expr, 1))))
1428                 gnu_result
1429                   = size_binop (MAX_EXPR, gnu_result,
1430                                 DECL_SIZE (TREE_OPERAND (gnu_expr, 1)));
1431             }
1432           else if (Nkind (Prefix (gnat_node)) == N_Explicit_Dereference)
1433             {
1434               Node_Id gnat_deref = Prefix (gnat_node);
1435               Node_Id gnat_actual_subtype
1436                 = Actual_Designated_Subtype (gnat_deref);
1437               tree gnu_ptr_type
1438                 = TREE_TYPE (gnat_to_gnu (Prefix (gnat_deref)));
1439
1440               if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type)
1441                   && Present (gnat_actual_subtype))
1442                 {
1443                   tree gnu_actual_obj_type
1444                     = gnat_to_gnu_type (gnat_actual_subtype);
1445                   gnu_type
1446                     = build_unc_object_type_from_ptr (gnu_ptr_type,
1447                                                       gnu_actual_obj_type,
1448                                                       get_identifier ("SIZE"));
1449                 }
1450
1451               gnu_result = TYPE_SIZE (gnu_type);
1452             }
1453           else
1454             gnu_result = TYPE_SIZE (gnu_type);
1455         }
1456       else
1457         gnu_result = rm_size (gnu_type);
1458
1459       gcc_assert (gnu_result);
1460
1461       /* Deal with a self-referential size by returning the maximum size for
1462          a type and by qualifying the size with the object for 'Size of an
1463          object.  */
1464       if (CONTAINS_PLACEHOLDER_P (gnu_result))
1465         {
1466           if (TREE_CODE (gnu_prefix) != TYPE_DECL)
1467             gnu_result = substitute_placeholder_in_expr (gnu_result, gnu_expr);
1468           else
1469             gnu_result = max_size (gnu_result, true);
1470         }
1471
1472       /* If the type contains a template, subtract its size.  */
1473       if (TREE_CODE (gnu_type) == RECORD_TYPE
1474           && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
1475         gnu_result = size_binop (MINUS_EXPR, gnu_result,
1476                                  DECL_SIZE (TYPE_FIELDS (gnu_type)));
1477
1478       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1479
1480       if (attribute == Attr_Max_Size_In_Storage_Elements)
1481         gnu_result = fold_build2 (CEIL_DIV_EXPR, bitsizetype,
1482                                   gnu_result, bitsize_unit_node);
1483       break;
1484
1485     case Attr_Alignment:
1486       {
1487         unsigned int align;
1488
1489         if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1490             && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0))))
1491           gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1492
1493         gnu_type = TREE_TYPE (gnu_prefix);
1494         gnu_result_type = get_unpadded_type (Etype (gnat_node));
1495         prefix_unused = true;
1496
1497         if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1498           align = DECL_ALIGN (TREE_OPERAND (gnu_prefix, 1)) / BITS_PER_UNIT;
1499         else
1500           {
1501             Node_Id gnat_prefix = Prefix (gnat_node);
1502             Entity_Id gnat_type = Etype (gnat_prefix);
1503             unsigned int double_align;
1504             bool is_capped_double, align_clause;
1505
1506             /* If the default alignment of "double" or larger scalar types is
1507                specifically capped and there is an alignment clause neither
1508                on the type nor on the prefix itself, return the cap.  */
1509             if ((double_align = double_float_alignment) > 0)
1510               is_capped_double
1511                 = is_double_float_or_array (gnat_type, &align_clause);
1512             else if ((double_align = double_scalar_alignment) > 0)
1513               is_capped_double
1514                 = is_double_scalar_or_array (gnat_type, &align_clause);
1515             else
1516               is_capped_double = align_clause = false;
1517
1518             if (is_capped_double
1519                 && Nkind (gnat_prefix) == N_Identifier
1520                 && Present (Alignment_Clause (Entity (gnat_prefix))))
1521               align_clause = true;
1522
1523             if (is_capped_double && !align_clause)
1524               align = double_align;
1525             else
1526               align = TYPE_ALIGN (gnu_type) / BITS_PER_UNIT;
1527           }
1528
1529         gnu_result = size_int (align);
1530       }
1531       break;
1532
1533     case Attr_First:
1534     case Attr_Last:
1535     case Attr_Range_Length:
1536       prefix_unused = true;
1537
1538       if (INTEGRAL_TYPE_P (gnu_type) || TREE_CODE (gnu_type) == REAL_TYPE)
1539         {
1540           gnu_result_type = get_unpadded_type (Etype (gnat_node));
1541
1542           if (attribute == Attr_First)
1543             gnu_result = TYPE_MIN_VALUE (gnu_type);
1544           else if (attribute == Attr_Last)
1545             gnu_result = TYPE_MAX_VALUE (gnu_type);
1546           else
1547             gnu_result
1548               = build_binary_op
1549                 (MAX_EXPR, get_base_type (gnu_result_type),
1550                  build_binary_op
1551                  (PLUS_EXPR, get_base_type (gnu_result_type),
1552                   build_binary_op (MINUS_EXPR,
1553                                    get_base_type (gnu_result_type),
1554                                    convert (gnu_result_type,
1555                                             TYPE_MAX_VALUE (gnu_type)),
1556                                    convert (gnu_result_type,
1557                                             TYPE_MIN_VALUE (gnu_type))),
1558                   convert (gnu_result_type, integer_one_node)),
1559                  convert (gnu_result_type, integer_zero_node));
1560
1561           break;
1562         }
1563
1564       /* ... fall through ... */
1565
1566     case Attr_Length:
1567       {
1568         int Dimension = (Present (Expressions (gnat_node))
1569                          ? UI_To_Int (Intval (First (Expressions (gnat_node))))
1570                          : 1), i;
1571         struct parm_attr_d *pa = NULL;
1572         Entity_Id gnat_param = Empty;
1573
1574         /* Make sure any implicit dereference gets done.  */
1575         gnu_prefix = maybe_implicit_deref (gnu_prefix);
1576         gnu_prefix = maybe_unconstrained_array (gnu_prefix);
1577         /* We treat unconstrained array In parameters specially.  */
1578         if (Nkind (Prefix (gnat_node)) == N_Identifier
1579             && !Is_Constrained (Etype (Prefix (gnat_node)))
1580             && Ekind (Entity (Prefix (gnat_node))) == E_In_Parameter)
1581           gnat_param = Entity (Prefix (gnat_node));
1582         gnu_type = TREE_TYPE (gnu_prefix);
1583         prefix_unused = true;
1584         gnu_result_type = get_unpadded_type (Etype (gnat_node));
1585
1586         if (TYPE_CONVENTION_FORTRAN_P (gnu_type))
1587           {
1588             int ndim;
1589             tree gnu_type_temp;
1590
1591             for (ndim = 1, gnu_type_temp = gnu_type;
1592                  TREE_CODE (TREE_TYPE (gnu_type_temp)) == ARRAY_TYPE
1593                  && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type_temp));
1594                  ndim++, gnu_type_temp = TREE_TYPE (gnu_type_temp))
1595               ;
1596
1597             Dimension = ndim + 1 - Dimension;
1598           }
1599
1600         for (i = 1; i < Dimension; i++)
1601           gnu_type = TREE_TYPE (gnu_type);
1602
1603         gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1604
1605         /* When not optimizing, look up the slot associated with the parameter
1606            and the dimension in the cache and create a new one on failure.  */
1607         if (!optimize && Present (gnat_param))
1608           {
1609             for (i = 0; VEC_iterate (parm_attr, f_parm_attr_cache, i, pa); i++)
1610               if (pa->id == gnat_param && pa->dim == Dimension)
1611                 break;
1612
1613             if (!pa)
1614               {
1615                 pa = GGC_CNEW (struct parm_attr_d);
1616                 pa->id = gnat_param;
1617                 pa->dim = Dimension;
1618                 VEC_safe_push (parm_attr, gc, f_parm_attr_cache, pa);
1619               }
1620           }
1621
1622         /* Return the cached expression or build a new one.  */
1623         if (attribute == Attr_First)
1624           {
1625             if (pa && pa->first)
1626               {
1627                 gnu_result = pa->first;
1628                 break;
1629               }
1630
1631             gnu_result
1632               = TYPE_MIN_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1633           }
1634
1635         else if (attribute == Attr_Last)
1636           {
1637             if (pa && pa->last)
1638               {
1639                 gnu_result = pa->last;
1640                 break;
1641               }
1642
1643             gnu_result
1644               = TYPE_MAX_VALUE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type)));
1645           }
1646
1647         else /* attribute == Attr_Range_Length || attribute == Attr_Length  */
1648           {
1649             if (pa && pa->length)
1650               {
1651                 gnu_result = pa->length;
1652                 break;
1653               }
1654             else
1655               {
1656                 /* We used to compute the length as max (hb - lb + 1, 0),
1657                    which could overflow for some cases of empty arrays, e.g.
1658                    when lb == index_type'first.  We now compute the length as
1659                    (hb >= lb) ? hb - lb + 1 : 0, which would only overflow in
1660                    much rarer cases, for extremely large arrays we expect
1661                    never to encounter in practice.  In addition, the former
1662                    computation required the use of potentially constraining
1663                    signed arithmetic while the latter doesn't.  Note that
1664                    the comparison must be done in the original index type,
1665                    to avoid any overflow during the conversion.  */
1666                 tree comp_type = get_base_type (gnu_result_type);
1667                 tree index_type = TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_type));
1668                 tree lb = TYPE_MIN_VALUE (index_type);
1669                 tree hb = TYPE_MAX_VALUE (index_type);
1670                 gnu_result
1671                   = build_binary_op (PLUS_EXPR, comp_type,
1672                                      build_binary_op (MINUS_EXPR,
1673                                                       comp_type,
1674                                                       convert (comp_type, hb),
1675                                                       convert (comp_type, lb)),
1676                                      convert (comp_type, integer_one_node));
1677                 gnu_result
1678                   = build_cond_expr (comp_type,
1679                                      build_binary_op (GE_EXPR,
1680                                                       integer_type_node,
1681                                                       hb, lb),
1682                                      gnu_result,
1683                                      convert (comp_type, integer_zero_node));
1684               }
1685           }
1686
1687         /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1688            handling.  Note that these attributes could not have been used on
1689            an unconstrained array type.  */
1690         gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1691
1692         /* Cache the expression we have just computed.  Since we want to do it
1693            at runtime, we force the use of a SAVE_EXPR and let the gimplifier
1694            create the temporary.  */
1695         if (pa)
1696           {
1697             gnu_result
1698               = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
1699             TREE_SIDE_EFFECTS (gnu_result) = 1;
1700             if (attribute == Attr_First)
1701               pa->first = gnu_result;
1702             else if (attribute == Attr_Last)
1703               pa->last = gnu_result;
1704             else
1705               pa->length = gnu_result;
1706           }
1707
1708         /* Set the source location onto the predicate of the condition in the
1709            'Length case but do not do it if the expression is cached to avoid
1710            messing up the debug info.  */
1711         else if ((attribute == Attr_Range_Length || attribute == Attr_Length)
1712                  && TREE_CODE (gnu_result) == COND_EXPR
1713                  && EXPR_P (TREE_OPERAND (gnu_result, 0)))
1714           set_expr_location_from_node (TREE_OPERAND (gnu_result, 0),
1715                                        gnat_node);
1716
1717         break;
1718       }
1719
1720     case Attr_Bit_Position:
1721     case Attr_Position:
1722     case Attr_First_Bit:
1723     case Attr_Last_Bit:
1724     case Attr_Bit:
1725       {
1726         HOST_WIDE_INT bitsize;
1727         HOST_WIDE_INT bitpos;
1728         tree gnu_offset;
1729         tree gnu_field_bitpos;
1730         tree gnu_field_offset;
1731         tree gnu_inner;
1732         enum machine_mode mode;
1733         int unsignedp, volatilep;
1734
1735         gnu_result_type = get_unpadded_type (Etype (gnat_node));
1736         gnu_prefix = remove_conversions (gnu_prefix, true);
1737         prefix_unused = true;
1738
1739         /* We can have 'Bit on any object, but if it isn't a COMPONENT_REF,
1740            the result is 0.  Don't allow 'Bit on a bare component, though.  */
1741         if (attribute == Attr_Bit
1742             && TREE_CODE (gnu_prefix) != COMPONENT_REF
1743             && TREE_CODE (gnu_prefix) != FIELD_DECL)
1744           {
1745             gnu_result = integer_zero_node;
1746             break;
1747           }
1748
1749         else
1750           gcc_assert (TREE_CODE (gnu_prefix) == COMPONENT_REF
1751                       || (attribute == Attr_Bit_Position
1752                           && TREE_CODE (gnu_prefix) == FIELD_DECL));
1753
1754         get_inner_reference (gnu_prefix, &bitsize, &bitpos, &gnu_offset,
1755                              &mode, &unsignedp, &volatilep, false);
1756
1757         if (TREE_CODE (gnu_prefix) == COMPONENT_REF)
1758           {
1759             gnu_field_bitpos = bit_position (TREE_OPERAND (gnu_prefix, 1));
1760             gnu_field_offset = byte_position (TREE_OPERAND (gnu_prefix, 1));
1761
1762             for (gnu_inner = TREE_OPERAND (gnu_prefix, 0);
1763                  TREE_CODE (gnu_inner) == COMPONENT_REF
1764                  && DECL_INTERNAL_P (TREE_OPERAND (gnu_inner, 1));
1765                  gnu_inner = TREE_OPERAND (gnu_inner, 0))
1766               {
1767                 gnu_field_bitpos
1768                   = size_binop (PLUS_EXPR, gnu_field_bitpos,
1769                                 bit_position (TREE_OPERAND (gnu_inner, 1)));
1770                 gnu_field_offset
1771                   = size_binop (PLUS_EXPR, gnu_field_offset,
1772                                 byte_position (TREE_OPERAND (gnu_inner, 1)));
1773               }
1774           }
1775         else if (TREE_CODE (gnu_prefix) == FIELD_DECL)
1776           {
1777             gnu_field_bitpos = bit_position (gnu_prefix);
1778             gnu_field_offset = byte_position (gnu_prefix);
1779           }
1780         else
1781           {
1782             gnu_field_bitpos = bitsize_zero_node;
1783             gnu_field_offset = size_zero_node;
1784           }
1785
1786         switch (attribute)
1787           {
1788           case Attr_Position:
1789             gnu_result = gnu_field_offset;
1790             break;
1791
1792           case Attr_First_Bit:
1793           case Attr_Bit:
1794             gnu_result = size_int (bitpos % BITS_PER_UNIT);
1795             break;
1796
1797           case Attr_Last_Bit:
1798             gnu_result = bitsize_int (bitpos % BITS_PER_UNIT);
1799             gnu_result = size_binop (PLUS_EXPR, gnu_result,
1800                                      TYPE_SIZE (TREE_TYPE (gnu_prefix)));
1801             gnu_result = size_binop (MINUS_EXPR, gnu_result,
1802                                      bitsize_one_node);
1803             break;
1804
1805           case Attr_Bit_Position:
1806             gnu_result = gnu_field_bitpos;
1807             break;
1808                 }
1809
1810         /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are
1811            handling.  */
1812         gnu_result = SUBSTITUTE_PLACEHOLDER_IN_EXPR (gnu_result, gnu_prefix);
1813         break;
1814       }
1815
1816     case Attr_Min:
1817     case Attr_Max:
1818       {
1819         tree gnu_lhs = gnat_to_gnu (First (Expressions (gnat_node)));
1820         tree gnu_rhs = gnat_to_gnu (Next (First (Expressions (gnat_node))));
1821
1822         gnu_result_type = get_unpadded_type (Etype (gnat_node));
1823         gnu_result = build_binary_op (attribute == Attr_Min
1824                                       ? MIN_EXPR : MAX_EXPR,
1825                                       gnu_result_type, gnu_lhs, gnu_rhs);
1826       }
1827       break;
1828
1829     case Attr_Passed_By_Reference:
1830       gnu_result = size_int (default_pass_by_ref (gnu_type)
1831                              || must_pass_by_ref (gnu_type));
1832       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1833       break;
1834
1835     case Attr_Component_Size:
1836       if (TREE_CODE (gnu_prefix) == COMPONENT_REF
1837           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_prefix, 0))))
1838         gnu_prefix = TREE_OPERAND (gnu_prefix, 0);
1839
1840       gnu_prefix = maybe_implicit_deref (gnu_prefix);
1841       gnu_type = TREE_TYPE (gnu_prefix);
1842
1843       if (TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
1844         gnu_type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_type))));
1845
1846       while (TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
1847              && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type)))
1848         gnu_type = TREE_TYPE (gnu_type);
1849
1850       gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE);
1851
1852       /* Note this size cannot be self-referential.  */
1853       gnu_result = TYPE_SIZE (TREE_TYPE (gnu_type));
1854       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1855       prefix_unused = true;
1856       break;
1857
1858     case Attr_Null_Parameter:
1859       /* This is just a zero cast to the pointer type for our prefix and
1860          dereferenced.  */
1861       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1862       gnu_result
1863         = build_unary_op (INDIRECT_REF, NULL_TREE,
1864                           convert (build_pointer_type (gnu_result_type),
1865                                    integer_zero_node));
1866       TREE_PRIVATE (gnu_result) = 1;
1867       break;
1868
1869     case Attr_Mechanism_Code:
1870       {
1871         int code;
1872         Entity_Id gnat_obj = Entity (Prefix (gnat_node));
1873
1874         prefix_unused = true;
1875         gnu_result_type = get_unpadded_type (Etype (gnat_node));
1876         if (Present (Expressions (gnat_node)))
1877           {
1878             int i = UI_To_Int (Intval (First (Expressions (gnat_node))));
1879
1880             for (gnat_obj = First_Formal (gnat_obj); i > 1;
1881                  i--, gnat_obj = Next_Formal (gnat_obj))
1882               ;
1883           }
1884
1885         code = Mechanism (gnat_obj);
1886         if (code == Default)
1887           code = ((present_gnu_tree (gnat_obj)
1888                    && (DECL_BY_REF_P (get_gnu_tree (gnat_obj))
1889                        || ((TREE_CODE (get_gnu_tree (gnat_obj))
1890                             == PARM_DECL)
1891                            && (DECL_BY_COMPONENT_PTR_P
1892                                (get_gnu_tree (gnat_obj))))))
1893                   ? By_Reference : By_Copy);
1894         gnu_result = convert (gnu_result_type, size_int (- code));
1895       }
1896       break;
1897
1898     default:
1899       /* Say we have an unimplemented attribute.  Then set the value to be
1900          returned to be a zero and hope that's something we can convert to
1901          the type of this attribute.  */
1902       post_error ("unimplemented attribute", gnat_node);
1903       gnu_result_type = get_unpadded_type (Etype (gnat_node));
1904       gnu_result = integer_zero_node;
1905       break;
1906     }
1907
1908   /* If this is an attribute where the prefix was unused, force a use of it if
1909      it has a side-effect.  But don't do it if the prefix is just an entity
1910      name.  However, if an access check is needed, we must do it.  See second
1911      example in AARM 11.6(5.e).  */
1912   if (prefix_unused && TREE_SIDE_EFFECTS (gnu_prefix)
1913       && !Is_Entity_Name (Prefix (gnat_node)))
1914     gnu_result = fold_build2 (COMPOUND_EXPR, TREE_TYPE (gnu_result),
1915                               gnu_prefix, gnu_result);
1916
1917   *gnu_result_type_p = gnu_result_type;
1918   return gnu_result;
1919 }
1920 \f
1921 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Case_Statement,
1922    to a GCC tree, which is returned.  */
1923
1924 static tree
1925 Case_Statement_to_gnu (Node_Id gnat_node)
1926 {
1927   tree gnu_result;
1928   tree gnu_expr;
1929   Node_Id gnat_when;
1930
1931   gnu_expr = gnat_to_gnu (Expression (gnat_node));
1932   gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
1933
1934   /*  The range of values in a case statement is determined by the rules in
1935       RM 5.4(7-9). In almost all cases, this range is represented by the Etype
1936       of the expression. One exception arises in the case of a simple name that
1937       is parenthesized. This still has the Etype of the name, but since it is
1938       not a name, para 7 does not apply, and we need to go to the base type.
1939       This is the only case where parenthesization affects the dynamic
1940       semantics (i.e. the range of possible values at runtime that is covered
1941       by the others alternative.
1942
1943       Another exception is if the subtype of the expression is non-static.  In
1944       that case, we also have to use the base type.  */
1945   if (Paren_Count (Expression (gnat_node)) != 0
1946       || !Is_OK_Static_Subtype (Underlying_Type
1947                                 (Etype (Expression (gnat_node)))))
1948     gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr);
1949
1950   /* We build a SWITCH_EXPR that contains the code with interspersed
1951      CASE_LABEL_EXPRs for each label.  */
1952
1953   push_stack (&gnu_switch_label_stack, NULL_TREE,
1954               create_artificial_label (input_location));
1955   start_stmt_group ();
1956   for (gnat_when = First_Non_Pragma (Alternatives (gnat_node));
1957        Present (gnat_when);
1958        gnat_when = Next_Non_Pragma (gnat_when))
1959     {
1960       bool choices_added_p = false;
1961       Node_Id gnat_choice;
1962
1963       /* First compile all the different case choices for the current WHEN
1964          alternative.  */
1965       for (gnat_choice = First (Discrete_Choices (gnat_when));
1966            Present (gnat_choice); gnat_choice = Next (gnat_choice))
1967         {
1968           tree gnu_low = NULL_TREE, gnu_high = NULL_TREE;
1969
1970           switch (Nkind (gnat_choice))
1971             {
1972             case N_Range:
1973               gnu_low = gnat_to_gnu (Low_Bound (gnat_choice));
1974               gnu_high = gnat_to_gnu (High_Bound (gnat_choice));
1975               break;
1976
1977             case N_Subtype_Indication:
1978               gnu_low = gnat_to_gnu (Low_Bound (Range_Expression
1979                                                 (Constraint (gnat_choice))));
1980               gnu_high = gnat_to_gnu (High_Bound (Range_Expression
1981                                                   (Constraint (gnat_choice))));
1982               break;
1983
1984             case N_Identifier:
1985             case N_Expanded_Name:
1986               /* This represents either a subtype range or a static value of
1987                  some kind; Ekind says which.  */
1988               if (IN (Ekind (Entity (gnat_choice)), Type_Kind))
1989                 {
1990                   tree gnu_type = get_unpadded_type (Entity (gnat_choice));
1991
1992                   gnu_low = fold (TYPE_MIN_VALUE (gnu_type));
1993                   gnu_high = fold (TYPE_MAX_VALUE (gnu_type));
1994                   break;
1995                 }
1996
1997               /* ... fall through ... */
1998
1999             case N_Character_Literal:
2000             case N_Integer_Literal:
2001               gnu_low = gnat_to_gnu (gnat_choice);
2002               break;
2003
2004             case N_Others_Choice:
2005               break;
2006
2007             default:
2008               gcc_unreachable ();
2009             }
2010
2011           /* If the case value is a subtype that raises Constraint_Error at
2012              run-time because of a wrong bound, then gnu_low or gnu_high is
2013              not translated into an INTEGER_CST.  In such a case, we need
2014              to ensure that the when statement is not added in the tree,
2015              otherwise it will crash the gimplifier.  */
2016           if ((!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST)
2017               && (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST))
2018             {
2019               add_stmt_with_node (build3
2020                                   (CASE_LABEL_EXPR, void_type_node,
2021                                    gnu_low, gnu_high,
2022                                    create_artificial_label (input_location)),
2023                                   gnat_choice);
2024               choices_added_p = true;
2025             }
2026         }
2027
2028       /* Push a binding level here in case variables are declared as we want
2029          them to be local to this set of statements instead of to the block
2030          containing the Case statement.  */
2031       if (choices_added_p)
2032         {
2033           add_stmt (build_stmt_group (Statements (gnat_when), true));
2034           add_stmt (build1 (GOTO_EXPR, void_type_node,
2035                             TREE_VALUE (gnu_switch_label_stack)));
2036         }
2037     }
2038
2039   /* Now emit a definition of the label all the cases branched to.  */
2040   add_stmt (build1 (LABEL_EXPR, void_type_node,
2041                     TREE_VALUE (gnu_switch_label_stack)));
2042   gnu_result = build3 (SWITCH_EXPR, TREE_TYPE (gnu_expr), gnu_expr,
2043                        end_stmt_group (), NULL_TREE);
2044   pop_stack (&gnu_switch_label_stack);
2045
2046   return gnu_result;
2047 }
2048 \f
2049 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement,
2050    to a GCC tree, which is returned.  */
2051
2052 static tree
2053 Loop_Statement_to_gnu (Node_Id gnat_node)
2054 {
2055   /* ??? It would be nice to use "build" here, but there's no build5.  */
2056   tree gnu_loop_stmt = build_nt (LOOP_STMT, NULL_TREE, NULL_TREE,
2057                                  NULL_TREE, NULL_TREE, NULL_TREE);
2058   tree gnu_loop_var = NULL_TREE;
2059   Node_Id gnat_iter_scheme = Iteration_Scheme (gnat_node);
2060   tree gnu_cond_expr = NULL_TREE;
2061   tree gnu_result;
2062
2063   TREE_TYPE (gnu_loop_stmt) = void_type_node;
2064   TREE_SIDE_EFFECTS (gnu_loop_stmt) = 1;
2065   LOOP_STMT_LABEL (gnu_loop_stmt) = create_artificial_label (input_location);
2066   set_expr_location_from_node (gnu_loop_stmt, gnat_node);
2067   Sloc_to_locus (Sloc (End_Label (gnat_node)),
2068                  &DECL_SOURCE_LOCATION (LOOP_STMT_LABEL (gnu_loop_stmt)));
2069
2070   /* Save the end label of this LOOP_STMT in a stack so that the corresponding
2071      N_Exit_Statement can find it.  */
2072   push_stack (&gnu_loop_label_stack, NULL_TREE,
2073               LOOP_STMT_LABEL (gnu_loop_stmt));
2074
2075   /* Set the condition under which the loop must keep going.
2076      For the case "LOOP .... END LOOP;" the condition is always true.  */
2077   if (No (gnat_iter_scheme))
2078     ;
2079
2080   /* For the case "WHILE condition LOOP ..... END LOOP;" it's immediate.  */
2081   else if (Present (Condition (gnat_iter_scheme)))
2082     LOOP_STMT_TOP_COND (gnu_loop_stmt)
2083       = gnat_to_gnu (Condition (gnat_iter_scheme));
2084
2085   /* Otherwise we have an iteration scheme and the condition is given by
2086      the bounds of the subtype of the iteration variable.  */
2087   else
2088     {
2089       Node_Id gnat_loop_spec = Loop_Parameter_Specification (gnat_iter_scheme);
2090       Entity_Id gnat_loop_var = Defining_Entity (gnat_loop_spec);
2091       Entity_Id gnat_type = Etype (gnat_loop_var);
2092       tree gnu_type = get_unpadded_type (gnat_type);
2093       tree gnu_low = TYPE_MIN_VALUE (gnu_type);
2094       tree gnu_high = TYPE_MAX_VALUE (gnu_type);
2095       tree gnu_first, gnu_last, gnu_limit;
2096       enum tree_code update_code, end_code;
2097       tree gnu_base_type = get_base_type (gnu_type);
2098
2099       /* We must disable modulo reduction for the loop variable, if any,
2100          in order for the loop comparison to be effective.  */
2101       if (Reverse_Present (gnat_loop_spec))
2102         {
2103           gnu_first = gnu_high;
2104           gnu_last = gnu_low;
2105           update_code = MINUS_NOMOD_EXPR;
2106           end_code = GE_EXPR;
2107           gnu_limit = TYPE_MIN_VALUE (gnu_base_type);
2108         }
2109       else
2110         {
2111           gnu_first = gnu_low;
2112           gnu_last = gnu_high;
2113           update_code = PLUS_NOMOD_EXPR;
2114           end_code = LE_EXPR;
2115           gnu_limit = TYPE_MAX_VALUE (gnu_base_type);
2116         }
2117
2118       /* We know the loop variable will not overflow if GNU_LAST is a constant
2119          and is not equal to GNU_LIMIT.  If it might overflow, we have to move
2120          the limit test to the end of the loop.  In that case, we have to test
2121          for an empty loop outside the loop.  */
2122       if (TREE_CODE (gnu_last) != INTEGER_CST
2123           || TREE_CODE (gnu_limit) != INTEGER_CST
2124           || tree_int_cst_equal (gnu_last, gnu_limit))
2125         {
2126           gnu_cond_expr
2127             = build3 (COND_EXPR, void_type_node,
2128                       build_binary_op (LE_EXPR, integer_type_node,
2129                                        gnu_low, gnu_high),
2130                       NULL_TREE, alloc_stmt_list ());
2131           set_expr_location_from_node (gnu_cond_expr, gnat_loop_spec);
2132         }
2133
2134       /* Open a new nesting level that will surround the loop to declare the
2135          loop index variable.  */
2136       start_stmt_group ();
2137       gnat_pushlevel ();
2138
2139       /* Declare the loop index and set it to its initial value.  */
2140       gnu_loop_var = gnat_to_gnu_entity (gnat_loop_var, gnu_first, 1);
2141       if (DECL_BY_REF_P (gnu_loop_var))
2142         gnu_loop_var = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_loop_var);
2143
2144       /* The loop variable might be a padded type, so use `convert' to get a
2145          reference to the inner variable if so.  */
2146       gnu_loop_var = convert (get_base_type (gnu_type), gnu_loop_var);
2147
2148       /* Set either the top or bottom exit condition as appropriate depending
2149          on whether or not we know an overflow cannot occur.  */
2150       if (gnu_cond_expr)
2151         LOOP_STMT_BOT_COND (gnu_loop_stmt)
2152           = build_binary_op (NE_EXPR, integer_type_node,
2153                              gnu_loop_var, gnu_last);
2154       else
2155         LOOP_STMT_TOP_COND (gnu_loop_stmt)
2156           = build_binary_op (end_code, integer_type_node,
2157                              gnu_loop_var, gnu_last);
2158
2159       LOOP_STMT_UPDATE (gnu_loop_stmt)
2160         = build_binary_op (MODIFY_EXPR, NULL_TREE,
2161                            gnu_loop_var,
2162                            build_binary_op (update_code,
2163                                             TREE_TYPE (gnu_loop_var),
2164                                             gnu_loop_var,
2165                                             convert (TREE_TYPE (gnu_loop_var),
2166                                                      integer_one_node)));
2167       set_expr_location_from_node (LOOP_STMT_UPDATE (gnu_loop_stmt),
2168                                    gnat_iter_scheme);
2169     }
2170
2171   /* If the loop was named, have the name point to this loop.  In this case,
2172      the association is not a ..._DECL node, but the end label from this
2173      LOOP_STMT.  */
2174   if (Present (Identifier (gnat_node)))
2175     save_gnu_tree (Entity (Identifier (gnat_node)),
2176                    LOOP_STMT_LABEL (gnu_loop_stmt), true);
2177
2178   /* Make the loop body into its own block, so any allocated storage will be
2179      released every iteration.  This is needed for stack allocation.  */
2180   LOOP_STMT_BODY (gnu_loop_stmt)
2181     = build_stmt_group (Statements (gnat_node), true);
2182
2183   /* If we declared a variable, then we are in a statement group for that
2184      declaration.  Add the LOOP_STMT to it and make that the "loop".  */
2185   if (gnu_loop_var)
2186     {
2187       add_stmt (gnu_loop_stmt);
2188       gnat_poplevel ();
2189       gnu_loop_stmt = end_stmt_group ();
2190     }
2191
2192   /* If we have an outer COND_EXPR, that's our result and this loop is its
2193      "true" statement.  Otherwise, the result is the LOOP_STMT.  */
2194   if (gnu_cond_expr)
2195     {
2196       COND_EXPR_THEN (gnu_cond_expr) = gnu_loop_stmt;
2197       gnu_result = gnu_cond_expr;
2198       recalculate_side_effects (gnu_cond_expr);
2199     }
2200   else
2201     gnu_result = gnu_loop_stmt;
2202
2203   pop_stack (&gnu_loop_label_stack);
2204
2205   return gnu_result;
2206 }
2207 \f
2208 /* Emit statements to establish __gnat_handle_vms_condition as a VMS condition
2209    handler for the current function.  */
2210
2211 /* This is implemented by issuing a call to the appropriate VMS specific
2212    builtin.  To avoid having VMS specific sections in the global gigi decls
2213    array, we maintain the decls of interest here.  We can't declare them
2214    inside the function because we must mark them never to be GC'd, which we
2215    can only do at the global level.  */
2216
2217 static GTY(()) tree vms_builtin_establish_handler_decl = NULL_TREE;
2218 static GTY(()) tree gnat_vms_condition_handler_decl = NULL_TREE;
2219
2220 static void
2221 establish_gnat_vms_condition_handler (void)
2222 {
2223   tree establish_stmt;
2224
2225   /* Elaborate the required decls on the first call.  Check on the decl for
2226      the gnat condition handler to decide, as this is one we create so we are
2227      sure that it will be non null on subsequent calls.  The builtin decl is
2228      looked up so remains null on targets where it is not implemented yet.  */
2229   if (gnat_vms_condition_handler_decl == NULL_TREE)
2230     {
2231       vms_builtin_establish_handler_decl
2232         = builtin_decl_for
2233           (get_identifier ("__builtin_establish_vms_condition_handler"));
2234
2235       gnat_vms_condition_handler_decl
2236         = create_subprog_decl (get_identifier ("__gnat_handle_vms_condition"),
2237                                NULL_TREE,
2238                                build_function_type_list (integer_type_node,
2239                                                          ptr_void_type_node,
2240                                                          ptr_void_type_node,
2241                                                          NULL_TREE),
2242                                NULL_TREE, 0, 1, 1, 0, Empty);
2243
2244       /* ??? DECL_CONTEXT shouldn't have been set because of DECL_EXTERNAL.  */
2245       DECL_CONTEXT (gnat_vms_condition_handler_decl) = NULL_TREE;
2246     }
2247
2248   /* Do nothing if the establish builtin is not available, which might happen
2249      on targets where the facility is not implemented.  */
2250   if (vms_builtin_establish_handler_decl == NULL_TREE)
2251     return;
2252
2253   establish_stmt
2254     = build_call_1_expr (vms_builtin_establish_handler_decl,
2255                          build_unary_op
2256                          (ADDR_EXPR, NULL_TREE,
2257                           gnat_vms_condition_handler_decl));
2258
2259   add_stmt (establish_stmt);
2260 }
2261 \f
2262 /* Subroutine of gnat_to_gnu to process gnat_node, an N_Subprogram_Body.  We
2263    don't return anything.  */
2264
2265 static void
2266 Subprogram_Body_to_gnu (Node_Id gnat_node)
2267 {
2268   /* Defining identifier of a parameter to the subprogram.  */
2269   Entity_Id gnat_param;
2270   /* The defining identifier for the subprogram body. Note that if a
2271      specification has appeared before for this body, then the identifier
2272      occurring in that specification will also be a defining identifier and all
2273      the calls to this subprogram will point to that specification.  */
2274   Entity_Id gnat_subprog_id
2275     = (Present (Corresponding_Spec (gnat_node))
2276        ? Corresponding_Spec (gnat_node) : Defining_Entity (gnat_node));
2277   /* The FUNCTION_DECL node corresponding to the subprogram spec.   */
2278   tree gnu_subprog_decl;
2279   /* Its RESULT_DECL node.  */
2280   tree gnu_result_decl;
2281   /* The FUNCTION_TYPE node corresponding to the subprogram spec.  */
2282   tree gnu_subprog_type;
2283   tree gnu_cico_list;
2284   tree gnu_result;
2285   VEC(parm_attr,gc) *cache;
2286
2287   /* If this is a generic object or if it has been eliminated,
2288      ignore it.  */
2289   if (Ekind (gnat_subprog_id) == E_Generic_Procedure
2290       || Ekind (gnat_subprog_id) == E_Generic_Function
2291       || Is_Eliminated (gnat_subprog_id))
2292     return;
2293
2294   /* If this subprogram acts as its own spec, define it.  Otherwise, just get
2295      the already-elaborated tree node.  However, if this subprogram had its
2296      elaboration deferred, we will already have made a tree node for it.  So
2297      treat it as not being defined in that case.  Such a subprogram cannot
2298      have an address clause or a freeze node, so this test is safe, though it
2299      does disable some otherwise-useful error checking.  */
2300   gnu_subprog_decl
2301     = gnat_to_gnu_entity (gnat_subprog_id, NULL_TREE,
2302                           Acts_As_Spec (gnat_node)
2303                           && !present_gnu_tree (gnat_subprog_id));
2304   gnu_result_decl = DECL_RESULT (gnu_subprog_decl);
2305   gnu_subprog_type = TREE_TYPE (gnu_subprog_decl);
2306
2307   /* If the function returns by invisible reference, make it explicit in the
2308      function body.  See gnat_to_gnu_entity, E_Subprogram_Type case.  */
2309   if (TREE_ADDRESSABLE (gnu_subprog_type))
2310     {
2311       TREE_TYPE (gnu_result_decl)
2312         = build_reference_type (TREE_TYPE (gnu_result_decl));
2313       relayout_decl (gnu_result_decl);
2314     }
2315
2316   /* Propagate the debug mode.  */
2317   if (!Needs_Debug_Info (gnat_subprog_id))
2318     DECL_IGNORED_P (gnu_subprog_decl) = 1;
2319
2320   /* Set the line number in the decl to correspond to that of the body so that
2321      the line number notes are written correctly.  */
2322   Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (gnu_subprog_decl));
2323
2324   /* Initialize the information structure for the function.  */
2325   allocate_struct_function (gnu_subprog_decl, false);
2326   DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language
2327     = GGC_CNEW (struct language_function);
2328
2329   begin_subprog_body (gnu_subprog_decl);
2330   gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
2331
2332   /* If there are Out parameters, we need to ensure that the return statement
2333      properly copies them out.  We do this by making a new block and converting
2334      any inner return into a goto to a label at the end of the block.  */
2335   push_stack (&gnu_return_label_stack, NULL_TREE,
2336               gnu_cico_list ? create_artificial_label (input_location)
2337               : NULL_TREE);
2338
2339   /* Get a tree corresponding to the code for the subprogram.  */
2340   start_stmt_group ();
2341   gnat_pushlevel ();
2342
2343   /* See if there are any parameters for which we don't yet have GCC entities.
2344      These must be for Out parameters for which we will be making VAR_DECL
2345      nodes here.  Fill them in to TYPE_CI_CO_LIST, which must contain the empty
2346      entry as well.  We can match up the entries because TYPE_CI_CO_LIST is in
2347      the order of the parameters.  */
2348   for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
2349        Present (gnat_param);
2350        gnat_param = Next_Formal_With_Extras (gnat_param))
2351     if (!present_gnu_tree (gnat_param))
2352       {
2353         /* Skip any entries that have been already filled in; they must
2354            correspond to In Out parameters.  */
2355         for (; gnu_cico_list && TREE_VALUE (gnu_cico_list);
2356              gnu_cico_list = TREE_CHAIN (gnu_cico_list))
2357           ;
2358
2359         /* Do any needed references for padded types.  */
2360         TREE_VALUE (gnu_cico_list)
2361           = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_list)),
2362                      gnat_to_gnu_entity (gnat_param, NULL_TREE, 1));
2363       }
2364
2365   /* On VMS, establish our condition handler to possibly turn a condition into
2366      the corresponding exception if the subprogram has a foreign convention or
2367      is exported.
2368
2369      To ensure proper execution of local finalizations on condition instances,
2370      we must turn a condition into the corresponding exception even if there
2371      is no applicable Ada handler, and need at least one condition handler per
2372      possible call chain involving GNAT code.  OTOH, establishing the handler
2373      has a cost so we want to minimize the number of subprograms into which
2374      this happens.  The foreign or exported condition is expected to satisfy
2375      all the constraints.  */
2376   if (TARGET_ABI_OPEN_VMS
2377       && (Has_Foreign_Convention (gnat_subprog_id)
2378           || Is_Exported (gnat_subprog_id)))
2379     establish_gnat_vms_condition_handler ();
2380
2381   process_decls (Declarations (gnat_node), Empty, Empty, true, true);
2382
2383   /* Generate the code of the subprogram itself.  A return statement will be
2384      present and any Out parameters will be handled there.  */
2385   add_stmt (gnat_to_gnu (Handled_Statement_Sequence (gnat_node)));
2386   gnat_poplevel ();
2387   gnu_result = end_stmt_group ();
2388
2389   /* If we populated the parameter attributes cache, we need to make sure
2390      that the cached expressions are evaluated on all possible paths.  */
2391   cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
2392   if (cache)
2393     {
2394       struct parm_attr_d *pa;
2395       int i;
2396
2397       start_stmt_group ();
2398
2399       for (i = 0; VEC_iterate (parm_attr, cache, i, pa); i++)
2400         {
2401           if (pa->first)
2402             add_stmt_with_node (pa->first, gnat_node);
2403           if (pa->last)
2404             add_stmt_with_node (pa->last, gnat_node);
2405           if (pa->length)
2406             add_stmt_with_node (pa->length, gnat_node);
2407         }
2408
2409       add_stmt (gnu_result);
2410       gnu_result = end_stmt_group ();
2411     }
2412
2413     /* If we are dealing with a return from an Ada procedure with parameters
2414        passed by copy-in/copy-out, we need to return a record containing the
2415        final values of these parameters.  If the list contains only one entry,
2416        return just that entry though.
2417
2418        For a full description of the copy-in/copy-out parameter mechanism, see
2419        the part of the gnat_to_gnu_entity routine dealing with the translation
2420        of subprograms.
2421
2422        We need to make a block that contains the definition of that label and
2423        the copying of the return value.  It first contains the function, then
2424        the label and copy statement.  */
2425   if (TREE_VALUE (gnu_return_label_stack))
2426     {
2427       tree gnu_retval;
2428
2429       start_stmt_group ();
2430       gnat_pushlevel ();
2431       add_stmt (gnu_result);
2432       add_stmt (build1 (LABEL_EXPR, void_type_node,
2433                         TREE_VALUE (gnu_return_label_stack)));
2434
2435       gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
2436       if (list_length (gnu_cico_list) == 1)
2437         gnu_retval = TREE_VALUE (gnu_cico_list);
2438       else
2439         gnu_retval = gnat_build_constructor (TREE_TYPE (gnu_subprog_type),
2440                                              gnu_cico_list);
2441
2442       add_stmt_with_node (build_return_expr (gnu_result_decl, gnu_retval),
2443                           End_Label (Handled_Statement_Sequence (gnat_node)));
2444       gnat_poplevel ();
2445       gnu_result = end_stmt_group ();
2446     }
2447
2448   pop_stack (&gnu_return_label_stack);
2449
2450   /* Set the end location.  */
2451   Sloc_to_locus
2452     ((Present (End_Label (Handled_Statement_Sequence (gnat_node)))
2453       ? Sloc (End_Label (Handled_Statement_Sequence (gnat_node)))
2454       : Sloc (gnat_node)),
2455      &DECL_STRUCT_FUNCTION (gnu_subprog_decl)->function_end_locus);
2456
2457   end_subprog_body (gnu_result);
2458
2459   /* Finally annotate the parameters and disconnect the trees for parameters
2460      that we have turned into variables since they are now unusable.  */
2461   for (gnat_param = First_Formal_With_Extras (gnat_subprog_id);
2462        Present (gnat_param);
2463        gnat_param = Next_Formal_With_Extras (gnat_param))
2464     {
2465       tree gnu_param = get_gnu_tree (gnat_param);
2466       annotate_object (gnat_param, TREE_TYPE (gnu_param), NULL_TREE,
2467                        DECL_BY_REF_P (gnu_param));
2468       if (TREE_CODE (gnu_param) == VAR_DECL)
2469         save_gnu_tree (gnat_param, NULL_TREE, false);
2470     }
2471
2472   if (DECL_FUNCTION_STUB (gnu_subprog_decl))
2473     build_function_stub (gnu_subprog_decl, gnat_subprog_id);
2474
2475   mark_out_of_scope (Defining_Unit_Name (Specification (gnat_node)));
2476 }
2477 \f
2478 /* Subroutine of gnat_to_gnu to translate gnat_node, either an N_Function_Call
2479    or an N_Procedure_Call_Statement, to a GCC tree, which is returned.
2480    GNU_RESULT_TYPE_P is a pointer to where we should place the result type.
2481    If GNU_TARGET is non-null, this must be a function call on the RHS of a
2482    N_Assignment_Statement and the result is to be placed into that object.  */
2483
2484 static tree
2485 call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
2486 {
2487   /* The GCC node corresponding to the GNAT subprogram name.  This can either
2488      be a FUNCTION_DECL node if we are dealing with a standard subprogram call,
2489      or an indirect reference expression (an INDIRECT_REF node) pointing to a
2490      subprogram.  */
2491   tree gnu_subprog = gnat_to_gnu (Name (gnat_node));
2492   /* The FUNCTION_TYPE node giving the GCC type of the subprogram.  */
2493   tree gnu_subprog_type = TREE_TYPE (gnu_subprog);
2494   tree gnu_subprog_addr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_subprog);
2495   Entity_Id gnat_formal;
2496   Node_Id gnat_actual;
2497   tree gnu_actual_list = NULL_TREE;
2498   tree gnu_name_list = NULL_TREE;
2499   tree gnu_before_list = NULL_TREE;
2500   tree gnu_after_list = NULL_TREE;
2501   tree gnu_call;
2502   bool went_into_elab_proc = false;
2503
2504   gcc_assert (TREE_CODE (gnu_subprog_type) == FUNCTION_TYPE);
2505
2506   /* If we are calling a stubbed function, raise Program_Error, but Elaborate
2507      all our args first.  */
2508   if (TREE_CODE (gnu_subprog) == FUNCTION_DECL && DECL_STUBBED_P (gnu_subprog))
2509     {
2510       tree call_expr = build_call_raise (PE_Stubbed_Subprogram_Called,
2511                                          gnat_node, N_Raise_Program_Error);
2512
2513       for (gnat_actual = First_Actual (gnat_node);
2514            Present (gnat_actual);
2515            gnat_actual = Next_Actual (gnat_actual))
2516         add_stmt (gnat_to_gnu (gnat_actual));
2517
2518       if (Nkind (gnat_node) == N_Function_Call && !gnu_target)
2519         {
2520           *gnu_result_type_p = TREE_TYPE (gnu_subprog_type);
2521           return build1 (NULL_EXPR, TREE_TYPE (gnu_subprog_type), call_expr);
2522         }
2523
2524       return call_expr;
2525     }
2526
2527   /* The only way we can be making a call via an access type is if Name is an
2528      explicit dereference.  In that case, get the list of formal args from the
2529      type the access type is pointing to.  Otherwise, get the formals from the
2530      entity being called.  */
2531   if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
2532     gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
2533   else if (Nkind (Name (gnat_node)) == N_Attribute_Reference)
2534     /* Assume here that this must be 'Elab_Body or 'Elab_Spec.  */
2535     gnat_formal = Empty;
2536   else
2537     gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
2538
2539   /* If we are translating a statement, open a new nesting level that will
2540      surround it to declare the temporaries created for the call.  */
2541   if (Nkind (gnat_node) == N_Procedure_Call_Statement || gnu_target)
2542     {
2543       start_stmt_group ();
2544       gnat_pushlevel ();
2545     }
2546
2547   /* The lifetime of the temporaries created for the call ends with the call
2548      so we can give them the scope of the elaboration routine at top level.  */
2549   else if (!current_function_decl)
2550     {
2551       current_function_decl = TREE_VALUE (gnu_elab_proc_stack);
2552       went_into_elab_proc = true;
2553     }
2554
2555   /* Create the list of the actual parameters as GCC expects it, namely a
2556      chain of TREE_LIST nodes in which the TREE_VALUE field of each node
2557      is an expression and the TREE_PURPOSE field is null.  But skip Out
2558      parameters not passed by reference and that need not be copied in.  */
2559   for (gnat_actual = First_Actual (gnat_node);
2560        Present (gnat_actual);
2561        gnat_formal = Next_Formal_With_Extras (gnat_formal),
2562        gnat_actual = Next_Actual (gnat_actual))
2563     {
2564       tree gnu_formal = present_gnu_tree (gnat_formal)
2565                         ? get_gnu_tree (gnat_formal) : NULL_TREE;
2566       tree gnu_formal_type = gnat_to_gnu_type (Etype (gnat_formal));
2567       /* In the Out or In Out case, we must suppress conversions that yield
2568          an lvalue but can nevertheless cause the creation of a temporary,
2569          because we need the real object in this case, either to pass its
2570          address if it's passed by reference or as target of the back copy
2571          done after the call if it uses the copy-in copy-out mechanism.
2572          We do it in the In case too, except for an unchecked conversion
2573          because it alone can cause the actual to be misaligned and the
2574          addressability test is applied to the real object.  */
2575       bool suppress_type_conversion
2576         = ((Nkind (gnat_actual) == N_Unchecked_Type_Conversion
2577             && Ekind (gnat_formal) != E_In_Parameter)
2578            || (Nkind (gnat_actual) == N_Type_Conversion
2579                && Is_Composite_Type (Underlying_Type (Etype (gnat_formal)))));
2580       Node_Id gnat_name = suppress_type_conversion
2581                           ? Expression (gnat_actual) : gnat_actual;
2582       tree gnu_name = gnat_to_gnu (gnat_name), gnu_name_type;
2583       tree gnu_actual;
2584
2585       /* If it's possible we may need to use this expression twice, make sure
2586          that any side-effects are handled via SAVE_EXPRs; likewise if we need
2587          to force side-effects before the call.
2588          ??? This is more conservative than we need since we don't need to do
2589          this for pass-by-ref with no conversion.  */
2590       if (Ekind (gnat_formal) != E_In_Parameter)
2591         gnu_name = gnat_stabilize_reference (gnu_name, true, NULL);
2592
2593       /* If we are passing a non-addressable parameter by reference, pass the
2594          address of a copy.  In the Out or In Out case, set up to copy back
2595          out after the call.  */
2596       if (gnu_formal
2597           && (DECL_BY_REF_P (gnu_formal)
2598               || (TREE_CODE (gnu_formal) == PARM_DECL
2599                   && (DECL_BY_COMPONENT_PTR_P (gnu_formal)
2600                       || (DECL_BY_DESCRIPTOR_P (gnu_formal)))))
2601           && (gnu_name_type = gnat_to_gnu_type (Etype (gnat_name)))
2602           && !addressable_p (gnu_name, gnu_name_type))
2603         {
2604           tree gnu_orig = gnu_name, gnu_temp, gnu_stmt;
2605
2606           /* Do not issue warnings for CONSTRUCTORs since this is not a copy
2607              but sort of an instantiation for them.  */
2608           if (TREE_CODE (gnu_name) == CONSTRUCTOR)
2609             ;
2610
2611           /* If the type is passed by reference, a copy is not allowed.  */
2612           else if (TREE_ADDRESSABLE (gnu_formal_type))
2613             post_error ("misaligned actual cannot be passed by reference",
2614                         gnat_actual);
2615
2616           /* For users of Starlet we issue a warning because the interface
2617              apparently assumes that by-ref parameters outlive the procedure
2618              invocation.  The code still will not work as intended, but we
2619              cannot do much better since low-level parts of the back-end
2620              would allocate temporaries at will because of the misalignment
2621              if we did not do so here.  */
2622           else if (Is_Valued_Procedure (Entity (Name (gnat_node))))
2623             {
2624               post_error
2625                 ("?possible violation of implicit assumption", gnat_actual);
2626               post_error_ne
2627                 ("?made by pragma Import_Valued_Procedure on &", gnat_actual,
2628                  Entity (Name (gnat_node)));
2629               post_error_ne ("?because of misalignment of &", gnat_actual,
2630                              gnat_formal);
2631             }
2632
2633           /* If the actual type of the object is already the nominal type,
2634              we have nothing to do, except if the size is self-referential
2635              in which case we'll remove the unpadding below.  */
2636           if (TREE_TYPE (gnu_name) == gnu_name_type
2637               && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_name_type)))
2638             ;
2639
2640           /* Otherwise remove the unpadding from all the objects.  */
2641           else if (TREE_CODE (gnu_name) == COMPONENT_REF
2642                    && TYPE_IS_PADDING_P
2643                       (TREE_TYPE (TREE_OPERAND (gnu_name, 0))))
2644             gnu_orig = gnu_name = TREE_OPERAND (gnu_name, 0);
2645
2646           /* Otherwise convert to the nominal type of the object if it's
2647              a record type.  There are several cases in which we need to
2648              make the temporary using this type instead of the actual type
2649              of the object if they are distinct, because the expectations
2650              of the callee would otherwise not be met:
2651                - if it's a justified modular type,
2652                - if the actual type is a smaller packable version of it.  */
2653           else if (TREE_CODE (gnu_name_type) == RECORD_TYPE
2654                    && (TYPE_JUSTIFIED_MODULAR_P (gnu_name_type)
2655                        || smaller_packable_type_p (TREE_TYPE (gnu_name),
2656                                                    gnu_name_type)))
2657             gnu_name = convert (gnu_name_type, gnu_name);
2658
2659           /* Create an explicit temporary holding the copy.  This ensures that
2660              its lifetime is as narrow as possible around a statement.  */
2661           gnu_temp = create_var_decl (create_tmp_var_name ("A"), NULL_TREE,
2662                                       TREE_TYPE (gnu_name), NULL_TREE, false,
2663                                       false, false, false, NULL, Empty);
2664           DECL_ARTIFICIAL (gnu_temp) = 1;
2665           DECL_IGNORED_P (gnu_temp) = 1;
2666
2667           /* But initialize it on the fly like for an implicit temporary as
2668              we aren't necessarily dealing with a statement.  */
2669           gnu_stmt
2670             = build_binary_op (INIT_EXPR, NULL_TREE, gnu_temp, gnu_name);
2671           set_expr_location_from_node (gnu_stmt, gnat_actual);
2672
2673           /* From now on, the real object is the temporary.  */
2674           gnu_name = build2 (COMPOUND_EXPR, TREE_TYPE (gnu_name), gnu_stmt,
2675                              gnu_temp);
2676
2677           /* Set up to move the copy back to the original if needed.  */
2678           if (Ekind (gnat_formal) != E_In_Parameter)
2679             {
2680               gnu_stmt = build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_orig,
2681                                           gnu_temp);
2682               set_expr_location_from_node (gnu_stmt, gnat_node);
2683               append_to_statement_list (gnu_stmt, &gnu_after_list);
2684             }
2685         }
2686
2687       /* Start from the real object and build the actual.  */
2688       gnu_actual = gnu_name;
2689
2690       /* If this was a procedure call, we may not have removed any padding.
2691          So do it here for the part we will use as an input, if any.  */
2692       if (Ekind (gnat_formal) != E_Out_Parameter
2693           && TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
2694         gnu_actual
2695           = convert (get_unpadded_type (Etype (gnat_actual)), gnu_actual);
2696
2697       /* Put back the conversion we suppressed above in the computation of the
2698          real object.  And even if we didn't suppress any conversion there, we
2699          may have suppressed a conversion to the Etype of the actual earlier,
2700          since the parent is a procedure call, so put it back here.  */
2701       if (suppress_type_conversion
2702           && Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
2703         gnu_actual
2704           = unchecked_convert (gnat_to_gnu_type (Etype (gnat_actual)),
2705                                gnu_actual, No_Truncation (gnat_actual));
2706       else
2707         gnu_actual
2708           = convert (gnat_to_gnu_type (Etype (gnat_actual)), gnu_actual);
2709
2710       /* Make sure that the actual is in range of the formal's type.  */
2711       if (Ekind (gnat_formal) != E_Out_Parameter
2712           && Do_Range_Check (gnat_actual))
2713         gnu_actual
2714           = emit_range_check (gnu_actual, Etype (gnat_formal), gnat_actual);
2715
2716       /* Unless this is an In parameter, we must remove any justified modular
2717          building from GNU_NAME to get an lvalue.  */
2718       if (Ekind (gnat_formal) != E_In_Parameter
2719           && TREE_CODE (gnu_name) == CONSTRUCTOR
2720           && TREE_CODE (TREE_TYPE (gnu_name)) == RECORD_TYPE
2721           && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (gnu_name)))
2722         gnu_name
2723           = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_name))), gnu_name);
2724
2725       /* If we have not saved a GCC object for the formal, it means it is an
2726          Out parameter not passed by reference and that need not be copied in.
2727          Otherwise, first see if the parameter is passed by reference.  */
2728       if (gnu_formal
2729           && TREE_CODE (gnu_formal) == PARM_DECL
2730           && DECL_BY_REF_P (gnu_formal))
2731         {
2732           if (Ekind (gnat_formal) != E_In_Parameter)
2733             {
2734               /* In Out or Out parameters passed by reference don't use the
2735                  copy-in copy-out mechanism so the address of the real object
2736                  must be passed to the function.  */
2737               gnu_actual = gnu_name;
2738
2739               /* If we have a padded type, be sure we've removed padding.  */
2740               if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_actual)))
2741                 gnu_actual = convert (get_unpadded_type (Etype (gnat_actual)),
2742                                       gnu_actual);
2743
2744               /* If we have the constructed subtype of an aliased object
2745                  with an unconstrained nominal subtype, the type of the
2746                  actual includes the template, although it is formally
2747                  constrained.  So we need to convert it back to the real
2748                  constructed subtype to retrieve the constrained part
2749                  and takes its address.  */
2750               if (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE
2751                   && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_actual))
2752                   && Is_Constr_Subt_For_UN_Aliased (Etype (gnat_actual))
2753                   && Is_Array_Type (Etype (gnat_actual)))
2754                 gnu_actual = convert (gnat_to_gnu_type (Etype (gnat_actual)),
2755                                       gnu_actual);
2756             }
2757
2758           /* There is no need to convert the actual to the formal's type before
2759              taking its address.  The only exception is for unconstrained array
2760              types because of the way we build fat pointers.  */
2761           else if (TREE_CODE (gnu_formal_type) == UNCONSTRAINED_ARRAY_TYPE)
2762             gnu_actual = convert (gnu_formal_type, gnu_actual);
2763
2764           /* The symmetry of the paths to the type of an entity is broken here
2765              since arguments don't know that they will be passed by ref.  */
2766           gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal));
2767           gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
2768         }
2769       else if (gnu_formal
2770                && TREE_CODE (gnu_formal) == PARM_DECL
2771                && DECL_BY_COMPONENT_PTR_P (gnu_formal))
2772         {
2773           gnu_formal_type = TREE_TYPE (get_gnu_tree (gnat_formal));
2774           gnu_actual = maybe_implicit_deref (gnu_actual);
2775           gnu_actual = maybe_unconstrained_array (gnu_actual);
2776
2777           if (TYPE_IS_PADDING_P (gnu_formal_type))
2778             {
2779               gnu_formal_type = TREE_TYPE (TYPE_FIELDS (gnu_formal_type));
2780               gnu_actual = convert (gnu_formal_type, gnu_actual);
2781             }
2782
2783           /* Take the address of the object and convert to the proper pointer
2784              type.  We'd like to actually compute the address of the beginning
2785              of the array using an ADDR_EXPR of an ARRAY_REF, but there's a
2786              possibility that the ARRAY_REF might return a constant and we'd be
2787              getting the wrong address.  Neither approach is exactly correct,
2788              but this is the most likely to work in all cases.  */
2789           gnu_actual = build_unary_op (ADDR_EXPR, gnu_formal_type, gnu_actual);
2790         }
2791       else if (gnu_formal
2792                && TREE_CODE (gnu_formal) == PARM_DECL
2793                && DECL_BY_DESCRIPTOR_P (gnu_formal))
2794         {
2795           gnu_actual = convert (gnu_formal_type, gnu_actual);
2796
2797           /* If this is 'Null_Parameter, pass a zero descriptor.  */
2798           if ((TREE_CODE (gnu_actual) == INDIRECT_REF
2799                || TREE_CODE (gnu_actual) == UNCONSTRAINED_ARRAY_REF)
2800               && TREE_PRIVATE (gnu_actual))
2801             gnu_actual
2802               = convert (DECL_ARG_TYPE (gnu_formal), integer_zero_node);
2803           else
2804             gnu_actual = build_unary_op (ADDR_EXPR, NULL_TREE,
2805                                          fill_vms_descriptor (gnu_actual,
2806                                                               gnat_formal,
2807                                                               gnat_actual));
2808         }
2809       else
2810         {
2811           tree gnu_size;
2812
2813           if (Ekind (gnat_formal) != E_In_Parameter)
2814             gnu_name_list = tree_cons (NULL_TREE, gnu_name, gnu_name_list);
2815
2816           if (!(gnu_formal && TREE_CODE (gnu_formal) == PARM_DECL))
2817             {
2818               /* Make sure side-effects are evaluated before the call.  */
2819               if (TREE_SIDE_EFFECTS (gnu_name))
2820                 append_to_statement_list (gnu_name, &gnu_before_list);
2821               continue;
2822             }
2823
2824           gnu_actual = convert (gnu_formal_type, gnu_actual);
2825
2826           /* If this is 'Null_Parameter, pass a zero even though we are
2827              dereferencing it.  */
2828           if (TREE_CODE (gnu_actual) == INDIRECT_REF
2829               && TREE_PRIVATE (gnu_actual)
2830               && (gnu_size = TYPE_SIZE (TREE_TYPE (gnu_actual)))
2831               && TREE_CODE (gnu_size) == INTEGER_CST
2832               && compare_tree_int (gnu_size, BITS_PER_WORD) <= 0)
2833             gnu_actual
2834               = unchecked_convert (DECL_ARG_TYPE (gnu_formal),
2835                                    convert (gnat_type_for_size
2836                                             (TREE_INT_CST_LOW (gnu_size), 1),
2837                                             integer_zero_node),
2838                                    false);
2839           else
2840             gnu_actual = convert (DECL_ARG_TYPE (gnu_formal), gnu_actual);
2841         }
2842
2843       gnu_actual_list = tree_cons (NULL_TREE, gnu_actual, gnu_actual_list);
2844     }
2845
2846   gnu_call = build_call_list (TREE_TYPE (gnu_subprog_type), gnu_subprog_addr,
2847                               nreverse (gnu_actual_list));
2848   set_expr_location_from_node (gnu_call, gnat_node);
2849
2850   /* If it's a function call, the result is the call expression unless a target
2851      is specified, in which case we copy the result into the target and return
2852      the assignment statement.  */
2853   if (Nkind (gnat_node) == N_Function_Call)
2854     {
2855       tree gnu_result = gnu_call;
2856
2857       /* If the function returns an unconstrained array or by direct reference,
2858          we have to dereference the pointer.  */
2859       if (TYPE_RETURN_UNCONSTRAINED_P (gnu_subprog_type)
2860           || TYPE_RETURN_BY_DIRECT_REF_P (gnu_subprog_type))
2861         gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
2862
2863       if (gnu_target)
2864         {
2865           Node_Id gnat_parent = Parent (gnat_node);
2866           enum tree_code op_code;
2867
2868           /* If range check is needed, emit code to generate it.  */
2869           if (Do_Range_Check (gnat_node))
2870             gnu_result
2871               = emit_range_check (gnu_result, Etype (Name (gnat_parent)),
2872                                   gnat_parent);
2873
2874           /* ??? If the return type has non-constant size, then force the
2875              return slot optimization as we would not be able to generate
2876              a temporary.  That's what has been done historically.  */
2877           if (TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_subprog_type))))
2878             op_code = MODIFY_EXPR;
2879           else
2880             op_code = INIT_EXPR;
2881
2882           gnu_result
2883             = build_binary_op (op_code, NULL_TREE, gnu_target, gnu_result);
2884           add_stmt_with_node (gnu_result, gnat_parent);
2885           gnat_poplevel ();
2886           gnu_result = end_stmt_group ();
2887         }
2888       else
2889         {
2890           if (went_into_elab_proc)
2891             current_function_decl = NULL_TREE;
2892           *gnu_result_type_p = get_unpadded_type (Etype (gnat_node));
2893         }
2894
2895       return gnu_result;
2896     }
2897
2898   /* If this is the case where the GNAT tree contains a procedure call but the
2899      Ada procedure has copy-in/copy-out parameters, then the special parameter
2900      passing mechanism must be used.  */
2901   if (TYPE_CI_CO_LIST (gnu_subprog_type))
2902     {
2903       /* List of FIELD_DECLs associated with the PARM_DECLs of the copy-in/
2904          copy-out parameters.  */
2905       tree gnu_cico_list = TYPE_CI_CO_LIST (gnu_subprog_type);
2906       const int length = list_length (gnu_cico_list);
2907
2908       if (length > 1)
2909         {
2910           tree gnu_temp, gnu_stmt;
2911
2912           /* The call sequence must contain one and only one call, even though
2913              the function is pure.  Save the result into a temporary.  */
2914           gnu_temp = create_var_decl (create_tmp_var_name ("R"), NULL_TREE,
2915                                       TREE_TYPE (gnu_call), NULL_TREE, false,
2916                                       false, false, false, NULL, Empty);
2917           DECL_ARTIFICIAL (gnu_temp) = 1;
2918           DECL_IGNORED_P (gnu_temp) = 1;
2919
2920           gnu_stmt
2921             = build_binary_op (INIT_EXPR, NULL_TREE, gnu_temp, gnu_call);
2922           set_expr_location_from_node (gnu_stmt, gnat_node);
2923
2924           /* Add the call statement to the list and start from its result.  */
2925           append_to_statement_list (gnu_stmt, &gnu_before_list);
2926           gnu_call = gnu_temp;
2927
2928           gnu_name_list = nreverse (gnu_name_list);
2929         }
2930
2931       if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
2932         gnat_formal = First_Formal_With_Extras (Etype (Name (gnat_node)));
2933       else
2934         gnat_formal = First_Formal_With_Extras (Entity (Name (gnat_node)));
2935
2936       for (gnat_actual = First_Actual (gnat_node);
2937            Present (gnat_actual);
2938            gnat_formal = Next_Formal_With_Extras (gnat_formal),
2939            gnat_actual = Next_Actual (gnat_actual))
2940         /* If we are dealing with a copy in copy out parameter, we must
2941            retrieve its value from the record returned in the call.  */
2942         if (!(present_gnu_tree (gnat_formal)
2943               && TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
2944               && (DECL_BY_REF_P (get_gnu_tree (gnat_formal))
2945                   || (TREE_CODE (get_gnu_tree (gnat_formal)) == PARM_DECL
2946                       && ((DECL_BY_COMPONENT_PTR_P (get_gnu_tree (gnat_formal))
2947                            || (DECL_BY_DESCRIPTOR_P
2948                                (get_gnu_tree (gnat_formal))))))))
2949             && Ekind (gnat_formal) != E_In_Parameter)
2950           {
2951             /* Get the value to assign to this Out or In Out parameter.  It is
2952                either the result of the function if there is only a single such
2953                parameter or the appropriate field from the record returned.  */
2954             tree gnu_result
2955               = length == 1
2956                 ? gnu_call
2957                 : build_component_ref (gnu_call, NULL_TREE,
2958                                        TREE_PURPOSE (gnu_cico_list), false);
2959
2960             /* If the actual is a conversion, get the inner expression, which
2961                will be the real destination, and convert the result to the
2962                type of the actual parameter.  */
2963             tree gnu_actual
2964               = maybe_unconstrained_array (TREE_VALUE (gnu_name_list));
2965
2966             /* If the result is a padded type, remove the padding.  */
2967             if (TYPE_IS_PADDING_P (TREE_TYPE (gnu_result)))
2968               gnu_result
2969                 = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_result))),
2970                            gnu_result);
2971
2972             /* If the actual is a type conversion, the real target object is
2973                denoted by the inner Expression and we need to convert the
2974                result to the associated type.
2975                We also need to convert our gnu assignment target to this type
2976                if the corresponding GNU_NAME was constructed from the GNAT
2977                conversion node and not from the inner Expression.  */
2978             if (Nkind (gnat_actual) == N_Type_Conversion)
2979               {
2980                 gnu_result
2981                   = convert_with_check
2982                     (Etype (Expression (gnat_actual)), gnu_result,
2983                      Do_Overflow_Check (gnat_actual),
2984                      Do_Range_Check (Expression (gnat_actual)),
2985                      Float_Truncate (gnat_actual), gnat_actual);
2986
2987                 if (!Is_Composite_Type (Underlying_Type (Etype (gnat_formal))))
2988                   gnu_actual = convert (TREE_TYPE (gnu_result), gnu_actual);
2989               }
2990
2991             /* Unchecked conversions as actuals for Out parameters are not
2992                allowed in user code because they are not variables, but do
2993                occur in front-end expansions.  The associated GNU_NAME is
2994                always obtained from the inner expression in such cases.  */
2995             else if (Nkind (gnat_actual) == N_Unchecked_Type_Conversion)
2996               gnu_result = unchecked_convert (TREE_TYPE (gnu_actual),
2997                                               gnu_result,
2998                                               No_Truncation (gnat_actual));
2999             else
3000               {
3001                 if (Do_Range_Check (gnat_actual))
3002                   gnu_result
3003                     = emit_range_check (gnu_result, Etype (gnat_actual),
3004                                         gnat_actual);
3005
3006                 if (!(!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_actual)))
3007                       && TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (gnu_result)))))
3008                   gnu_result = convert (TREE_TYPE (gnu_actual), gnu_result);
3009               }
3010
3011             gnu_result = build_binary_op (MODIFY_EXPR, NULL_TREE,
3012                                           gnu_actual, gnu_result);
3013             set_expr_location_from_node (gnu_result, gnat_node);
3014             append_to_statement_list (gnu_result, &gnu_before_list);
3015             gnu_cico_list = TREE_CHAIN (gnu_cico_list);
3016             gnu_name_list = TREE_CHAIN (gnu_name_list);
3017           }
3018     }
3019   else
3020     append_to_statement_list (gnu_call, &gnu_before_list);
3021
3022   append_to_statement_list (gnu_after_list, &gnu_before_list);
3023
3024   add_stmt (gnu_before_list);
3025   gnat_poplevel ();
3026   return end_stmt_group ();
3027 }
3028 \f
3029 /* Subroutine of gnat_to_gnu to translate gnat_node, an
3030    N_Handled_Sequence_Of_Statements, to a GCC tree, which is returned.  */
3031
3032 static tree
3033 Handled_Sequence_Of_Statements_to_gnu (Node_Id gnat_node)
3034 {
3035   tree gnu_jmpsave_decl = NULL_TREE;
3036   tree gnu_jmpbuf_decl = NULL_TREE;
3037   /* If just annotating, ignore all EH and cleanups.  */
3038   bool gcc_zcx = (!type_annotate_only
3039                   && Present (Exception_Handlers (gnat_node))
3040                   && Exception_Mechanism == Back_End_Exceptions);
3041   bool setjmp_longjmp
3042     = (!type_annotate_only && Present (Exception_Handlers (gnat_node))
3043        && Exception_Mechanism == Setjmp_Longjmp);
3044   bool at_end = !type_annotate_only && Present (At_End_Proc (gnat_node));
3045   bool binding_for_block = (at_end || gcc_zcx || setjmp_longjmp);
3046   tree gnu_inner_block; /* The statement(s) for the block itself.  */
3047   tree gnu_result;
3048   tree gnu_expr;
3049   Node_Id gnat_temp;
3050
3051   /* The GCC exception handling mechanism can handle both ZCX and SJLJ schemes
3052      and we have our own SJLJ mechanism.  To call the GCC mechanism, we call
3053      add_cleanup, and when we leave the binding, end_stmt_group will create
3054      the TRY_FINALLY_EXPR.
3055
3056      ??? The region level calls down there have been specifically put in place
3057      for a ZCX context and currently the order in which things are emitted
3058      (region/handlers) is different from the SJLJ case. Instead of putting
3059      other calls with different conditions at other places for the SJLJ case,
3060      it seems cleaner to reorder things for the SJLJ case and generalize the
3061      condition to make it not ZCX specific.
3062
3063      If there are any exceptions or cleanup processing involved, we need an
3064      outer statement group (for Setjmp_Longjmp) and binding level.  */
3065   if (binding_for_block)
3066     {
3067       start_stmt_group ();
3068       gnat_pushlevel ();
3069     }
3070
3071   /* If using setjmp_longjmp, make the variables for the setjmp buffer and save
3072      area for address of previous buffer.  Do this first since we need to have
3073      the setjmp buf known for any decls in this block.  */
3074   if (setjmp_longjmp)
3075     {
3076       gnu_jmpsave_decl = create_var_decl (get_identifier ("JMPBUF_SAVE"),
3077                                           NULL_TREE, jmpbuf_ptr_type,
3078                                           build_call_0_expr (get_jmpbuf_decl),
3079                                           false, false, false, false, NULL,
3080                                           gnat_node);
3081       DECL_ARTIFICIAL (gnu_jmpsave_decl) = 1;
3082
3083       /* The __builtin_setjmp receivers will immediately reinstall it.  Now
3084          because of the unstructured form of EH used by setjmp_longjmp, there
3085          might be forward edges going to __builtin_setjmp receivers on which
3086          it is uninitialized, although they will never be actually taken.  */
3087       TREE_NO_WARNING (gnu_jmpsave_decl) = 1;
3088       gnu_jmpbuf_decl = create_var_decl (get_identifier ("JMP_BUF"),
3089                                          NULL_TREE, jmpbuf_type,
3090                                          NULL_TREE, false, false, false, false,
3091                                          NULL, gnat_node);
3092       DECL_ARTIFICIAL (gnu_jmpbuf_decl) = 1;
3093
3094       set_block_jmpbuf_decl (gnu_jmpbuf_decl);
3095
3096       /* When we exit this block, restore the saved value.  */
3097       add_cleanup (build_call_1_expr (set_jmpbuf_decl, gnu_jmpsave_decl),