OSDN Git Service

2007-12-19 Tristan Gingold <gingold@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / utils.c
1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                                U T I L S                                 *
6  *                                                                          *
7  *                          C Implementation File                           *
8  *                                                                          *
9  *          Copyright (C) 1992-2007, 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 along with GCC; see the 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 "defaults.h"
33 #include "toplev.h"
34 #include "output.h"
35 #include "ggc.h"
36 #include "debug.h"
37 #include "convert.h"
38 #include "target.h"
39 #include "function.h"
40 #include "cgraph.h"
41 #include "tree-inline.h"
42 #include "tree-gimple.h"
43 #include "tree-dump.h"
44 #include "pointer-set.h"
45
46 #include "ada.h"
47 #include "types.h"
48 #include "atree.h"
49 #include "elists.h"
50 #include "namet.h"
51 #include "nlists.h"
52 #include "stringt.h"
53 #include "uintp.h"
54 #include "fe.h"
55 #include "sinfo.h"
56 #include "einfo.h"
57 #include "ada-tree.h"
58 #include "gigi.h"
59
60 #ifndef MAX_FIXED_MODE_SIZE
61 #define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode)
62 #endif
63
64 #ifndef MAX_BITS_PER_WORD
65 #define MAX_BITS_PER_WORD  BITS_PER_WORD
66 #endif
67
68 /* If nonzero, pretend we are allocating at global level.  */
69 int force_global;
70
71 /* Tree nodes for the various types and decls we create.  */
72 tree gnat_std_decls[(int) ADT_LAST];
73
74 /* Functions to call for each of the possible raise reasons.  */
75 tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
76
77 /* Forward declarations for handlers of attributes.  */
78 static tree handle_const_attribute (tree *, tree, tree, int, bool *);
79 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
80
81 /* Table of machine-independent internal attributes for Ada.  We support
82    this minimal set of attributes to accommodate the Alpha back-end which
83    unconditionally puts them on its builtins.  */
84 const struct attribute_spec gnat_internal_attribute_table[] =
85 {
86   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
87   { "const",   0, 0, true,  false, false, handle_const_attribute   },
88   { "nothrow", 0, 0, true,  false, false, handle_nothrow_attribute },
89   { NULL,      0, 0, false, false, false, NULL }
90 };
91
92 /* Associates a GNAT tree node to a GCC tree node. It is used in
93    `save_gnu_tree', `get_gnu_tree' and `present_gnu_tree'. See documentation
94    of `save_gnu_tree' for more info.  */
95 static GTY((length ("max_gnat_nodes"))) tree *associate_gnat_to_gnu;
96
97 #define GET_GNU_TREE(GNAT_ENTITY)       \
98   associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id]
99
100 #define SET_GNU_TREE(GNAT_ENTITY,VAL)   \
101   associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id] = (VAL)
102
103 #define PRESENT_GNU_TREE(GNAT_ENTITY)   \
104   (associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id] != NULL_TREE)
105
106 /* Associates a GNAT entity to a GCC tree node used as a dummy, if any.  */
107 static GTY((length ("max_gnat_nodes"))) tree *dummy_node_table;
108
109 #define GET_DUMMY_NODE(GNAT_ENTITY)     \
110   dummy_node_table[(GNAT_ENTITY) - First_Node_Id]
111
112 #define SET_DUMMY_NODE(GNAT_ENTITY,VAL) \
113   dummy_node_table[(GNAT_ENTITY) - First_Node_Id] = (VAL)
114
115 #define PRESENT_DUMMY_NODE(GNAT_ENTITY) \
116   (dummy_node_table[(GNAT_ENTITY) - First_Node_Id] != NULL_TREE)
117
118 /* This variable keeps a table for types for each precision so that we only
119    allocate each of them once. Signed and unsigned types are kept separate.
120
121    Note that these types are only used when fold-const requests something
122    special.  Perhaps we should NOT share these types; we'll see how it
123    goes later.  */
124 static GTY(()) tree signed_and_unsigned_types[2 * MAX_BITS_PER_WORD + 1][2];
125
126 /* Likewise for float types, but record these by mode.  */
127 static GTY(()) tree float_types[NUM_MACHINE_MODES];
128
129 /* For each binding contour we allocate a binding_level structure to indicate
130    the binding depth.  */
131
132 struct gnat_binding_level GTY((chain_next ("%h.chain")))
133 {
134   /* The binding level containing this one (the enclosing binding level). */
135   struct gnat_binding_level *chain;
136   /* The BLOCK node for this level.  */
137   tree block;
138   /* If nonzero, the setjmp buffer that needs to be updated for any
139      variable-sized definition within this context.  */
140   tree jmpbuf_decl;
141 };
142
143 /* The binding level currently in effect.  */
144 static GTY(()) struct gnat_binding_level *current_binding_level;
145
146 /* A chain of gnat_binding_level structures awaiting reuse.  */
147 static GTY((deletable)) struct gnat_binding_level *free_binding_level;
148
149 /* An array of global declarations.  */
150 static GTY(()) VEC(tree,gc) *global_decls;
151
152 /* An array of builtin declarations.  */
153 static GTY(()) VEC(tree,gc) *builtin_decls;
154
155 /* An array of global renaming pointers.  */
156 static GTY(()) VEC(tree,gc) *global_renaming_pointers;
157
158 /* A chain of unused BLOCK nodes. */
159 static GTY((deletable)) tree free_block_chain;
160
161 static void gnat_install_builtins (void);
162 static tree merge_sizes (tree, tree, tree, bool, bool);
163 static tree compute_related_constant (tree, tree);
164 static tree split_plus (tree, tree *);
165 static void gnat_gimplify_function (tree);
166 static tree float_type_for_precision (int, enum machine_mode);
167 static tree convert_to_fat_pointer (tree, tree);
168 static tree convert_to_thin_pointer (tree, tree);
169 static tree make_descriptor_field (const char *,tree, tree, tree);
170 static bool potential_alignment_gap (tree, tree, tree);
171 \f
172 /* Initialize the association of GNAT nodes to GCC trees.  */
173
174 void
175 init_gnat_to_gnu (void)
176 {
177   associate_gnat_to_gnu
178     = (tree *) ggc_alloc_cleared (max_gnat_nodes * sizeof (tree));
179 }
180
181 /* GNAT_ENTITY is a GNAT tree node for an entity.   GNU_DECL is the GCC tree
182    which is to be associated with GNAT_ENTITY. Such GCC tree node is always
183    a ..._DECL node.  If NO_CHECK is nonzero, the latter check is suppressed.
184
185    If GNU_DECL is zero, a previous association is to be reset.  */
186
187 void
188 save_gnu_tree (Entity_Id gnat_entity, tree gnu_decl, bool no_check)
189 {
190   /* Check that GNAT_ENTITY is not already defined and that it is being set
191      to something which is a decl.  Raise gigi 401 if not.  Usually, this
192      means GNAT_ENTITY is defined twice, but occasionally is due to some
193      Gigi problem.  */
194   gcc_assert (!(gnu_decl
195                 && (PRESENT_GNU_TREE (gnat_entity)
196                     || (!no_check && !DECL_P (gnu_decl)))));
197
198   SET_GNU_TREE (gnat_entity, gnu_decl);
199 }
200
201 /* GNAT_ENTITY is a GNAT tree node for a defining identifier.
202    Return the ..._DECL node that was associated with it.  If there is no tree
203    node associated with GNAT_ENTITY, abort.
204
205    In some cases, such as delayed elaboration or expressions that need to
206    be elaborated only once, GNAT_ENTITY is really not an entity.  */
207
208 tree
209 get_gnu_tree (Entity_Id gnat_entity)
210 {
211   gcc_assert (PRESENT_GNU_TREE (gnat_entity));
212   return GET_GNU_TREE (gnat_entity);
213 }
214
215 /* Return nonzero if a GCC tree has been associated with GNAT_ENTITY.  */
216
217 bool
218 present_gnu_tree (Entity_Id gnat_entity)
219 {
220   return PRESENT_GNU_TREE (gnat_entity);
221 }
222 \f
223 /* Initialize the association of GNAT nodes to GCC trees as dummies.  */
224
225 void
226 init_dummy_type (void)
227 {
228   dummy_node_table
229     = (tree *) ggc_alloc_cleared (max_gnat_nodes * sizeof (tree));
230 }
231
232 /* Make a dummy type corresponding to GNAT_TYPE.  */
233
234 tree
235 make_dummy_type (Entity_Id gnat_type)
236 {
237   Entity_Id gnat_underlying = Gigi_Equivalent_Type (gnat_type);
238   tree gnu_type;
239
240   /* If there is an equivalent type, get its underlying type.  */
241   if (Present (gnat_underlying))
242     gnat_underlying = Underlying_Type (gnat_underlying);
243
244   /* If there was no equivalent type (can only happen when just annotating
245      types) or underlying type, go back to the original type.  */
246   if (No (gnat_underlying))
247     gnat_underlying = gnat_type;
248
249   /* If it there already a dummy type, use that one.  Else make one.  */
250   if (PRESENT_DUMMY_NODE (gnat_underlying))
251     return GET_DUMMY_NODE (gnat_underlying);
252
253   /* If this is a record, make a RECORD_TYPE or UNION_TYPE; else make
254      an ENUMERAL_TYPE.  */
255   gnu_type = make_node (Is_Record_Type (gnat_underlying)
256                         ? tree_code_for_record_type (gnat_underlying)
257                         : ENUMERAL_TYPE);
258   TYPE_NAME (gnu_type) = get_entity_name (gnat_type);
259   TYPE_DUMMY_P (gnu_type) = 1;
260   if (AGGREGATE_TYPE_P (gnu_type))
261     {
262       TYPE_STUB_DECL (gnu_type) = build_decl (TYPE_DECL, NULL_TREE, gnu_type);
263       TYPE_BY_REFERENCE_P (gnu_type) = Is_By_Reference_Type (gnat_type);
264     }
265
266   SET_DUMMY_NODE (gnat_underlying, gnu_type);
267
268   return gnu_type;
269 }
270 \f
271 /* Return nonzero if we are currently in the global binding level.  */
272
273 int
274 global_bindings_p (void)
275 {
276   return ((force_global || !current_function_decl) ? -1 : 0);
277 }
278
279 /* Enter a new binding level. */
280
281 void
282 gnat_pushlevel ()
283 {
284   struct gnat_binding_level *newlevel = NULL;
285
286   /* Reuse a struct for this binding level, if there is one.  */
287   if (free_binding_level)
288     {
289       newlevel = free_binding_level;
290       free_binding_level = free_binding_level->chain;
291     }
292   else
293     newlevel
294       = (struct gnat_binding_level *)
295         ggc_alloc (sizeof (struct gnat_binding_level));
296
297   /* Use a free BLOCK, if any; otherwise, allocate one.  */
298   if (free_block_chain)
299     {
300       newlevel->block = free_block_chain;
301       free_block_chain = BLOCK_CHAIN (free_block_chain);
302       BLOCK_CHAIN (newlevel->block) = NULL_TREE;
303     }
304   else
305     newlevel->block = make_node (BLOCK);
306
307   /* Point the BLOCK we just made to its parent.  */
308   if (current_binding_level)
309     BLOCK_SUPERCONTEXT (newlevel->block) = current_binding_level->block;
310
311   BLOCK_VARS (newlevel->block) = BLOCK_SUBBLOCKS (newlevel->block) = NULL_TREE;
312   TREE_USED (newlevel->block) = 1;
313
314   /* Add this level to the front of the chain (stack) of levels that are
315      active.  */
316   newlevel->chain = current_binding_level;
317   newlevel->jmpbuf_decl = NULL_TREE;
318   current_binding_level = newlevel;
319 }
320
321 /* Set SUPERCONTEXT of the BLOCK for the current binding level to FNDECL
322    and point FNDECL to this BLOCK.  */
323
324 void
325 set_current_block_context (tree fndecl)
326 {
327   BLOCK_SUPERCONTEXT (current_binding_level->block) = fndecl;
328   DECL_INITIAL (fndecl) = current_binding_level->block;
329 }
330
331 /* Set the jmpbuf_decl for the current binding level to DECL.  */
332
333 void
334 set_block_jmpbuf_decl (tree decl)
335 {
336   current_binding_level->jmpbuf_decl = decl;
337 }
338
339 /* Get the jmpbuf_decl, if any, for the current binding level.  */
340
341 tree
342 get_block_jmpbuf_decl ()
343 {
344   return current_binding_level->jmpbuf_decl;
345 }
346
347 /* Exit a binding level. Set any BLOCK into the current code group.  */
348
349 void
350 gnat_poplevel ()
351 {
352   struct gnat_binding_level *level = current_binding_level;
353   tree block = level->block;
354
355   BLOCK_VARS (block) = nreverse (BLOCK_VARS (block));
356   BLOCK_SUBBLOCKS (block) = nreverse (BLOCK_SUBBLOCKS (block));
357
358   /* If this is a function-level BLOCK don't do anything.  Otherwise, if there
359      are no variables free the block and merge its subblocks into those of its
360      parent block. Otherwise, add it to the list of its parent.  */
361   if (TREE_CODE (BLOCK_SUPERCONTEXT (block)) == FUNCTION_DECL)
362     ;
363   else if (BLOCK_VARS (block) == NULL_TREE)
364     {
365       BLOCK_SUBBLOCKS (level->chain->block)
366         = chainon (BLOCK_SUBBLOCKS (block),
367                    BLOCK_SUBBLOCKS (level->chain->block));
368       BLOCK_CHAIN (block) = free_block_chain;
369       free_block_chain = block;
370     }
371   else
372     {
373       BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (level->chain->block);
374       BLOCK_SUBBLOCKS (level->chain->block) = block;
375       TREE_USED (block) = 1;
376       set_block_for_group (block);
377     }
378
379   /* Free this binding structure.  */
380   current_binding_level = level->chain;
381   level->chain = free_binding_level;
382   free_binding_level = level;
383 }
384
385 /* Insert BLOCK at the end of the list of subblocks of the
386    current binding level.  This is used when a BIND_EXPR is expanded,
387    to handle the BLOCK node inside the BIND_EXPR.  */
388
389 void
390 insert_block (tree block)
391 {
392   TREE_USED (block) = 1;
393   TREE_CHAIN (block) = BLOCK_SUBBLOCKS (current_binding_level->block);
394   BLOCK_SUBBLOCKS (current_binding_level->block) = block;
395 }
396 \f
397 /* Records a ..._DECL node DECL as belonging to the current lexical scope
398    and uses GNAT_NODE for location information and propagating flags.  */
399
400 void
401 gnat_pushdecl (tree decl, Node_Id gnat_node)
402 {
403   /* If at top level, there is no context. But PARM_DECLs always go in the
404      level of its function.  */
405   if (global_bindings_p () && TREE_CODE (decl) != PARM_DECL)
406     DECL_CONTEXT (decl) = 0;
407   else
408     {
409       DECL_CONTEXT (decl) = current_function_decl;
410
411       /* Functions imported in another function are not really nested.  */
412       if (TREE_CODE (decl) == FUNCTION_DECL && TREE_PUBLIC (decl))
413         DECL_NO_STATIC_CHAIN (decl) = 1;
414     }
415
416   TREE_NO_WARNING (decl) = (gnat_node == Empty || Warnings_Off (gnat_node));
417
418   /* Set the location of DECL and emit a declaration for it.  */
419   if (Present (gnat_node))
420     Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (decl));
421   add_decl_expr (decl, gnat_node);
422
423   /* Put the declaration on the list.  The list of declarations is in reverse
424      order.  The list will be reversed later.  Put global variables in the
425      globals list and builtin functions in a dedicated list to speed up
426      further lookups.  Don't put TYPE_DECLs for UNCONSTRAINED_ARRAY_TYPE into
427      the list, as they will cause trouble with the debugger and aren't needed
428      anyway.  */
429   if (TREE_CODE (decl) != TYPE_DECL
430       || TREE_CODE (TREE_TYPE (decl)) != UNCONSTRAINED_ARRAY_TYPE)
431     {
432       if (global_bindings_p ())
433         {
434           VEC_safe_push (tree, gc, global_decls, decl);
435
436           if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
437             VEC_safe_push (tree, gc, builtin_decls, decl);
438         }
439       else
440         {
441           TREE_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
442           BLOCK_VARS (current_binding_level->block) = decl;
443         }
444     }
445
446   /* For the declaration of a type, set its name if it either is not already
447      set, was set to an IDENTIFIER_NODE, indicating an internal name,
448      or if the previous type name was not derived from a source name.
449      We'd rather have the type named with a real name and all the pointer
450      types to the same object have the same POINTER_TYPE node.  Code in the
451      equivalent function of c-decl.c makes a copy of the type node here, but
452      that may cause us trouble with incomplete types.  We make an exception
453      for fat pointer types because the compiler automatically builds them
454      for unconstrained array types and the debugger uses them to represent
455      both these and pointers to these.  */
456   if (TREE_CODE (decl) == TYPE_DECL && DECL_NAME (decl))
457     {
458       tree t = TREE_TYPE (decl);
459
460       if (!TYPE_NAME (t) || TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE)
461         TYPE_NAME (t) = decl;
462       else if (TYPE_FAT_POINTER_P (t))
463         {
464           tree tt = build_variant_type_copy (t);
465           TYPE_NAME (tt) = decl;
466           TREE_USED (tt) = TREE_USED (t);
467           TREE_TYPE (decl) = tt;
468           DECL_ORIGINAL_TYPE (decl) = t;
469         }
470       else if (DECL_ARTIFICIAL (TYPE_NAME (t)) && !DECL_ARTIFICIAL (decl))
471         TYPE_NAME (t) = decl;
472     }
473 }
474 \f
475 /* Do little here.  Set up the standard declarations later after the
476    front end has been run.  */
477
478 void
479 gnat_init_decl_processing (void)
480 {
481   /* Make the binding_level structure for global names.  */
482   current_function_decl = 0;
483   current_binding_level = 0;
484   free_binding_level = 0;
485   gnat_pushlevel ();
486
487   build_common_tree_nodes (true, true);
488
489   /* In Ada, we use a signed type for SIZETYPE.  Use the signed type
490      corresponding to the size of Pmode.  In most cases when ptr_mode and
491      Pmode differ, C will use the width of ptr_mode as sizetype.  But we get
492      far better code using the width of Pmode.  Make this here since we need
493      this before we can expand the GNAT types.  */
494   size_type_node = gnat_type_for_size (GET_MODE_BITSIZE (Pmode), 0);
495   set_sizetype (size_type_node);
496   build_common_tree_nodes_2 (0);
497
498   ptr_void_type_node = build_pointer_type (void_type_node);
499
500   gnat_install_builtins ();
501 }
502
503 /* Install the builtin functions we might need.  */
504
505 static void
506 gnat_install_builtins ()
507 {
508   /* Builtins used by generic middle-end optimizers.  */
509   build_common_builtin_nodes ();
510
511   /* Target specific builtins, such as the AltiVec family on ppc.  */
512   targetm.init_builtins ();
513 }
514
515 /* Create the predefined scalar types such as `integer_type_node' needed
516    in the gcc back-end and initialize the global binding level.  */
517
518 void
519 init_gigi_decls (tree long_long_float_type, tree exception_type)
520 {
521   tree endlink, decl;
522   unsigned int i;
523
524   /* Set the types that GCC and Gigi use from the front end.  We would like
525      to do this for char_type_node, but it needs to correspond to the C
526      char type.  */
527   if (TREE_CODE (TREE_TYPE (long_long_float_type)) == INTEGER_TYPE)
528     {
529       /* In this case, the builtin floating point types are VAX float,
530          so make up a type for use.  */
531       longest_float_type_node = make_node (REAL_TYPE);
532       TYPE_PRECISION (longest_float_type_node) = LONG_DOUBLE_TYPE_SIZE;
533       layout_type (longest_float_type_node);
534       create_type_decl (get_identifier ("longest float type"),
535                         longest_float_type_node, NULL, false, true, Empty);
536     }
537   else
538     longest_float_type_node = TREE_TYPE (long_long_float_type);
539
540   except_type_node = TREE_TYPE (exception_type);
541
542   unsigned_type_node = gnat_type_for_size (INT_TYPE_SIZE, 1);
543   create_type_decl (get_identifier ("unsigned int"), unsigned_type_node,
544                     NULL, false, true, Empty);
545
546   void_type_decl_node = create_type_decl (get_identifier ("void"),
547                                           void_type_node, NULL, false, true,
548                                           Empty);
549
550   void_ftype = build_function_type (void_type_node, NULL_TREE);
551   ptr_void_ftype = build_pointer_type (void_ftype);
552
553   /* Now declare runtime functions. */
554   endlink = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
555
556   /* malloc is a function declaration tree for a function to allocate
557      memory.  */
558   malloc_decl = create_subprog_decl (get_identifier ("__gnat_malloc"),
559                                      NULL_TREE,
560                                      build_function_type (ptr_void_type_node,
561                                                           tree_cons (NULL_TREE,
562                                                                      sizetype,
563                                                                      endlink)),
564                                      NULL_TREE, false, true, true, NULL,
565                                      Empty);
566   DECL_IS_MALLOC (malloc_decl) = 1;
567
568   /* free is a function declaration tree for a function to free memory.  */
569   free_decl
570     = create_subprog_decl (get_identifier ("__gnat_free"), NULL_TREE,
571                            build_function_type (void_type_node,
572                                                 tree_cons (NULL_TREE,
573                                                            ptr_void_type_node,
574                                                            endlink)),
575                            NULL_TREE, false, true, true, NULL, Empty);
576
577   /* Make the types and functions used for exception processing.    */
578   jmpbuf_type
579     = build_array_type (gnat_type_for_mode (Pmode, 0),
580                         build_index_type (build_int_cst (NULL_TREE, 5)));
581   create_type_decl (get_identifier ("JMPBUF_T"), jmpbuf_type, NULL,
582                     true, true, Empty);
583   jmpbuf_ptr_type = build_pointer_type (jmpbuf_type);
584
585   /* Functions to get and set the jumpbuf pointer for the current thread.  */
586   get_jmpbuf_decl
587     = create_subprog_decl
588     (get_identifier ("system__soft_links__get_jmpbuf_address_soft"),
589      NULL_TREE, build_function_type (jmpbuf_ptr_type, NULL_TREE),
590      NULL_TREE, false, true, true, NULL, Empty);
591   /* Avoid creating superfluous edges to __builtin_setjmp receivers.  */
592   DECL_IS_PURE (get_jmpbuf_decl) = 1;
593
594   set_jmpbuf_decl
595     = create_subprog_decl
596     (get_identifier ("system__soft_links__set_jmpbuf_address_soft"),
597      NULL_TREE,
598      build_function_type (void_type_node,
599                           tree_cons (NULL_TREE, jmpbuf_ptr_type, endlink)),
600      NULL_TREE, false, true, true, NULL, Empty);
601
602   /* Function to get the current exception.  */
603   get_excptr_decl
604     = create_subprog_decl
605     (get_identifier ("system__soft_links__get_gnat_exception"),
606      NULL_TREE,
607      build_function_type (build_pointer_type (except_type_node), NULL_TREE),
608      NULL_TREE, false, true, true, NULL, Empty);
609   /* Avoid creating superfluous edges to __builtin_setjmp receivers.  */
610   DECL_IS_PURE (get_excptr_decl) = 1;
611
612   /* Functions that raise exceptions. */
613   raise_nodefer_decl
614     = create_subprog_decl
615       (get_identifier ("__gnat_raise_nodefer_with_msg"), NULL_TREE,
616        build_function_type (void_type_node,
617                             tree_cons (NULL_TREE,
618                                        build_pointer_type (except_type_node),
619                                        endlink)),
620        NULL_TREE, false, true, true, NULL, Empty);
621
622   /* Dummy objects to materialize "others" and "all others" in the exception
623      tables.  These are exported by a-exexpr.adb, so see this unit for the
624      types to use.  */
625
626   others_decl
627     = create_var_decl (get_identifier ("OTHERS"),
628                        get_identifier ("__gnat_others_value"),
629                        integer_type_node, 0, 1, 0, 1, 1, 0, Empty);
630
631   all_others_decl
632     = create_var_decl (get_identifier ("ALL_OTHERS"),
633                        get_identifier ("__gnat_all_others_value"),
634                        integer_type_node, 0, 1, 0, 1, 1, 0, Empty);
635
636   /* Hooks to call when entering/leaving an exception handler.  */
637   begin_handler_decl
638     = create_subprog_decl (get_identifier ("__gnat_begin_handler"), NULL_TREE,
639                            build_function_type (void_type_node,
640                                                 tree_cons (NULL_TREE,
641                                                            ptr_void_type_node,
642                                                            endlink)),
643                            NULL_TREE, false, true, true, NULL, Empty);
644
645   end_handler_decl
646     = create_subprog_decl (get_identifier ("__gnat_end_handler"), NULL_TREE,
647                            build_function_type (void_type_node,
648                                                 tree_cons (NULL_TREE,
649                                                            ptr_void_type_node,
650                                                            endlink)),
651                            NULL_TREE, false, true, true, NULL, Empty);
652
653   /* If in no exception handlers mode, all raise statements are redirected to
654      __gnat_last_chance_handler. No need to redefine raise_nodefer_decl, since
655      this procedure will never be called in this mode.  */
656   if (No_Exception_Handlers_Set ())
657     {
658       decl
659         = create_subprog_decl
660           (get_identifier ("__gnat_last_chance_handler"), NULL_TREE,
661            build_function_type (void_type_node,
662                                 tree_cons (NULL_TREE,
663                                            build_pointer_type (char_type_node),
664                                            tree_cons (NULL_TREE,
665                                                       integer_type_node,
666                                                       endlink))),
667            NULL_TREE, false, true, true, NULL, Empty);
668
669       for (i = 0; i < ARRAY_SIZE (gnat_raise_decls); i++)
670         gnat_raise_decls[i] = decl;
671     }
672   else
673     /* Otherwise, make one decl for each exception reason.  */
674     for (i = 0; i < ARRAY_SIZE (gnat_raise_decls); i++)
675       {
676         char name[17];
677
678         sprintf (name, "__gnat_rcheck_%.2d", i);
679         gnat_raise_decls[i]
680           = create_subprog_decl
681             (get_identifier (name), NULL_TREE,
682              build_function_type (void_type_node,
683                                   tree_cons (NULL_TREE,
684                                              build_pointer_type
685                                              (char_type_node),
686                                              tree_cons (NULL_TREE,
687                                                         integer_type_node,
688                                                         endlink))),
689              NULL_TREE, false, true, true, NULL, Empty);
690       }
691
692   /* Indicate that these never return.  */
693   TREE_THIS_VOLATILE (raise_nodefer_decl) = 1;
694   TREE_SIDE_EFFECTS (raise_nodefer_decl) = 1;
695   TREE_TYPE (raise_nodefer_decl)
696     = build_qualified_type (TREE_TYPE (raise_nodefer_decl),
697                             TYPE_QUAL_VOLATILE);
698
699   for (i = 0; i < ARRAY_SIZE (gnat_raise_decls); i++)
700     {
701       TREE_THIS_VOLATILE (gnat_raise_decls[i]) = 1;
702       TREE_SIDE_EFFECTS (gnat_raise_decls[i]) = 1;
703       TREE_TYPE (gnat_raise_decls[i])
704         = build_qualified_type (TREE_TYPE (gnat_raise_decls[i]),
705                                 TYPE_QUAL_VOLATILE);
706     }
707
708   /* setjmp returns an integer and has one operand, which is a pointer to
709      a jmpbuf.  */
710   setjmp_decl
711     = create_subprog_decl
712       (get_identifier ("__builtin_setjmp"), NULL_TREE,
713        build_function_type (integer_type_node,
714                             tree_cons (NULL_TREE,  jmpbuf_ptr_type, endlink)),
715        NULL_TREE, false, true, true, NULL, Empty);
716
717   DECL_BUILT_IN_CLASS (setjmp_decl) = BUILT_IN_NORMAL;
718   DECL_FUNCTION_CODE (setjmp_decl) = BUILT_IN_SETJMP;
719
720   /* update_setjmp_buf updates a setjmp buffer from the current stack pointer
721      address.  */
722   update_setjmp_buf_decl
723     = create_subprog_decl
724       (get_identifier ("__builtin_update_setjmp_buf"), NULL_TREE,
725        build_function_type (void_type_node,
726                             tree_cons (NULL_TREE,  jmpbuf_ptr_type, endlink)),
727        NULL_TREE, false, true, true, NULL, Empty);
728
729   DECL_BUILT_IN_CLASS (update_setjmp_buf_decl) = BUILT_IN_NORMAL;
730   DECL_FUNCTION_CODE (update_setjmp_buf_decl) = BUILT_IN_UPDATE_SETJMP_BUF;
731
732   main_identifier_node = get_identifier ("main");
733 }
734 \f
735 /* Given a record type RECORD_TYPE and a chain of FIELD_DECL nodes FIELDLIST,
736    finish constructing the record or union type.  If REP_LEVEL is zero, this
737    record has no representation clause and so will be entirely laid out here.
738    If REP_LEVEL is one, this record has a representation clause and has been
739    laid out already; only set the sizes and alignment.  If REP_LEVEL is two,
740    this record is derived from a parent record and thus inherits its layout;
741    only make a pass on the fields to finalize them.  If DO_NOT_FINALIZE is
742    true, the record type is expected to be modified afterwards so it will
743    not be sent to the back-end for finalization.  */
744
745 void
746 finish_record_type (tree record_type, tree fieldlist, int rep_level,
747                     bool do_not_finalize)
748 {
749   enum tree_code code = TREE_CODE (record_type);
750   tree name = TYPE_NAME (record_type);
751   tree ada_size = bitsize_zero_node;
752   tree size = bitsize_zero_node;
753   bool var_size = false;
754   bool had_size = TYPE_SIZE (record_type) != 0;
755   bool had_size_unit = TYPE_SIZE_UNIT (record_type) != 0;
756   tree field;
757
758   if (name && TREE_CODE (name) == TYPE_DECL)
759     name = DECL_NAME (name);
760
761   TYPE_FIELDS (record_type) = fieldlist;
762   TYPE_STUB_DECL (record_type) = build_decl (TYPE_DECL, name, record_type);
763
764   /* We don't need both the typedef name and the record name output in
765      the debugging information, since they are the same.  */
766   DECL_ARTIFICIAL (TYPE_STUB_DECL (record_type)) = 1;
767
768   /* Globally initialize the record first.  If this is a rep'ed record,
769      that just means some initializations; otherwise, layout the record.  */
770   if (rep_level > 0)
771     {
772       TYPE_ALIGN (record_type) = MAX (BITS_PER_UNIT, TYPE_ALIGN (record_type));
773       TYPE_MODE (record_type) = BLKmode;
774
775       if (!had_size_unit)
776         TYPE_SIZE_UNIT (record_type) = size_zero_node;
777       if (!had_size)
778         TYPE_SIZE (record_type) = bitsize_zero_node;
779
780       /* For all-repped records with a size specified, lay the QUAL_UNION_TYPE
781          out just like a UNION_TYPE, since the size will be fixed.  */
782       else if (code == QUAL_UNION_TYPE)
783         code = UNION_TYPE;
784     }
785   else
786     {
787       /* Ensure there isn't a size already set.  There can be in an error
788          case where there is a rep clause but all fields have errors and
789          no longer have a position.  */
790       TYPE_SIZE (record_type) = 0;
791       layout_type (record_type);
792     }
793
794   /* At this point, the position and size of each field is known.  It was
795      either set before entry by a rep clause, or by laying out the type above.
796
797      We now run a pass over the fields (in reverse order for QUAL_UNION_TYPEs)
798      to compute the Ada size; the GCC size and alignment (for rep'ed records
799      that are not padding types); and the mode (for rep'ed records).  We also
800      clear the DECL_BIT_FIELD indication for the cases we know have not been
801      handled yet, and adjust DECL_NONADDRESSABLE_P accordingly.  */
802
803   if (code == QUAL_UNION_TYPE)
804     fieldlist = nreverse (fieldlist);
805
806   for (field = fieldlist; field; field = TREE_CHAIN (field))
807     {
808       tree pos = bit_position (field);
809
810       tree type = TREE_TYPE (field);
811       tree this_size = DECL_SIZE (field);
812       tree this_ada_size = DECL_SIZE (field);
813
814       /* We need to make an XVE/XVU record if any field has variable size,
815          whether or not the record does.  For example, if we have a union,
816          it may be that all fields, rounded up to the alignment, have the
817          same size, in which case we'll use that size.  But the debug
818          output routines (except Dwarf2) won't be able to output the fields,
819          so we need to make the special record.  */
820       if (TREE_CODE (this_size) != INTEGER_CST)
821         var_size = true;
822
823       if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
824           || TREE_CODE (type) == QUAL_UNION_TYPE)
825           && !TYPE_IS_FAT_POINTER_P (type)
826           && !TYPE_CONTAINS_TEMPLATE_P (type)
827           && TYPE_ADA_SIZE (type))
828         this_ada_size = TYPE_ADA_SIZE (type);
829
830       /* Clear DECL_BIT_FIELD for the cases layout_decl does not handle.  */
831       if (DECL_BIT_FIELD (field) && !STRICT_ALIGNMENT
832           && value_factor_p (pos, BITS_PER_UNIT)
833           && operand_equal_p (this_size, TYPE_SIZE (type), 0))
834         DECL_BIT_FIELD (field) = 0;
835
836       /* If we still have DECL_BIT_FIELD set at this point, we know the field
837          is technically not addressable.  Except that it can actually be
838          addressed if the field is BLKmode and happens to be properly
839          aligned.  */
840       DECL_NONADDRESSABLE_P (field)
841         |= DECL_BIT_FIELD (field) && DECL_MODE (field) != BLKmode;
842
843       if ((rep_level > 0) && !DECL_BIT_FIELD (field))
844         TYPE_ALIGN (record_type)
845           = MAX (TYPE_ALIGN (record_type), DECL_ALIGN (field));
846
847       switch (code)
848         {
849         case UNION_TYPE:
850           ada_size = size_binop (MAX_EXPR, ada_size, this_ada_size);
851           size = size_binop (MAX_EXPR, size, this_size);
852           break;
853
854         case QUAL_UNION_TYPE:
855           ada_size
856             = fold_build3 (COND_EXPR, bitsizetype, DECL_QUALIFIER (field),
857                            this_ada_size, ada_size);
858           size = fold_build3 (COND_EXPR, bitsizetype, DECL_QUALIFIER (field),
859                               this_size, size);
860           break;
861
862         case RECORD_TYPE:
863           /* Since we know here that all fields are sorted in order of
864              increasing bit position, the size of the record is one
865              higher than the ending bit of the last field processed
866              unless we have a rep clause, since in that case we might
867              have a field outside a QUAL_UNION_TYPE that has a higher ending
868              position.  So use a MAX in that case.  Also, if this field is a
869              QUAL_UNION_TYPE, we need to take into account the previous size in
870              the case of empty variants.  */
871           ada_size
872             = merge_sizes (ada_size, pos, this_ada_size,
873                            TREE_CODE (type) == QUAL_UNION_TYPE, rep_level > 0);
874           size
875             = merge_sizes (size, pos, this_size,
876                            TREE_CODE (type) == QUAL_UNION_TYPE, rep_level > 0);
877           break;
878
879         default:
880           gcc_unreachable ();
881         }
882     }
883
884   if (code == QUAL_UNION_TYPE)
885     nreverse (fieldlist);
886
887   if (rep_level < 2)
888     {
889       /* If this is a padding record, we never want to make the size smaller
890          than what was specified in it, if any.  */
891       if (TREE_CODE (record_type) == RECORD_TYPE
892           && TYPE_IS_PADDING_P (record_type) && TYPE_SIZE (record_type))
893         size = TYPE_SIZE (record_type);
894
895       /* Now set any of the values we've just computed that apply.  */
896       if (!TYPE_IS_FAT_POINTER_P (record_type)
897           && !TYPE_CONTAINS_TEMPLATE_P (record_type))
898         SET_TYPE_ADA_SIZE (record_type, ada_size);
899
900       if (rep_level > 0)
901         {
902           tree size_unit = had_size_unit
903                            ? TYPE_SIZE_UNIT (record_type)
904                            : convert (sizetype,
905                                       size_binop (CEIL_DIV_EXPR, size,
906                                                   bitsize_unit_node));
907           unsigned int align = TYPE_ALIGN (record_type);
908
909           TYPE_SIZE (record_type) = variable_size (round_up (size, align));
910           TYPE_SIZE_UNIT (record_type)
911             = variable_size (round_up (size_unit, align / BITS_PER_UNIT));
912
913           compute_record_mode (record_type);
914         }
915     }
916
917   if (!do_not_finalize)
918     rest_of_record_type_compilation (record_type);
919 }
920
921 /* Wrap up compilation of RECORD_TYPE, i.e. most notably output all
922    the debug information associated with it.  It need not be invoked
923    directly in most cases since finish_record_type takes care of doing
924    so, unless explicitly requested not to through DO_NOT_FINALIZE.  */
925
926 void
927 rest_of_record_type_compilation (tree record_type)
928 {
929   tree fieldlist = TYPE_FIELDS (record_type);
930   tree field;
931   enum tree_code code = TREE_CODE (record_type);
932   bool var_size = false;
933
934   for (field = fieldlist; field; field = TREE_CHAIN (field))
935     {
936       /* We need to make an XVE/XVU record if any field has variable size,
937          whether or not the record does.  For example, if we have a union,
938          it may be that all fields, rounded up to the alignment, have the
939          same size, in which case we'll use that size.  But the debug
940          output routines (except Dwarf2) won't be able to output the fields,
941          so we need to make the special record.  */
942       if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST
943           /* If a field has a non-constant qualifier, the record will have
944              variable size too.  */
945           || (code == QUAL_UNION_TYPE
946               && TREE_CODE (DECL_QUALIFIER (field)) != INTEGER_CST))
947         {
948           var_size = true;
949           break;
950         }
951     }
952
953   /* If this record is of variable size, rename it so that the
954      debugger knows it is and make a new, parallel, record
955      that tells the debugger how the record is laid out.  See
956      exp_dbug.ads.  But don't do this for records that are padding
957      since they confuse GDB.  */
958   if (var_size
959       && !(TREE_CODE (record_type) == RECORD_TYPE
960            && TYPE_IS_PADDING_P (record_type)))
961     {
962       tree new_record_type
963         = make_node (TREE_CODE (record_type) == QUAL_UNION_TYPE
964                      ? UNION_TYPE : TREE_CODE (record_type));
965       tree orig_name = TYPE_NAME (record_type);
966       tree orig_id
967         = (TREE_CODE (orig_name) == TYPE_DECL ? DECL_NAME (orig_name)
968            : orig_name);
969       tree new_id
970         = concat_id_with_name (orig_id,
971                                TREE_CODE (record_type) == QUAL_UNION_TYPE
972                                ? "XVU" : "XVE");
973       tree last_pos = bitsize_zero_node;
974       tree old_field;
975       tree prev_old_field = 0;
976
977       TYPE_NAME (new_record_type) = new_id;
978       TYPE_ALIGN (new_record_type) = BIGGEST_ALIGNMENT;
979       TYPE_STUB_DECL (new_record_type)
980         = build_decl (TYPE_DECL, new_id, new_record_type);
981       DECL_ARTIFICIAL (TYPE_STUB_DECL (new_record_type)) = 1;
982       DECL_IGNORED_P (TYPE_STUB_DECL (new_record_type))
983         = DECL_IGNORED_P (TYPE_STUB_DECL (record_type));
984       TYPE_SIZE (new_record_type) = size_int (TYPE_ALIGN (record_type));
985       TYPE_SIZE_UNIT (new_record_type)
986         = size_int (TYPE_ALIGN (record_type) / BITS_PER_UNIT);
987
988       /* Now scan all the fields, replacing each field with a new
989          field corresponding to the new encoding.  */
990       for (old_field = TYPE_FIELDS (record_type); old_field;
991            old_field = TREE_CHAIN (old_field))
992         {
993           tree field_type = TREE_TYPE (old_field);
994           tree field_name = DECL_NAME (old_field);
995           tree new_field;
996           tree curpos = bit_position (old_field);
997           bool var = false;
998           unsigned int align = 0;
999           tree pos;
1000
1001           /* See how the position was modified from the last position.
1002
1003           There are two basic cases we support: a value was added
1004           to the last position or the last position was rounded to
1005           a boundary and they something was added.  Check for the
1006           first case first.  If not, see if there is any evidence
1007           of rounding.  If so, round the last position and try
1008           again.
1009
1010           If this is a union, the position can be taken as zero. */
1011
1012           if (TREE_CODE (new_record_type) == UNION_TYPE)
1013             pos = bitsize_zero_node, align = 0;
1014           else
1015             pos = compute_related_constant (curpos, last_pos);
1016
1017           if (!pos && TREE_CODE (curpos) == MULT_EXPR
1018               && host_integerp (TREE_OPERAND (curpos, 1), 1))
1019             {
1020               tree offset = TREE_OPERAND (curpos, 0);
1021               align = tree_low_cst (TREE_OPERAND (curpos, 1), 1);
1022
1023               /* Strip off any conversions.  */
1024               while (TREE_CODE (offset) == NON_LVALUE_EXPR
1025                      || TREE_CODE (offset) == NOP_EXPR
1026                      || TREE_CODE (offset) == CONVERT_EXPR)
1027                 offset = TREE_OPERAND (offset, 0);
1028
1029               /* An offset which is a bitwise AND with a negative power of 2
1030                  means an alignment corresponding to this power of 2.  */
1031               if (TREE_CODE (offset) == BIT_AND_EXPR
1032                   && host_integerp (TREE_OPERAND (offset, 1), 0)
1033                   && tree_int_cst_sgn (TREE_OPERAND (offset, 1)) < 0)
1034                 {
1035                   unsigned int pow
1036                     = - tree_low_cst (TREE_OPERAND (offset, 1), 0);
1037                   if (exact_log2 (pow) > 0)
1038                     align *= pow;
1039                 }
1040
1041               pos = compute_related_constant (curpos,
1042                                               round_up (last_pos, align));
1043             }
1044           else if (!pos && TREE_CODE (curpos) == PLUS_EXPR
1045                    && TREE_CODE (TREE_OPERAND (curpos, 1)) == INTEGER_CST
1046                    && TREE_CODE (TREE_OPERAND (curpos, 0)) == MULT_EXPR
1047                    && host_integerp (TREE_OPERAND
1048                                      (TREE_OPERAND (curpos, 0), 1),
1049                                      1))
1050             {
1051               align
1052                 = tree_low_cst
1053                 (TREE_OPERAND (TREE_OPERAND (curpos, 0), 1), 1);
1054               pos = compute_related_constant (curpos,
1055                                               round_up (last_pos, align));
1056             }
1057           else if (potential_alignment_gap (prev_old_field, old_field,
1058                                             pos))
1059             {
1060               align = TYPE_ALIGN (field_type);
1061               pos = compute_related_constant (curpos,
1062                                               round_up (last_pos, align));
1063             }
1064
1065           /* If we can't compute a position, set it to zero.
1066
1067           ??? We really should abort here, but it's too much work
1068           to get this correct for all cases.  */
1069
1070           if (!pos)
1071             pos = bitsize_zero_node;
1072
1073           /* See if this type is variable-sized and make a pointer type
1074              and indicate the indirection if so.  Beware that the debug
1075              back-end may adjust the position computed above according
1076              to the alignment of the field type, i.e. the pointer type
1077              in this case, if we don't preventively counter that.  */
1078           if (TREE_CODE (DECL_SIZE (old_field)) != INTEGER_CST)
1079             {
1080               field_type = build_pointer_type (field_type);
1081               if (align != 0 && TYPE_ALIGN (field_type) > align)
1082                 {
1083                   field_type = copy_node (field_type);
1084                   TYPE_ALIGN (field_type) = align;
1085                 }
1086               var = true;
1087             }
1088
1089           /* Make a new field name, if necessary.  */
1090           if (var || align != 0)
1091             {
1092               char suffix[16];
1093
1094               if (align != 0)
1095                 sprintf (suffix, "XV%c%u", var ? 'L' : 'A',
1096                          align / BITS_PER_UNIT);
1097               else
1098                 strcpy (suffix, "XVL");
1099
1100               field_name = concat_id_with_name (field_name, suffix);
1101             }
1102
1103           new_field = create_field_decl (field_name, field_type,
1104                                          new_record_type, 0,
1105                                          DECL_SIZE (old_field), pos, 0);
1106           TREE_CHAIN (new_field) = TYPE_FIELDS (new_record_type);
1107           TYPE_FIELDS (new_record_type) = new_field;
1108
1109           /* If old_field is a QUAL_UNION_TYPE, take its size as being
1110              zero.  The only time it's not the last field of the record
1111              is when there are other components at fixed positions after
1112              it (meaning there was a rep clause for every field) and we
1113              want to be able to encode them.  */
1114           last_pos = size_binop (PLUS_EXPR, bit_position (old_field),
1115                                  (TREE_CODE (TREE_TYPE (old_field))
1116                                   == QUAL_UNION_TYPE)
1117                                  ? bitsize_zero_node
1118                                  : DECL_SIZE (old_field));
1119           prev_old_field = old_field;
1120         }
1121
1122       TYPE_FIELDS (new_record_type)
1123         = nreverse (TYPE_FIELDS (new_record_type));
1124
1125       rest_of_type_decl_compilation (TYPE_STUB_DECL (new_record_type));
1126     }
1127
1128   rest_of_type_decl_compilation (TYPE_STUB_DECL (record_type));
1129 }
1130
1131 /* Utility function of above to merge LAST_SIZE, the previous size of a record
1132    with FIRST_BIT and SIZE that describe a field.  SPECIAL is nonzero
1133    if this represents a QUAL_UNION_TYPE in which case we must look for
1134    COND_EXPRs and replace a value of zero with the old size.  If HAS_REP
1135    is nonzero, we must take the MAX of the end position of this field
1136    with LAST_SIZE.  In all other cases, we use FIRST_BIT plus SIZE.
1137
1138    We return an expression for the size.  */
1139
1140 static tree
1141 merge_sizes (tree last_size, tree first_bit, tree size, bool special,
1142              bool has_rep)
1143 {
1144   tree type = TREE_TYPE (last_size);
1145   tree new;
1146
1147   if (!special || TREE_CODE (size) != COND_EXPR)
1148     {
1149       new = size_binop (PLUS_EXPR, first_bit, size);
1150       if (has_rep)
1151         new = size_binop (MAX_EXPR, last_size, new);
1152     }
1153
1154   else
1155     new = fold_build3 (COND_EXPR, type, TREE_OPERAND (size, 0),
1156                        integer_zerop (TREE_OPERAND (size, 1))
1157                        ? last_size : merge_sizes (last_size, first_bit,
1158                                                   TREE_OPERAND (size, 1),
1159                                                   1, has_rep),
1160                        integer_zerop (TREE_OPERAND (size, 2))
1161                        ? last_size : merge_sizes (last_size, first_bit,
1162                                                   TREE_OPERAND (size, 2),
1163                                                   1, has_rep));
1164
1165   /* We don't need any NON_VALUE_EXPRs and they can confuse us (especially
1166      when fed through substitute_in_expr) into thinking that a constant
1167      size is not constant.  */
1168   while (TREE_CODE (new) == NON_LVALUE_EXPR)
1169     new = TREE_OPERAND (new, 0);
1170
1171   return new;
1172 }
1173
1174 /* Utility function of above to see if OP0 and OP1, both of SIZETYPE, are
1175    related by the addition of a constant.  Return that constant if so.  */
1176
1177 static tree
1178 compute_related_constant (tree op0, tree op1)
1179 {
1180   tree op0_var, op1_var;
1181   tree op0_con = split_plus (op0, &op0_var);
1182   tree op1_con = split_plus (op1, &op1_var);
1183   tree result = size_binop (MINUS_EXPR, op0_con, op1_con);
1184
1185   if (operand_equal_p (op0_var, op1_var, 0))
1186     return result;
1187   else if (operand_equal_p (op0, size_binop (PLUS_EXPR, op1_var, result), 0))
1188     return result;
1189   else
1190     return 0;
1191 }
1192
1193 /* Utility function of above to split a tree OP which may be a sum, into a
1194    constant part, which is returned, and a variable part, which is stored
1195    in *PVAR.  *PVAR may be bitsize_zero_node.  All operations must be of
1196    bitsizetype.  */
1197
1198 static tree
1199 split_plus (tree in, tree *pvar)
1200 {
1201   /* Strip NOPS in order to ease the tree traversal and maximize the
1202      potential for constant or plus/minus discovery. We need to be careful
1203      to always return and set *pvar to bitsizetype trees, but it's worth
1204      the effort.  */
1205   STRIP_NOPS (in);
1206
1207   *pvar = convert (bitsizetype, in);
1208
1209   if (TREE_CODE (in) == INTEGER_CST)
1210     {
1211       *pvar = bitsize_zero_node;
1212       return convert (bitsizetype, in);
1213     }
1214   else if (TREE_CODE (in) == PLUS_EXPR || TREE_CODE (in) == MINUS_EXPR)
1215     {
1216       tree lhs_var, rhs_var;
1217       tree lhs_con = split_plus (TREE_OPERAND (in, 0), &lhs_var);
1218       tree rhs_con = split_plus (TREE_OPERAND (in, 1), &rhs_var);
1219
1220       if (lhs_var == TREE_OPERAND (in, 0)
1221           && rhs_var == TREE_OPERAND (in, 1))
1222         return bitsize_zero_node;
1223
1224       *pvar = size_binop (TREE_CODE (in), lhs_var, rhs_var);
1225       return size_binop (TREE_CODE (in), lhs_con, rhs_con);
1226     }
1227   else
1228     return bitsize_zero_node;
1229 }
1230 \f
1231 /* Return a FUNCTION_TYPE node. RETURN_TYPE is the type returned by the
1232    subprogram. If it is void_type_node, then we are dealing with a procedure,
1233    otherwise we are dealing with a function. PARAM_DECL_LIST is a list of
1234    PARM_DECL nodes that are the subprogram arguments.  CICO_LIST is the
1235    copy-in/copy-out list to be stored into TYPE_CICO_LIST.
1236    RETURNS_UNCONSTRAINED is nonzero if the function returns an unconstrained
1237    object.  RETURNS_BY_REF is nonzero if the function returns by reference.
1238    RETURNS_WITH_DSP is nonzero if the function is to return with a
1239    depressed stack pointer.  RETURNS_BY_TARGET_PTR is true if the function
1240    is to be passed (as its first parameter) the address of the place to copy
1241    its result.  */
1242
1243 tree
1244 create_subprog_type (tree return_type, tree param_decl_list, tree cico_list,
1245                      bool returns_unconstrained, bool returns_by_ref,
1246                      bool returns_with_dsp, bool returns_by_target_ptr)
1247 {
1248   /* A chain of TREE_LIST nodes whose TREE_VALUEs are the data type nodes of
1249      the subprogram formal parameters. This list is generated by traversing the
1250      input list of PARM_DECL nodes.  */
1251   tree param_type_list = NULL;
1252   tree param_decl;
1253   tree type;
1254
1255   for (param_decl = param_decl_list; param_decl;
1256        param_decl = TREE_CHAIN (param_decl))
1257     param_type_list = tree_cons (NULL_TREE, TREE_TYPE (param_decl),
1258                                  param_type_list);
1259
1260   /* The list of the function parameter types has to be terminated by the void
1261      type to signal to the back-end that we are not dealing with a variable
1262      parameter subprogram, but that the subprogram has a fixed number of
1263      parameters.  */
1264   param_type_list = tree_cons (NULL_TREE, void_type_node, param_type_list);
1265
1266   /* The list of argument types has been created in reverse
1267      so nreverse it.   */
1268   param_type_list = nreverse (param_type_list);
1269
1270   type = build_function_type (return_type, param_type_list);
1271
1272   /* TYPE may have been shared since GCC hashes types.  If it has a CICO_LIST
1273      or the new type should, make a copy of TYPE.  Likewise for
1274      RETURNS_UNCONSTRAINED and RETURNS_BY_REF.  */
1275   if (TYPE_CI_CO_LIST (type) || cico_list
1276       || TYPE_RETURNS_UNCONSTRAINED_P (type) != returns_unconstrained
1277       || TYPE_RETURNS_BY_REF_P (type) != returns_by_ref
1278       || TYPE_RETURNS_BY_TARGET_PTR_P (type) != returns_by_target_ptr)
1279     type = copy_type (type);
1280
1281   TYPE_CI_CO_LIST (type) = cico_list;
1282   TYPE_RETURNS_UNCONSTRAINED_P (type) = returns_unconstrained;
1283   TYPE_RETURNS_STACK_DEPRESSED (type) = returns_with_dsp;
1284   TYPE_RETURNS_BY_REF_P (type) = returns_by_ref;
1285   TYPE_RETURNS_BY_TARGET_PTR_P (type) = returns_by_target_ptr;
1286   return type;
1287 }
1288 \f
1289 /* Return a copy of TYPE but safe to modify in any way.  */
1290
1291 tree
1292 copy_type (tree type)
1293 {
1294   tree new = copy_node (type);
1295
1296   /* copy_node clears this field instead of copying it, because it is
1297      aliased with TREE_CHAIN.  */
1298   TYPE_STUB_DECL (new) = TYPE_STUB_DECL (type);
1299
1300   TYPE_POINTER_TO (new) = 0;
1301   TYPE_REFERENCE_TO (new) = 0;
1302   TYPE_MAIN_VARIANT (new) = new;
1303   TYPE_NEXT_VARIANT (new) = 0;
1304
1305   return new;
1306 }
1307 \f
1308 /* Return an INTEGER_TYPE of SIZETYPE with range MIN to MAX and whose
1309    TYPE_INDEX_TYPE is INDEX.  GNAT_NODE is used for the position of
1310    the decl.  */
1311
1312 tree
1313 create_index_type (tree min, tree max, tree index, Node_Id gnat_node)
1314 {
1315   /* First build a type for the desired range.  */
1316   tree type = build_index_2_type (min, max);
1317
1318   /* If this type has the TYPE_INDEX_TYPE we want, return it.  Otherwise, if it
1319      doesn't have TYPE_INDEX_TYPE set, set it to INDEX.  If TYPE_INDEX_TYPE
1320      is set, but not to INDEX, make a copy of this type with the requested
1321      index type.  Note that we have no way of sharing these types, but that's
1322      only a small hole.  */
1323   if (TYPE_INDEX_TYPE (type) == index)
1324     return type;
1325   else if (TYPE_INDEX_TYPE (type))
1326     type = copy_type (type);
1327
1328   SET_TYPE_INDEX_TYPE (type, index);
1329   create_type_decl (NULL_TREE, type, NULL, true, false, gnat_node);
1330   return type;
1331 }
1332 \f
1333 /* Return a TYPE_DECL node. TYPE_NAME gives the name of the type (a character
1334    string) and TYPE is a ..._TYPE node giving its data type.
1335    ARTIFICIAL_P is true if this is a declaration that was generated
1336    by the compiler.  DEBUG_INFO_P is true if we need to write debugging
1337    information about this type.  GNAT_NODE is used for the position of
1338    the decl.  */
1339
1340 tree
1341 create_type_decl (tree type_name, tree type, struct attrib *attr_list,
1342                   bool artificial_p, bool debug_info_p, Node_Id gnat_node)
1343 {
1344   tree type_decl = build_decl (TYPE_DECL, type_name, type);
1345   enum tree_code code = TREE_CODE (type);
1346
1347   DECL_ARTIFICIAL (type_decl) = artificial_p;
1348
1349   if (!TYPE_IS_DUMMY_P (type))
1350     gnat_pushdecl (type_decl, gnat_node);
1351
1352   process_attributes (type_decl, attr_list);
1353
1354   /* Pass type declaration information to the debugger unless this is an
1355      UNCONSTRAINED_ARRAY_TYPE, which the debugger does not support,
1356      and ENUMERAL_TYPE or RECORD_TYPE which is handled separately, or
1357      type for which debugging information was not requested.  */
1358   if (code == UNCONSTRAINED_ARRAY_TYPE || !debug_info_p)
1359     DECL_IGNORED_P (type_decl) = 1;
1360   else if (code != ENUMERAL_TYPE
1361            && (code != RECORD_TYPE || TYPE_IS_FAT_POINTER_P (type))
1362            && !((code == POINTER_TYPE || code == REFERENCE_TYPE)
1363                 && TYPE_IS_DUMMY_P (TREE_TYPE (type))))
1364     rest_of_type_decl_compilation (type_decl);
1365
1366   return type_decl;
1367 }
1368
1369 /* Helper for create_var_decl and create_true_var_decl. Returns a GCC VAR_DECL
1370    or CONST_DECL node.
1371
1372    VAR_NAME gives the name of the variable.  ASM_NAME is its assembler name
1373    (if provided).  TYPE is its data type (a GCC ..._TYPE node).  VAR_INIT is
1374    the GCC tree for an optional initial expression; NULL_TREE if none.
1375
1376    CONST_FLAG is true if this variable is constant, in which case we might
1377    return a CONST_DECL node unless CONST_DECL_ALLOWED_FLAG is false.
1378
1379    PUBLIC_FLAG is true if this definition is to be made visible outside of
1380    the current compilation unit. This flag should be set when processing the
1381    variable definitions in a package specification.  EXTERN_FLAG is nonzero
1382    when processing an external variable declaration (as opposed to a
1383    definition: no storage is to be allocated for the variable here).
1384
1385    STATIC_FLAG is only relevant when not at top level.  In that case
1386    it indicates whether to always allocate storage to the variable.
1387
1388    GNAT_NODE is used for the position of the decl.  */
1389
1390 static tree
1391 create_var_decl_1 (tree var_name, tree asm_name, tree type, tree var_init,
1392                    bool const_flag, bool const_decl_allowed_flag,
1393                    bool public_flag, bool extern_flag, bool static_flag,
1394                    struct attrib *attr_list, Node_Id gnat_node)
1395 {
1396   bool init_const
1397     = (var_init != 0
1398        && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (var_init))
1399        && (global_bindings_p () || static_flag
1400            ? initializer_constant_valid_p (var_init, TREE_TYPE (var_init)) != 0
1401            : TREE_CONSTANT (var_init)));
1402
1403   /* Whether we will make TREE_CONSTANT the DECL we produce here, in which
1404      case the initializer may be used in-lieu of the DECL node (as done in
1405      Identifier_to_gnu).  This is useful to prevent the need of elaboration
1406      code when an identifier for which such a decl is made is in turn used as
1407      an initializer.  We used to rely on CONST vs VAR_DECL for this purpose,
1408      but extra constraints apply to this choice (see below) and are not
1409      relevant to the distinction we wish to make. */
1410   bool constant_p = const_flag && init_const;
1411
1412   /* The actual DECL node.  CONST_DECL was initially intended for enumerals
1413      and may be used for scalars in general but not for aggregates.  */
1414   tree var_decl
1415     = build_decl ((constant_p && const_decl_allowed_flag
1416                    && !AGGREGATE_TYPE_P (type)) ? CONST_DECL : VAR_DECL,
1417                   var_name, type);
1418
1419   /* If this is external, throw away any initializations (they will be done
1420      elsewhere) unless this is a a constant for which we would like to remain
1421      able to get the initializer.  If we are defining a global here, leave a
1422      constant initialization and save any variable elaborations for the
1423      elaboration routine.  If we are just annotating types, throw away the
1424      initialization if it isn't a constant.  */
1425   if ((extern_flag && !constant_p)
1426       || (type_annotate_only && var_init && !TREE_CONSTANT (var_init)))
1427     var_init = NULL_TREE;
1428
1429   /* At the global level, an initializer requiring code to be generated
1430      produces elaboration statements.  Check that such statements are allowed,
1431      that is, not violating a No_Elaboration_Code restriction.  */
1432   if (global_bindings_p () && var_init != 0 && ! init_const)
1433     Check_Elaboration_Code_Allowed (gnat_node);
1434
1435   /* Ada doesn't feature Fortran-like COMMON variables so we shouldn't
1436      try to fiddle with DECL_COMMON.  However, on platforms that don't
1437      support global BSS sections, uninitialized global variables would
1438      go in DATA instead, thus increasing the size of the executable.  */
1439   if (!flag_no_common
1440       && TREE_CODE (var_decl) == VAR_DECL
1441       && !have_global_bss_p ())
1442     DECL_COMMON (var_decl) = 1;
1443   DECL_INITIAL  (var_decl) = var_init;
1444   TREE_READONLY (var_decl) = const_flag;
1445   DECL_EXTERNAL (var_decl) = extern_flag;
1446   TREE_PUBLIC   (var_decl) = public_flag || extern_flag;
1447   TREE_CONSTANT (var_decl) = constant_p;
1448   TREE_THIS_VOLATILE (var_decl) = TREE_SIDE_EFFECTS (var_decl)
1449     = TYPE_VOLATILE (type);
1450
1451   /* If it's public and not external, always allocate storage for it.
1452      At the global binding level we need to allocate static storage for the
1453      variable if and only if it's not external. If we are not at the top level
1454      we allocate automatic storage unless requested not to.  */
1455   TREE_STATIC (var_decl)
1456     = public_flag || (global_bindings_p () ? !extern_flag : static_flag);
1457
1458   if (asm_name && VAR_OR_FUNCTION_DECL_P (var_decl))
1459     SET_DECL_ASSEMBLER_NAME (var_decl, asm_name);
1460
1461   process_attributes (var_decl, attr_list);
1462
1463   /* Add this decl to the current binding level.  */
1464   gnat_pushdecl (var_decl, gnat_node);
1465
1466   if (TREE_SIDE_EFFECTS (var_decl))
1467     TREE_ADDRESSABLE (var_decl) = 1;
1468
1469   if (TREE_CODE (var_decl) != CONST_DECL)
1470     {
1471       if (global_bindings_p ())
1472         rest_of_decl_compilation (var_decl, true, 0);
1473     }
1474   else
1475     expand_decl (var_decl);
1476
1477   return var_decl;
1478 }
1479
1480 /* Wrapper around create_var_decl_1 for cases where we don't care whether
1481    a VAR or a CONST decl node is created.  */
1482
1483 tree
1484 create_var_decl (tree var_name, tree asm_name, tree type, tree var_init,
1485                  bool const_flag, bool public_flag, bool extern_flag,
1486                  bool static_flag, struct attrib *attr_list,
1487                  Node_Id gnat_node)
1488 {
1489   return create_var_decl_1 (var_name, asm_name, type, var_init,
1490                             const_flag, true,
1491                             public_flag, extern_flag, static_flag,
1492                             attr_list, gnat_node);
1493 }
1494
1495 /* Wrapper around create_var_decl_1 for cases where a VAR_DECL node is
1496    required.  The primary intent is for DECL_CONST_CORRESPONDING_VARs, which
1497    must be VAR_DECLs and on which we want TREE_READONLY set to have them
1498    possibly assigned to a readonly data section.  */
1499
1500 tree
1501 create_true_var_decl (tree var_name, tree asm_name, tree type, tree var_init,
1502                       bool const_flag, bool public_flag, bool extern_flag,
1503                       bool static_flag, struct attrib *attr_list,
1504                       Node_Id gnat_node)
1505 {
1506   return create_var_decl_1 (var_name, asm_name, type, var_init,
1507                             const_flag, false,
1508                             public_flag, extern_flag, static_flag,
1509                             attr_list, gnat_node);
1510 }
1511 \f
1512 /* Returns a FIELD_DECL node. FIELD_NAME the field name, FIELD_TYPE is its
1513    type, and RECORD_TYPE is the type of the parent.  PACKED is nonzero if
1514    this field is in a record type with a "pragma pack".  If SIZE is nonzero
1515    it is the specified size for this field.  If POS is nonzero, it is the bit
1516    position.  If ADDRESSABLE is nonzero, it means we are allowed to take
1517    the address of this field for aliasing purposes. If it is negative, we
1518    should not make a bitfield, which is used by make_aligning_type.   */
1519
1520 tree
1521 create_field_decl (tree field_name, tree field_type, tree record_type,
1522                    int packed, tree size, tree pos, int addressable)
1523 {
1524   tree field_decl = build_decl (FIELD_DECL, field_name, field_type);
1525
1526   DECL_CONTEXT (field_decl) = record_type;
1527   TREE_READONLY (field_decl) = TYPE_READONLY (field_type);
1528
1529   /* If FIELD_TYPE is BLKmode, we must ensure this is aligned to at least a
1530      byte boundary since GCC cannot handle less-aligned BLKmode bitfields.  */
1531   if (packed && TYPE_MODE (field_type) == BLKmode)
1532     DECL_ALIGN (field_decl) = BITS_PER_UNIT;
1533
1534   /* If a size is specified, use it.  Otherwise, if the record type is packed
1535      compute a size to use, which may differ from the object's natural size.
1536      We always set a size in this case to trigger the checks for bitfield
1537      creation below, which is typically required when no position has been
1538      specified.  */
1539   if (size)
1540     size = convert (bitsizetype, size);
1541   else if (packed == 1)
1542     {
1543       size = rm_size (field_type);
1544
1545       /* For a constant size larger than MAX_FIXED_MODE_SIZE, round up to
1546          byte.  */
1547       if (TREE_CODE (size) == INTEGER_CST
1548           && compare_tree_int (size, MAX_FIXED_MODE_SIZE) > 0)
1549         size = round_up (size, BITS_PER_UNIT);
1550     }
1551
1552   /* If we may, according to ADDRESSABLE, make a bitfield if a size is
1553      specified for two reasons: first if the size differs from the natural
1554      size.  Second, if the alignment is insufficient.  There are a number of
1555      ways the latter can be true.
1556
1557      We never make a bitfield if the type of the field has a nonconstant size,
1558      because no such entity requiring bitfield operations should reach here.
1559
1560      We do *preventively* make a bitfield when there might be the need for it
1561      but we don't have all the necessary information to decide, as is the case
1562      of a field with no specified position in a packed record.
1563
1564      We also don't look at STRICT_ALIGNMENT here, and rely on later processing
1565      in layout_decl or finish_record_type to clear the bit_field indication if
1566      it is in fact not needed.  */
1567   if (addressable >= 0
1568       && size
1569       && TREE_CODE (size) == INTEGER_CST
1570       && TREE_CODE (TYPE_SIZE (field_type)) == INTEGER_CST
1571       && (!tree_int_cst_equal (size, TYPE_SIZE (field_type))
1572           || (pos && !value_factor_p (pos, TYPE_ALIGN (field_type)))
1573           || packed
1574           || (TYPE_ALIGN (record_type) != 0
1575               && TYPE_ALIGN (record_type) < TYPE_ALIGN (field_type))))
1576     {
1577       DECL_BIT_FIELD (field_decl) = 1;
1578       DECL_SIZE (field_decl) = size;
1579       if (!packed && !pos)
1580         DECL_ALIGN (field_decl)
1581           = (TYPE_ALIGN (record_type) != 0
1582              ? MIN (TYPE_ALIGN (record_type), TYPE_ALIGN (field_type))
1583              : TYPE_ALIGN (field_type));
1584     }
1585
1586   DECL_PACKED (field_decl) = pos ? DECL_BIT_FIELD (field_decl) : packed;
1587
1588   /* Bump the alignment if need be, either for bitfield/packing purposes or
1589      to satisfy the type requirements if no such consideration applies.  When
1590      we get the alignment from the type, indicate if this is from an explicit
1591      user request, which prevents stor-layout from lowering it later on.  */
1592   {
1593     int bit_align
1594       = (DECL_BIT_FIELD (field_decl) ? 1
1595          : packed && TYPE_MODE (field_type) != BLKmode ? BITS_PER_UNIT : 0);
1596
1597     if (bit_align > DECL_ALIGN (field_decl))
1598       DECL_ALIGN (field_decl) = bit_align;
1599     else if (!bit_align && TYPE_ALIGN (field_type) > DECL_ALIGN (field_decl))
1600       {
1601         DECL_ALIGN (field_decl) = TYPE_ALIGN (field_type);
1602         DECL_USER_ALIGN (field_decl) = TYPE_USER_ALIGN (field_type);
1603       }
1604   }
1605
1606   if (pos)
1607     {
1608       /* We need to pass in the alignment the DECL is known to have.
1609          This is the lowest-order bit set in POS, but no more than
1610          the alignment of the record, if one is specified.  Note
1611          that an alignment of 0 is taken as infinite.  */
1612       unsigned int known_align;
1613
1614       if (host_integerp (pos, 1))
1615         known_align = tree_low_cst (pos, 1) & - tree_low_cst (pos, 1);
1616       else
1617         known_align = BITS_PER_UNIT;
1618
1619       if (TYPE_ALIGN (record_type)
1620           && (known_align == 0 || known_align > TYPE_ALIGN (record_type)))
1621         known_align = TYPE_ALIGN (record_type);
1622
1623       layout_decl (field_decl, known_align);
1624       SET_DECL_OFFSET_ALIGN (field_decl,
1625                              host_integerp (pos, 1) ? BIGGEST_ALIGNMENT
1626                              : BITS_PER_UNIT);
1627       pos_from_bit (&DECL_FIELD_OFFSET (field_decl),
1628                     &DECL_FIELD_BIT_OFFSET (field_decl),
1629                     DECL_OFFSET_ALIGN (field_decl), pos);
1630
1631       DECL_HAS_REP_P (field_decl) = 1;
1632     }
1633
1634   /* In addition to what our caller says, claim the field is addressable if we
1635      know that its type is not suitable.
1636
1637      The field may also be "technically" nonaddressable, meaning that even if
1638      we attempt to take the field's address we will actually get the address
1639      of a copy.  This is the case for true bitfields, but the DECL_BIT_FIELD
1640      value we have at this point is not accurate enough, so we don't account
1641      for this here and let finish_record_type decide.  */
1642   if (!type_for_nonaliased_component_p (field_type))
1643     addressable = 1;
1644
1645   DECL_NONADDRESSABLE_P (field_decl) = !addressable;
1646
1647   return field_decl;
1648 }
1649 \f
1650 /* Returns a PARM_DECL node. PARAM_NAME is the name of the parameter,
1651    PARAM_TYPE is its type.  READONLY is true if the parameter is
1652    readonly (either an IN parameter or an address of a pass-by-ref
1653    parameter). */
1654
1655 tree
1656 create_param_decl (tree param_name, tree param_type, bool readonly)
1657 {
1658   tree param_decl = build_decl (PARM_DECL, param_name, param_type);
1659
1660   /* Honor targetm.calls.promote_prototypes(), as not doing so can
1661      lead to various ABI violations.  */
1662   if (targetm.calls.promote_prototypes (param_type)
1663       && (TREE_CODE (param_type) == INTEGER_TYPE
1664           || TREE_CODE (param_type) == ENUMERAL_TYPE)
1665       && TYPE_PRECISION (param_type) < TYPE_PRECISION (integer_type_node))
1666     {
1667       /* We have to be careful about biased types here.  Make a subtype
1668          of integer_type_node with the proper biasing.  */
1669       if (TREE_CODE (param_type) == INTEGER_TYPE
1670           && TYPE_BIASED_REPRESENTATION_P (param_type))
1671         {
1672           param_type
1673             = copy_type (build_range_type (integer_type_node,
1674                                            TYPE_MIN_VALUE (param_type),
1675                                            TYPE_MAX_VALUE (param_type)));
1676
1677           TYPE_BIASED_REPRESENTATION_P (param_type) = 1;
1678         }
1679       else
1680         param_type = integer_type_node;
1681     }
1682
1683   DECL_ARG_TYPE (param_decl) = param_type;
1684   TREE_READONLY (param_decl) = readonly;
1685   return param_decl;
1686 }
1687 \f
1688 /* Given a DECL and ATTR_LIST, process the listed attributes.  */
1689
1690 void
1691 process_attributes (tree decl, struct attrib *attr_list)
1692 {
1693   for (; attr_list; attr_list = attr_list->next)
1694     switch (attr_list->type)
1695       {
1696       case ATTR_MACHINE_ATTRIBUTE:
1697         decl_attributes (&decl, tree_cons (attr_list->name, attr_list->args,
1698                                            NULL_TREE),
1699                          ATTR_FLAG_TYPE_IN_PLACE);
1700         break;
1701
1702       case ATTR_LINK_ALIAS:
1703         if (! DECL_EXTERNAL (decl))
1704           {
1705             TREE_STATIC (decl) = 1;
1706             assemble_alias (decl, attr_list->name);
1707           }
1708         break;
1709
1710       case ATTR_WEAK_EXTERNAL:
1711         if (SUPPORTS_WEAK)
1712           declare_weak (decl);
1713         else
1714           post_error ("?weak declarations not supported on this target",
1715                       attr_list->error_point);
1716         break;
1717
1718       case ATTR_LINK_SECTION:
1719         if (targetm.have_named_sections)
1720           {
1721             DECL_SECTION_NAME (decl)
1722               = build_string (IDENTIFIER_LENGTH (attr_list->name),
1723                               IDENTIFIER_POINTER (attr_list->name));
1724             DECL_COMMON (decl) = 0;
1725           }
1726         else
1727           post_error ("?section attributes are not supported for this target",
1728                       attr_list->error_point);
1729         break;
1730
1731       case ATTR_LINK_CONSTRUCTOR:
1732         DECL_STATIC_CONSTRUCTOR (decl) = 1;
1733         TREE_USED (decl) = 1;
1734         break;
1735
1736       case ATTR_LINK_DESTRUCTOR:
1737         DECL_STATIC_DESTRUCTOR (decl) = 1;
1738         TREE_USED (decl) = 1;
1739         break;
1740       }
1741 }
1742 \f
1743 /* Record a global renaming pointer.  */
1744
1745 void
1746 record_global_renaming_pointer (tree decl)
1747 {
1748   gcc_assert (DECL_RENAMED_OBJECT (decl));
1749   VEC_safe_push (tree, gc, global_renaming_pointers, decl);
1750 }
1751
1752 /* Invalidate the global renaming pointers.   */
1753
1754 void
1755 invalidate_global_renaming_pointers (void)
1756 {
1757   unsigned int i;
1758   tree iter;
1759
1760   for (i = 0; VEC_iterate(tree, global_renaming_pointers, i, iter); i++)
1761     SET_DECL_RENAMED_OBJECT (iter, NULL_TREE);
1762
1763   VEC_free (tree, gc, global_renaming_pointers);
1764 }
1765
1766 /* Return true if VALUE is a known to be a multiple of FACTOR, which must be
1767    a power of 2. */
1768
1769 bool
1770 value_factor_p (tree value, HOST_WIDE_INT factor)
1771 {
1772   if (host_integerp (value, 1))
1773     return tree_low_cst (value, 1) % factor == 0;
1774
1775   if (TREE_CODE (value) == MULT_EXPR)
1776     return (value_factor_p (TREE_OPERAND (value, 0), factor)
1777             || value_factor_p (TREE_OPERAND (value, 1), factor));
1778
1779   return 0;
1780 }
1781
1782 /* Given 2 consecutive field decls PREV_FIELD and CURR_FIELD, return true
1783    unless we can prove these 2 fields are laid out in such a way that no gap
1784    exist between the end of PREV_FIELD and the beginning of CURR_FIELD.  OFFSET
1785    is the distance in bits between the end of PREV_FIELD and the starting
1786    position of CURR_FIELD. It is ignored if null. */
1787
1788 static bool
1789 potential_alignment_gap (tree prev_field, tree curr_field, tree offset)
1790 {
1791   /* If this is the first field of the record, there cannot be any gap */
1792   if (!prev_field)
1793     return false;
1794
1795   /* If the previous field is a union type, then return False: The only
1796      time when such a field is not the last field of the record is when
1797      there are other components at fixed positions after it (meaning there
1798      was a rep clause for every field), in which case we don't want the
1799      alignment constraint to override them. */
1800   if (TREE_CODE (TREE_TYPE (prev_field)) == QUAL_UNION_TYPE)
1801     return false;
1802
1803   /* If the distance between the end of prev_field and the beginning of
1804      curr_field is constant, then there is a gap if the value of this
1805      constant is not null. */
1806   if (offset && host_integerp (offset, 1))
1807     return !integer_zerop (offset);
1808
1809   /* If the size and position of the previous field are constant,
1810      then check the sum of this size and position. There will be a gap
1811      iff it is not multiple of the current field alignment. */
1812   if (host_integerp (DECL_SIZE (prev_field), 1)
1813       && host_integerp (bit_position (prev_field), 1))
1814     return ((tree_low_cst (bit_position (prev_field), 1)
1815              + tree_low_cst (DECL_SIZE (prev_field), 1))
1816             % DECL_ALIGN (curr_field) != 0);
1817
1818   /* If both the position and size of the previous field are multiples
1819      of the current field alignment, there cannot be any gap. */
1820   if (value_factor_p (bit_position (prev_field), DECL_ALIGN (curr_field))
1821       && value_factor_p (DECL_SIZE (prev_field), DECL_ALIGN (curr_field)))
1822     return false;
1823
1824   /* Fallback, return that there may be a potential gap */
1825   return true;
1826 }
1827
1828 /* Returns a LABEL_DECL node for LABEL_NAME.  */
1829
1830 tree
1831 create_label_decl (tree label_name)
1832 {
1833   tree label_decl = build_decl (LABEL_DECL, label_name, void_type_node);
1834
1835   DECL_CONTEXT (label_decl)     = current_function_decl;
1836   DECL_MODE (label_decl)        = VOIDmode;
1837   DECL_SOURCE_LOCATION (label_decl) = input_location;
1838
1839   return label_decl;
1840 }
1841 \f
1842 /* Returns a FUNCTION_DECL node.  SUBPROG_NAME is the name of the subprogram,
1843    ASM_NAME is its assembler name, SUBPROG_TYPE is its type (a FUNCTION_TYPE
1844    node), PARAM_DECL_LIST is the list of the subprogram arguments (a list of
1845    PARM_DECL nodes chained through the TREE_CHAIN field).
1846
1847    INLINE_FLAG, PUBLIC_FLAG, EXTERN_FLAG, and ATTR_LIST are used to set the
1848    appropriate fields in the FUNCTION_DECL.  GNAT_NODE gives the location.  */
1849
1850 tree
1851 create_subprog_decl (tree subprog_name, tree asm_name,
1852                      tree subprog_type, tree param_decl_list, bool inline_flag,
1853                      bool public_flag, bool extern_flag,
1854                      struct attrib *attr_list, Node_Id gnat_node)
1855 {
1856   tree return_type  = TREE_TYPE (subprog_type);
1857   tree subprog_decl = build_decl (FUNCTION_DECL, subprog_name, subprog_type);
1858
1859   /* If this is a function nested inside an inlined external function, it
1860      means we aren't going to compile the outer function unless it is
1861      actually inlined, so do the same for us.  */
1862   if (current_function_decl && DECL_INLINE (current_function_decl)
1863       && DECL_EXTERNAL (current_function_decl))
1864     extern_flag = true;
1865
1866   DECL_EXTERNAL (subprog_decl)  = extern_flag;
1867   TREE_PUBLIC (subprog_decl)    = public_flag;
1868   TREE_STATIC (subprog_decl)    = 1;
1869   TREE_READONLY (subprog_decl)  = TYPE_READONLY (subprog_type);
1870   TREE_THIS_VOLATILE (subprog_decl) = TYPE_VOLATILE (subprog_type);
1871   TREE_SIDE_EFFECTS (subprog_decl) = TYPE_VOLATILE (subprog_type);
1872   DECL_ARGUMENTS (subprog_decl) = param_decl_list;
1873   DECL_RESULT (subprog_decl)    = build_decl (RESULT_DECL, 0, return_type);
1874   DECL_ARTIFICIAL (DECL_RESULT (subprog_decl)) = 1;
1875   DECL_IGNORED_P (DECL_RESULT (subprog_decl)) = 1;
1876
1877    /* TREE_ADDRESSABLE is set on the result type to request the use of the
1878       target by-reference return mechanism.  This is not supported all the
1879       way down to RTL expansion with GCC 4, which ICEs on temporary creation
1880       attempts with such a type and expects DECL_BY_REFERENCE to be set on
1881       the RESULT_DECL instead - see gnat_genericize for more details.  */
1882    if (TREE_ADDRESSABLE (TREE_TYPE (DECL_RESULT (subprog_decl))))
1883      {
1884        tree result_decl = DECL_RESULT (subprog_decl);
1885
1886        TREE_ADDRESSABLE (TREE_TYPE (result_decl)) = 0;
1887        DECL_BY_REFERENCE (result_decl) = 1;
1888      }
1889
1890   if (inline_flag)
1891     DECL_DECLARED_INLINE_P (subprog_decl) = 1;
1892
1893   if (asm_name)
1894     SET_DECL_ASSEMBLER_NAME (subprog_decl, asm_name);
1895
1896   process_attributes (subprog_decl, attr_list);
1897
1898   /* Add this decl to the current binding level.  */
1899   gnat_pushdecl (subprog_decl, gnat_node);
1900
1901   /* Output the assembler code and/or RTL for the declaration.  */
1902   rest_of_decl_compilation (subprog_decl, global_bindings_p (), 0);
1903
1904   return subprog_decl;
1905 }
1906 \f
1907 /* Set up the framework for generating code for SUBPROG_DECL, a subprogram
1908    body.  This routine needs to be invoked before processing the declarations
1909    appearing in the subprogram.  */
1910
1911 void
1912 begin_subprog_body (tree subprog_decl)
1913 {
1914   tree param_decl;
1915
1916   current_function_decl = subprog_decl;
1917   announce_function (subprog_decl);
1918
1919   /* Enter a new binding level and show that all the parameters belong to
1920      this function.  */
1921   gnat_pushlevel ();
1922   for (param_decl = DECL_ARGUMENTS (subprog_decl); param_decl;
1923        param_decl = TREE_CHAIN (param_decl))
1924     DECL_CONTEXT (param_decl) = subprog_decl;
1925
1926   make_decl_rtl (subprog_decl);
1927
1928   /* We handle pending sizes via the elaboration of types, so we don't need to
1929      save them.  This causes them to be marked as part of the outer function
1930      and then discarded.  */
1931   get_pending_sizes ();
1932 }
1933
1934
1935 /* Helper for the genericization callback.  Return a dereference of VAL
1936    if it is of a reference type.  */
1937
1938 static tree
1939 convert_from_reference (tree val)
1940 {
1941   tree value_type, ref;
1942
1943   if (TREE_CODE (TREE_TYPE (val)) != REFERENCE_TYPE)
1944     return val;
1945
1946   value_type =  TREE_TYPE (TREE_TYPE (val));
1947   ref = build1 (INDIRECT_REF, value_type, val);
1948
1949   /* See if what we reference is CONST or VOLATILE, which requires
1950      looking into array types to get to the component type.  */
1951
1952   while (TREE_CODE (value_type) == ARRAY_TYPE)
1953     value_type = TREE_TYPE (value_type);
1954
1955   TREE_READONLY (ref)
1956     = (TYPE_QUALS (value_type) & TYPE_QUAL_CONST);
1957   TREE_THIS_VOLATILE (ref)
1958     = (TYPE_QUALS (value_type) & TYPE_QUAL_VOLATILE);
1959
1960   TREE_SIDE_EFFECTS (ref)
1961     = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
1962
1963   return ref;
1964 }
1965
1966 /* Helper for the genericization callback.  Returns true if T denotes
1967    a RESULT_DECL with DECL_BY_REFERENCE set.  */
1968
1969 static inline bool
1970 is_byref_result (tree t)
1971 {
1972   return (TREE_CODE (t) == RESULT_DECL && DECL_BY_REFERENCE (t));
1973 }
1974
1975
1976 /* Tree walking callback for gnat_genericize. Currently ...
1977
1978    o Adjust references to the function's DECL_RESULT if it is marked
1979      DECL_BY_REFERENCE and so has had its type turned into a reference
1980      type at the end of the function compilation.  */
1981
1982 static tree
1983 gnat_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
1984 {
1985   /* This implementation is modeled after what the C++ front-end is
1986      doing, basis of the downstream passes behavior.  */
1987
1988   tree stmt = *stmt_p;
1989   struct pointer_set_t *p_set = (struct pointer_set_t*) data;
1990
1991   /* If we have a direct mention of the result decl, dereference.  */
1992   if (is_byref_result (stmt))
1993     {
1994       *stmt_p = convert_from_reference (stmt);
1995       *walk_subtrees = 0;
1996       return NULL;
1997     }
1998
1999   /* Otherwise, no need to walk the the same tree twice.  */
2000   if (pointer_set_contains (p_set, stmt))
2001     {
2002       *walk_subtrees = 0;
2003       return NULL_TREE;
2004     }
2005
2006   /* If we are taking the address of what now is a reference, just get the
2007      reference value.  */
2008   if (TREE_CODE (stmt) == ADDR_EXPR
2009       && is_byref_result (TREE_OPERAND (stmt, 0)))
2010     {
2011       *stmt_p = convert (TREE_TYPE (stmt), TREE_OPERAND (stmt, 0));
2012       *walk_subtrees = 0;
2013     }
2014
2015   /* Don't dereference an by-reference RESULT_DECL inside a RETURN_EXPR.  */
2016   else if (TREE_CODE (stmt) == RETURN_EXPR
2017            && TREE_OPERAND (stmt, 0)
2018            && is_byref_result (TREE_OPERAND (stmt, 0)))
2019     *walk_subtrees = 0;
2020
2021   /* Don't look inside trees that cannot embed references of interest.  */
2022   else if (IS_TYPE_OR_DECL_P (stmt))
2023     *walk_subtrees = 0;
2024
2025   pointer_set_insert (p_set, *stmt_p);
2026
2027   return NULL;
2028 }
2029
2030 /* Perform lowering of Ada trees to GENERIC. In particular:
2031
2032    o Turn a DECL_BY_REFERENCE RESULT_DECL into a real by-reference decl
2033      and adjust all the references to this decl accordingly.  */
2034
2035 static void
2036 gnat_genericize (tree fndecl)
2037 {
2038   /* Prior to GCC 4, an explicit By_Reference result mechanism for a function
2039      was handled by simply setting TREE_ADDRESSABLE on the result type.
2040      Everything required to actually pass by invisible ref using the target
2041      mechanism (e.g. extra parameter) was handled at RTL expansion time.
2042
2043      This doesn't work with GCC 4 any more for several reasons.  First, the
2044      gimplification process might need the creation of temporaries of this
2045      type, and the gimplifier ICEs on such attempts.  Second, the middle-end
2046      now relies on a different attribute for such cases (DECL_BY_REFERENCE on
2047      RESULT/PARM_DECLs), and expects the user invisible by-reference-ness to
2048      be explicitely accounted for by the front-end in the function body.
2049
2050      We achieve the complete transformation in two steps:
2051
2052      1/ create_subprog_decl performs early attribute tweaks: it clears
2053         TREE_ADDRESSABLE from the result type and sets DECL_BY_REFERENCE on
2054         the result decl.  The former ensures that the bit isn't set in the GCC
2055         tree saved for the function, so prevents ICEs on temporary creation.
2056         The latter we use here to trigger the rest of the processing.
2057
2058      2/ This function performs the type transformation on the result decl
2059         and adjusts all the references to this decl from the function body
2060         accordingly.
2061
2062      Clearing TREE_ADDRESSABLE from the type differs from the C++ front-end
2063      strategy, which escapes the gimplifier temporary creation issues by
2064      creating it's own temporaries using TARGET_EXPR nodes.  Our way relies
2065      on simple specific support code in aggregate_value_p to look at the
2066      target function result decl explicitely.  */
2067
2068   struct pointer_set_t *p_set;
2069   tree decl_result = DECL_RESULT (fndecl);
2070
2071   if (!DECL_BY_REFERENCE (decl_result))
2072     return;
2073
2074   /* Make the DECL_RESULT explicitely by-reference and adjust all the
2075      occurrences in the function body using the common tree-walking facility.
2076      We want to see every occurrence of the result decl to adjust the
2077      referencing tree, so need to use our own pointer set to control which
2078      trees should be visited again or not.  */
2079
2080   p_set = pointer_set_create ();
2081
2082   TREE_TYPE (decl_result) = build_reference_type (TREE_TYPE (decl_result));
2083   TREE_ADDRESSABLE (decl_result) = 0;
2084   relayout_decl (decl_result);
2085
2086   walk_tree (&DECL_SAVED_TREE (fndecl), gnat_genericize_r, p_set, NULL);
2087
2088   pointer_set_destroy (p_set);
2089 }
2090
2091 /* Finish the definition of the current subprogram and compile it all the way
2092    to assembler language output.  BODY is the tree corresponding to
2093    the subprogram.  */
2094
2095 void
2096 end_subprog_body (tree body)
2097 {
2098   tree fndecl = current_function_decl;
2099
2100   /* Mark the BLOCK for this level as being for this function and pop the
2101      level.  Since the vars in it are the parameters, clear them.  */
2102   BLOCK_VARS (current_binding_level->block) = 0;
2103   BLOCK_SUPERCONTEXT (current_binding_level->block) = fndecl;
2104   DECL_INITIAL (fndecl) = current_binding_level->block;
2105   gnat_poplevel ();
2106
2107   /* Deal with inline.  If declared inline or we should default to inline,
2108      set the flag in the decl.  */
2109   DECL_INLINE (fndecl)
2110     = DECL_DECLARED_INLINE_P (fndecl) || flag_inline_trees == 2;
2111
2112   /* We handle pending sizes via the elaboration of types, so we don't
2113      need to save them.  */
2114   get_pending_sizes ();
2115
2116   /* Mark the RESULT_DECL as being in this subprogram. */
2117   DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
2118
2119   DECL_SAVED_TREE (fndecl) = body;
2120
2121   current_function_decl = DECL_CONTEXT (fndecl);
2122   set_cfun (NULL);
2123
2124   /* We cannot track the location of errors past this point.  */
2125   error_gnat_node = Empty;
2126
2127   /* If we're only annotating types, don't actually compile this function.  */
2128   if (type_annotate_only)
2129     return;
2130
2131   /* Perform the required pre-gimplfication transformations on the tree.  */
2132   gnat_genericize (fndecl);
2133
2134   /* We do different things for nested and non-nested functions.
2135      ??? This should be in cgraph.  */
2136   if (!DECL_CONTEXT (fndecl))
2137     {
2138       gnat_gimplify_function (fndecl);
2139       cgraph_finalize_function (fndecl, false);
2140     }
2141   else
2142     /* Register this function with cgraph just far enough to get it
2143        added to our parent's nested function list.  */
2144     (void) cgraph_node (fndecl);
2145 }
2146
2147 /* Convert FNDECL's code to GIMPLE and handle any nested functions.  */
2148
2149 static void
2150 gnat_gimplify_function (tree fndecl)
2151 {
2152   struct cgraph_node *cgn;
2153
2154   dump_function (TDI_original, fndecl);
2155   gimplify_function_tree (fndecl);
2156   dump_function (TDI_generic, fndecl);
2157
2158   /* Convert all nested functions to GIMPLE now.  We do things in this order
2159      so that items like VLA sizes are expanded properly in the context of the
2160      correct function.  */
2161   cgn = cgraph_node (fndecl);
2162   for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
2163     gnat_gimplify_function (cgn->decl);
2164 }
2165 \f
2166
2167 tree
2168 gnat_builtin_function (tree decl)
2169 {
2170   gnat_pushdecl (decl, Empty);
2171   return decl;
2172 }
2173
2174 /* Handle a "const" attribute; arguments as in
2175    struct attribute_spec.handler.  */
2176
2177 static tree
2178 handle_const_attribute (tree *node, tree ARG_UNUSED (name),
2179                         tree ARG_UNUSED (args), int ARG_UNUSED (flags),
2180                         bool *no_add_attrs)
2181 {
2182   if (TREE_CODE (*node) == FUNCTION_DECL)
2183     TREE_READONLY (*node) = 1;
2184   else
2185     *no_add_attrs = true;
2186
2187   return NULL_TREE;
2188 }
2189
2190 /* Handle a "nothrow" attribute; arguments as in
2191    struct attribute_spec.handler.  */
2192
2193 static tree
2194 handle_nothrow_attribute (tree *node, tree ARG_UNUSED (name),
2195                           tree ARG_UNUSED (args), int ARG_UNUSED (flags),
2196                           bool *no_add_attrs)
2197 {
2198   if (TREE_CODE (*node) == FUNCTION_DECL)
2199     TREE_NOTHROW (*node) = 1;
2200   else
2201     *no_add_attrs = true;
2202
2203   return NULL_TREE;
2204 }
2205
2206 /* Return an integer type with the number of bits of precision given by
2207    PRECISION.  UNSIGNEDP is nonzero if the type is unsigned; otherwise
2208    it is a signed type.  */
2209
2210 tree
2211 gnat_type_for_size (unsigned precision, int unsignedp)
2212 {
2213   tree t;
2214   char type_name[20];
2215
2216   if (precision <= 2 * MAX_BITS_PER_WORD
2217       && signed_and_unsigned_types[precision][unsignedp])
2218     return signed_and_unsigned_types[precision][unsignedp];
2219
2220  if (unsignedp)
2221     t = make_unsigned_type (precision);
2222   else
2223     t = make_signed_type (precision);
2224
2225   if (precision <= 2 * MAX_BITS_PER_WORD)
2226     signed_and_unsigned_types[precision][unsignedp] = t;
2227
2228   if (!TYPE_NAME (t))
2229     {
2230       sprintf (type_name, "%sSIGNED_%d", unsignedp ? "UN" : "", precision);
2231       TYPE_NAME (t) = get_identifier (type_name);
2232     }
2233
2234   return t;
2235 }
2236
2237 /* Likewise for floating-point types.  */
2238
2239 static tree
2240 float_type_for_precision (int precision, enum machine_mode mode)
2241 {
2242   tree t;
2243   char type_name[20];
2244
2245   if (float_types[(int) mode])
2246     return float_types[(int) mode];
2247
2248   float_types[(int) mode] = t = make_node (REAL_TYPE);
2249   TYPE_PRECISION (t) = precision;
2250   layout_type (t);
2251
2252   gcc_assert (TYPE_MODE (t) == mode);
2253   if (!TYPE_NAME (t))
2254     {
2255       sprintf (type_name, "FLOAT_%d", precision);
2256       TYPE_NAME (t) = get_identifier (type_name);
2257     }
2258
2259   return t;
2260 }
2261
2262 /* Return a data type that has machine mode MODE.  UNSIGNEDP selects
2263    an unsigned type; otherwise a signed type is returned.  */
2264
2265 tree
2266 gnat_type_for_mode (enum machine_mode mode, int unsignedp)
2267 {
2268   if (mode == BLKmode)
2269     return NULL_TREE;
2270   else if (mode == VOIDmode)
2271     return void_type_node;
2272   else if (COMPLEX_MODE_P (mode))
2273     return NULL_TREE;
2274   else if (SCALAR_FLOAT_MODE_P (mode))
2275     return float_type_for_precision (GET_MODE_PRECISION (mode), mode);
2276   else if (SCALAR_INT_MODE_P (mode))
2277     return gnat_type_for_size (GET_MODE_BITSIZE (mode), unsignedp);
2278   else
2279     return NULL_TREE;
2280 }
2281
2282 /* Return the unsigned version of a TYPE_NODE, a scalar type.  */
2283
2284 tree
2285 gnat_unsigned_type (tree type_node)
2286 {
2287   tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 1);
2288
2289   if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node))
2290     {
2291       type = copy_node (type);
2292       TREE_TYPE (type) = type_node;
2293     }
2294   else if (TREE_TYPE (type_node)
2295            && TREE_CODE (TREE_TYPE (type_node)) == INTEGER_TYPE
2296            && TYPE_MODULAR_P (TREE_TYPE (type_node)))
2297     {
2298       type = copy_node (type);
2299       TREE_TYPE (type) = TREE_TYPE (type_node);
2300     }
2301
2302   return type;
2303 }
2304
2305 /* Return the signed version of a TYPE_NODE, a scalar type.  */
2306
2307 tree
2308 gnat_signed_type (tree type_node)
2309 {
2310   tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 0);
2311
2312   if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node))
2313     {
2314       type = copy_node (type);
2315       TREE_TYPE (type) = type_node;
2316     }
2317   else if (TREE_TYPE (type_node)
2318            && TREE_CODE (TREE_TYPE (type_node)) == INTEGER_TYPE
2319            && TYPE_MODULAR_P (TREE_TYPE (type_node)))
2320     {
2321       type = copy_node (type);
2322       TREE_TYPE (type) = TREE_TYPE (type_node);
2323     }
2324
2325   return type;
2326 }
2327
2328 \f
2329 /* EXP is an expression for the size of an object.  If this size contains
2330    discriminant references, replace them with the maximum (if MAX_P) or
2331    minimum (if !MAX_P) possible value of the discriminant.  */
2332
2333 tree
2334 max_size (tree exp, bool max_p)
2335 {
2336   enum tree_code code = TREE_CODE (exp);
2337   tree type = TREE_TYPE (exp);
2338
2339   switch (TREE_CODE_CLASS (code))
2340     {
2341     case tcc_declaration:
2342     case tcc_constant:
2343       return exp;
2344
2345     case tcc_vl_exp:
2346       if (code == CALL_EXPR)
2347         {
2348           tree *argarray;
2349           int i, n = call_expr_nargs (exp);
2350           gcc_assert (n > 0);
2351
2352           argarray = (tree *) alloca (n * sizeof (tree));
2353           for (i = 0; i < n; i++)
2354             argarray[i] = max_size (CALL_EXPR_ARG (exp, i), max_p);
2355           return build_call_array (type, CALL_EXPR_FN (exp), n, argarray);
2356         }
2357       break;
2358
2359     case tcc_reference:
2360       /* If this contains a PLACEHOLDER_EXPR, it is the thing we want to
2361          modify.  Otherwise, we treat it like a variable.  */
2362       if (!CONTAINS_PLACEHOLDER_P (exp))
2363         return exp;
2364
2365       type = TREE_TYPE (TREE_OPERAND (exp, 1));
2366       return
2367         max_size (max_p ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type), true);
2368
2369     case tcc_comparison:
2370       return max_p ? size_one_node : size_zero_node;
2371
2372     case tcc_unary:
2373     case tcc_binary:
2374     case tcc_expression:
2375       switch (TREE_CODE_LENGTH (code))
2376         {
2377         case 1:
2378           if (code == NON_LVALUE_EXPR)
2379             return max_size (TREE_OPERAND (exp, 0), max_p);
2380           else
2381             return
2382               fold_build1 (code, type,
2383                            max_size (TREE_OPERAND (exp, 0),
2384                                      code == NEGATE_EXPR ? !max_p : max_p));
2385
2386         case 2:
2387           if (code == COMPOUND_EXPR)
2388             return max_size (TREE_OPERAND (exp, 1), max_p);
2389
2390           /* Calculate "(A ? B : C) - D" as "A ? B - D : C - D" which
2391              may provide a tighter bound on max_size.  */
2392           if (code == MINUS_EXPR
2393               && TREE_CODE (TREE_OPERAND (exp, 0)) == COND_EXPR)
2394             {
2395               tree lhs = fold_build2 (MINUS_EXPR, type,
2396                                       TREE_OPERAND (TREE_OPERAND (exp, 0), 1),
2397                                       TREE_OPERAND (exp, 1));
2398               tree rhs = fold_build2 (MINUS_EXPR, type,
2399                                       TREE_OPERAND (TREE_OPERAND (exp, 0), 2),
2400                                       TREE_OPERAND (exp, 1));
2401               return fold_build2 (max_p ? MAX_EXPR : MIN_EXPR, type,
2402                                   max_size (lhs, max_p),
2403                                   max_size (rhs, max_p));
2404             }
2405
2406           {
2407             tree lhs = max_size (TREE_OPERAND (exp, 0), max_p);
2408             tree rhs = max_size (TREE_OPERAND (exp, 1),
2409                                  code == MINUS_EXPR ? !max_p : max_p);
2410
2411             /* Special-case wanting the maximum value of a MIN_EXPR.
2412                In that case, if one side overflows, return the other.
2413                sizetype is signed, but we know sizes are non-negative.
2414                Likewise, handle a MINUS_EXPR or PLUS_EXPR with the LHS
2415                overflowing or the maximum possible value and the RHS
2416                a variable.  */
2417             if (max_p
2418                 && code == MIN_EXPR
2419                 && TREE_CODE (rhs) == INTEGER_CST
2420                 && TREE_OVERFLOW (rhs))
2421               return lhs;
2422             else if (max_p
2423                      && code == MIN_EXPR
2424                      && TREE_CODE (lhs) == INTEGER_CST
2425                      && TREE_OVERFLOW (lhs))
2426               return rhs;
2427             else if ((code == MINUS_EXPR || code == PLUS_EXPR)
2428                      && ((TREE_CODE (lhs) == INTEGER_CST
2429                           && TREE_OVERFLOW (lhs))
2430                          || operand_equal_p (lhs, TYPE_MAX_VALUE (type), 0))
2431                      && !TREE_CONSTANT (rhs))
2432               return lhs;
2433             else
2434               return fold_build2 (code, type, lhs, rhs);
2435           }
2436
2437         case 3:
2438           if (code == SAVE_EXPR)
2439             return exp;
2440           else if (code == COND_EXPR)
2441             return fold_build2 (max_p ? MAX_EXPR : MIN_EXPR, type,
2442                                 max_size (TREE_OPERAND (exp, 1), max_p),
2443                                 max_size (TREE_OPERAND (exp, 2), max_p));
2444         }
2445
2446       /* Other tree classes cannot happen.  */
2447     default:
2448       break;
2449     }
2450
2451   gcc_unreachable ();
2452 }
2453 \f
2454 /* Build a template of type TEMPLATE_TYPE from the array bounds of ARRAY_TYPE.
2455    EXPR is an expression that we can use to locate any PLACEHOLDER_EXPRs.
2456    Return a constructor for the template.  */
2457
2458 tree
2459 build_template (tree template_type, tree array_type, tree expr)
2460 {
2461   tree template_elts = NULL_TREE;
2462   tree bound_list = NULL_TREE;
2463   tree field;
2464
2465   if (TREE_CODE (array_type) == RECORD_TYPE
2466       && (TYPE_IS_PADDING_P (array_type)
2467           || TYPE_JUSTIFIED_MODULAR_P (array_type)))
2468     array_type = TREE_TYPE (TYPE_FIELDS (array_type));
2469
2470   if (TREE_CODE (array_type) == ARRAY_TYPE
2471       || (TREE_CODE (array_type) == INTEGER_TYPE
2472           && TYPE_HAS_ACTUAL_BOUNDS_P (array_type)))
2473     bound_list = TYPE_ACTUAL_BOUNDS (array_type);
2474
2475   /* First make the list for a CONSTRUCTOR for the template.  Go down the
2476      field list of the template instead of the type chain because this
2477      array might be an Ada array of arrays and we can't tell where the
2478      nested arrays stop being the underlying object.  */
2479
2480   for (field = TYPE_FIELDS (template_type); field;
2481        (bound_list
2482         ? (bound_list = TREE_CHAIN (bound_list))
2483         : (array_type = TREE_TYPE (array_type))),
2484        field = TREE_CHAIN (TREE_CHAIN (field)))
2485     {
2486       tree bounds, min, max;
2487
2488       /* If we have a bound list, get the bounds from there.  Likewise
2489          for an ARRAY_TYPE.  Otherwise, if expr is a PARM_DECL with
2490          DECL_BY_COMPONENT_PTR_P, use the bounds of the field in the template.
2491          This will give us a maximum range.  */
2492       if (bound_list)
2493         bounds = TREE_VALUE (bound_list);
2494       else if (TREE_CODE (array_type) == ARRAY_TYPE)
2495         bounds = TYPE_INDEX_TYPE (TYPE_DOMAIN (array_type));
2496       else if (expr && TREE_CODE (expr) == PARM_DECL
2497                && DECL_BY_COMPONENT_PTR_P (expr))
2498         bounds = TREE_TYPE (field);
2499       else
2500         gcc_unreachable ();
2501
2502       min = convert (TREE_TYPE (field), TYPE_MIN_VALUE (bounds));
2503       max = convert (TREE_TYPE (TREE_CHAIN (field)), TYPE_MAX_VALUE (bounds));
2504
2505       /* If either MIN or MAX involve a PLACEHOLDER_EXPR, we must
2506          substitute it from OBJECT.  */
2507       min = SUBSTITUTE_PLACEHOLDER_IN_EXPR (min, expr);
2508       max = SUBSTITUTE_PLACEHOLDER_IN_EXPR (max, expr);
2509
2510       template_elts = tree_cons (TREE_CHAIN (field), max,
2511                                  tree_cons (field, min, template_elts));
2512     }
2513
2514   return gnat_build_constructor (template_type, nreverse (template_elts));
2515 }
2516 \f
2517 /* Build a VMS descriptor from a Mechanism_Type, which must specify
2518    a descriptor type, and the GCC type of an object.  Each FIELD_DECL
2519    in the type contains in its DECL_INITIAL the expression to use when
2520    a constructor is made for the type.  GNAT_ENTITY is an entity used
2521    to print out an error message if the mechanism cannot be applied to
2522    an object of that type and also for the name.  */
2523
2524 tree
2525 build_vms_descriptor (tree type, Mechanism_Type mech, Entity_Id gnat_entity)
2526 {
2527   tree record_type = make_node (RECORD_TYPE);
2528   tree pointer32_type;
2529   tree field_list = 0;
2530   int class;
2531   int dtype = 0;
2532   tree inner_type;
2533   int ndim;
2534   int i;
2535   tree *idx_arr;
2536   tree tem;
2537
2538   /* If TYPE is an unconstrained array, use the underlying array type.  */
2539   if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
2540     type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type))));
2541
2542   /* If this is an array, compute the number of dimensions in the array,
2543      get the index types, and point to the inner type.  */
2544   if (TREE_CODE (type) != ARRAY_TYPE)
2545     ndim = 0;
2546   else
2547     for (ndim = 1, inner_type = type;
2548          TREE_CODE (TREE_TYPE (inner_type)) == ARRAY_TYPE
2549          && TYPE_MULTI_ARRAY_P (TREE_TYPE (inner_type));
2550          ndim++, inner_type = TREE_TYPE (inner_type))
2551       ;
2552
2553   idx_arr = (tree *) alloca (ndim * sizeof (tree));
2554
2555   if (mech != By_Descriptor_NCA
2556       && TREE_CODE (type) == ARRAY_TYPE && TYPE_CONVENTION_FORTRAN_P (type))
2557     for (i = ndim - 1, inner_type = type;
2558          i >= 0;
2559          i--, inner_type = TREE_TYPE (inner_type))
2560       idx_arr[i] = TYPE_DOMAIN (inner_type);
2561   else
2562     for (i = 0, inner_type = type;
2563          i < ndim;
2564          i++, inner_type = TREE_TYPE (inner_type))
2565       idx_arr[i] = TYPE_DOMAIN (inner_type);
2566
2567   /* Now get the DTYPE value.  */
2568   switch (TREE_CODE (type))
2569     {
2570     case INTEGER_TYPE:
2571     case ENUMERAL_TYPE:
2572       if (TYPE_VAX_FLOATING_POINT_P (type))
2573         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2574           {
2575           case 6:
2576             dtype = 10;
2577             break;
2578           case 9:
2579             dtype = 11;
2580             break;
2581           case 15:
2582             dtype = 27;
2583             break;
2584           }
2585       else
2586         switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
2587           {
2588           case 8:
2589             dtype = TYPE_UNSIGNED (type) ? 2 : 6;
2590             break;
2591           case 16:
2592             dtype = TYPE_UNSIGNED (type) ? 3 : 7;
2593             break;
2594           case 32:
2595             dtype = TYPE_UNSIGNED (type) ? 4 : 8;
2596             break;
2597           case 64:
2598             dtype = TYPE_UNSIGNED (type) ? 5 : 9;
2599             break;
2600           case 128:
2601             dtype = TYPE_UNSIGNED (type) ? 25 : 26;
2602             break;
2603           }
2604       break;
2605
2606     case REAL_TYPE:
2607       dtype = GET_MODE_BITSIZE (TYPE_MODE (type)) == 32 ? 52 : 53;
2608       break;
2609
2610     case COMPLEX_TYPE:
2611       if (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE
2612           && TYPE_VAX_FLOATING_POINT_P (type))
2613         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2614           {
2615           case 6:
2616             dtype = 12;
2617             break;
2618           case 9:
2619             dtype = 13;
2620             break;
2621           case 15:
2622             dtype = 29;
2623           }
2624       else
2625         dtype = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) == 32 ? 54: 55;
2626       break;
2627
2628     case ARRAY_TYPE:
2629       dtype = 14;
2630       break;
2631
2632     default:
2633       break;
2634     }
2635
2636   /* Get the CLASS value.  */
2637   switch (mech)
2638     {
2639     case By_Descriptor_A:
2640       class = 4;
2641       break;
2642     case By_Descriptor_NCA:
2643       class = 10;
2644       break;
2645     case By_Descriptor_SB:
2646       class = 15;
2647       break;
2648     case By_Descriptor:
2649     case By_Descriptor_S:
2650     default:
2651       class = 1;
2652       break;
2653     }
2654
2655   /* Make the type for a descriptor for VMS.  The first four fields
2656      are the same for all types.  */
2657
2658   field_list
2659     = chainon (field_list,
2660                make_descriptor_field
2661                ("LENGTH", gnat_type_for_size (16, 1), record_type,
2662                 size_in_bytes (mech == By_Descriptor_A ? inner_type : type)));
2663
2664   field_list = chainon (field_list,
2665                         make_descriptor_field ("DTYPE",
2666                                                gnat_type_for_size (8, 1),
2667                                                record_type, size_int (dtype)));
2668   field_list = chainon (field_list,
2669                         make_descriptor_field ("CLASS",
2670                                                gnat_type_for_size (8, 1),
2671                                                record_type, size_int (class)));
2672
2673   /* Of course this will crash at run-time if the address space is not
2674      within the low 32 bits, but there is nothing else we can do.  */
2675   pointer32_type = build_pointer_type_for_mode (type, SImode, false);
2676
2677   field_list
2678     = chainon (field_list,
2679                make_descriptor_field
2680                ("POINTER", pointer32_type, record_type,
2681                 build_unary_op (ADDR_EXPR,
2682                                 pointer32_type,
2683                                 build0 (PLACEHOLDER_EXPR, type))));
2684
2685   switch (mech)
2686     {
2687     case By_Descriptor:
2688     case By_Descriptor_S:
2689       break;
2690
2691     case By_Descriptor_SB:
2692       field_list
2693         = chainon (field_list,
2694                    make_descriptor_field
2695                    ("SB_L1", gnat_type_for_size (32, 1), record_type,
2696                     TREE_CODE (type) == ARRAY_TYPE
2697                     ? TYPE_MIN_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
2698       field_list
2699         = chainon (field_list,
2700                    make_descriptor_field
2701                    ("SB_U1", gnat_type_for_size (32, 1), record_type,
2702                     TREE_CODE (type) == ARRAY_TYPE
2703                     ? TYPE_MAX_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
2704       break;
2705
2706     case By_Descriptor_A:
2707     case By_Descriptor_NCA:
2708       field_list = chainon (field_list,
2709                             make_descriptor_field ("SCALE",
2710                                                    gnat_type_for_size (8, 1),
2711                                                    record_type,
2712                                                    size_zero_node));
2713
2714       field_list = chainon (field_list,
2715                             make_descriptor_field ("DIGITS",
2716                                                    gnat_type_for_size (8, 1),
2717                                                    record_type,
2718                                                    size_zero_node));
2719
2720       field_list
2721         = chainon (field_list,
2722                    make_descriptor_field
2723                    ("AFLAGS", gnat_type_for_size (8, 1), record_type,
2724                     size_int (mech == By_Descriptor_NCA
2725                               ? 0
2726                               /* Set FL_COLUMN, FL_COEFF, and FL_BOUNDS.  */
2727                               : (TREE_CODE (type) == ARRAY_TYPE
2728                                  && TYPE_CONVENTION_FORTRAN_P (type)
2729                                  ? 224 : 192))));
2730
2731       field_list = chainon (field_list,
2732                             make_descriptor_field ("DIMCT",
2733                                                    gnat_type_for_size (8, 1),
2734                                                    record_type,
2735                                                    size_int (ndim)));
2736
2737       field_list = chainon (field_list,
2738                             make_descriptor_field ("ARSIZE",
2739                                                    gnat_type_for_size (32, 1),
2740                                                    record_type,
2741                                                    size_in_bytes (type)));
2742
2743       /* Now build a pointer to the 0,0,0... element.  */
2744       tem = build0 (PLACEHOLDER_EXPR, type);
2745       for (i = 0, inner_type = type; i < ndim;
2746            i++, inner_type = TREE_TYPE (inner_type))
2747         tem = build4 (ARRAY_REF, TREE_TYPE (inner_type), tem,
2748                       convert (TYPE_DOMAIN (inner_type), size_zero_node),
2749                       NULL_TREE, NULL_TREE);
2750
2751       field_list
2752         = chainon (field_list,
2753                    make_descriptor_field
2754                    ("A0",
2755                     build_pointer_type_for_mode (inner_type, SImode, false),
2756                     record_type,
2757                     build1 (ADDR_EXPR,
2758                             build_pointer_type_for_mode (inner_type, SImode,
2759                                                          false),
2760                             tem)));
2761
2762       /* Next come the addressing coefficients.  */
2763       tem = size_one_node;
2764       for (i = 0; i < ndim; i++)
2765         {
2766           char fname[3];
2767           tree idx_length
2768             = size_binop (MULT_EXPR, tem,
2769                           size_binop (PLUS_EXPR,
2770                                       size_binop (MINUS_EXPR,
2771                                                   TYPE_MAX_VALUE (idx_arr[i]),
2772                                                   TYPE_MIN_VALUE (idx_arr[i])),
2773                                       size_int (1)));
2774
2775           fname[0] = (mech == By_Descriptor_NCA ? 'S' : 'M');
2776           fname[1] = '0' + i, fname[2] = 0;
2777           field_list
2778             = chainon (field_list,
2779                        make_descriptor_field (fname,
2780                                               gnat_type_for_size (32, 1),
2781                                               record_type, idx_length));
2782
2783           if (mech == By_Descriptor_NCA)
2784             tem = idx_length;
2785         }
2786
2787       /* Finally here are the bounds.  */
2788       for (i = 0; i < ndim; i++)
2789         {
2790           char fname[3];
2791
2792           fname[0] = 'L', fname[1] = '0' + i, fname[2] = 0;
2793           field_list
2794             = chainon (field_list,
2795                        make_descriptor_field
2796                        (fname, gnat_type_for_size (32, 1), record_type,
2797                         TYPE_MIN_VALUE (idx_arr[i])));
2798
2799           fname[0] = 'U';
2800           field_list
2801             = chainon (field_list,
2802                        make_descriptor_field
2803                        (fname, gnat_type_for_size (32, 1), record_type,
2804                         TYPE_MAX_VALUE (idx_arr[i])));
2805         }
2806       break;
2807
2808     default:
2809       post_error ("unsupported descriptor type for &", gnat_entity);
2810     }
2811
2812   finish_record_type (record_type, field_list, 0, true);
2813   create_type_decl (create_concat_name (gnat_entity, "DESC"), record_type,
2814                     NULL, true, false, gnat_entity);
2815
2816   return record_type;
2817 }
2818
2819 /* Utility routine for above code to make a field.  */
2820
2821 static tree
2822 make_descriptor_field (const char *name, tree type,
2823                        tree rec_type, tree initial)
2824 {
2825   tree field
2826     = create_field_decl (get_identifier (name), type, rec_type, 0, 0, 0, 0);
2827
2828   DECL_INITIAL (field) = initial;
2829   return field;
2830 }
2831
2832 /* Convert GNU_EXPR, a pointer to a VMS descriptor, to GNU_TYPE, a regular
2833    pointer or fat pointer type.  GNAT_SUBPROG is the subprogram to which
2834    the VMS descriptor is passed.  */
2835
2836 static tree
2837 convert_vms_descriptor (tree gnu_type, tree gnu_expr, Entity_Id gnat_subprog)
2838 {
2839   tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr));
2840   tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr);
2841   /* The CLASS field is the 3rd field in the descriptor.  */
2842   tree class = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (desc_type)));
2843   /* The POINTER field is the 4th field in the descriptor.  */
2844   tree pointer = TREE_CHAIN (class);
2845
2846   /* Retrieve the value of the POINTER field.  */
2847   gnu_expr
2848     = build3 (COMPONENT_REF, TREE_TYPE (pointer), desc, pointer, NULL_TREE);
2849
2850   if (POINTER_TYPE_P (gnu_type))
2851     return convert (gnu_type, gnu_expr);
2852
2853   else if (TYPE_FAT_POINTER_P (gnu_type))
2854     {
2855       tree p_array_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
2856       tree p_bounds_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
2857       tree template_type = TREE_TYPE (p_bounds_type);
2858       tree min_field = TYPE_FIELDS (template_type);
2859       tree max_field = TREE_CHAIN (TYPE_FIELDS (template_type));
2860       tree template, template_addr, aflags, dimct, t, u;
2861       /* See the head comment of build_vms_descriptor.  */
2862       int iclass = TREE_INT_CST_LOW (DECL_INITIAL (class));
2863
2864       /* Convert POINTER to the type of the P_ARRAY field.  */
2865       gnu_expr = convert (p_array_type, gnu_expr);
2866
2867       switch (iclass)
2868         {
2869         case 1:  /* Class S  */
2870         case 15: /* Class SB */
2871           /* Build {1, LENGTH} template; LENGTH is the 1st field.  */
2872           t = TYPE_FIELDS (desc_type);
2873           t = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
2874           t = tree_cons (min_field,
2875                          convert (TREE_TYPE (min_field), integer_one_node),
2876                          tree_cons (max_field,
2877                                     convert (TREE_TYPE (max_field), t),
2878                                     NULL_TREE));
2879           template = gnat_build_constructor (template_type, t);
2880           template_addr = build_unary_op (ADDR_EXPR, NULL_TREE, template);
2881
2882           /* For class S, we are done.  */
2883           if (iclass == 1)
2884             break;
2885
2886           /* Test that we really have a SB descriptor, like DEC Ada.  */
2887           t = build3 (COMPONENT_REF, TREE_TYPE (class), desc, class, NULL);
2888           u = convert (TREE_TYPE (class), DECL_INITIAL (class));
2889           u = build_binary_op (EQ_EXPR, integer_type_node, t, u);
2890           /* If so, there is already a template in the descriptor and
2891              it is located right after the POINTER field.  */
2892           t = TREE_CHAIN (pointer);
2893           template = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
2894           /* Otherwise use the {1, LENGTH} template we build above.  */
2895           template_addr = build3 (COND_EXPR, p_bounds_type, u,
2896                                   build_unary_op (ADDR_EXPR, p_bounds_type,
2897                                                  template),
2898                                   template_addr);
2899           break;
2900
2901         case 4:  /* Class A */
2902           /* The AFLAGS field is the 7th field in the descriptor.  */
2903           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (pointer)));
2904           aflags = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
2905           /* The DIMCT field is the 8th field in the descriptor.  */
2906           t = TREE_CHAIN (t);
2907           dimct = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
2908           /* Raise CONSTRAINT_ERROR if either more than 1 dimension
2909              or FL_COEFF or FL_BOUNDS not set.  */
2910           u = build_int_cst (TREE_TYPE (aflags), 192);
2911           u = build_binary_op (TRUTH_OR_EXPR, integer_type_node,
2912                                build_binary_op (NE_EXPR, integer_type_node,
2913                                                 dimct,
2914                                                 convert (TREE_TYPE (dimct),
2915                                                          size_one_node)),
2916                                build_binary_op (NE_EXPR, integer_type_node,
2917                                                 build2 (BIT_AND_EXPR,
2918                                                         TREE_TYPE (aflags),
2919                                                         aflags, u),
2920                                                 u));
2921           add_stmt (build3 (COND_EXPR, void_type_node, u,
2922                             build_call_raise (CE_Length_Check_Failed, Empty,
2923                                               N_Raise_Constraint_Error),
2924                             NULL_TREE));
2925           /* There is already a template in the descriptor and it is
2926              located at the start of block 3 (12th field).  */
2927           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (t))));
2928           template = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
2929           template_addr = build_unary_op (ADDR_EXPR, p_bounds_type, template);
2930           break;
2931
2932         case 10: /* Class NCA */
2933         default:
2934           post_error ("unsupported descriptor type for &", gnat_subprog);
2935           template_addr = integer_zero_node;
2936           break;
2937         }
2938
2939       /* Build the fat pointer in the form of a constructor.  */
2940       t = tree_cons (TYPE_FIELDS (gnu_type), gnu_expr,
2941                      tree_cons (TREE_CHAIN (TYPE_FIELDS (gnu_type)),
2942                                 template_addr, NULL_TREE));
2943       return gnat_build_constructor (gnu_type, t);
2944     }
2945
2946   else
2947     gcc_unreachable ();
2948 }
2949
2950 /* Build a stub for the subprogram specified by the GCC tree GNU_SUBPROG
2951    and the GNAT node GNAT_SUBPROG.  */
2952
2953 void
2954 build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog)
2955 {
2956   tree gnu_subprog_type, gnu_subprog_addr, gnu_subprog_call;
2957   tree gnu_stub_param, gnu_param_list, gnu_arg_types, gnu_param;
2958   tree gnu_stub_decl = DECL_FUNCTION_STUB (gnu_subprog);
2959   tree gnu_body;
2960
2961   gnu_subprog_type = TREE_TYPE (gnu_subprog);
2962   gnu_param_list = NULL_TREE;
2963
2964   begin_subprog_body (gnu_stub_decl);
2965   gnat_pushlevel ();
2966
2967   start_stmt_group ();
2968
2969   /* Loop over the parameters of the stub and translate any of them
2970      passed by descriptor into a by reference one.  */
2971   for (gnu_stub_param = DECL_ARGUMENTS (gnu_stub_decl),
2972        gnu_arg_types = TYPE_ARG_TYPES (gnu_subprog_type);
2973        gnu_stub_param;
2974        gnu_stub_param = TREE_CHAIN (gnu_stub_param),
2975        gnu_arg_types = TREE_CHAIN (gnu_arg_types))
2976     {
2977       if (DECL_BY_DESCRIPTOR_P (gnu_stub_param))
2978         gnu_param = convert_vms_descriptor (TREE_VALUE (gnu_arg_types),
2979                                             gnu_stub_param, gnat_subprog);
2980       else
2981         gnu_param = gnu_stub_param;
2982
2983       gnu_param_list = tree_cons (NULL_TREE, gnu_param, gnu_param_list);
2984     }
2985
2986   gnu_body = end_stmt_group ();
2987
2988   /* Invoke the internal subprogram.  */
2989   gnu_subprog_addr = build1 (ADDR_EXPR, build_pointer_type (gnu_subprog_type),
2990                              gnu_subprog);
2991   gnu_subprog_call = build3 (CALL_EXPR, TREE_TYPE (gnu_subprog_type),
2992                              gnu_subprog_addr, nreverse (gnu_param_list),
2993                              NULL_TREE);
2994
2995   /* Propagate the return value, if any.  */
2996   if (VOID_TYPE_P (TREE_TYPE (gnu_subprog_type)))
2997     append_to_statement_list (gnu_subprog_call, &gnu_body);
2998   else
2999     append_to_statement_list (build_return_expr (DECL_RESULT (gnu_stub_decl),
3000                                                  gnu_subprog_call),
3001                               &gnu_body);
3002
3003   gnat_poplevel ();
3004
3005   allocate_struct_function (gnu_stub_decl, false);
3006   end_subprog_body (gnu_body);
3007 }
3008 \f
3009 /* Build a type to be used to represent an aliased object whose nominal
3010    type is an unconstrained array.  This consists of a RECORD_TYPE containing
3011    a field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an
3012    ARRAY_TYPE.  If ARRAY_TYPE is that of the unconstrained array, this
3013    is used to represent an arbitrary unconstrained object.  Use NAME
3014    as the name of the record.  */
3015
3016 tree
3017 build_unc_object_type (tree template_type, tree object_type, tree name)
3018 {
3019   tree type = make_node (RECORD_TYPE);
3020   tree template_field = create_field_decl (get_identifier ("BOUNDS"),
3021                                            template_type, type, 0, 0, 0, 1);
3022   tree array_field = create_field_decl (get_identifier ("ARRAY"), object_type,
3023                                         type, 0, 0, 0, 1);
3024
3025   TYPE_NAME (type) = name;
3026   TYPE_CONTAINS_TEMPLATE_P (type) = 1;
3027   finish_record_type (type,
3028                       chainon (chainon (NULL_TREE, template_field),
3029                                array_field),
3030                       0, false);
3031
3032   return type;
3033 }
3034
3035 /* Same, taking a thin or fat pointer type instead of a template type. */
3036
3037 tree
3038 build_unc_object_type_from_ptr (tree thin_fat_ptr_type, tree object_type,
3039                                 tree name)
3040 {
3041   tree template_type;
3042
3043   gcc_assert (TYPE_FAT_OR_THIN_POINTER_P (thin_fat_ptr_type));
3044
3045   template_type
3046     = (TYPE_FAT_POINTER_P (thin_fat_ptr_type)
3047        ? TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (thin_fat_ptr_type))))
3048        : TREE_TYPE (TYPE_FIELDS (TREE_TYPE (thin_fat_ptr_type))));
3049   return build_unc_object_type (template_type, object_type, name);
3050 }
3051
3052 /* Shift the component offsets within an unconstrained object TYPE to make it
3053    suitable for use as a designated type for thin pointers.  */
3054
3055 void
3056 shift_unc_components_for_thin_pointers (tree type)
3057 {
3058   /* Thin pointer values designate the ARRAY data of an unconstrained object,
3059      allocated past the BOUNDS template.  The designated type is adjusted to
3060      have ARRAY at position zero and the template at a negative offset, so
3061      that COMPONENT_REFs on (*thin_ptr) designate the proper location.  */
3062
3063   tree bounds_field = TYPE_FIELDS (type);
3064   tree array_field  = TREE_CHAIN (TYPE_FIELDS (type));
3065
3066   DECL_FIELD_OFFSET (bounds_field)
3067     = size_binop (MINUS_EXPR, size_zero_node, byte_position (array_field));
3068
3069   DECL_FIELD_OFFSET (array_field) = size_zero_node;
3070   DECL_FIELD_BIT_OFFSET (array_field) = bitsize_zero_node;
3071 }
3072 \f
3073 /* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE.  In
3074    the normal case this is just two adjustments, but we have more to do
3075    if NEW is an UNCONSTRAINED_ARRAY_TYPE.  */
3076
3077 void
3078 update_pointer_to (tree old_type, tree new_type)
3079 {
3080   tree ptr = TYPE_POINTER_TO (old_type);
3081   tree ref = TYPE_REFERENCE_TO (old_type);
3082   tree ptr1, ref1;
3083   tree type;
3084
3085   /* If this is the main variant, process all the other variants first.  */
3086   if (TYPE_MAIN_VARIANT (old_type) == old_type)
3087     for (type = TYPE_NEXT_VARIANT (old_type); type;
3088          type = TYPE_NEXT_VARIANT (type))
3089       update_pointer_to (type, new_type);
3090
3091   /* If no pointer or reference, we are done.  */
3092   if (!ptr && !ref)
3093     return;
3094
3095   /* Merge the old type qualifiers in the new type.
3096
3097      Each old variant has qualifiers for specific reasons, and the new
3098      designated type as well. Each set of qualifiers represents useful
3099      information grabbed at some point, and merging the two simply unifies
3100      these inputs into the final type description.
3101
3102      Consider for instance a volatile type frozen after an access to constant
3103      type designating it. After the designated type freeze, we get here with a
3104      volatile new_type and a dummy old_type with a readonly variant, created
3105      when the access type was processed. We shall make a volatile and readonly
3106      designated type, because that's what it really is.
3107
3108      We might also get here for a non-dummy old_type variant with different
3109      qualifiers than the new_type ones, for instance in some cases of pointers
3110      to private record type elaboration (see the comments around the call to
3111      this routine from gnat_to_gnu_entity/E_Access_Type). We have to merge the
3112      qualifiers in thoses cases too, to avoid accidentally discarding the
3113      initial set, and will often end up with old_type == new_type then.  */
3114   new_type = build_qualified_type (new_type,
3115                                    TYPE_QUALS (old_type)
3116                                    | TYPE_QUALS (new_type));
3117
3118   /* If the new type and the old one are identical, there is nothing to
3119      update.  */
3120   if (old_type == new_type)
3121     return;
3122
3123   /* Otherwise, first handle the simple case.  */
3124   if (TREE_CODE (new_type) != UNCONSTRAINED_ARRAY_TYPE)
3125     {
3126       TYPE_POINTER_TO (new_type) = ptr;
3127       TYPE_REFERENCE_TO (new_type) = ref;
3128
3129       for (; ptr; ptr = TYPE_NEXT_PTR_TO (ptr))
3130         for (ptr1 = TYPE_MAIN_VARIANT (ptr); ptr1;
3131              ptr1 = TYPE_NEXT_VARIANT (ptr1))
3132           TREE_TYPE (ptr1) = new_type;
3133
3134       for (; ref; ref = TYPE_NEXT_REF_TO (ref))
3135         for (ref1 = TYPE_MAIN_VARIANT (ref); ref1;
3136              ref1 = TYPE_NEXT_VARIANT (ref1))
3137           TREE_TYPE (ref1) = new_type;
3138     }
3139
3140   /* Now deal with the unconstrained array case. In this case the "pointer"
3141      is actually a RECORD_TYPE where both fields are pointers to dummy nodes.
3142      Turn them into pointers to the correct types using update_pointer_to.  */
3143   else if (TREE_CODE (ptr) != RECORD_TYPE || !TYPE_IS_FAT_POINTER_P (ptr))
3144     gcc_unreachable ();
3145
3146   else
3147     {
3148       tree new_obj_rec = TYPE_OBJECT_RECORD_TYPE (new_type);
3149       tree array_field = TYPE_FIELDS (ptr);
3150       tree bounds_field = TREE_CHAIN (TYPE_FIELDS (ptr));
3151       tree new_ptr = TYPE_POINTER_TO (new_type);
3152       tree new_ref;
3153       tree var;
3154
3155       /* Make pointers to the dummy template point to the real template.  */
3156       update_pointer_to
3157         (TREE_TYPE (TREE_TYPE (bounds_field)),
3158          TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (new_ptr)))));
3159
3160       /* The references to the template bounds present in the array type
3161          are made through a PLACEHOLDER_EXPR of type new_ptr.  Since we
3162          are updating ptr to make it a full replacement for new_ptr as
3163          pointer to new_type, we must rework the PLACEHOLDER_EXPR so as
3164          to make it of type ptr.  */
3165       new_ref = build3 (COMPONENT_REF, TREE_TYPE (bounds_field),
3166                         build0 (PLACEHOLDER_EXPR, ptr),
3167                         bounds_field, NULL_TREE);
3168
3169       /* Create the new array for the new PLACEHOLDER_EXPR and make
3170          pointers to the dummy array point to it.
3171
3172          ??? This is now the only use of substitute_in_type,
3173          which is a very "heavy" routine to do this, so it
3174          should be replaced at some point.  */
3175       update_pointer_to
3176         (TREE_TYPE (TREE_TYPE (array_field)),
3177          substitute_in_type (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (new_ptr))),
3178                              TREE_CHAIN (TYPE_FIELDS (new_ptr)), new_ref));
3179
3180       /* Make ptr the pointer to new_type.  */
3181       TYPE_POINTER_TO (new_type) = TYPE_REFERENCE_TO (new_type)
3182         = TREE_TYPE (new_type) = ptr;
3183
3184       for (var = TYPE_MAIN_VARIANT (ptr); var; var = TYPE_NEXT_VARIANT (var))
3185         SET_TYPE_UNCONSTRAINED_ARRAY (var, new_type);
3186
3187       /* Now handle updating the allocation record, what the thin pointer
3188          points to.  Update all pointers from the old record into the new
3189          one, update the type of the array field, and recompute the size.  */
3190       update_pointer_to (TYPE_OBJECT_RECORD_TYPE (old_type), new_obj_rec);
3191
3192       TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec)))
3193         = TREE_TYPE (TREE_TYPE (array_field));
3194
3195       /* The size recomputation needs to account for alignment constraints, so
3196          we let layout_type work it out.  This will reset the field offsets to
3197          what they would be in a regular record, so we shift them back to what
3198          we want them to be for a thin pointer designated type afterwards.  */
3199       DECL_SIZE (TYPE_FIELDS (new_obj_rec)) = 0;
3200       DECL_SIZE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec))) = 0;
3201       TYPE_SIZE (new_obj_rec) = 0;
3202       layout_type (new_obj_rec);
3203
3204       shift_unc_components_for_thin_pointers (new_obj_rec);
3205
3206       /* We are done, at last.  */
3207       rest_of_record_type_compilation (ptr);
3208     }
3209 }
3210 \f
3211 /* Convert a pointer to a constrained array into a pointer to a fat
3212    pointer.  This involves making or finding a template.  */
3213
3214 static tree
3215 convert_to_fat_pointer (tree type, tree expr)
3216 {
3217   tree template_type = TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type))));
3218   tree template, template_addr;
3219   tree etype = TREE_TYPE (expr);
3220
3221   /* If EXPR is a constant of zero, we make a fat pointer that has a null
3222      pointer to the template and array.  */
3223   if (integer_zerop (expr))
3224     return
3225       gnat_build_constructor
3226         (type,
3227          tree_cons (TYPE_FIELDS (type),
3228                     convert (TREE_TYPE (TYPE_FIELDS (type)), expr),
3229                     tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3230                                convert (build_pointer_type (template_type),
3231                                         expr),
3232                                NULL_TREE)));
3233
3234   /* If EXPR is a thin pointer, make the template and data from the record.  */
3235
3236   else if (TYPE_THIN_POINTER_P (etype))
3237     {
3238       tree fields = TYPE_FIELDS (TREE_TYPE (etype));
3239
3240       expr = save_expr (expr);
3241       if (TREE_CODE (expr) == ADDR_EXPR)
3242         expr = TREE_OPERAND (expr, 0);
3243       else
3244         expr = build1 (INDIRECT_REF, TREE_TYPE (etype), expr);
3245
3246       template = build_component_ref (expr, NULL_TREE, fields, false);
3247       expr = build_unary_op (ADDR_EXPR, NULL_TREE,
3248                              build_component_ref (expr, NULL_TREE,
3249                                                   TREE_CHAIN (fields), false));
3250     }
3251   else
3252     /* Otherwise, build the constructor for the template.  */
3253     template = build_template (template_type, TREE_TYPE (etype), expr);
3254
3255   template_addr = build_unary_op (ADDR_EXPR, NULL_TREE, template);
3256
3257   /* The result is a CONSTRUCTOR for the fat pointer.
3258
3259      If expr is an argument of a foreign convention subprogram, the type it
3260      points to is directly the component type. In this case, the expression
3261      type may not match the corresponding FIELD_DECL type at this point, so we
3262      call "convert" here to fix that up if necessary. This type consistency is
3263      required, for instance because it ensures that possible later folding of
3264      component_refs against this constructor always yields something of the
3265      same type as the initial reference.
3266
3267      Note that the call to "build_template" above is still fine, because it
3268      will only refer to the provided template_type in this case.  */
3269    return
3270      gnat_build_constructor
3271      (type, tree_cons (TYPE_FIELDS (type),
3272                       convert (TREE_TYPE (TYPE_FIELDS (type)), expr),
3273                       tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3274                                  template_addr, NULL_TREE)));
3275 }
3276 \f
3277 /* Convert to a thin pointer type, TYPE.  The only thing we know how to convert
3278    is something that is a fat pointer, so convert to it first if it EXPR
3279    is not already a fat pointer.  */
3280
3281 static tree
3282 convert_to_thin_pointer (tree type, tree expr)
3283 {
3284   if (!TYPE_FAT_POINTER_P (TREE_TYPE (expr)))
3285     expr
3286       = convert_to_fat_pointer
3287         (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type))), expr);
3288
3289   /* We get the pointer to the data and use a NOP_EXPR to make it the
3290      proper GCC type.  */
3291   expr = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (TREE_TYPE (expr)),
3292                               false);
3293   expr = build1 (NOP_EXPR, type, expr);
3294
3295   return expr;
3296 }
3297 \f
3298 /* Create an expression whose value is that of EXPR,
3299    converted to type TYPE.  The TREE_TYPE of the value
3300    is always TYPE.  This function implements all reasonable
3301    conversions; callers should filter out those that are
3302    not permitted by the language being compiled.  */
3303
3304 tree
3305 convert (tree type, tree expr)
3306 {
3307   enum tree_code code = TREE_CODE (type);
3308   tree etype = TREE_TYPE (expr);
3309   enum tree_code ecode = TREE_CODE (etype);
3310
3311   /* If EXPR is already the right type, we are done.  */
3312   if (type == etype)
3313     return expr;
3314
3315   /* If both input and output have padding and are of variable size, do this
3316      as an unchecked conversion.  Likewise if one is a mere variant of the
3317      other, so we avoid a pointless unpad/repad sequence.  */
3318   else if (ecode == RECORD_TYPE && code == RECORD_TYPE
3319            && TYPE_IS_PADDING_P (type) && TYPE_IS_PADDING_P (etype)
3320            && (!TREE_CONSTANT (TYPE_SIZE (type))
3321                || !TREE_CONSTANT (TYPE_SIZE (etype))
3322                || TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype)))
3323     ;
3324
3325   /* If the output type has padding, make a constructor to build the
3326      record.  */
3327   else if (code == RECORD_TYPE && TYPE_IS_PADDING_P (type))
3328     {
3329       /* If we previously converted from another type and our type is
3330          of variable size, remove the conversion to avoid the need for
3331          variable-size temporaries.  */
3332       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
3333           && !TREE_CONSTANT (TYPE_SIZE (type)))
3334         expr = TREE_OPERAND (expr, 0);
3335
3336       /* If we are just removing the padding from expr, convert the original
3337          object if we have variable size.  That will avoid the need
3338          for some variable-size temporaries.  */
3339       if (TREE_CODE (expr) == COMPONENT_REF
3340           && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE
3341           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (expr, 0)))
3342           && !TREE_CONSTANT (TYPE_SIZE (type)))
3343         return convert (type, TREE_OPERAND (expr, 0));
3344
3345       /* If the result type is a padded type with a self-referentially-sized
3346          field and the expression type is a record, do this as an
3347          unchecked conversion.  */
3348       else if (TREE_CODE (etype) == RECORD_TYPE
3349                && CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type))))
3350         return unchecked_convert (type, expr, false);
3351
3352       else
3353         return
3354           gnat_build_constructor (type,
3355                              tree_cons (TYPE_FIELDS (type),
3356                                         convert (TREE_TYPE
3357                                                  (TYPE_FIELDS (type)),
3358                                                  expr),
3359                                         NULL_TREE));
3360     }
3361
3362   /* If the input type has padding, remove it and convert to the output type.
3363      The conditions ordering is arranged to ensure that the output type is not
3364      a padding type here, as it is not clear whether the conversion would
3365      always be correct if this was to happen.  */
3366   else if (ecode == RECORD_TYPE && TYPE_IS_PADDING_P (etype))
3367     {
3368       tree unpadded;
3369
3370       /* If we have just converted to this padded type, just get the
3371          inner expression.  */
3372       if (TREE_CODE (expr) == CONSTRUCTOR
3373           && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (expr))
3374           && VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->index
3375              == TYPE_FIELDS (etype))
3376         unpadded
3377           = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->value;
3378
3379       /* Otherwise, build an explicit component reference.  */
3380       else
3381         unpadded
3382           = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (etype), false);
3383
3384       return convert (type, unpadded);
3385     }
3386
3387   /* If the input is a biased type, adjust first.  */
3388   if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype))
3389     return convert (type, fold_build2 (PLUS_EXPR, TREE_TYPE (etype),
3390                                        fold_convert (TREE_TYPE (etype),
3391                                                      expr),
3392                                        TYPE_MIN_VALUE (etype)));
3393
3394   /* If the input is a justified modular type, we need to extract the actual
3395      object before converting it to any other type with the exceptions of an
3396      unconstrained array or of a mere type variant.  It is useful to avoid the
3397      extraction and conversion in the type variant case because it could end
3398      up replacing a VAR_DECL expr by a constructor and we might be about the
3399      take the address of the result.  */
3400   if (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)
3401       && code != UNCONSTRAINED_ARRAY_TYPE
3402       && TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (etype))
3403     return convert (type, build_component_ref (expr, NULL_TREE,
3404                                                TYPE_FIELDS (etype), false));
3405
3406   /* If converting to a type that contains a template, convert to the data
3407      type and then build the template. */
3408   if (code == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (type))
3409     {
3410       tree obj_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type)));
3411
3412       /* If the source already has a template, get a reference to the
3413          associated array only, as we are going to rebuild a template
3414          for the target type anyway.  */
3415       expr = maybe_unconstrained_array (expr);
3416
3417       return
3418         gnat_build_constructor
3419           (type,
3420            tree_cons (TYPE_FIELDS (type),
3421                       build_template (TREE_TYPE (TYPE_FIELDS (type)),
3422                                       obj_type, NULL_TREE),
3423                       tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3424                                  convert (obj_type, expr), NULL_TREE)));
3425     }
3426
3427   /* There are some special cases of expressions that we process
3428      specially.  */
3429   switch (TREE_CODE (expr))
3430     {
3431     case ERROR_MARK:
3432       return expr;
3433
3434     case NULL_EXPR:
3435       /* Just set its type here.  For TRANSFORM_EXPR, we will do the actual
3436          conversion in gnat_expand_expr.  NULL_EXPR does not represent
3437          and actual value, so no conversion is needed.  */
3438       expr = copy_node (expr);
3439       TREE_TYPE (expr) = type;
3440       return expr;
3441
3442     case STRING_CST:
3443       /* If we are converting a STRING_CST to another constrained array type,
3444          just make a new one in the proper type.  */
3445       if (code == ecode && AGGREGATE_TYPE_P (etype)
3446           && !(TREE_CODE (TYPE_SIZE (etype)) == INTEGER_CST
3447                && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
3448         {
3449           expr = copy_node (expr);
3450           TREE_TYPE (expr) = type;
3451           return expr;
3452         }
3453       break;
3454
3455     case CONSTRUCTOR:
3456       /* If we are converting a CONSTRUCTOR to another constrained array type
3457          with the same domain, just make a new one in the proper type.  */
3458       if (code == ecode && code == ARRAY_TYPE
3459           && TREE_TYPE (type) == TREE_TYPE (etype)
3460           && tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (type)),
3461                                  TYPE_MIN_VALUE (TYPE_DOMAIN (etype)))
3462           && tree_int_cst_equal (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
3463                                  TYPE_MAX_VALUE (TYPE_DOMAIN (etype))))
3464         {
3465           expr = copy_node (expr);
3466           TREE_TYPE (expr) = type;
3467           return expr;
3468         }
3469       break;
3470
3471     case UNCONSTRAINED_ARRAY_REF:
3472       /* Convert this to the type of the inner array by getting the address of
3473          the array from the template.  */
3474       expr = build_unary_op (INDIRECT_REF, NULL_TREE,
3475                              build_component_ref (TREE_OPERAND (expr, 0),
3476                                                   get_identifier ("P_ARRAY"),
3477                                                   NULL_TREE, false));
3478       etype = TREE_TYPE (expr);
3479       ecode = TREE_CODE (etype);
3480       break;
3481
3482     case VIEW_CONVERT_EXPR:
3483       {
3484         /* GCC 4.x is very sensitive to type consistency overall, and view
3485            conversions thus are very frequent.  Even though just "convert"ing
3486            the inner operand to the output type is fine in most cases, it
3487            might expose unexpected input/output type mismatches in special
3488            circumstances so we avoid such recursive calls when we can.  */
3489
3490         tree op0 = TREE_OPERAND (expr, 0);
3491
3492         /* If we are converting back to the original type, we can just
3493            lift the input conversion.  This is a common occurrence with
3494            switches back-and-forth amongst type variants.  */
3495         if (type == TREE_TYPE (op0))
3496           return op0;
3497
3498         /* Otherwise, if we're converting between two aggregate types, we
3499            might be allowed to substitute the VIEW_CONVERT target type in
3500            place or to just convert the inner expression.  */
3501         if (AGGREGATE_TYPE_P (type) && AGGREGATE_TYPE_P (etype))
3502           {
3503             /* If we are converting between type variants, we can just
3504                substitute the VIEW_CONVERT in place.  */
3505             if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype))
3506               return build1 (VIEW_CONVERT_EXPR, type, op0);
3507
3508             /* Otherwise, we may just bypass the input view conversion unless
3509                one of the types is a fat pointer,  which is handled by
3510                specialized code below which relies on exact type matching.  */
3511             else if (!TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
3512               return convert (type, op0);
3513           }
3514       }
3515       break;
3516
3517     case INDIRECT_REF:
3518       /* If both types are record types, just convert the pointer and
3519          make a new INDIRECT_REF.
3520
3521          ??? Disable this for now since it causes problems with the
3522          code in build_binary_op for MODIFY_EXPR which wants to
3523          strip off conversions.  But that code really is a mess and
3524          we need to do this a much better way some time.  */
3525       if (0
3526           && (TREE_CODE (type) == RECORD_TYPE
3527               || TREE_CODE (type) == UNION_TYPE)
3528           && (TREE_CODE (etype) == RECORD_TYPE
3529               || TREE_CODE (etype) == UNION_TYPE)
3530           && !TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
3531         return build_unary_op (INDIRECT_REF, NULL_TREE,
3532                                convert (build_pointer_type (type),
3533                                         TREE_OPERAND (expr, 0)));
3534       break;
3535
3536     default:
3537       break;
3538     }
3539
3540   /* Check for converting to a pointer to an unconstrained array.  */
3541   if (TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
3542     return convert_to_fat_pointer (type, expr);
3543
3544   /* If we're converting between two aggregate types that have the same main
3545      variant, just make a VIEW_CONVER_EXPR.  */
3546   else if (AGGREGATE_TYPE_P (type)
3547            && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype))
3548     return build1 (VIEW_CONVERT_EXPR, type, expr);
3549
3550   /* In all other cases of related types, make a NOP_EXPR.  */
3551   else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype)
3552            || (code == INTEGER_CST && ecode == INTEGER_CST
3553                && (type == TREE_TYPE (etype) || etype == TREE_TYPE (type))))
3554     return fold_convert (type, expr);
3555
3556   switch (code)
3557     {
3558     case VOID_TYPE:
3559       return fold_build1 (CONVERT_EXPR, type, expr);
3560
3561     case BOOLEAN_TYPE:
3562       return fold_convert (type, gnat_truthvalue_conversion (expr));
3563
3564     case INTEGER_TYPE:
3565       if (TYPE_HAS_ACTUAL_BOUNDS_P (type)
3566           && (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE
3567               || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))))
3568         return unchecked_convert (type, expr, false);
3569       else if (TYPE_BIASED_REPRESENTATION_P (type))
3570         return fold_convert (type,
3571                              fold_build2 (MINUS_EXPR, TREE_TYPE (type),
3572                                           convert (TREE_TYPE (type), expr),
3573                                           TYPE_MIN_VALUE (type)));
3574
3575       /* ... fall through ... */
3576
3577     case ENUMERAL_TYPE:
3578       return fold (convert_to_integer (type, expr));
3579
3580     case POINTER_TYPE:
3581     case REFERENCE_TYPE:
3582       /* If converting between two pointers to records denoting
3583          both a template and type, adjust if needed to account
3584          for any differing offsets, since one might be negative.  */
3585       if (TYPE_THIN_POINTER_P (etype) && TYPE_THIN_POINTER_P (type))
3586         {
3587           tree bit_diff
3588             = size_diffop (bit_position (TYPE_FIELDS (TREE_TYPE (etype))),
3589                            bit_position (TYPE_FIELDS (TREE_TYPE (type))));
3590           tree byte_diff = size_binop (CEIL_DIV_EXPR, bit_diff,
3591                                        sbitsize_int (BITS_PER_UNIT));
3592
3593           expr = build1 (NOP_EXPR, type, expr);
3594           TREE_CONSTANT (expr) = TREE_CONSTANT (TREE_OPERAND (expr, 0));
3595           if (integer_zerop (byte_diff))
3596             return expr;
3597
3598           return build_binary_op (POINTER_PLUS_EXPR, type, expr,
3599                                   fold (convert (sizetype, byte_diff)));
3600         }
3601
3602       /* If converting to a thin pointer, handle specially.  */
3603       if (TYPE_THIN_POINTER_P (type)
3604           && TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)))
3605         return convert_to_thin_pointer (type, expr);
3606
3607       /* If converting fat pointer to normal pointer, get the pointer to the
3608          array and then convert it.  */
3609       else if (TYPE_FAT_POINTER_P (etype))
3610         expr = build_component_ref (expr, get_identifier ("P_ARRAY"),
3611                                     NULL_TREE, false);
3612
3613       return fold (convert_to_pointer (type, expr));
3614
3615     case REAL_TYPE:
3616       return fold (convert_to_real (type, expr));
3617
3618     case RECORD_TYPE:
3619       if (TYPE_JUSTIFIED_MODULAR_P (type) && !AGGREGATE_TYPE_P (etype))
3620         return
3621           gnat_build_constructor
3622             (type, tree_cons (TYPE_FIELDS (type),
3623                               convert (TREE_TYPE (TYPE_FIELDS (type)), expr),
3624                               NULL_TREE));
3625
3626       /* ... fall through ... */
3627
3628     case ARRAY_TYPE:
3629       /* In these cases, assume the front-end has validated the conversion.
3630          If the conversion is valid, it will be a bit-wise conversion, so
3631          it can be viewed as an unchecked conversion.  */
3632       return unchecked_convert (type, expr, false);
3633
3634     case UNION_TYPE:
3635       /* This is a either a conversion between a tagged type and some
3636          subtype, which we have to mark as a UNION_TYPE because of
3637          overlapping fields or a conversion of an Unchecked_Union.  */
3638       return unchecked_convert (type, expr, false);
3639
3640     case UNCONSTRAINED_ARRAY_TYPE:
3641       /* If EXPR is a constrained array, take its address, convert it to a
3642          fat pointer, and then dereference it.  Likewise if EXPR is a
3643          record containing both a template and a constrained array.
3644          Note that a record representing a justified modular type
3645          always represents a packed constrained array.  */
3646       if (ecode == ARRAY_TYPE
3647           || (ecode == INTEGER_TYPE && TYPE_HAS_ACTUAL_BOUNDS_P (etype))
3648           || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))
3649           || (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)))
3650         return
3651           build_unary_op
3652             (INDIRECT_REF, NULL_TREE,
3653              convert_to_fat_pointer (TREE_TYPE (type),
3654                                      build_unary_op (ADDR_EXPR,
3655                                                      NULL_TREE, expr)));
3656
3657       /* Do something very similar for converting one unconstrained
3658          array to another.  */
3659       else if (ecode == UNCONSTRAINED_ARRAY_TYPE)
3660         return
3661           build_unary_op (INDIRECT_REF, NULL_TREE,
3662                           convert (TREE_TYPE (type),
3663                                    build_unary_op (ADDR_EXPR,
3664                                                    NULL_TREE, expr)));
3665       else
3666         gcc_unreachable ();
3667
3668     case COMPLEX_TYPE:
3669       return fold (convert_to_complex (type, expr));
3670
3671     default:
3672       gcc_unreachable ();
3673     }
3674 }
3675 \f
3676 /* Remove all conversions that are done in EXP.  This includes converting
3677    from a padded type or to a justified modular type.  If TRUE_ADDRESS
3678    is true, always return the address of the containing object even if
3679    the address is not bit-aligned.  */
3680
3681 tree
3682 remove_conversions (tree exp, bool true_address)
3683 {
3684   switch (TREE_CODE (exp))
3685     {
3686     case CONSTRUCTOR:
3687       if (true_address
3688           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
3689           && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (exp)))
3690         return
3691           remove_conversions (VEC_index (constructor_elt,
3692                                          CONSTRUCTOR_ELTS (exp), 0)->value,
3693                               true);
3694       break;
3695
3696     case COMPONENT_REF:
3697       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == RECORD_TYPE
3698           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
3699         return remove_conversions (TREE_OPERAND (exp, 0), true_address);
3700       break;
3701
3702     case VIEW_CONVERT_EXPR:  case NON_LVALUE_EXPR:
3703     case NOP_EXPR:  case CONVERT_EXPR:
3704       return remove_conversions (TREE_OPERAND (exp, 0), true_address);
3705
3706     default:
3707       break;
3708     }
3709
3710   return exp;
3711 }
3712 \f
3713 /* If EXP's type is an UNCONSTRAINED_ARRAY_TYPE, return an expression that
3714    refers to the underlying array.  If its type has TYPE_CONTAINS_TEMPLATE_P,
3715    likewise return an expression pointing to the underlying array.  */
3716
3717 tree
3718 maybe_unconstrained_array (tree exp)
3719 {
3720   enum tree_code code = TREE_CODE (exp);
3721   tree new;
3722
3723   switch (TREE_CODE (TREE_TYPE (exp)))
3724     {
3725     case UNCONSTRAINED_ARRAY_TYPE:
3726       if (code == UNCONSTRAINED_ARRAY_REF)
3727         {
3728           new
3729             = build_unary_op (INDIRECT_REF, NULL_TREE,
3730                               build_component_ref (TREE_OPERAND (exp, 0),
3731                                                    get_identifier ("P_ARRAY"),
3732                                                    NULL_TREE, false));
3733           TREE_READONLY (new) = TREE_STATIC (new) = TREE_READONLY (exp);
3734           return new;
3735         }
3736
3737       else if (code == NULL_EXPR)
3738         return build1 (NULL_EXPR,
3739                        TREE_TYPE (TREE_TYPE (TYPE_FIELDS
3740                                              (TREE_TYPE (TREE_TYPE (exp))))),
3741                        TREE_OPERAND (exp, 0));
3742
3743     case RECORD_TYPE:
3744       /* If this is a padded type, convert to the unpadded type and see if
3745          it contains a template.  */
3746       if (TYPE_IS_PADDING_P (TREE_TYPE (exp)))
3747         {
3748           new = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
3749           if (TREE_CODE (TREE_TYPE (new)) == RECORD_TYPE
3750               && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new)))
3751             return
3752               build_component_ref (new, NULL_TREE,
3753                                    TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new))),
3754                                    0);
3755         }
3756       else if (TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (exp)))
3757         return
3758           build_component_ref (exp, NULL_TREE,
3759                                TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (exp))), 0);
3760       break;
3761
3762     default:
3763       break;
3764     }
3765
3766   return exp;
3767 }
3768 \f
3769 /* Return an expression that does an unchecked conversion of EXPR to TYPE.
3770    If NOTRUNC_P is true, truncation operations should be suppressed.  */
3771
3772 tree
3773 unchecked_convert (tree type, tree expr, bool notrunc_p)
3774 {
3775   tree etype = TREE_TYPE (expr);
3776
3777   /* If the expression is already the right type, we are done.  */
3778   if (etype == type)
3779     return expr;
3780
3781   /* If both types types are integral just do a normal conversion.
3782      Likewise for a conversion to an unconstrained array.  */
3783   if ((((INTEGRAL_TYPE_P (type)
3784          && !(TREE_CODE (type) == INTEGER_TYPE
3785               && TYPE_VAX_FLOATING_POINT_P (type)))
3786         || (POINTER_TYPE_P (type) && ! TYPE_THIN_POINTER_P (type))
3787         || (TREE_CODE (type) == RECORD_TYPE
3788             && TYPE_JUSTIFIED_MODULAR_P (type)))
3789        && ((INTEGRAL_TYPE_P (etype)
3790             && !(TREE_CODE (etype) == INTEGER_TYPE
3791                  && TYPE_VAX_FLOATING_POINT_P (etype)))
3792            || (POINTER_TYPE_P (etype) && !TYPE_THIN_POINTER_P (etype))
3793            || (TREE_CODE (etype) == RECORD_TYPE
3794                && TYPE_JUSTIFIED_MODULAR_P (etype))))
3795       || TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
3796     {
3797       tree rtype = type;
3798       bool final_unchecked = false;
3799
3800       if (TREE_CODE (etype) == INTEGER_TYPE
3801           && TYPE_BIASED_REPRESENTATION_P (etype))
3802         {
3803           tree ntype = copy_type (etype);
3804
3805           TYPE_BIASED_REPRESENTATION_P (ntype) = 0;
3806           TYPE_MAIN_VARIANT (ntype) = ntype;
3807           expr = build1 (NOP_EXPR, ntype, expr);
3808         }
3809
3810       if (TREE_CODE (type) == INTEGER_TYPE
3811           && TYPE_BIASED_REPRESENTATION_P (type))
3812         {
3813           rtype = copy_type (type);
3814           TYPE_BIASED_REPRESENTATION_P (rtype) = 0;
3815           TYPE_MAIN_VARIANT (rtype) = rtype;
3816         }
3817
3818       /* We have another special case: if we are unchecked converting subtype
3819          into a base type, we need to ensure that VRP doesn't propagate range
3820          information since this conversion may be done precisely to validate
3821          that the object is within the range it is supposed to have.  */
3822       else if (TREE_CODE (expr) != INTEGER_CST
3823                && TREE_CODE (type) == INTEGER_TYPE && !TREE_TYPE (type)
3824                && ((TREE_CODE (etype) == INTEGER_TYPE && TREE_TYPE (etype))
3825                    || TREE_CODE (etype) == ENUMERAL_TYPE
3826                    || TREE_CODE (etype) == BOOLEAN_TYPE))
3827         {
3828           /* The optimization barrier is a VIEW_CONVERT_EXPR node; moreover,
3829              in order not to be deemed an useless type conversion, it must
3830              be from subtype to base type.
3831
3832              ??? This may raise addressability and/or aliasing issues because
3833              VIEW_CONVERT_EXPR gets gimplified as an lvalue, thus causing the
3834              address of its operand to be taken if it is deemed addressable
3835              and not already in GIMPLE form.  */
3836           rtype = gnat_type_for_mode (TYPE_MODE (type), TYPE_UNSIGNED (type));
3837           rtype = copy_type (rtype);
3838           TYPE_MAIN_VARIANT (rtype) = rtype;
3839           TREE_TYPE (rtype) = type;
3840           final_unchecked = true;
3841         }
3842
3843       expr = convert (rtype, expr);
3844       if (type != rtype)
3845         expr = build1 (final_unchecked ? VIEW_CONVERT_EXPR : NOP_EXPR,
3846                        type, expr);
3847     }
3848
3849   /* If we are converting TO an integral type whose precision is not the
3850      same as its size, first unchecked convert to a record that contains
3851      an object of the output type.  Then extract the field. */
3852   else if (INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
3853            && 0 != compare_tree_int (TYPE_RM_SIZE (type),
3854                                      GET_MODE_BITSIZE (TYPE_MODE (type))))
3855     {
3856       tree rec_type = make_node (RECORD_TYPE);
3857       tree field = create_field_decl (get_identifier ("OBJ"), type,
3858                                       rec_type, 1, 0, 0, 0);
3859
3860       TYPE_FIELDS (rec_type) = field;
3861       layout_type (rec_type);
3862
3863       expr = unchecked_convert (rec_type, expr, notrunc_p);
3864       expr = build_component_ref (expr, NULL_TREE, field, 0);
3865     }
3866
3867   /* Similarly for integral input type whose precision is not equal to its
3868      size.  */
3869   else if (INTEGRAL_TYPE_P (etype) && TYPE_RM_SIZE (etype)
3870       && 0 != compare_tree_int (TYPE_RM_SIZE (etype),
3871                                 GET_MODE_BITSIZE (TYPE_MODE (etype))))
3872     {
3873       tree rec_type = make_node (RECORD_TYPE);
3874       tree field
3875         = create_field_decl (get_identifier ("OBJ"), etype, rec_type,
3876                              1, 0, 0, 0);
3877
3878       TYPE_FIELDS (rec_type) = field;
3879       layout_type (rec_type);
3880
3881       expr = gnat_build_constructor (rec_type, build_tree_list (field, expr));
3882       expr = unchecked_convert (type, expr, notrunc_p);
3883     }
3884
3885   /* We have a special case when we are converting between two
3886      unconstrained array types.  In that case, take the address,
3887      convert the fat pointer types, and dereference.  */
3888   else if (TREE_CODE (etype) == UNCONSTRAINED_ARRAY_TYPE
3889            && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
3890     expr = build_unary_op (INDIRECT_REF, NULL_TREE,
3891                            build1 (VIEW_CONVERT_EXPR, TREE_TYPE (type),
3892                                    build_unary_op (ADDR_EXPR, NULL_TREE,
3893                                                    expr)));
3894   else
3895     {
3896       expr = maybe_unconstrained_array (expr);
3897
3898       /* There's no point in doing two unchecked conversions in a row.  */
3899       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
3900         expr = TREE_OPERAND (expr, 0);
3901
3902       etype = TREE_TYPE (expr);
3903       expr = build1 (VIEW_CONVERT_EXPR, type, expr);
3904     }
3905
3906   /* If the result is an integral type whose size is not equal to
3907      the size of the underlying machine type, sign- or zero-extend
3908      the result.  We need not do this in the case where the input is
3909      an integral type of the same precision and signedness or if the output
3910      is a biased type or if both the input and output are unsigned.  */
3911   if (!notrunc_p
3912       && INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
3913       && !(TREE_CODE (type) == INTEGER_TYPE
3914            && TYPE_BIASED_REPRESENTATION_P (type))
3915       && 0 != compare_tree_int (TYPE_RM_SIZE (type),
3916                                 GET_MODE_BITSIZE (TYPE_MODE (type)))
3917       && !(INTEGRAL_TYPE_P (etype)
3918            && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (etype)
3919            && operand_equal_p (TYPE_RM_SIZE (type),
3920                                (TYPE_RM_SIZE (etype) != 0
3921                                 ? TYPE_RM_SIZE (etype) : TYPE_SIZE (etype)),
3922                                0))
3923       && !(TYPE_UNSIGNED (type) && TYPE_UNSIGNED (etype)))
3924     {
3925       tree base_type = gnat_type_for_mode (TYPE_MODE (type),
3926                                            TYPE_UNSIGNED (type));
3927       tree shift_expr
3928         = convert (base_type,
3929                    size_binop (MINUS_EXPR,
3930                                bitsize_int
3931                                (GET_MODE_BITSIZE (TYPE_MODE (type))),
3932                                TYPE_RM_SIZE (type)));
3933       expr
3934         = convert (type,
3935                    build_binary_op (RSHIFT_EXPR, base_type,
3936                                     build_binary_op (LSHIFT_EXPR, base_type,
3937                                                      convert (base_type, expr),
3938                                                      shift_expr),
3939                                     shift_expr));
3940     }
3941
3942   /* An unchecked conversion should never raise Constraint_Error.  The code
3943      below assumes that GCC's conversion routines overflow the same way that
3944      the underlying hardware does.  This is probably true.  In the rare case
3945      when it is false, we can rely on the fact that such conversions are
3946      erroneous anyway.  */
3947   if (TREE_CODE (expr) == INTEGER_CST)
3948     TREE_OVERFLOW (expr) = 0;
3949
3950   /* If the sizes of the types differ and this is an VIEW_CONVERT_EXPR,
3951      show no longer constant.  */
3952   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
3953       && !operand_equal_p (TYPE_SIZE_UNIT (type), TYPE_SIZE_UNIT (etype),
3954                            OEP_ONLY_CONST))
3955     TREE_CONSTANT (expr) = 0;
3956
3957   return expr;
3958 }
3959 \f
3960 /* Search the chain of currently available builtin declarations for a node
3961    corresponding to function NAME (an IDENTIFIER_NODE).  Return the first node
3962    found, if any, or NULL_TREE otherwise.  */
3963 tree
3964 builtin_decl_for (tree name)
3965 {
3966   unsigned i;
3967   tree decl;
3968
3969   for (i = 0; VEC_iterate(tree, builtin_decls, i, decl); i++)
3970     if (DECL_NAME (decl) == name)
3971       return decl;
3972
3973   return NULL_TREE;
3974 }
3975
3976 /* Return the appropriate GCC tree code for the specified GNAT type,
3977    the latter being a record type as predicated by Is_Record_Type.  */
3978
3979 enum tree_code
3980 tree_code_for_record_type (Entity_Id gnat_type)
3981 {
3982   Node_Id component_list
3983     = Component_List (Type_Definition
3984                       (Declaration_Node
3985                        (Implementation_Base_Type (gnat_type))));
3986   Node_Id component;
3987
3988  /* Make this a UNION_TYPE unless it's either not an Unchecked_Union or
3989     we have a non-discriminant field outside a variant.  In either case,
3990     it's a RECORD_TYPE.  */
3991
3992   if (!Is_Unchecked_Union (gnat_type))
3993     return RECORD_TYPE;
3994
3995   for (component = First_Non_Pragma (Component_Items (component_list));
3996        Present (component);
3997        component = Next_Non_Pragma (component))
3998     if (Ekind (Defining_Entity (component)) == E_Component)
3999       return RECORD_TYPE;
4000
4001   return UNION_TYPE;
4002 }
4003
4004 /* Return true if GNU_TYPE is suitable as the type of a non-aliased
4005    component of an aggregate type.  */
4006
4007 bool
4008 type_for_nonaliased_component_p (tree gnu_type)
4009 {
4010   /* If the type is passed by reference, we may have pointers to the
4011      component so it cannot be made non-aliased. */
4012   if (must_pass_by_ref (gnu_type) || default_pass_by_ref (gnu_type))
4013     return false;
4014
4015   /* We used to say that any component of aggregate type is aliased
4016      because the front-end may take 'Reference of it.  The front-end
4017      has been enhanced in the meantime so as to use a renaming instead
4018      in most cases, but the back-end can probably take the address of
4019      such a component too so we go for the conservative stance.
4020
4021      For instance, we might need the address of any array type, even
4022      if normally passed by copy, to construct a fat pointer if the
4023      component is used as an actual for an unconstrained formal.
4024
4025      Likewise for record types: even if a specific record subtype is
4026      passed by copy, the parent type might be passed by ref (e.g. if
4027      it's of variable size) and we might take the address of a child
4028      component to pass to a parent formal.  We have no way to check
4029      for such conditions here.  */
4030   if (AGGREGATE_TYPE_P (gnu_type))
4031     return false;
4032
4033   return true;
4034 }
4035
4036 /* Perform final processing on global variables.  */
4037
4038 void
4039 gnat_write_global_declarations (void)
4040 {
4041   /* Proceed to optimize and emit assembly.
4042      FIXME: shouldn't be the front end's responsibility to call this.  */
4043   cgraph_optimize ();
4044
4045   /* Emit debug info for all global declarations.  */
4046   emit_debug_global_declarations (VEC_address (tree, global_decls),
4047                                   VEC_length (tree, global_decls));
4048 }
4049
4050 #include "gt-ada-utils.h"
4051 #include "gtype-ada.h"