OSDN Git Service

PR middle-end/42068
[pf3gnuchains/gcc-fork.git] / gcc / ada / gcc-interface / 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-2009, 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 "toplev.h"
33 #include "rtl.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 "langhooks.h"
41 #include "pointer-set.h"
42 #include "cgraph.h"
43 #include "tree-dump.h"
44 #include "tree-inline.h"
45 #include "tree-iterator.h"
46 #include "gimple.h"
47
48 #include "ada.h"
49 #include "types.h"
50 #include "atree.h"
51 #include "elists.h"
52 #include "namet.h"
53 #include "nlists.h"
54 #include "stringt.h"
55 #include "uintp.h"
56 #include "fe.h"
57 #include "sinfo.h"
58 #include "einfo.h"
59 #include "ada-tree.h"
60 #include "gigi.h"
61
62 #ifndef MAX_BITS_PER_WORD
63 #define MAX_BITS_PER_WORD  BITS_PER_WORD
64 #endif
65
66 /* If nonzero, pretend we are allocating at global level.  */
67 int force_global;
68
69 /* The default alignment of "double" floating-point types, i.e. floating
70    point types whose size is equal to 64 bits, or 0 if this alignment is
71    not specifically capped.  */
72 int double_float_alignment;
73
74 /* The default alignment of "double" or larger scalar types, i.e. scalar
75    types whose size is greater or equal to 64 bits, or 0 if this alignment
76    is not specifically capped.  */
77 int double_scalar_alignment;
78
79 /* Tree nodes for the various types and decls we create.  */
80 tree gnat_std_decls[(int) ADT_LAST];
81
82 /* Functions to call for each of the possible raise reasons.  */
83 tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
84
85 /* Forward declarations for handlers of attributes.  */
86 static tree handle_const_attribute (tree *, tree, tree, int, bool *);
87 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
88 static tree handle_pure_attribute (tree *, tree, tree, int, bool *);
89 static tree handle_novops_attribute (tree *, tree, tree, int, bool *);
90 static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
91 static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *);
92 static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
93 static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
94 static tree handle_type_generic_attribute (tree *, tree, tree, int, bool *);
95 static tree handle_vector_size_attribute (tree *, tree, tree, int, bool *);
96 static tree handle_vector_type_attribute (tree *, tree, tree, int, bool *);
97
98 /* Fake handler for attributes we don't properly support, typically because
99    they'd require dragging a lot of the common-c front-end circuitry.  */
100 static tree fake_attribute_handler      (tree *, tree, tree, int, bool *);
101
102 /* Table of machine-independent internal attributes for Ada.  We support
103    this minimal set of attributes to accommodate the needs of builtins.  */
104 const struct attribute_spec gnat_internal_attribute_table[] =
105 {
106   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
107   { "const",        0, 0,  true,  false, false, handle_const_attribute   },
108   { "nothrow",      0, 0,  true,  false, false, handle_nothrow_attribute },
109   { "pure",         0, 0,  true,  false, false, handle_pure_attribute },
110   { "no vops",      0, 0,  true,  false, false, handle_novops_attribute },
111   { "nonnull",      0, -1, false, true,  true,  handle_nonnull_attribute },
112   { "sentinel",     0, 1,  false, true,  true,  handle_sentinel_attribute },
113   { "noreturn",     0, 0,  true,  false, false, handle_noreturn_attribute },
114   { "malloc",       0, 0,  true,  false, false, handle_malloc_attribute },
115   { "type generic", 0, 0,  false, true, true, handle_type_generic_attribute },
116
117   { "vector_size",  1, 1,  false, true, false,  handle_vector_size_attribute },
118   { "vector_type",  0, 0,  false, true, false,  handle_vector_type_attribute },
119   { "may_alias",    0, 0, false, true, false, NULL },
120
121   /* ??? format and format_arg are heavy and not supported, which actually
122      prevents support for stdio builtins, which we however declare as part
123      of the common builtins.def contents.  */
124   { "format",     3, 3,  false, true,  true,  fake_attribute_handler },
125   { "format_arg", 1, 1,  false, true,  true,  fake_attribute_handler },
126
127   { NULL,         0, 0, false, false, false, NULL }
128 };
129
130 /* Associates a GNAT tree node to a GCC tree node. It is used in
131    `save_gnu_tree', `get_gnu_tree' and `present_gnu_tree'. See documentation
132    of `save_gnu_tree' for more info.  */
133 static GTY((length ("max_gnat_nodes"))) tree *associate_gnat_to_gnu;
134
135 #define GET_GNU_TREE(GNAT_ENTITY)       \
136   associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id]
137
138 #define SET_GNU_TREE(GNAT_ENTITY,VAL)   \
139   associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id] = (VAL)
140
141 #define PRESENT_GNU_TREE(GNAT_ENTITY)   \
142   (associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id] != NULL_TREE)
143
144 /* Associates a GNAT entity to a GCC tree node used as a dummy, if any.  */
145 static GTY((length ("max_gnat_nodes"))) tree *dummy_node_table;
146
147 #define GET_DUMMY_NODE(GNAT_ENTITY)     \
148   dummy_node_table[(GNAT_ENTITY) - First_Node_Id]
149
150 #define SET_DUMMY_NODE(GNAT_ENTITY,VAL) \
151   dummy_node_table[(GNAT_ENTITY) - First_Node_Id] = (VAL)
152
153 #define PRESENT_DUMMY_NODE(GNAT_ENTITY) \
154   (dummy_node_table[(GNAT_ENTITY) - First_Node_Id] != NULL_TREE)
155
156 /* This variable keeps a table for types for each precision so that we only
157    allocate each of them once. Signed and unsigned types are kept separate.
158
159    Note that these types are only used when fold-const requests something
160    special.  Perhaps we should NOT share these types; we'll see how it
161    goes later.  */
162 static GTY(()) tree signed_and_unsigned_types[2 * MAX_BITS_PER_WORD + 1][2];
163
164 /* Likewise for float types, but record these by mode.  */
165 static GTY(()) tree float_types[NUM_MACHINE_MODES];
166
167 /* For each binding contour we allocate a binding_level structure to indicate
168    the binding depth.  */
169
170 struct GTY((chain_next ("%h.chain"))) gnat_binding_level {
171   /* The binding level containing this one (the enclosing binding level). */
172   struct gnat_binding_level *chain;
173   /* The BLOCK node for this level.  */
174   tree block;
175   /* If nonzero, the setjmp buffer that needs to be updated for any
176      variable-sized definition within this context.  */
177   tree jmpbuf_decl;
178 };
179
180 /* The binding level currently in effect.  */
181 static GTY(()) struct gnat_binding_level *current_binding_level;
182
183 /* A chain of gnat_binding_level structures awaiting reuse.  */
184 static GTY((deletable)) struct gnat_binding_level *free_binding_level;
185
186 /* An array of global declarations.  */
187 static GTY(()) VEC(tree,gc) *global_decls;
188
189 /* An array of builtin function declarations.  */
190 static GTY(()) VEC(tree,gc) *builtin_decls;
191
192 /* An array of global renaming pointers.  */
193 static GTY(()) VEC(tree,gc) *global_renaming_pointers;
194
195 /* A chain of unused BLOCK nodes. */
196 static GTY((deletable)) tree free_block_chain;
197
198 static tree merge_sizes (tree, tree, tree, bool, bool);
199 static tree compute_related_constant (tree, tree);
200 static tree split_plus (tree, tree *);
201 static tree float_type_for_precision (int, enum machine_mode);
202 static tree convert_to_fat_pointer (tree, tree);
203 static tree convert_to_thin_pointer (tree, tree);
204 static tree make_descriptor_field (const char *,tree, tree, tree);
205 static bool potential_alignment_gap (tree, tree, tree);
206 \f
207 /* Initialize the association of GNAT nodes to GCC trees.  */
208
209 void
210 init_gnat_to_gnu (void)
211 {
212   associate_gnat_to_gnu
213     = (tree *) ggc_alloc_cleared (max_gnat_nodes * sizeof (tree));
214 }
215
216 /* GNAT_ENTITY is a GNAT tree node for an entity.   GNU_DECL is the GCC tree
217    which is to be associated with GNAT_ENTITY. Such GCC tree node is always
218    a ..._DECL node.  If NO_CHECK is true, the latter check is suppressed.
219
220    If GNU_DECL is zero, a previous association is to be reset.  */
221
222 void
223 save_gnu_tree (Entity_Id gnat_entity, tree gnu_decl, bool no_check)
224 {
225   /* Check that GNAT_ENTITY is not already defined and that it is being set
226      to something which is a decl.  Raise gigi 401 if not.  Usually, this
227      means GNAT_ENTITY is defined twice, but occasionally is due to some
228      Gigi problem.  */
229   gcc_assert (!(gnu_decl
230                 && (PRESENT_GNU_TREE (gnat_entity)
231                     || (!no_check && !DECL_P (gnu_decl)))));
232
233   SET_GNU_TREE (gnat_entity, gnu_decl);
234 }
235
236 /* GNAT_ENTITY is a GNAT tree node for a defining identifier.
237    Return the ..._DECL node that was associated with it.  If there is no tree
238    node associated with GNAT_ENTITY, abort.
239
240    In some cases, such as delayed elaboration or expressions that need to
241    be elaborated only once, GNAT_ENTITY is really not an entity.  */
242
243 tree
244 get_gnu_tree (Entity_Id gnat_entity)
245 {
246   gcc_assert (PRESENT_GNU_TREE (gnat_entity));
247   return GET_GNU_TREE (gnat_entity);
248 }
249
250 /* Return nonzero if a GCC tree has been associated with GNAT_ENTITY.  */
251
252 bool
253 present_gnu_tree (Entity_Id gnat_entity)
254 {
255   return PRESENT_GNU_TREE (gnat_entity);
256 }
257 \f
258 /* Initialize the association of GNAT nodes to GCC trees as dummies.  */
259
260 void
261 init_dummy_type (void)
262 {
263   dummy_node_table
264     = (tree *) ggc_alloc_cleared (max_gnat_nodes * sizeof (tree));
265 }
266
267 /* Make a dummy type corresponding to GNAT_TYPE.  */
268
269 tree
270 make_dummy_type (Entity_Id gnat_type)
271 {
272   Entity_Id gnat_underlying = Gigi_Equivalent_Type (gnat_type);
273   tree gnu_type;
274
275   /* If there is an equivalent type, get its underlying type.  */
276   if (Present (gnat_underlying))
277     gnat_underlying = Underlying_Type (gnat_underlying);
278
279   /* If there was no equivalent type (can only happen when just annotating
280      types) or underlying type, go back to the original type.  */
281   if (No (gnat_underlying))
282     gnat_underlying = gnat_type;
283
284   /* If it there already a dummy type, use that one.  Else make one.  */
285   if (PRESENT_DUMMY_NODE (gnat_underlying))
286     return GET_DUMMY_NODE (gnat_underlying);
287
288   /* If this is a record, make a RECORD_TYPE or UNION_TYPE; else make
289      an ENUMERAL_TYPE.  */
290   gnu_type = make_node (Is_Record_Type (gnat_underlying)
291                         ? tree_code_for_record_type (gnat_underlying)
292                         : ENUMERAL_TYPE);
293   TYPE_NAME (gnu_type) = get_entity_name (gnat_type);
294   TYPE_DUMMY_P (gnu_type) = 1;
295   TYPE_STUB_DECL (gnu_type)
296     = create_type_stub_decl (TYPE_NAME (gnu_type), gnu_type);
297   if (AGGREGATE_TYPE_P (gnu_type))
298     TYPE_BY_REFERENCE_P (gnu_type) = Is_By_Reference_Type (gnat_type);
299
300   SET_DUMMY_NODE (gnat_underlying, gnu_type);
301
302   return gnu_type;
303 }
304 \f
305 /* Return nonzero if we are currently in the global binding level.  */
306
307 int
308 global_bindings_p (void)
309 {
310   return ((force_global || !current_function_decl) ? -1 : 0);
311 }
312
313 /* Enter a new binding level. */
314
315 void
316 gnat_pushlevel (void)
317 {
318   struct gnat_binding_level *newlevel = NULL;
319
320   /* Reuse a struct for this binding level, if there is one.  */
321   if (free_binding_level)
322     {
323       newlevel = free_binding_level;
324       free_binding_level = free_binding_level->chain;
325     }
326   else
327     newlevel
328       = (struct gnat_binding_level *)
329         ggc_alloc (sizeof (struct gnat_binding_level));
330
331   /* Use a free BLOCK, if any; otherwise, allocate one.  */
332   if (free_block_chain)
333     {
334       newlevel->block = free_block_chain;
335       free_block_chain = BLOCK_CHAIN (free_block_chain);
336       BLOCK_CHAIN (newlevel->block) = NULL_TREE;
337     }
338   else
339     newlevel->block = make_node (BLOCK);
340
341   /* Point the BLOCK we just made to its parent.  */
342   if (current_binding_level)
343     BLOCK_SUPERCONTEXT (newlevel->block) = current_binding_level->block;
344
345   BLOCK_VARS (newlevel->block) = BLOCK_SUBBLOCKS (newlevel->block) = NULL_TREE;
346   TREE_USED (newlevel->block) = 1;
347
348   /* Add this level to the front of the chain (stack) of levels that are
349      active.  */
350   newlevel->chain = current_binding_level;
351   newlevel->jmpbuf_decl = NULL_TREE;
352   current_binding_level = newlevel;
353 }
354
355 /* Set SUPERCONTEXT of the BLOCK for the current binding level to FNDECL
356    and point FNDECL to this BLOCK.  */
357
358 void
359 set_current_block_context (tree fndecl)
360 {
361   BLOCK_SUPERCONTEXT (current_binding_level->block) = fndecl;
362   DECL_INITIAL (fndecl) = current_binding_level->block;
363 }
364
365 /* Set the jmpbuf_decl for the current binding level to DECL.  */
366
367 void
368 set_block_jmpbuf_decl (tree decl)
369 {
370   current_binding_level->jmpbuf_decl = decl;
371 }
372
373 /* Get the jmpbuf_decl, if any, for the current binding level.  */
374
375 tree
376 get_block_jmpbuf_decl (void)
377 {
378   return current_binding_level->jmpbuf_decl;
379 }
380
381 /* Exit a binding level. Set any BLOCK into the current code group.  */
382
383 void
384 gnat_poplevel (void)
385 {
386   struct gnat_binding_level *level = current_binding_level;
387   tree block = level->block;
388
389   BLOCK_VARS (block) = nreverse (BLOCK_VARS (block));
390   BLOCK_SUBBLOCKS (block) = nreverse (BLOCK_SUBBLOCKS (block));
391
392   /* If this is a function-level BLOCK don't do anything.  Otherwise, if there
393      are no variables free the block and merge its subblocks into those of its
394      parent block. Otherwise, add it to the list of its parent.  */
395   if (TREE_CODE (BLOCK_SUPERCONTEXT (block)) == FUNCTION_DECL)
396     ;
397   else if (BLOCK_VARS (block) == NULL_TREE)
398     {
399       BLOCK_SUBBLOCKS (level->chain->block)
400         = chainon (BLOCK_SUBBLOCKS (block),
401                    BLOCK_SUBBLOCKS (level->chain->block));
402       BLOCK_CHAIN (block) = free_block_chain;
403       free_block_chain = block;
404     }
405   else
406     {
407       BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (level->chain->block);
408       BLOCK_SUBBLOCKS (level->chain->block) = block;
409       TREE_USED (block) = 1;
410       set_block_for_group (block);
411     }
412
413   /* Free this binding structure.  */
414   current_binding_level = level->chain;
415   level->chain = free_binding_level;
416   free_binding_level = level;
417 }
418
419 \f
420 /* Records a ..._DECL node DECL as belonging to the current lexical scope
421    and uses GNAT_NODE for location information and propagating flags.  */
422
423 void
424 gnat_pushdecl (tree decl, Node_Id gnat_node)
425 {
426   /* If this decl is public external or at toplevel, there is no context.
427      But PARM_DECLs always go in the level of its function.  */
428   if (TREE_CODE (decl) != PARM_DECL
429       && ((DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
430           || global_bindings_p ()))
431     DECL_CONTEXT (decl) = 0;
432   else
433     {
434       DECL_CONTEXT (decl) = current_function_decl;
435
436       /* Functions imported in another function are not really nested.
437          For really nested functions mark them initially as needing
438          a static chain for uses of that flag before unnesting;
439          lower_nested_functions will then recompute it.  */
440       if (TREE_CODE (decl) == FUNCTION_DECL && !TREE_PUBLIC (decl))
441         DECL_STATIC_CHAIN (decl) = 1;
442     }
443
444   TREE_NO_WARNING (decl) = (gnat_node == Empty || Warnings_Off (gnat_node));
445
446   /* Set the location of DECL and emit a declaration for it.  */
447   if (Present (gnat_node))
448     Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (decl));
449   add_decl_expr (decl, gnat_node);
450
451   /* Put the declaration on the list.  The list of declarations is in reverse
452      order.  The list will be reversed later.  Put global variables in the
453      globals list and builtin functions in a dedicated list to speed up
454      further lookups.  Don't put TYPE_DECLs for UNCONSTRAINED_ARRAY_TYPE into
455      the list, as they will cause trouble with the debugger and aren't needed
456      anyway.  */
457   if (TREE_CODE (decl) != TYPE_DECL
458       || TREE_CODE (TREE_TYPE (decl)) != UNCONSTRAINED_ARRAY_TYPE)
459     {
460       if (global_bindings_p ())
461         {
462           VEC_safe_push (tree, gc, global_decls, decl);
463
464           if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
465             VEC_safe_push (tree, gc, builtin_decls, decl);
466         }
467       else
468         {
469           TREE_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
470           BLOCK_VARS (current_binding_level->block) = decl;
471         }
472     }
473
474   /* For the declaration of a type, set its name if it either is not already
475      set or if the previous type name was not derived from a source name.
476      We'd rather have the type named with a real name and all the pointer
477      types to the same object have the same POINTER_TYPE node.  Code in the
478      equivalent function of c-decl.c makes a copy of the type node here, but
479      that may cause us trouble with incomplete types.  We make an exception
480      for fat pointer types because the compiler automatically builds them
481      for unconstrained array types and the debugger uses them to represent
482      both these and pointers to these.  */
483   if (TREE_CODE (decl) == TYPE_DECL && DECL_NAME (decl))
484     {
485       tree t = TREE_TYPE (decl);
486
487       if (!(TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL))
488         ;
489       else if (TYPE_IS_FAT_POINTER_P (t))
490         {
491           tree tt = build_variant_type_copy (t);
492           TYPE_NAME (tt) = decl;
493           TREE_USED (tt) = TREE_USED (t);
494           TREE_TYPE (decl) = tt;
495           if (DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
496             DECL_ORIGINAL_TYPE (decl) = DECL_ORIGINAL_TYPE (TYPE_NAME (t));
497           else
498             DECL_ORIGINAL_TYPE (decl) = t;
499           t = NULL_TREE;
500           DECL_ARTIFICIAL (decl) = 0;
501         }
502       else if (DECL_ARTIFICIAL (TYPE_NAME (t)) && !DECL_ARTIFICIAL (decl))
503         ;
504       else
505         t = NULL_TREE;
506
507       /* Propagate the name to all the variants.  This is needed for
508          the type qualifiers machinery to work properly.  */
509       if (t)
510         for (t = TYPE_MAIN_VARIANT (t); t; t = TYPE_NEXT_VARIANT (t))
511           TYPE_NAME (t) = decl;
512     }
513 }
514 \f
515 /* Do little here.  Set up the standard declarations later after the
516    front end has been run.  */
517
518 void
519 gnat_init_decl_processing (void)
520 {
521   /* Make the binding_level structure for global names.  */
522   current_function_decl = 0;
523   current_binding_level = 0;
524   free_binding_level = 0;
525   gnat_pushlevel ();
526
527   build_common_tree_nodes (true, true);
528
529   /* In Ada, we use a signed type for SIZETYPE.  Use the signed type
530      corresponding to the width of Pmode.  In most cases when ptr_mode
531      and Pmode differ, C will use the width of ptr_mode for SIZETYPE.
532      But we get far better code using the width of Pmode.  */
533   size_type_node = gnat_type_for_mode (Pmode, 0);
534   set_sizetype (size_type_node);
535
536   /* In Ada, we use an unsigned 8-bit type for the default boolean type.  */
537   boolean_type_node = make_unsigned_type (8);
538   TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
539   SET_TYPE_RM_MAX_VALUE (boolean_type_node,
540                          build_int_cst (boolean_type_node, 1));
541   SET_TYPE_RM_SIZE (boolean_type_node, bitsize_int (1));
542
543   build_common_tree_nodes_2 (0);
544   boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
545
546   ptr_void_type_node = build_pointer_type (void_type_node);
547 }
548 \f
549 /* Record TYPE as a builtin type for Ada.  NAME is the name of the type.  */
550
551 void
552 record_builtin_type (const char *name, tree type)
553 {
554   tree type_decl = build_decl (input_location,
555                                TYPE_DECL, get_identifier (name), type);
556
557   gnat_pushdecl (type_decl, Empty);
558
559   if (debug_hooks->type_decl)
560     debug_hooks->type_decl (type_decl, false);
561 }
562 \f
563 /* Given a record type RECORD_TYPE and a list of FIELD_DECL nodes FIELD_LIST,
564    finish constructing the record or union type.  If REP_LEVEL is zero, this
565    record has no representation clause and so will be entirely laid out here.
566    If REP_LEVEL is one, this record has a representation clause and has been
567    laid out already; only set the sizes and alignment.  If REP_LEVEL is two,
568    this record is derived from a parent record and thus inherits its layout;
569    only make a pass on the fields to finalize them.  DEBUG_INFO_P is true if
570    we need to write debug information about this type.  */
571
572 void
573 finish_record_type (tree record_type, tree field_list, int rep_level,
574                     bool debug_info_p)
575 {
576   enum tree_code code = TREE_CODE (record_type);
577   tree name = TYPE_NAME (record_type);
578   tree ada_size = bitsize_zero_node;
579   tree size = bitsize_zero_node;
580   bool had_size = TYPE_SIZE (record_type) != 0;
581   bool had_size_unit = TYPE_SIZE_UNIT (record_type) != 0;
582   bool had_align = TYPE_ALIGN (record_type) != 0;
583   tree field;
584
585   TYPE_FIELDS (record_type) = field_list;
586
587   /* Always attach the TYPE_STUB_DECL for a record type.  It is required to
588      generate debug info and have a parallel type.  */
589   if (name && TREE_CODE (name) == TYPE_DECL)
590     name = DECL_NAME (name);
591   TYPE_STUB_DECL (record_type) = create_type_stub_decl (name, record_type);
592
593   /* Globally initialize the record first.  If this is a rep'ed record,
594      that just means some initializations; otherwise, layout the record.  */
595   if (rep_level > 0)
596     {
597       TYPE_ALIGN (record_type) = MAX (BITS_PER_UNIT, TYPE_ALIGN (record_type));
598       SET_TYPE_MODE (record_type, BLKmode);
599
600       if (!had_size_unit)
601         TYPE_SIZE_UNIT (record_type) = size_zero_node;
602       if (!had_size)
603         TYPE_SIZE (record_type) = bitsize_zero_node;
604
605       /* For all-repped records with a size specified, lay the QUAL_UNION_TYPE
606          out just like a UNION_TYPE, since the size will be fixed.  */
607       else if (code == QUAL_UNION_TYPE)
608         code = UNION_TYPE;
609     }
610   else
611     {
612       /* Ensure there isn't a size already set.  There can be in an error
613          case where there is a rep clause but all fields have errors and
614          no longer have a position.  */
615       TYPE_SIZE (record_type) = 0;
616       layout_type (record_type);
617     }
618
619   /* At this point, the position and size of each field is known.  It was
620      either set before entry by a rep clause, or by laying out the type above.
621
622      We now run a pass over the fields (in reverse order for QUAL_UNION_TYPEs)
623      to compute the Ada size; the GCC size and alignment (for rep'ed records
624      that are not padding types); and the mode (for rep'ed records).  We also
625      clear the DECL_BIT_FIELD indication for the cases we know have not been
626      handled yet, and adjust DECL_NONADDRESSABLE_P accordingly.  */
627
628   if (code == QUAL_UNION_TYPE)
629     field_list = nreverse (field_list);
630
631   for (field = field_list; field; field = TREE_CHAIN (field))
632     {
633       tree type = TREE_TYPE (field);
634       tree pos = bit_position (field);
635       tree this_size = DECL_SIZE (field);
636       tree this_ada_size;
637
638       if ((TREE_CODE (type) == RECORD_TYPE
639            || TREE_CODE (type) == UNION_TYPE
640            || TREE_CODE (type) == QUAL_UNION_TYPE)
641           && !TYPE_FAT_POINTER_P (type)
642           && !TYPE_CONTAINS_TEMPLATE_P (type)
643           && TYPE_ADA_SIZE (type))
644         this_ada_size = TYPE_ADA_SIZE (type);
645       else
646         this_ada_size = this_size;
647
648       /* Clear DECL_BIT_FIELD for the cases layout_decl does not handle.  */
649       if (DECL_BIT_FIELD (field)
650           && operand_equal_p (this_size, TYPE_SIZE (type), 0))
651         {
652           unsigned int align = TYPE_ALIGN (type);
653
654           /* In the general case, type alignment is required.  */
655           if (value_factor_p (pos, align))
656             {
657               /* The enclosing record type must be sufficiently aligned.
658                  Otherwise, if no alignment was specified for it and it
659                  has been laid out already, bump its alignment to the
660                  desired one if this is compatible with its size.  */
661               if (TYPE_ALIGN (record_type) >= align)
662                 {
663                   DECL_ALIGN (field) = MAX (DECL_ALIGN (field), align);
664                   DECL_BIT_FIELD (field) = 0;
665                 }
666               else if (!had_align
667                        && rep_level == 0
668                        && value_factor_p (TYPE_SIZE (record_type), align))
669                 {
670                   TYPE_ALIGN (record_type) = align;
671                   DECL_ALIGN (field) = MAX (DECL_ALIGN (field), align);
672                   DECL_BIT_FIELD (field) = 0;
673                 }
674             }
675
676           /* In the non-strict alignment case, only byte alignment is.  */
677           if (!STRICT_ALIGNMENT
678               && DECL_BIT_FIELD (field)
679               && value_factor_p (pos, BITS_PER_UNIT))
680             DECL_BIT_FIELD (field) = 0;
681         }
682
683       /* If we still have DECL_BIT_FIELD set at this point, we know that the
684          field is technically not addressable.  Except that it can actually
685          be addressed if it is BLKmode and happens to be properly aligned.  */
686       if (DECL_BIT_FIELD (field)
687           && !(DECL_MODE (field) == BLKmode
688                && value_factor_p (pos, BITS_PER_UNIT)))
689         DECL_NONADDRESSABLE_P (field) = 1;
690
691       /* A type must be as aligned as its most aligned field that is not
692          a bit-field.  But this is already enforced by layout_type.  */
693       if (rep_level > 0 && !DECL_BIT_FIELD (field))
694         TYPE_ALIGN (record_type)
695           = MAX (TYPE_ALIGN (record_type), DECL_ALIGN (field));
696
697       switch (code)
698         {
699         case UNION_TYPE:
700           ada_size = size_binop (MAX_EXPR, ada_size, this_ada_size);
701           size = size_binop (MAX_EXPR, size, this_size);
702           break;
703
704         case QUAL_UNION_TYPE:
705           ada_size
706             = fold_build3 (COND_EXPR, bitsizetype, DECL_QUALIFIER (field),
707                            this_ada_size, ada_size);
708           size = fold_build3 (COND_EXPR, bitsizetype, DECL_QUALIFIER (field),
709                               this_size, size);
710           break;
711
712         case RECORD_TYPE:
713           /* Since we know here that all fields are sorted in order of
714              increasing bit position, the size of the record is one
715              higher than the ending bit of the last field processed
716              unless we have a rep clause, since in that case we might
717              have a field outside a QUAL_UNION_TYPE that has a higher ending
718              position.  So use a MAX in that case.  Also, if this field is a
719              QUAL_UNION_TYPE, we need to take into account the previous size in
720              the case of empty variants.  */
721           ada_size
722             = merge_sizes (ada_size, pos, this_ada_size,
723                            TREE_CODE (type) == QUAL_UNION_TYPE, rep_level > 0);
724           size
725             = merge_sizes (size, pos, this_size,
726                            TREE_CODE (type) == QUAL_UNION_TYPE, rep_level > 0);
727           break;
728
729         default:
730           gcc_unreachable ();
731         }
732     }
733
734   if (code == QUAL_UNION_TYPE)
735     nreverse (field_list);
736
737   if (rep_level < 2)
738     {
739       /* If this is a padding record, we never want to make the size smaller
740          than what was specified in it, if any.  */
741       if (TYPE_IS_PADDING_P (record_type) && TYPE_SIZE (record_type))
742         size = TYPE_SIZE (record_type);
743
744       /* Now set any of the values we've just computed that apply.  */
745       if (!TYPE_FAT_POINTER_P (record_type)
746           && !TYPE_CONTAINS_TEMPLATE_P (record_type))
747         SET_TYPE_ADA_SIZE (record_type, ada_size);
748
749       if (rep_level > 0)
750         {
751           tree size_unit = had_size_unit
752                            ? TYPE_SIZE_UNIT (record_type)
753                            : convert (sizetype,
754                                       size_binop (CEIL_DIV_EXPR, size,
755                                                   bitsize_unit_node));
756           unsigned int align = TYPE_ALIGN (record_type);
757
758           TYPE_SIZE (record_type) = variable_size (round_up (size, align));
759           TYPE_SIZE_UNIT (record_type)
760             = variable_size (round_up (size_unit, align / BITS_PER_UNIT));
761
762           compute_record_mode (record_type);
763         }
764     }
765
766   if (debug_info_p)
767     rest_of_record_type_compilation (record_type);
768 }
769
770 /* Wrap up compilation of RECORD_TYPE, i.e. output all the debug information
771    associated with it.  It need not be invoked directly in most cases since
772    finish_record_type takes care of doing so, but this can be necessary if
773    a parallel type is to be attached to the record type.  */
774
775 void
776 rest_of_record_type_compilation (tree record_type)
777 {
778   tree field_list = TYPE_FIELDS (record_type);
779   tree field;
780   enum tree_code code = TREE_CODE (record_type);
781   bool var_size = false;
782
783   for (field = field_list; field; field = TREE_CHAIN (field))
784     {
785       /* We need to make an XVE/XVU record if any field has variable size,
786          whether or not the record does.  For example, if we have a union,
787          it may be that all fields, rounded up to the alignment, have the
788          same size, in which case we'll use that size.  But the debug
789          output routines (except Dwarf2) won't be able to output the fields,
790          so we need to make the special record.  */
791       if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST
792           /* If a field has a non-constant qualifier, the record will have
793              variable size too.  */
794           || (code == QUAL_UNION_TYPE
795               && TREE_CODE (DECL_QUALIFIER (field)) != INTEGER_CST))
796         {
797           var_size = true;
798           break;
799         }
800     }
801
802   /* If this record is of variable size, rename it so that the
803      debugger knows it is and make a new, parallel, record
804      that tells the debugger how the record is laid out.  See
805      exp_dbug.ads.  But don't do this for records that are padding
806      since they confuse GDB.  */
807   if (var_size && !TYPE_IS_PADDING_P (record_type))
808     {
809       tree new_record_type
810         = make_node (TREE_CODE (record_type) == QUAL_UNION_TYPE
811                      ? UNION_TYPE : TREE_CODE (record_type));
812       tree orig_name = TYPE_NAME (record_type), new_name;
813       tree last_pos = bitsize_zero_node;
814       tree old_field, prev_old_field = NULL_TREE;
815
816       if (TREE_CODE (orig_name) == TYPE_DECL)
817         orig_name = DECL_NAME (orig_name);
818
819       new_name
820         = concat_name (orig_name, TREE_CODE (record_type) == QUAL_UNION_TYPE
821                                   ? "XVU" : "XVE");
822       TYPE_NAME (new_record_type) = new_name;
823       TYPE_ALIGN (new_record_type) = BIGGEST_ALIGNMENT;
824       TYPE_STUB_DECL (new_record_type)
825         = create_type_stub_decl (new_name, new_record_type);
826       DECL_IGNORED_P (TYPE_STUB_DECL (new_record_type))
827         = DECL_IGNORED_P (TYPE_STUB_DECL (record_type));
828       TYPE_SIZE (new_record_type) = size_int (TYPE_ALIGN (record_type));
829       TYPE_SIZE_UNIT (new_record_type)
830         = size_int (TYPE_ALIGN (record_type) / BITS_PER_UNIT);
831
832       add_parallel_type (TYPE_STUB_DECL (record_type), new_record_type);
833
834       /* Now scan all the fields, replacing each field with a new
835          field corresponding to the new encoding.  */
836       for (old_field = TYPE_FIELDS (record_type); old_field;
837            old_field = TREE_CHAIN (old_field))
838         {
839           tree field_type = TREE_TYPE (old_field);
840           tree field_name = DECL_NAME (old_field);
841           tree new_field;
842           tree curpos = bit_position (old_field);
843           bool var = false;
844           unsigned int align = 0;
845           tree pos;
846
847           /* See how the position was modified from the last position.
848
849           There are two basic cases we support: a value was added
850           to the last position or the last position was rounded to
851           a boundary and they something was added.  Check for the
852           first case first.  If not, see if there is any evidence
853           of rounding.  If so, round the last position and try
854           again.
855
856           If this is a union, the position can be taken as zero. */
857
858           /* Some computations depend on the shape of the position expression,
859              so strip conversions to make sure it's exposed.  */
860           curpos = remove_conversions (curpos, true);
861
862           if (TREE_CODE (new_record_type) == UNION_TYPE)
863             pos = bitsize_zero_node, align = 0;
864           else
865             pos = compute_related_constant (curpos, last_pos);
866
867           if (!pos && TREE_CODE (curpos) == MULT_EXPR
868               && host_integerp (TREE_OPERAND (curpos, 1), 1))
869             {
870               tree offset = TREE_OPERAND (curpos, 0);
871               align = tree_low_cst (TREE_OPERAND (curpos, 1), 1);
872
873               /* An offset which is a bitwise AND with a negative power of 2
874                  means an alignment corresponding to this power of 2.  */
875               offset = remove_conversions (offset, true);
876               if (TREE_CODE (offset) == BIT_AND_EXPR
877                   && host_integerp (TREE_OPERAND (offset, 1), 0)
878                   && tree_int_cst_sgn (TREE_OPERAND (offset, 1)) < 0)
879                 {
880                   unsigned int pow
881                     = - tree_low_cst (TREE_OPERAND (offset, 1), 0);
882                   if (exact_log2 (pow) > 0)
883                     align *= pow;
884                 }
885
886               pos = compute_related_constant (curpos,
887                                               round_up (last_pos, align));
888             }
889           else if (!pos && TREE_CODE (curpos) == PLUS_EXPR
890                    && TREE_CODE (TREE_OPERAND (curpos, 1)) == INTEGER_CST
891                    && TREE_CODE (TREE_OPERAND (curpos, 0)) == MULT_EXPR
892                    && host_integerp (TREE_OPERAND
893                                      (TREE_OPERAND (curpos, 0), 1),
894                                      1))
895             {
896               align
897                 = tree_low_cst
898                 (TREE_OPERAND (TREE_OPERAND (curpos, 0), 1), 1);
899               pos = compute_related_constant (curpos,
900                                               round_up (last_pos, align));
901             }
902           else if (potential_alignment_gap (prev_old_field, old_field,
903                                             pos))
904             {
905               align = TYPE_ALIGN (field_type);
906               pos = compute_related_constant (curpos,
907                                               round_up (last_pos, align));
908             }
909
910           /* If we can't compute a position, set it to zero.
911
912           ??? We really should abort here, but it's too much work
913           to get this correct for all cases.  */
914
915           if (!pos)
916             pos = bitsize_zero_node;
917
918           /* See if this type is variable-sized and make a pointer type
919              and indicate the indirection if so.  Beware that the debug
920              back-end may adjust the position computed above according
921              to the alignment of the field type, i.e. the pointer type
922              in this case, if we don't preventively counter that.  */
923           if (TREE_CODE (DECL_SIZE (old_field)) != INTEGER_CST)
924             {
925               field_type = build_pointer_type (field_type);
926               if (align != 0 && TYPE_ALIGN (field_type) > align)
927                 {
928                   field_type = copy_node (field_type);
929                   TYPE_ALIGN (field_type) = align;
930                 }
931               var = true;
932             }
933
934           /* Make a new field name, if necessary.  */
935           if (var || align != 0)
936             {
937               char suffix[16];
938
939               if (align != 0)
940                 sprintf (suffix, "XV%c%u", var ? 'L' : 'A',
941                          align / BITS_PER_UNIT);
942               else
943                 strcpy (suffix, "XVL");
944
945               field_name = concat_name (field_name, suffix);
946             }
947
948           new_field = create_field_decl (field_name, field_type,
949                                          new_record_type, 0,
950                                          DECL_SIZE (old_field), pos, 0);
951           TREE_CHAIN (new_field) = TYPE_FIELDS (new_record_type);
952           TYPE_FIELDS (new_record_type) = new_field;
953
954           /* If old_field is a QUAL_UNION_TYPE, take its size as being
955              zero.  The only time it's not the last field of the record
956              is when there are other components at fixed positions after
957              it (meaning there was a rep clause for every field) and we
958              want to be able to encode them.  */
959           last_pos = size_binop (PLUS_EXPR, bit_position (old_field),
960                                  (TREE_CODE (TREE_TYPE (old_field))
961                                   == QUAL_UNION_TYPE)
962                                  ? bitsize_zero_node
963                                  : DECL_SIZE (old_field));
964           prev_old_field = old_field;
965         }
966
967       TYPE_FIELDS (new_record_type)
968         = nreverse (TYPE_FIELDS (new_record_type));
969
970       rest_of_type_decl_compilation (TYPE_STUB_DECL (new_record_type));
971     }
972
973   rest_of_type_decl_compilation (TYPE_STUB_DECL (record_type));
974 }
975
976 /* Append PARALLEL_TYPE on the chain of parallel types for decl.  */
977
978 void
979 add_parallel_type (tree decl, tree parallel_type)
980 {
981   tree d = decl;
982
983   while (DECL_PARALLEL_TYPE (d))
984     d = TYPE_STUB_DECL (DECL_PARALLEL_TYPE (d));
985
986   SET_DECL_PARALLEL_TYPE (d, parallel_type);
987 }
988
989 /* Return the parallel type associated to a type, if any.  */
990
991 tree
992 get_parallel_type (tree type)
993 {
994   if (TYPE_STUB_DECL (type))
995     return DECL_PARALLEL_TYPE (TYPE_STUB_DECL (type));
996   else
997     return NULL_TREE;
998 }
999
1000 /* Utility function of above to merge LAST_SIZE, the previous size of a record
1001    with FIRST_BIT and SIZE that describe a field.  SPECIAL is true if this
1002    represents a QUAL_UNION_TYPE in which case we must look for COND_EXPRs and
1003    replace a value of zero with the old size.  If HAS_REP is true, we take the
1004    MAX of the end position of this field with LAST_SIZE.  In all other cases,
1005    we use FIRST_BIT plus SIZE.  Return an expression for the size.  */
1006
1007 static tree
1008 merge_sizes (tree last_size, tree first_bit, tree size, bool special,
1009              bool has_rep)
1010 {
1011   tree type = TREE_TYPE (last_size);
1012   tree new_size;
1013
1014   if (!special || TREE_CODE (size) != COND_EXPR)
1015     {
1016       new_size = size_binop (PLUS_EXPR, first_bit, size);
1017       if (has_rep)
1018         new_size = size_binop (MAX_EXPR, last_size, new_size);
1019     }
1020
1021   else
1022     new_size = fold_build3 (COND_EXPR, type, TREE_OPERAND (size, 0),
1023                             integer_zerop (TREE_OPERAND (size, 1))
1024                             ? last_size : merge_sizes (last_size, first_bit,
1025                                                        TREE_OPERAND (size, 1),
1026                                                        1, has_rep),
1027                             integer_zerop (TREE_OPERAND (size, 2))
1028                             ? last_size : merge_sizes (last_size, first_bit,
1029                                                        TREE_OPERAND (size, 2),
1030                                                        1, has_rep));
1031
1032   /* We don't need any NON_VALUE_EXPRs and they can confuse us (especially
1033      when fed through substitute_in_expr) into thinking that a constant
1034      size is not constant.  */
1035   while (TREE_CODE (new_size) == NON_LVALUE_EXPR)
1036     new_size = TREE_OPERAND (new_size, 0);
1037
1038   return new_size;
1039 }
1040
1041 /* Utility function of above to see if OP0 and OP1, both of SIZETYPE, are
1042    related by the addition of a constant.  Return that constant if so.  */
1043
1044 static tree
1045 compute_related_constant (tree op0, tree op1)
1046 {
1047   tree op0_var, op1_var;
1048   tree op0_con = split_plus (op0, &op0_var);
1049   tree op1_con = split_plus (op1, &op1_var);
1050   tree result = size_binop (MINUS_EXPR, op0_con, op1_con);
1051
1052   if (operand_equal_p (op0_var, op1_var, 0))
1053     return result;
1054   else if (operand_equal_p (op0, size_binop (PLUS_EXPR, op1_var, result), 0))
1055     return result;
1056   else
1057     return 0;
1058 }
1059
1060 /* Utility function of above to split a tree OP which may be a sum, into a
1061    constant part, which is returned, and a variable part, which is stored
1062    in *PVAR.  *PVAR may be bitsize_zero_node.  All operations must be of
1063    bitsizetype.  */
1064
1065 static tree
1066 split_plus (tree in, tree *pvar)
1067 {
1068   /* Strip NOPS in order to ease the tree traversal and maximize the
1069      potential for constant or plus/minus discovery. We need to be careful
1070      to always return and set *pvar to bitsizetype trees, but it's worth
1071      the effort.  */
1072   STRIP_NOPS (in);
1073
1074   *pvar = convert (bitsizetype, in);
1075
1076   if (TREE_CODE (in) == INTEGER_CST)
1077     {
1078       *pvar = bitsize_zero_node;
1079       return convert (bitsizetype, in);
1080     }
1081   else if (TREE_CODE (in) == PLUS_EXPR || TREE_CODE (in) == MINUS_EXPR)
1082     {
1083       tree lhs_var, rhs_var;
1084       tree lhs_con = split_plus (TREE_OPERAND (in, 0), &lhs_var);
1085       tree rhs_con = split_plus (TREE_OPERAND (in, 1), &rhs_var);
1086
1087       if (lhs_var == TREE_OPERAND (in, 0)
1088           && rhs_var == TREE_OPERAND (in, 1))
1089         return bitsize_zero_node;
1090
1091       *pvar = size_binop (TREE_CODE (in), lhs_var, rhs_var);
1092       return size_binop (TREE_CODE (in), lhs_con, rhs_con);
1093     }
1094   else
1095     return bitsize_zero_node;
1096 }
1097 \f
1098 /* Return a FUNCTION_TYPE node. RETURN_TYPE is the type returned by the
1099    subprogram. If it is void_type_node, then we are dealing with a procedure,
1100    otherwise we are dealing with a function. PARAM_DECL_LIST is a list of
1101    PARM_DECL nodes that are the subprogram arguments.  CICO_LIST is the
1102    copy-in/copy-out list to be stored into TYPE_CICO_LIST.
1103    RETURNS_UNCONSTRAINED is true if the function returns an unconstrained
1104    object.  RETURNS_BY_REF is true if the function returns by reference.
1105    RETURNS_BY_TARGET_PTR is true if the function is to be passed (as its
1106    first parameter) the address of the place to copy its result.  */
1107
1108 tree
1109 create_subprog_type (tree return_type, tree param_decl_list, tree cico_list,
1110                      bool returns_unconstrained, bool returns_by_ref,
1111                      bool returns_by_target_ptr)
1112 {
1113   /* A chain of TREE_LIST nodes whose TREE_VALUEs are the data type nodes of
1114      the subprogram formal parameters. This list is generated by traversing the
1115      input list of PARM_DECL nodes.  */
1116   tree param_type_list = NULL;
1117   tree param_decl;
1118   tree type;
1119
1120   for (param_decl = param_decl_list; param_decl;
1121        param_decl = TREE_CHAIN (param_decl))
1122     param_type_list = tree_cons (NULL_TREE, TREE_TYPE (param_decl),
1123                                  param_type_list);
1124
1125   /* The list of the function parameter types has to be terminated by the void
1126      type to signal to the back-end that we are not dealing with a variable
1127      parameter subprogram, but that the subprogram has a fixed number of
1128      parameters.  */
1129   param_type_list = tree_cons (NULL_TREE, void_type_node, param_type_list);
1130
1131   /* The list of argument types has been created in reverse
1132      so nreverse it.   */
1133   param_type_list = nreverse (param_type_list);
1134
1135   type = build_function_type (return_type, param_type_list);
1136
1137   /* TYPE may have been shared since GCC hashes types.  If it has a CICO_LIST
1138      or the new type should, make a copy of TYPE.  Likewise for
1139      RETURNS_UNCONSTRAINED and RETURNS_BY_REF.  */
1140   if (TYPE_CI_CO_LIST (type) || cico_list
1141       || TYPE_RETURNS_UNCONSTRAINED_P (type) != returns_unconstrained
1142       || TYPE_RETURNS_BY_REF_P (type) != returns_by_ref
1143       || TYPE_RETURNS_BY_TARGET_PTR_P (type) != returns_by_target_ptr)
1144     type = copy_type (type);
1145
1146   TYPE_CI_CO_LIST (type) = cico_list;
1147   TYPE_RETURNS_UNCONSTRAINED_P (type) = returns_unconstrained;
1148   TYPE_RETURNS_BY_REF_P (type) = returns_by_ref;
1149   TYPE_RETURNS_BY_TARGET_PTR_P (type) = returns_by_target_ptr;
1150   return type;
1151 }
1152 \f
1153 /* Return a copy of TYPE but safe to modify in any way.  */
1154
1155 tree
1156 copy_type (tree type)
1157 {
1158   tree new_type = copy_node (type);
1159
1160   /* Unshare the language-specific data.  */
1161   if (TYPE_LANG_SPECIFIC (type))
1162     {
1163       TYPE_LANG_SPECIFIC (new_type) = NULL;
1164       SET_TYPE_LANG_SPECIFIC (new_type, GET_TYPE_LANG_SPECIFIC (type));
1165     }
1166
1167   /* And the contents of the language-specific slot if needed.  */
1168   if ((INTEGRAL_TYPE_P (type) || TREE_CODE (type) == REAL_TYPE)
1169       && TYPE_RM_VALUES (type))
1170     {
1171       TYPE_RM_VALUES (new_type) = NULL_TREE;
1172       SET_TYPE_RM_SIZE (new_type, TYPE_RM_SIZE (type));
1173       SET_TYPE_RM_MIN_VALUE (new_type, TYPE_RM_MIN_VALUE (type));
1174       SET_TYPE_RM_MAX_VALUE (new_type, TYPE_RM_MAX_VALUE (type));
1175     }
1176
1177   /* copy_node clears this field instead of copying it, because it is
1178      aliased with TREE_CHAIN.  */
1179   TYPE_STUB_DECL (new_type) = TYPE_STUB_DECL (type);
1180
1181   TYPE_POINTER_TO (new_type) = 0;
1182   TYPE_REFERENCE_TO (new_type) = 0;
1183   TYPE_MAIN_VARIANT (new_type) = new_type;
1184   TYPE_NEXT_VARIANT (new_type) = 0;
1185
1186   return new_type;
1187 }
1188 \f
1189 /* Return a subtype of sizetype with range MIN to MAX and whose
1190    TYPE_INDEX_TYPE is INDEX.  GNAT_NODE is used for the position
1191    of the associated TYPE_DECL.  */
1192
1193 tree
1194 create_index_type (tree min, tree max, tree index, Node_Id gnat_node)
1195 {
1196   /* First build a type for the desired range.  */
1197   tree type = build_index_2_type (min, max);
1198
1199   /* If this type has the TYPE_INDEX_TYPE we want, return it.  */
1200   if (TYPE_INDEX_TYPE (type) == index)
1201     return type;
1202
1203   /* Otherwise, if TYPE_INDEX_TYPE is set, make a copy.  Note that we have
1204      no way of sharing these types, but that's only a small hole.  */
1205   if (TYPE_INDEX_TYPE (type))
1206     type = copy_type (type);
1207
1208   SET_TYPE_INDEX_TYPE (type, index);
1209   create_type_decl (NULL_TREE, type, NULL, true, false, gnat_node);
1210
1211   return type;
1212 }
1213
1214 /* Return a subtype of TYPE with range MIN to MAX.  If TYPE is NULL,
1215    sizetype is used.  */
1216
1217 tree
1218 create_range_type (tree type, tree min, tree max)
1219 {
1220   tree range_type;
1221
1222   if (type == NULL_TREE)
1223     type = sizetype;
1224
1225   /* First build a type with the base range.  */
1226   range_type
1227     = build_range_type (type, TYPE_MIN_VALUE (type), TYPE_MAX_VALUE (type));
1228
1229   min = convert (type, min);
1230   max = convert (type, max);
1231
1232   /* If this type has the TYPE_RM_{MIN,MAX}_VALUE we want, return it.  */
1233   if (TYPE_RM_MIN_VALUE (range_type)
1234       && TYPE_RM_MAX_VALUE (range_type)
1235       && operand_equal_p (TYPE_RM_MIN_VALUE (range_type), min, 0)
1236       && operand_equal_p (TYPE_RM_MAX_VALUE (range_type), max, 0))
1237     return range_type;
1238
1239   /* Otherwise, if TYPE_RM_{MIN,MAX}_VALUE is set, make a copy.  */
1240   if (TYPE_RM_MIN_VALUE (range_type) || TYPE_RM_MAX_VALUE (range_type))
1241     range_type = copy_type (range_type);
1242
1243   /* Then set the actual range.  */
1244   SET_TYPE_RM_MIN_VALUE (range_type, min);
1245   SET_TYPE_RM_MAX_VALUE (range_type, max);
1246
1247   return range_type;
1248 }
1249 \f
1250 /* Return a TYPE_DECL node suitable for the TYPE_STUB_DECL field of a type.
1251    TYPE_NAME gives the name of the type and TYPE is a ..._TYPE node giving
1252    its data type.  */
1253
1254 tree
1255 create_type_stub_decl (tree type_name, tree type)
1256 {
1257   /* Using a named TYPE_DECL ensures that a type name marker is emitted in
1258      STABS while setting DECL_ARTIFICIAL ensures that no DW_TAG_typedef is
1259      emitted in DWARF.  */
1260   tree type_decl = build_decl (input_location,
1261                                TYPE_DECL, type_name, type);
1262   DECL_ARTIFICIAL (type_decl) = 1;
1263   return type_decl;
1264 }
1265
1266 /* Return a TYPE_DECL node.  TYPE_NAME gives the name of the type and TYPE
1267    is a ..._TYPE node giving its data type.  ARTIFICIAL_P is true if this
1268    is a declaration that was generated by the compiler.  DEBUG_INFO_P is
1269    true if we need to write debug information about this type.  GNAT_NODE
1270    is used for the position of the decl.  */
1271
1272 tree
1273 create_type_decl (tree type_name, tree type, struct attrib *attr_list,
1274                   bool artificial_p, bool debug_info_p, Node_Id gnat_node)
1275 {
1276   enum tree_code code = TREE_CODE (type);
1277   bool named = TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL;
1278   tree type_decl;
1279
1280   /* Only the builtin TYPE_STUB_DECL should be used for dummy types.  */
1281   gcc_assert (!TYPE_IS_DUMMY_P (type));
1282
1283   /* If the type hasn't been named yet, we're naming it; preserve an existing
1284      TYPE_STUB_DECL that has been attached to it for some purpose.  */
1285   if (!named && TYPE_STUB_DECL (type))
1286     {
1287       type_decl = TYPE_STUB_DECL (type);
1288       DECL_NAME (type_decl) = type_name;
1289     }
1290   else
1291     type_decl = build_decl (input_location,
1292                             TYPE_DECL, type_name, type);
1293
1294   DECL_ARTIFICIAL (type_decl) = artificial_p;
1295   gnat_pushdecl (type_decl, gnat_node);
1296   process_attributes (type_decl, attr_list);
1297
1298   /* If we're naming the type, equate the TYPE_STUB_DECL to the name.
1299      This causes the name to be also viewed as a "tag" by the debug
1300      back-end, with the advantage that no DW_TAG_typedef is emitted
1301      for artificial "tagged" types in DWARF.  */
1302   if (!named)
1303     TYPE_STUB_DECL (type) = type_decl;
1304
1305   /* Pass the type declaration to the debug back-end unless this is an
1306      UNCONSTRAINED_ARRAY_TYPE that the back-end does not support, or a
1307      type for which debugging information was not requested, or else an
1308      ENUMERAL_TYPE or RECORD_TYPE (except for fat pointers) which are
1309      handled separately.  And do not pass dummy types either.  */
1310   if (code == UNCONSTRAINED_ARRAY_TYPE || !debug_info_p)
1311     DECL_IGNORED_P (type_decl) = 1;
1312   else if (code != ENUMERAL_TYPE
1313            && (code != RECORD_TYPE || TYPE_FAT_POINTER_P (type))
1314            && !((code == POINTER_TYPE || code == REFERENCE_TYPE)
1315                 && TYPE_IS_DUMMY_P (TREE_TYPE (type)))
1316            && !(code == RECORD_TYPE
1317                 && TYPE_IS_DUMMY_P
1318                    (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (type))))))
1319     rest_of_type_decl_compilation (type_decl);
1320
1321   return type_decl;
1322 }
1323 \f
1324 /* Return a VAR_DECL or CONST_DECL node.
1325
1326    VAR_NAME gives the name of the variable.  ASM_NAME is its assembler name
1327    (if provided).  TYPE is its data type (a GCC ..._TYPE node).  VAR_INIT is
1328    the GCC tree for an optional initial expression; NULL_TREE if none.
1329
1330    CONST_FLAG is true if this variable is constant, in which case we might
1331    return a CONST_DECL node unless CONST_DECL_ALLOWED_P is false.
1332
1333    PUBLIC_FLAG is true if this is for a reference to a public entity or for a
1334    definition to be made visible outside of the current compilation unit, for
1335    instance variable definitions in a package specification.
1336
1337    EXTERN_FLAG is true when processing an external variable declaration (as
1338    opposed to a definition: no storage is to be allocated for the variable).
1339
1340    STATIC_FLAG is only relevant when not at top level.  In that case
1341    it indicates whether to always allocate storage to the variable.
1342
1343    GNAT_NODE is used for the position of the decl.  */
1344
1345 tree
1346 create_var_decl_1 (tree var_name, tree asm_name, tree type, tree var_init,
1347                    bool const_flag, bool public_flag, bool extern_flag,
1348                    bool static_flag, bool const_decl_allowed_p,
1349                    struct attrib *attr_list, Node_Id gnat_node)
1350 {
1351   bool init_const
1352     = (var_init != 0
1353        && gnat_types_compatible_p (type, TREE_TYPE (var_init))
1354        && (global_bindings_p () || static_flag
1355            ? initializer_constant_valid_p (var_init, TREE_TYPE (var_init)) != 0
1356            : TREE_CONSTANT (var_init)));
1357
1358   /* Whether we will make TREE_CONSTANT the DECL we produce here, in which
1359      case the initializer may be used in-lieu of the DECL node (as done in
1360      Identifier_to_gnu).  This is useful to prevent the need of elaboration
1361      code when an identifier for which such a decl is made is in turn used as
1362      an initializer.  We used to rely on CONST vs VAR_DECL for this purpose,
1363      but extra constraints apply to this choice (see below) and are not
1364      relevant to the distinction we wish to make. */
1365   bool constant_p = const_flag && init_const;
1366
1367   /* The actual DECL node.  CONST_DECL was initially intended for enumerals
1368      and may be used for scalars in general but not for aggregates.  */
1369   tree var_decl
1370     = build_decl (input_location,
1371                   (constant_p && const_decl_allowed_p
1372                    && !AGGREGATE_TYPE_P (type)) ? CONST_DECL : VAR_DECL,
1373                   var_name, type);
1374
1375   /* If this is external, throw away any initializations (they will be done
1376      elsewhere) unless this is a constant for which we would like to remain
1377      able to get the initializer.  If we are defining a global here, leave a
1378      constant initialization and save any variable elaborations for the
1379      elaboration routine.  If we are just annotating types, throw away the
1380      initialization if it isn't a constant.  */
1381   if ((extern_flag && !constant_p)
1382       || (type_annotate_only && var_init && !TREE_CONSTANT (var_init)))
1383     var_init = NULL_TREE;
1384
1385   /* At the global level, an initializer requiring code to be generated
1386      produces elaboration statements.  Check that such statements are allowed,
1387      that is, not violating a No_Elaboration_Code restriction.  */
1388   if (global_bindings_p () && var_init != 0 && ! init_const)
1389     Check_Elaboration_Code_Allowed (gnat_node);
1390   DECL_INITIAL  (var_decl) = var_init;
1391   TREE_READONLY (var_decl) = const_flag;
1392   DECL_EXTERNAL (var_decl) = extern_flag;
1393   TREE_PUBLIC   (var_decl) = public_flag || extern_flag;
1394   TREE_CONSTANT (var_decl) = constant_p;
1395   TREE_THIS_VOLATILE (var_decl) = TREE_SIDE_EFFECTS (var_decl)
1396     = TYPE_VOLATILE (type);
1397
1398   /* Ada doesn't feature Fortran-like COMMON variables so we shouldn't
1399      try to fiddle with DECL_COMMON.  However, on platforms that don't
1400      support global BSS sections, uninitialized global variables would
1401      go in DATA instead, thus increasing the size of the executable.  */
1402   if (!flag_no_common
1403       && TREE_CODE (var_decl) == VAR_DECL
1404       && TREE_PUBLIC   (var_decl)
1405       && !have_global_bss_p ())
1406     DECL_COMMON (var_decl) = 1;
1407
1408   /* If it's public and not external, always allocate storage for it.
1409      At the global binding level we need to allocate static storage for the
1410      variable if and only if it's not external. If we are not at the top level
1411      we allocate automatic storage unless requested not to.  */
1412   TREE_STATIC (var_decl)
1413     = !extern_flag && (public_flag || static_flag || global_bindings_p ());
1414
1415   /* For an external constant whose initializer is not absolute, do not emit
1416      debug info.  In DWARF this would mean a global relocation in a read-only
1417      section which runs afoul of the PE-COFF runtime relocation mechanism.  */
1418   if (extern_flag
1419       && constant_p
1420       && initializer_constant_valid_p (var_init, TREE_TYPE (var_init))
1421            != null_pointer_node)
1422     DECL_IGNORED_P (var_decl) = 1;
1423
1424   if (TREE_CODE (var_decl) == VAR_DECL)
1425     {
1426       if (asm_name)
1427         SET_DECL_ASSEMBLER_NAME (var_decl, asm_name);
1428       process_attributes (var_decl, attr_list);
1429     }
1430
1431   /* Add this decl to the current binding level.  */
1432   gnat_pushdecl (var_decl, gnat_node);
1433
1434   if (TREE_SIDE_EFFECTS (var_decl))
1435     TREE_ADDRESSABLE (var_decl) = 1;
1436
1437   if (TREE_CODE (var_decl) != CONST_DECL)
1438     {
1439       if (global_bindings_p ())
1440         rest_of_decl_compilation (var_decl, true, 0);
1441     }
1442   else
1443     expand_decl (var_decl);
1444
1445   return var_decl;
1446 }
1447 \f
1448 /* Return true if TYPE, an aggregate type, contains (or is) an array.  */
1449
1450 static bool
1451 aggregate_type_contains_array_p (tree type)
1452 {
1453   switch (TREE_CODE (type))
1454     {
1455     case RECORD_TYPE:
1456     case UNION_TYPE:
1457     case QUAL_UNION_TYPE:
1458       {
1459         tree field;
1460         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1461           if (AGGREGATE_TYPE_P (TREE_TYPE (field))
1462               && aggregate_type_contains_array_p (TREE_TYPE (field)))
1463             return true;
1464         return false;
1465       }
1466
1467     case ARRAY_TYPE:
1468       return true;
1469
1470     default:
1471       gcc_unreachable ();
1472     }
1473 }
1474
1475 /* Return a FIELD_DECL node.  FIELD_NAME is the field's name, FIELD_TYPE is
1476    its type and RECORD_TYPE is the type of the enclosing record.  PACKED is
1477    1 if the enclosing record is packed, -1 if it has Component_Alignment of
1478    Storage_Unit.  If SIZE is nonzero, it is the specified size of the field.
1479    If POS is nonzero, it is the bit position.  If ADDRESSABLE is nonzero, it
1480    means we are allowed to take the address of the field; if it is negative,
1481    we should not make a bitfield, which is used by make_aligning_type.  */
1482
1483 tree
1484 create_field_decl (tree field_name, tree field_type, tree record_type,
1485                    int packed, tree size, tree pos, int addressable)
1486 {
1487   tree field_decl = build_decl (input_location,
1488                                 FIELD_DECL, field_name, field_type);
1489
1490   DECL_CONTEXT (field_decl) = record_type;
1491   TREE_READONLY (field_decl) = TYPE_READONLY (field_type);
1492
1493   /* If FIELD_TYPE is BLKmode, we must ensure this is aligned to at least a
1494      byte boundary since GCC cannot handle less-aligned BLKmode bitfields.
1495      Likewise for an aggregate without specified position that contains an
1496      array, because in this case slices of variable length of this array
1497      must be handled by GCC and variable-sized objects need to be aligned
1498      to at least a byte boundary.  */
1499   if (packed && (TYPE_MODE (field_type) == BLKmode
1500                  || (!pos
1501                      && AGGREGATE_TYPE_P (field_type)
1502                      && aggregate_type_contains_array_p (field_type))))
1503     DECL_ALIGN (field_decl) = BITS_PER_UNIT;
1504
1505   /* If a size is specified, use it.  Otherwise, if the record type is packed
1506      compute a size to use, which may differ from the object's natural size.
1507      We always set a size in this case to trigger the checks for bitfield
1508      creation below, which is typically required when no position has been
1509      specified.  */
1510   if (size)
1511     size = convert (bitsizetype, size);
1512   else if (packed == 1)
1513     {
1514       size = rm_size (field_type);
1515       if (TYPE_MODE (field_type) == BLKmode)
1516         size = round_up (size, BITS_PER_UNIT);
1517     }
1518
1519   /* If we may, according to ADDRESSABLE, make a bitfield if a size is
1520      specified for two reasons: first if the size differs from the natural
1521      size.  Second, if the alignment is insufficient.  There are a number of
1522      ways the latter can be true.
1523
1524      We never make a bitfield if the type of the field has a nonconstant size,
1525      because no such entity requiring bitfield operations should reach here.
1526
1527      We do *preventively* make a bitfield when there might be the need for it
1528      but we don't have all the necessary information to decide, as is the case
1529      of a field with no specified position in a packed record.
1530
1531      We also don't look at STRICT_ALIGNMENT here, and rely on later processing
1532      in layout_decl or finish_record_type to clear the bit_field indication if
1533      it is in fact not needed.  */
1534   if (addressable >= 0
1535       && size
1536       && TREE_CODE (size) == INTEGER_CST
1537       && TREE_CODE (TYPE_SIZE (field_type)) == INTEGER_CST
1538       && (!tree_int_cst_equal (size, TYPE_SIZE (field_type))
1539           || (pos && !value_factor_p (pos, TYPE_ALIGN (field_type)))
1540           || packed
1541           || (TYPE_ALIGN (record_type) != 0
1542               && TYPE_ALIGN (record_type) < TYPE_ALIGN (field_type))))
1543     {
1544       DECL_BIT_FIELD (field_decl) = 1;
1545       DECL_SIZE (field_decl) = size;
1546       if (!packed && !pos)
1547         {
1548           if (TYPE_ALIGN (record_type) != 0
1549               && TYPE_ALIGN (record_type) < TYPE_ALIGN (field_type))
1550             DECL_ALIGN (field_decl) = TYPE_ALIGN (record_type);
1551           else
1552             DECL_ALIGN (field_decl) = TYPE_ALIGN (field_type);
1553         }
1554     }
1555
1556   DECL_PACKED (field_decl) = pos ? DECL_BIT_FIELD (field_decl) : packed;
1557
1558   /* Bump the alignment if need be, either for bitfield/packing purposes or
1559      to satisfy the type requirements if no such consideration applies.  When
1560      we get the alignment from the type, indicate if this is from an explicit
1561      user request, which prevents stor-layout from lowering it later on.  */
1562   {
1563     unsigned int bit_align
1564       = (DECL_BIT_FIELD (field_decl) ? 1
1565          : packed && TYPE_MODE (field_type) != BLKmode ? BITS_PER_UNIT : 0);
1566
1567     if (bit_align > DECL_ALIGN (field_decl))
1568       DECL_ALIGN (field_decl) = bit_align;
1569     else if (!bit_align && TYPE_ALIGN (field_type) > DECL_ALIGN (field_decl))
1570       {
1571         DECL_ALIGN (field_decl) = TYPE_ALIGN (field_type);
1572         DECL_USER_ALIGN (field_decl) = TYPE_USER_ALIGN (field_type);
1573       }
1574   }
1575
1576   if (pos)
1577     {
1578       /* We need to pass in the alignment the DECL is known to have.
1579          This is the lowest-order bit set in POS, but no more than
1580          the alignment of the record, if one is specified.  Note
1581          that an alignment of 0 is taken as infinite.  */
1582       unsigned int known_align;
1583
1584       if (host_integerp (pos, 1))
1585         known_align = tree_low_cst (pos, 1) & - tree_low_cst (pos, 1);
1586       else
1587         known_align = BITS_PER_UNIT;
1588
1589       if (TYPE_ALIGN (record_type)
1590           && (known_align == 0 || known_align > TYPE_ALIGN (record_type)))
1591         known_align = TYPE_ALIGN (record_type);
1592
1593       layout_decl (field_decl, known_align);
1594       SET_DECL_OFFSET_ALIGN (field_decl,
1595                              host_integerp (pos, 1) ? BIGGEST_ALIGNMENT
1596                              : BITS_PER_UNIT);
1597       pos_from_bit (&DECL_FIELD_OFFSET (field_decl),
1598                     &DECL_FIELD_BIT_OFFSET (field_decl),
1599                     DECL_OFFSET_ALIGN (field_decl), pos);
1600     }
1601
1602   /* In addition to what our caller says, claim the field is addressable if we
1603      know that its type is not suitable.
1604
1605      The field may also be "technically" nonaddressable, meaning that even if
1606      we attempt to take the field's address we will actually get the address
1607      of a copy.  This is the case for true bitfields, but the DECL_BIT_FIELD
1608      value we have at this point is not accurate enough, so we don't account
1609      for this here and let finish_record_type decide.  */
1610   if (!addressable && !type_for_nonaliased_component_p (field_type))
1611     addressable = 1;
1612
1613   DECL_NONADDRESSABLE_P (field_decl) = !addressable;
1614
1615   return field_decl;
1616 }
1617 \f
1618 /* Return a PARM_DECL node.  PARAM_NAME is the name of the parameter and
1619    PARAM_TYPE is its type.  READONLY is true if the parameter is readonly
1620    (either an In parameter or an address of a pass-by-ref parameter).  */
1621
1622 tree
1623 create_param_decl (tree param_name, tree param_type, bool readonly)
1624 {
1625   tree param_decl = build_decl (input_location,
1626                                 PARM_DECL, param_name, param_type);
1627
1628   /* Honor TARGET_PROMOTE_PROTOTYPES like the C compiler, as not doing so
1629      can lead to various ABI violations.  */
1630   if (targetm.calls.promote_prototypes (NULL_TREE)
1631       && INTEGRAL_TYPE_P (param_type)
1632       && TYPE_PRECISION (param_type) < TYPE_PRECISION (integer_type_node))
1633     {
1634       /* We have to be careful about biased types here.  Make a subtype
1635          of integer_type_node with the proper biasing.  */
1636       if (TREE_CODE (param_type) == INTEGER_TYPE
1637           && TYPE_BIASED_REPRESENTATION_P (param_type))
1638         {
1639           tree subtype
1640             = make_unsigned_type (TYPE_PRECISION (integer_type_node));
1641           TREE_TYPE (subtype) = integer_type_node;
1642           TYPE_BIASED_REPRESENTATION_P (subtype) = 1;
1643           SET_TYPE_RM_MIN_VALUE (subtype, TYPE_MIN_VALUE (param_type));
1644           SET_TYPE_RM_MAX_VALUE (subtype, TYPE_MAX_VALUE (param_type));
1645           param_type = subtype;
1646         }
1647       else
1648         param_type = integer_type_node;
1649     }
1650
1651   DECL_ARG_TYPE (param_decl) = param_type;
1652   TREE_READONLY (param_decl) = readonly;
1653   return param_decl;
1654 }
1655 \f
1656 /* Given a DECL and ATTR_LIST, process the listed attributes.  */
1657
1658 void
1659 process_attributes (tree decl, struct attrib *attr_list)
1660 {
1661   for (; attr_list; attr_list = attr_list->next)
1662     switch (attr_list->type)
1663       {
1664       case ATTR_MACHINE_ATTRIBUTE:
1665         decl_attributes (&decl, tree_cons (attr_list->name, attr_list->args,
1666                                            NULL_TREE),
1667                          ATTR_FLAG_TYPE_IN_PLACE);
1668         break;
1669
1670       case ATTR_LINK_ALIAS:
1671         if (! DECL_EXTERNAL (decl))
1672           {
1673             TREE_STATIC (decl) = 1;
1674             assemble_alias (decl, attr_list->name);
1675           }
1676         break;
1677
1678       case ATTR_WEAK_EXTERNAL:
1679         if (SUPPORTS_WEAK)
1680           declare_weak (decl);
1681         else
1682           post_error ("?weak declarations not supported on this target",
1683                       attr_list->error_point);
1684         break;
1685
1686       case ATTR_LINK_SECTION:
1687         if (targetm.have_named_sections)
1688           {
1689             DECL_SECTION_NAME (decl)
1690               = build_string (IDENTIFIER_LENGTH (attr_list->name),
1691                               IDENTIFIER_POINTER (attr_list->name));
1692             DECL_COMMON (decl) = 0;
1693           }
1694         else
1695           post_error ("?section attributes are not supported for this target",
1696                       attr_list->error_point);
1697         break;
1698
1699       case ATTR_LINK_CONSTRUCTOR:
1700         DECL_STATIC_CONSTRUCTOR (decl) = 1;
1701         TREE_USED (decl) = 1;
1702         break;
1703
1704       case ATTR_LINK_DESTRUCTOR:
1705         DECL_STATIC_DESTRUCTOR (decl) = 1;
1706         TREE_USED (decl) = 1;
1707         break;
1708
1709       case ATTR_THREAD_LOCAL_STORAGE:
1710         DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
1711         DECL_COMMON (decl) = 0;
1712         break;
1713       }
1714 }
1715 \f
1716 /* Record DECL as a global renaming pointer.  */
1717
1718 void
1719 record_global_renaming_pointer (tree decl)
1720 {
1721   gcc_assert (DECL_RENAMED_OBJECT (decl));
1722   VEC_safe_push (tree, gc, global_renaming_pointers, decl);
1723 }
1724
1725 /* Invalidate the global renaming pointers.   */
1726
1727 void
1728 invalidate_global_renaming_pointers (void)
1729 {
1730   unsigned int i;
1731   tree iter;
1732
1733   for (i = 0; VEC_iterate(tree, global_renaming_pointers, i, iter); i++)
1734     SET_DECL_RENAMED_OBJECT (iter, NULL_TREE);
1735
1736   VEC_free (tree, gc, global_renaming_pointers);
1737 }
1738
1739 /* Return true if VALUE is a known to be a multiple of FACTOR, which must be
1740    a power of 2. */
1741
1742 bool
1743 value_factor_p (tree value, HOST_WIDE_INT factor)
1744 {
1745   if (host_integerp (value, 1))
1746     return tree_low_cst (value, 1) % factor == 0;
1747
1748   if (TREE_CODE (value) == MULT_EXPR)
1749     return (value_factor_p (TREE_OPERAND (value, 0), factor)
1750             || value_factor_p (TREE_OPERAND (value, 1), factor));
1751
1752   return false;
1753 }
1754
1755 /* Given 2 consecutive field decls PREV_FIELD and CURR_FIELD, return true
1756    unless we can prove these 2 fields are laid out in such a way that no gap
1757    exist between the end of PREV_FIELD and the beginning of CURR_FIELD.  OFFSET
1758    is the distance in bits between the end of PREV_FIELD and the starting
1759    position of CURR_FIELD. It is ignored if null. */
1760
1761 static bool
1762 potential_alignment_gap (tree prev_field, tree curr_field, tree offset)
1763 {
1764   /* If this is the first field of the record, there cannot be any gap */
1765   if (!prev_field)
1766     return false;
1767
1768   /* If the previous field is a union type, then return False: The only
1769      time when such a field is not the last field of the record is when
1770      there are other components at fixed positions after it (meaning there
1771      was a rep clause for every field), in which case we don't want the
1772      alignment constraint to override them. */
1773   if (TREE_CODE (TREE_TYPE (prev_field)) == QUAL_UNION_TYPE)
1774     return false;
1775
1776   /* If the distance between the end of prev_field and the beginning of
1777      curr_field is constant, then there is a gap if the value of this
1778      constant is not null. */
1779   if (offset && host_integerp (offset, 1))
1780     return !integer_zerop (offset);
1781
1782   /* If the size and position of the previous field are constant,
1783      then check the sum of this size and position. There will be a gap
1784      iff it is not multiple of the current field alignment. */
1785   if (host_integerp (DECL_SIZE (prev_field), 1)
1786       && host_integerp (bit_position (prev_field), 1))
1787     return ((tree_low_cst (bit_position (prev_field), 1)
1788              + tree_low_cst (DECL_SIZE (prev_field), 1))
1789             % DECL_ALIGN (curr_field) != 0);
1790
1791   /* If both the position and size of the previous field are multiples
1792      of the current field alignment, there cannot be any gap. */
1793   if (value_factor_p (bit_position (prev_field), DECL_ALIGN (curr_field))
1794       && value_factor_p (DECL_SIZE (prev_field), DECL_ALIGN (curr_field)))
1795     return false;
1796
1797   /* Fallback, return that there may be a potential gap */
1798   return true;
1799 }
1800
1801 /* Returns a LABEL_DECL node for LABEL_NAME.  */
1802
1803 tree
1804 create_label_decl (tree label_name)
1805 {
1806   tree label_decl = build_decl (input_location,
1807                                 LABEL_DECL, label_name, void_type_node);
1808
1809   DECL_CONTEXT (label_decl)     = current_function_decl;
1810   DECL_MODE (label_decl)        = VOIDmode;
1811   DECL_SOURCE_LOCATION (label_decl) = input_location;
1812
1813   return label_decl;
1814 }
1815 \f
1816 /* Returns a FUNCTION_DECL node.  SUBPROG_NAME is the name of the subprogram,
1817    ASM_NAME is its assembler name, SUBPROG_TYPE is its type (a FUNCTION_TYPE
1818    node), PARAM_DECL_LIST is the list of the subprogram arguments (a list of
1819    PARM_DECL nodes chained through the TREE_CHAIN field).
1820
1821    INLINE_FLAG, PUBLIC_FLAG, EXTERN_FLAG, and ATTR_LIST are used to set the
1822    appropriate fields in the FUNCTION_DECL.  GNAT_NODE gives the location.  */
1823
1824 tree
1825 create_subprog_decl (tree subprog_name, tree asm_name,
1826                      tree subprog_type, tree param_decl_list, bool inline_flag,
1827                      bool public_flag, bool extern_flag,
1828                      struct attrib *attr_list, Node_Id gnat_node)
1829 {
1830   tree return_type  = TREE_TYPE (subprog_type);
1831   tree subprog_decl = build_decl (input_location,
1832                                   FUNCTION_DECL, subprog_name, subprog_type);
1833
1834   /* If this is a non-inline function nested inside an inlined external
1835      function, we cannot honor both requests without cloning the nested
1836      function in the current unit since it is private to the other unit.
1837      We could inline the nested function as well but it's probably better
1838      to err on the side of too little inlining.  */
1839   if (!inline_flag
1840       && current_function_decl
1841       && DECL_DECLARED_INLINE_P (current_function_decl)
1842       && DECL_EXTERNAL (current_function_decl))
1843     DECL_DECLARED_INLINE_P (current_function_decl) = 0;
1844
1845   DECL_EXTERNAL (subprog_decl)  = extern_flag;
1846   TREE_PUBLIC (subprog_decl)    = public_flag;
1847   TREE_STATIC (subprog_decl)    = 1;
1848   TREE_READONLY (subprog_decl)  = TYPE_READONLY (subprog_type);
1849   TREE_THIS_VOLATILE (subprog_decl) = TYPE_VOLATILE (subprog_type);
1850   TREE_SIDE_EFFECTS (subprog_decl) = TYPE_VOLATILE (subprog_type);
1851   DECL_DECLARED_INLINE_P (subprog_decl) = inline_flag;
1852   DECL_ARGUMENTS (subprog_decl) = param_decl_list;
1853   DECL_RESULT (subprog_decl)    = build_decl (input_location,
1854                                               RESULT_DECL, 0, return_type);
1855   DECL_ARTIFICIAL (DECL_RESULT (subprog_decl)) = 1;
1856   DECL_IGNORED_P (DECL_RESULT (subprog_decl)) = 1;
1857
1858   /* TREE_ADDRESSABLE is set on the result type to request the use of the
1859      target by-reference return mechanism.  This is not supported all the
1860      way down to RTL expansion with GCC 4, which ICEs on temporary creation
1861      attempts with such a type and expects DECL_BY_REFERENCE to be set on
1862      the RESULT_DECL instead - see gnat_genericize for more details.  */
1863   if (TREE_ADDRESSABLE (TREE_TYPE (DECL_RESULT (subprog_decl))))
1864     {
1865       tree result_decl = DECL_RESULT (subprog_decl);
1866
1867       TREE_ADDRESSABLE (TREE_TYPE (result_decl)) = 0;
1868       DECL_BY_REFERENCE (result_decl) = 1;
1869     }
1870
1871   if (asm_name)
1872     {
1873       SET_DECL_ASSEMBLER_NAME (subprog_decl, asm_name);
1874
1875       /* The expand_main_function circuitry expects "main_identifier_node" to
1876          designate the DECL_NAME of the 'main' entry point, in turn expected
1877          to be declared as the "main" function literally by default.  Ada
1878          program entry points are typically declared with a different name
1879          within the binder generated file, exported as 'main' to satisfy the
1880          system expectations.  Force main_identifier_node in this case.  */
1881       if (asm_name == main_identifier_node)
1882         DECL_NAME (subprog_decl) = main_identifier_node;
1883     }
1884
1885   process_attributes (subprog_decl, attr_list);
1886
1887   /* Add this decl to the current binding level.  */
1888   gnat_pushdecl (subprog_decl, gnat_node);
1889
1890   /* Output the assembler code and/or RTL for the declaration.  */
1891   rest_of_decl_compilation (subprog_decl, global_bindings_p (), 0);
1892
1893   return subprog_decl;
1894 }
1895 \f
1896 /* Set up the framework for generating code for SUBPROG_DECL, a subprogram
1897    body.  This routine needs to be invoked before processing the declarations
1898    appearing in the subprogram.  */
1899
1900 void
1901 begin_subprog_body (tree subprog_decl)
1902 {
1903   tree param_decl;
1904
1905   current_function_decl = subprog_decl;
1906   announce_function (subprog_decl);
1907
1908   /* Enter a new binding level and show that all the parameters belong to
1909      this function.  */
1910   gnat_pushlevel ();
1911   for (param_decl = DECL_ARGUMENTS (subprog_decl); param_decl;
1912        param_decl = TREE_CHAIN (param_decl))
1913     DECL_CONTEXT (param_decl) = subprog_decl;
1914
1915   make_decl_rtl (subprog_decl);
1916
1917   /* We handle pending sizes via the elaboration of types, so we don't need to
1918      save them.  This causes them to be marked as part of the outer function
1919      and then discarded.  */
1920   get_pending_sizes ();
1921 }
1922
1923
1924 /* Helper for the genericization callback.  Return a dereference of VAL
1925    if it is of a reference type.  */
1926
1927 static tree
1928 convert_from_reference (tree val)
1929 {
1930   tree value_type, ref;
1931
1932   if (TREE_CODE (TREE_TYPE (val)) != REFERENCE_TYPE)
1933     return val;
1934
1935   value_type =  TREE_TYPE (TREE_TYPE (val));
1936   ref = build1 (INDIRECT_REF, value_type, val);
1937
1938   /* See if what we reference is CONST or VOLATILE, which requires
1939      looking into array types to get to the component type.  */
1940
1941   while (TREE_CODE (value_type) == ARRAY_TYPE)
1942     value_type = TREE_TYPE (value_type);
1943
1944   TREE_READONLY (ref)
1945     = (TYPE_QUALS (value_type) & TYPE_QUAL_CONST);
1946   TREE_THIS_VOLATILE (ref)
1947     = (TYPE_QUALS (value_type) & TYPE_QUAL_VOLATILE);
1948
1949   TREE_SIDE_EFFECTS (ref)
1950     = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
1951
1952   return ref;
1953 }
1954
1955 /* Helper for the genericization callback.  Returns true if T denotes
1956    a RESULT_DECL with DECL_BY_REFERENCE set.  */
1957
1958 static inline bool
1959 is_byref_result (tree t)
1960 {
1961   return (TREE_CODE (t) == RESULT_DECL && DECL_BY_REFERENCE (t));
1962 }
1963
1964
1965 /* Tree walking callback for gnat_genericize. Currently ...
1966
1967    o Adjust references to the function's DECL_RESULT if it is marked
1968      DECL_BY_REFERENCE and so has had its type turned into a reference
1969      type at the end of the function compilation.  */
1970
1971 static tree
1972 gnat_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
1973 {
1974   /* This implementation is modeled after what the C++ front-end is
1975      doing, basis of the downstream passes behavior.  */
1976
1977   tree stmt = *stmt_p;
1978   struct pointer_set_t *p_set = (struct pointer_set_t*) data;
1979
1980   /* If we have a direct mention of the result decl, dereference.  */
1981   if (is_byref_result (stmt))
1982     {
1983       *stmt_p = convert_from_reference (stmt);
1984       *walk_subtrees = 0;
1985       return NULL;
1986     }
1987
1988   /* Otherwise, no need to walk the same tree twice.  */
1989   if (pointer_set_contains (p_set, stmt))
1990     {
1991       *walk_subtrees = 0;
1992       return NULL_TREE;
1993     }
1994
1995   /* If we are taking the address of what now is a reference, just get the
1996      reference value.  */
1997   if (TREE_CODE (stmt) == ADDR_EXPR
1998       && is_byref_result (TREE_OPERAND (stmt, 0)))
1999     {
2000       *stmt_p = convert (TREE_TYPE (stmt), TREE_OPERAND (stmt, 0));
2001       *walk_subtrees = 0;
2002     }
2003
2004   /* Don't dereference an by-reference RESULT_DECL inside a RETURN_EXPR.  */
2005   else if (TREE_CODE (stmt) == RETURN_EXPR
2006            && TREE_OPERAND (stmt, 0)
2007            && is_byref_result (TREE_OPERAND (stmt, 0)))
2008     *walk_subtrees = 0;
2009
2010   /* Don't look inside trees that cannot embed references of interest.  */
2011   else if (IS_TYPE_OR_DECL_P (stmt))
2012     *walk_subtrees = 0;
2013
2014   pointer_set_insert (p_set, *stmt_p);
2015
2016   return NULL;
2017 }
2018
2019 /* Perform lowering of Ada trees to GENERIC. In particular:
2020
2021    o Turn a DECL_BY_REFERENCE RESULT_DECL into a real by-reference decl
2022      and adjust all the references to this decl accordingly.  */
2023
2024 static void
2025 gnat_genericize (tree fndecl)
2026 {
2027   /* Prior to GCC 4, an explicit By_Reference result mechanism for a function
2028      was handled by simply setting TREE_ADDRESSABLE on the result type.
2029      Everything required to actually pass by invisible ref using the target
2030      mechanism (e.g. extra parameter) was handled at RTL expansion time.
2031
2032      This doesn't work with GCC 4 any more for several reasons.  First, the
2033      gimplification process might need the creation of temporaries of this
2034      type, and the gimplifier ICEs on such attempts.  Second, the middle-end
2035      now relies on a different attribute for such cases (DECL_BY_REFERENCE on
2036      RESULT/PARM_DECLs), and expects the user invisible by-reference-ness to
2037      be explicitly accounted for by the front-end in the function body.
2038
2039      We achieve the complete transformation in two steps:
2040
2041      1/ create_subprog_decl performs early attribute tweaks: it clears
2042         TREE_ADDRESSABLE from the result type and sets DECL_BY_REFERENCE on
2043         the result decl.  The former ensures that the bit isn't set in the GCC
2044         tree saved for the function, so prevents ICEs on temporary creation.
2045         The latter we use here to trigger the rest of the processing.
2046
2047      2/ This function performs the type transformation on the result decl
2048         and adjusts all the references to this decl from the function body
2049         accordingly.
2050
2051      Clearing TREE_ADDRESSABLE from the type differs from the C++ front-end
2052      strategy, which escapes the gimplifier temporary creation issues by
2053      creating it's own temporaries using TARGET_EXPR nodes.  Our way relies
2054      on simple specific support code in aggregate_value_p to look at the
2055      target function result decl explicitly.  */
2056
2057   struct pointer_set_t *p_set;
2058   tree decl_result = DECL_RESULT (fndecl);
2059
2060   if (!DECL_BY_REFERENCE (decl_result))
2061     return;
2062
2063   /* Make the DECL_RESULT explicitly by-reference and adjust all the
2064      occurrences in the function body using the common tree-walking facility.
2065      We want to see every occurrence of the result decl to adjust the
2066      referencing tree, so need to use our own pointer set to control which
2067      trees should be visited again or not.  */
2068
2069   p_set = pointer_set_create ();
2070
2071   TREE_TYPE (decl_result) = build_reference_type (TREE_TYPE (decl_result));
2072   TREE_ADDRESSABLE (decl_result) = 0;
2073   relayout_decl (decl_result);
2074
2075   walk_tree (&DECL_SAVED_TREE (fndecl), gnat_genericize_r, p_set, NULL);
2076
2077   pointer_set_destroy (p_set);
2078 }
2079
2080 /* Finish the definition of the current subprogram BODY and finalize it.  */
2081
2082 void
2083 end_subprog_body (tree body)
2084 {
2085   tree fndecl = current_function_decl;
2086
2087   /* Mark the BLOCK for this level as being for this function and pop the
2088      level.  Since the vars in it are the parameters, clear them.  */
2089   BLOCK_VARS (current_binding_level->block) = 0;
2090   BLOCK_SUPERCONTEXT (current_binding_level->block) = fndecl;
2091   DECL_INITIAL (fndecl) = current_binding_level->block;
2092   gnat_poplevel ();
2093
2094   /* We handle pending sizes via the elaboration of types, so we don't
2095      need to save them.  */
2096   get_pending_sizes ();
2097
2098   /* Mark the RESULT_DECL as being in this subprogram. */
2099   DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
2100
2101   DECL_SAVED_TREE (fndecl) = body;
2102
2103   current_function_decl = DECL_CONTEXT (fndecl);
2104   set_cfun (NULL);
2105
2106   /* We cannot track the location of errors past this point.  */
2107   error_gnat_node = Empty;
2108
2109   /* If we're only annotating types, don't actually compile this function.  */
2110   if (type_annotate_only)
2111     return;
2112
2113   /* Perform the required pre-gimplification transformations on the tree.  */
2114   gnat_genericize (fndecl);
2115
2116   /* Dump functions before gimplification.  */
2117   dump_function (TDI_original, fndecl);
2118
2119   /* ??? This special handling of nested functions is probably obsolete.  */
2120   if (!DECL_CONTEXT (fndecl))
2121     cgraph_finalize_function (fndecl, false);
2122   else
2123     /* Register this function with cgraph just far enough to get it
2124        added to our parent's nested function list.  */
2125     (void) cgraph_node (fndecl);
2126 }
2127
2128 tree
2129 gnat_builtin_function (tree decl)
2130 {
2131   gnat_pushdecl (decl, Empty);
2132   return decl;
2133 }
2134
2135 /* Return an integer type with the number of bits of precision given by
2136    PRECISION.  UNSIGNEDP is nonzero if the type is unsigned; otherwise
2137    it is a signed type.  */
2138
2139 tree
2140 gnat_type_for_size (unsigned precision, int unsignedp)
2141 {
2142   tree t;
2143   char type_name[20];
2144
2145   if (precision <= 2 * MAX_BITS_PER_WORD
2146       && signed_and_unsigned_types[precision][unsignedp])
2147     return signed_and_unsigned_types[precision][unsignedp];
2148
2149  if (unsignedp)
2150     t = make_unsigned_type (precision);
2151   else
2152     t = make_signed_type (precision);
2153
2154   if (precision <= 2 * MAX_BITS_PER_WORD)
2155     signed_and_unsigned_types[precision][unsignedp] = t;
2156
2157   if (!TYPE_NAME (t))
2158     {
2159       sprintf (type_name, "%sSIGNED_%d", unsignedp ? "UN" : "", precision);
2160       TYPE_NAME (t) = get_identifier (type_name);
2161     }
2162
2163   return t;
2164 }
2165
2166 /* Likewise for floating-point types.  */
2167
2168 static tree
2169 float_type_for_precision (int precision, enum machine_mode mode)
2170 {
2171   tree t;
2172   char type_name[20];
2173
2174   if (float_types[(int) mode])
2175     return float_types[(int) mode];
2176
2177   float_types[(int) mode] = t = make_node (REAL_TYPE);
2178   TYPE_PRECISION (t) = precision;
2179   layout_type (t);
2180
2181   gcc_assert (TYPE_MODE (t) == mode);
2182   if (!TYPE_NAME (t))
2183     {
2184       sprintf (type_name, "FLOAT_%d", precision);
2185       TYPE_NAME (t) = get_identifier (type_name);
2186     }
2187
2188   return t;
2189 }
2190
2191 /* Return a data type that has machine mode MODE.  UNSIGNEDP selects
2192    an unsigned type; otherwise a signed type is returned.  */
2193
2194 tree
2195 gnat_type_for_mode (enum machine_mode mode, int unsignedp)
2196 {
2197   if (mode == BLKmode)
2198     return NULL_TREE;
2199
2200   if (mode == VOIDmode)
2201     return void_type_node;
2202
2203   if (COMPLEX_MODE_P (mode))
2204     return NULL_TREE;
2205
2206   if (SCALAR_FLOAT_MODE_P (mode))
2207     return float_type_for_precision (GET_MODE_PRECISION (mode), mode);
2208
2209   if (SCALAR_INT_MODE_P (mode))
2210     return gnat_type_for_size (GET_MODE_BITSIZE (mode), unsignedp);
2211
2212   if (VECTOR_MODE_P (mode))
2213     {
2214       enum machine_mode inner_mode = GET_MODE_INNER (mode);
2215       tree inner_type = gnat_type_for_mode (inner_mode, unsignedp);
2216       if (inner_type)
2217         return build_vector_type_for_mode (inner_type, mode);
2218     }
2219
2220   return NULL_TREE;
2221 }
2222
2223 /* Return the unsigned version of a TYPE_NODE, a scalar type.  */
2224
2225 tree
2226 gnat_unsigned_type (tree type_node)
2227 {
2228   tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 1);
2229
2230   if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node))
2231     {
2232       type = copy_node (type);
2233       TREE_TYPE (type) = type_node;
2234     }
2235   else if (TREE_TYPE (type_node)
2236            && TREE_CODE (TREE_TYPE (type_node)) == INTEGER_TYPE
2237            && TYPE_MODULAR_P (TREE_TYPE (type_node)))
2238     {
2239       type = copy_node (type);
2240       TREE_TYPE (type) = TREE_TYPE (type_node);
2241     }
2242
2243   return type;
2244 }
2245
2246 /* Return the signed version of a TYPE_NODE, a scalar type.  */
2247
2248 tree
2249 gnat_signed_type (tree type_node)
2250 {
2251   tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 0);
2252
2253   if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node))
2254     {
2255       type = copy_node (type);
2256       TREE_TYPE (type) = type_node;
2257     }
2258   else if (TREE_TYPE (type_node)
2259            && TREE_CODE (TREE_TYPE (type_node)) == INTEGER_TYPE
2260            && TYPE_MODULAR_P (TREE_TYPE (type_node)))
2261     {
2262       type = copy_node (type);
2263       TREE_TYPE (type) = TREE_TYPE (type_node);
2264     }
2265
2266   return type;
2267 }
2268
2269 /* Return 1 if the types T1 and T2 are compatible, i.e. if they can be
2270    transparently converted to each other.  */
2271
2272 int
2273 gnat_types_compatible_p (tree t1, tree t2)
2274 {
2275   enum tree_code code;
2276
2277   /* This is the default criterion.  */
2278   if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
2279     return 1;
2280
2281   /* We only check structural equivalence here.  */
2282   if ((code = TREE_CODE (t1)) != TREE_CODE (t2))
2283     return 0;
2284
2285   /* Vector types are also compatible if they have the same number of subparts
2286      and the same form of (scalar) element type.  */
2287   if (code == VECTOR_TYPE
2288       && TYPE_VECTOR_SUBPARTS (t1) == TYPE_VECTOR_SUBPARTS (t2)
2289       && TREE_CODE (TREE_TYPE (t1)) == TREE_CODE (TREE_TYPE (t2))
2290       && TYPE_PRECISION (TREE_TYPE (t1)) == TYPE_PRECISION (TREE_TYPE (t2)))
2291     return 1;
2292
2293   /* Array types are also compatible if they are constrained and have
2294      the same component type and the same domain.  */
2295   if (code == ARRAY_TYPE
2296       && TREE_TYPE (t1) == TREE_TYPE (t2)
2297       && (TYPE_DOMAIN (t1) == TYPE_DOMAIN (t2)
2298           || (TYPE_DOMAIN (t1)
2299               && TYPE_DOMAIN (t2)
2300               && tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (t1)),
2301                                      TYPE_MIN_VALUE (TYPE_DOMAIN (t2)))
2302               && tree_int_cst_equal (TYPE_MAX_VALUE (TYPE_DOMAIN (t1)),
2303                                      TYPE_MAX_VALUE (TYPE_DOMAIN (t2))))))
2304     return 1;
2305
2306   /* Padding record types are also compatible if they pad the same
2307      type and have the same constant size.  */
2308   if (code == RECORD_TYPE
2309       && TYPE_PADDING_P (t1) && TYPE_PADDING_P (t2)
2310       && TREE_TYPE (TYPE_FIELDS (t1)) == TREE_TYPE (TYPE_FIELDS (t2))
2311       && tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)))
2312     return 1;
2313
2314   return 0;
2315 }
2316 \f
2317 /* EXP is an expression for the size of an object.  If this size contains
2318    discriminant references, replace them with the maximum (if MAX_P) or
2319    minimum (if !MAX_P) possible value of the discriminant.  */
2320
2321 tree
2322 max_size (tree exp, bool max_p)
2323 {
2324   enum tree_code code = TREE_CODE (exp);
2325   tree type = TREE_TYPE (exp);
2326
2327   switch (TREE_CODE_CLASS (code))
2328     {
2329     case tcc_declaration:
2330     case tcc_constant:
2331       return exp;
2332
2333     case tcc_vl_exp:
2334       if (code == CALL_EXPR)
2335         {
2336           tree t, *argarray;
2337           int n, i;
2338
2339           t = maybe_inline_call_in_expr (exp);
2340           if (t)
2341             return max_size (t, max_p);
2342
2343           n = call_expr_nargs (exp);
2344           gcc_assert (n > 0);
2345           argarray = (tree *) alloca (n * sizeof (tree));
2346           for (i = 0; i < n; i++)
2347             argarray[i] = max_size (CALL_EXPR_ARG (exp, i), max_p);
2348           return build_call_array (type, CALL_EXPR_FN (exp), n, argarray);
2349         }
2350       break;
2351
2352     case tcc_reference:
2353       /* If this contains a PLACEHOLDER_EXPR, it is the thing we want to
2354          modify.  Otherwise, we treat it like a variable.  */
2355       if (!CONTAINS_PLACEHOLDER_P (exp))
2356         return exp;
2357
2358       type = TREE_TYPE (TREE_OPERAND (exp, 1));
2359       return
2360         max_size (max_p ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type), true);
2361
2362     case tcc_comparison:
2363       return max_p ? size_one_node : size_zero_node;
2364
2365     case tcc_unary:
2366     case tcc_binary:
2367     case tcc_expression:
2368       switch (TREE_CODE_LENGTH (code))
2369         {
2370         case 1:
2371           if (code == NON_LVALUE_EXPR)
2372             return max_size (TREE_OPERAND (exp, 0), max_p);
2373           else
2374             return
2375               fold_build1 (code, type,
2376                            max_size (TREE_OPERAND (exp, 0),
2377                                      code == NEGATE_EXPR ? !max_p : max_p));
2378
2379         case 2:
2380           if (code == COMPOUND_EXPR)
2381             return max_size (TREE_OPERAND (exp, 1), max_p);
2382
2383           /* Calculate "(A ? B : C) - D" as "A ? B - D : C - D" which
2384              may provide a tighter bound on max_size.  */
2385           if (code == MINUS_EXPR
2386               && TREE_CODE (TREE_OPERAND (exp, 0)) == COND_EXPR)
2387             {
2388               tree lhs = fold_build2 (MINUS_EXPR, type,
2389                                       TREE_OPERAND (TREE_OPERAND (exp, 0), 1),
2390                                       TREE_OPERAND (exp, 1));
2391               tree rhs = fold_build2 (MINUS_EXPR, type,
2392                                       TREE_OPERAND (TREE_OPERAND (exp, 0), 2),
2393                                       TREE_OPERAND (exp, 1));
2394               return fold_build2 (max_p ? MAX_EXPR : MIN_EXPR, type,
2395                                   max_size (lhs, max_p),
2396                                   max_size (rhs, max_p));
2397             }
2398
2399           {
2400             tree lhs = max_size (TREE_OPERAND (exp, 0), max_p);
2401             tree rhs = max_size (TREE_OPERAND (exp, 1),
2402                                  code == MINUS_EXPR ? !max_p : max_p);
2403
2404             /* Special-case wanting the maximum value of a MIN_EXPR.
2405                In that case, if one side overflows, return the other.
2406                sizetype is signed, but we know sizes are non-negative.
2407                Likewise, handle a MINUS_EXPR or PLUS_EXPR with the LHS
2408                overflowing or the maximum possible value and the RHS
2409                a variable.  */
2410             if (max_p
2411                 && code == MIN_EXPR
2412                 && TREE_CODE (rhs) == INTEGER_CST
2413                 && TREE_OVERFLOW (rhs))
2414               return lhs;
2415             else if (max_p
2416                      && code == MIN_EXPR
2417                      && TREE_CODE (lhs) == INTEGER_CST
2418                      && TREE_OVERFLOW (lhs))
2419               return rhs;
2420             else if ((code == MINUS_EXPR || code == PLUS_EXPR)
2421                      && ((TREE_CODE (lhs) == INTEGER_CST
2422                           && TREE_OVERFLOW (lhs))
2423                          || operand_equal_p (lhs, TYPE_MAX_VALUE (type), 0))
2424                      && !TREE_CONSTANT (rhs))
2425               return lhs;
2426             else
2427               return fold_build2 (code, type, lhs, rhs);
2428           }
2429
2430         case 3:
2431           if (code == SAVE_EXPR)
2432             return exp;
2433           else if (code == COND_EXPR)
2434             return fold_build2 (max_p ? MAX_EXPR : MIN_EXPR, type,
2435                                 max_size (TREE_OPERAND (exp, 1), max_p),
2436                                 max_size (TREE_OPERAND (exp, 2), max_p));
2437         }
2438
2439       /* Other tree classes cannot happen.  */
2440     default:
2441       break;
2442     }
2443
2444   gcc_unreachable ();
2445 }
2446 \f
2447 /* Build a template of type TEMPLATE_TYPE from the array bounds of ARRAY_TYPE.
2448    EXPR is an expression that we can use to locate any PLACEHOLDER_EXPRs.
2449    Return a constructor for the template.  */
2450
2451 tree
2452 build_template (tree template_type, tree array_type, tree expr)
2453 {
2454   tree template_elts = NULL_TREE;
2455   tree bound_list = NULL_TREE;
2456   tree field;
2457
2458   while (TREE_CODE (array_type) == RECORD_TYPE
2459          && (TYPE_PADDING_P (array_type)
2460              || TYPE_JUSTIFIED_MODULAR_P (array_type)))
2461     array_type = TREE_TYPE (TYPE_FIELDS (array_type));
2462
2463   if (TREE_CODE (array_type) == ARRAY_TYPE
2464       || (TREE_CODE (array_type) == INTEGER_TYPE
2465           && TYPE_HAS_ACTUAL_BOUNDS_P (array_type)))
2466     bound_list = TYPE_ACTUAL_BOUNDS (array_type);
2467
2468   /* First make the list for a CONSTRUCTOR for the template.  Go down the
2469      field list of the template instead of the type chain because this
2470      array might be an Ada array of arrays and we can't tell where the
2471      nested arrays stop being the underlying object.  */
2472
2473   for (field = TYPE_FIELDS (template_type); field;
2474        (bound_list
2475         ? (bound_list = TREE_CHAIN (bound_list))
2476         : (array_type = TREE_TYPE (array_type))),
2477        field = TREE_CHAIN (TREE_CHAIN (field)))
2478     {
2479       tree bounds, min, max;
2480
2481       /* If we have a bound list, get the bounds from there.  Likewise
2482          for an ARRAY_TYPE.  Otherwise, if expr is a PARM_DECL with
2483          DECL_BY_COMPONENT_PTR_P, use the bounds of the field in the template.
2484          This will give us a maximum range.  */
2485       if (bound_list)
2486         bounds = TREE_VALUE (bound_list);
2487       else if (TREE_CODE (array_type) == ARRAY_TYPE)
2488         bounds = TYPE_INDEX_TYPE (TYPE_DOMAIN (array_type));
2489       else if (expr && TREE_CODE (expr) == PARM_DECL
2490                && DECL_BY_COMPONENT_PTR_P (expr))
2491         bounds = TREE_TYPE (field);
2492       else
2493         gcc_unreachable ();
2494
2495       min = convert (TREE_TYPE (field), TYPE_MIN_VALUE (bounds));
2496       max = convert (TREE_TYPE (TREE_CHAIN (field)), TYPE_MAX_VALUE (bounds));
2497
2498       /* If either MIN or MAX involve a PLACEHOLDER_EXPR, we must
2499          substitute it from OBJECT.  */
2500       min = SUBSTITUTE_PLACEHOLDER_IN_EXPR (min, expr);
2501       max = SUBSTITUTE_PLACEHOLDER_IN_EXPR (max, expr);
2502
2503       template_elts = tree_cons (TREE_CHAIN (field), max,
2504                                  tree_cons (field, min, template_elts));
2505     }
2506
2507   return gnat_build_constructor (template_type, nreverse (template_elts));
2508 }
2509 \f
2510 /* Build a 32bit VMS descriptor from a Mechanism_Type, which must specify
2511    a descriptor type, and the GCC type of an object.  Each FIELD_DECL
2512    in the type contains in its DECL_INITIAL the expression to use when
2513    a constructor is made for the type.  GNAT_ENTITY is an entity used
2514    to print out an error message if the mechanism cannot be applied to
2515    an object of that type and also for the name.  */
2516
2517 tree
2518 build_vms_descriptor32 (tree type, Mechanism_Type mech, Entity_Id gnat_entity)
2519 {
2520   tree record_type = make_node (RECORD_TYPE);
2521   tree pointer32_type;
2522   tree field_list = 0;
2523   int klass;
2524   int dtype = 0;
2525   tree inner_type;
2526   int ndim;
2527   int i;
2528   tree *idx_arr;
2529   tree tem;
2530
2531   /* If TYPE is an unconstrained array, use the underlying array type.  */
2532   if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
2533     type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type))));
2534
2535   /* If this is an array, compute the number of dimensions in the array,
2536      get the index types, and point to the inner type.  */
2537   if (TREE_CODE (type) != ARRAY_TYPE)
2538     ndim = 0;
2539   else
2540     for (ndim = 1, inner_type = type;
2541          TREE_CODE (TREE_TYPE (inner_type)) == ARRAY_TYPE
2542          && TYPE_MULTI_ARRAY_P (TREE_TYPE (inner_type));
2543          ndim++, inner_type = TREE_TYPE (inner_type))
2544       ;
2545
2546   idx_arr = (tree *) alloca (ndim * sizeof (tree));
2547
2548   if (mech != By_Descriptor_NCA && mech != By_Short_Descriptor_NCA
2549       && TREE_CODE (type) == ARRAY_TYPE && TYPE_CONVENTION_FORTRAN_P (type))
2550     for (i = ndim - 1, inner_type = type;
2551          i >= 0;
2552          i--, inner_type = TREE_TYPE (inner_type))
2553       idx_arr[i] = TYPE_DOMAIN (inner_type);
2554   else
2555     for (i = 0, inner_type = type;
2556          i < ndim;
2557          i++, inner_type = TREE_TYPE (inner_type))
2558       idx_arr[i] = TYPE_DOMAIN (inner_type);
2559
2560   /* Now get the DTYPE value.  */
2561   switch (TREE_CODE (type))
2562     {
2563     case INTEGER_TYPE:
2564     case ENUMERAL_TYPE:
2565     case BOOLEAN_TYPE:
2566       if (TYPE_VAX_FLOATING_POINT_P (type))
2567         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2568           {
2569           case 6:
2570             dtype = 10;
2571             break;
2572           case 9:
2573             dtype = 11;
2574             break;
2575           case 15:
2576             dtype = 27;
2577             break;
2578           }
2579       else
2580         switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
2581           {
2582           case 8:
2583             dtype = TYPE_UNSIGNED (type) ? 2 : 6;
2584             break;
2585           case 16:
2586             dtype = TYPE_UNSIGNED (type) ? 3 : 7;
2587             break;
2588           case 32:
2589             dtype = TYPE_UNSIGNED (type) ? 4 : 8;
2590             break;
2591           case 64:
2592             dtype = TYPE_UNSIGNED (type) ? 5 : 9;
2593             break;
2594           case 128:
2595             dtype = TYPE_UNSIGNED (type) ? 25 : 26;
2596             break;
2597           }
2598       break;
2599
2600     case REAL_TYPE:
2601       dtype = GET_MODE_BITSIZE (TYPE_MODE (type)) == 32 ? 52 : 53;
2602       break;
2603
2604     case COMPLEX_TYPE:
2605       if (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE
2606           && TYPE_VAX_FLOATING_POINT_P (type))
2607         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2608           {
2609           case 6:
2610             dtype = 12;
2611             break;
2612           case 9:
2613             dtype = 13;
2614             break;
2615           case 15:
2616             dtype = 29;
2617           }
2618       else
2619         dtype = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) == 32 ? 54: 55;
2620       break;
2621
2622     case ARRAY_TYPE:
2623       dtype = 14;
2624       break;
2625
2626     default:
2627       break;
2628     }
2629
2630   /* Get the CLASS value.  */
2631   switch (mech)
2632     {
2633     case By_Descriptor_A:
2634     case By_Short_Descriptor_A:
2635       klass = 4;
2636       break;
2637     case By_Descriptor_NCA:
2638     case By_Short_Descriptor_NCA:
2639       klass = 10;
2640       break;
2641     case By_Descriptor_SB:
2642     case By_Short_Descriptor_SB:
2643       klass = 15;
2644       break;
2645     case By_Descriptor:
2646     case By_Short_Descriptor:
2647     case By_Descriptor_S:
2648     case By_Short_Descriptor_S:
2649     default:
2650       klass = 1;
2651       break;
2652     }
2653
2654   /* Make the type for a descriptor for VMS.  The first four fields
2655      are the same for all types.  */
2656
2657   field_list
2658     = chainon (field_list,
2659                make_descriptor_field
2660                ("LENGTH", gnat_type_for_size (16, 1), record_type,
2661                 size_in_bytes ((mech == By_Descriptor_A ||
2662                                 mech == By_Short_Descriptor_A)
2663                                ? inner_type : type)));
2664
2665   field_list = chainon (field_list,
2666                         make_descriptor_field ("DTYPE",
2667                                                gnat_type_for_size (8, 1),
2668                                                record_type, size_int (dtype)));
2669   field_list = chainon (field_list,
2670                         make_descriptor_field ("CLASS",
2671                                                gnat_type_for_size (8, 1),
2672                                                record_type, size_int (klass)));
2673
2674   /* Of course this will crash at run-time if the address space is not
2675      within the low 32 bits, but there is nothing else we can do.  */
2676   pointer32_type = build_pointer_type_for_mode (type, SImode, false);
2677
2678   field_list
2679     = chainon (field_list,
2680                make_descriptor_field
2681                ("POINTER", pointer32_type, record_type,
2682                 build_unary_op (ADDR_EXPR,
2683                                 pointer32_type,
2684                                 build0 (PLACEHOLDER_EXPR, type))));
2685
2686   switch (mech)
2687     {
2688     case By_Descriptor:
2689     case By_Short_Descriptor:
2690     case By_Descriptor_S:
2691     case By_Short_Descriptor_S:
2692       break;
2693
2694     case By_Descriptor_SB:
2695     case By_Short_Descriptor_SB:
2696       field_list
2697         = chainon (field_list,
2698                    make_descriptor_field
2699                    ("SB_L1", gnat_type_for_size (32, 1), record_type,
2700                     TREE_CODE (type) == ARRAY_TYPE
2701                     ? TYPE_MIN_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
2702       field_list
2703         = chainon (field_list,
2704                    make_descriptor_field
2705                    ("SB_U1", gnat_type_for_size (32, 1), record_type,
2706                     TREE_CODE (type) == ARRAY_TYPE
2707                     ? TYPE_MAX_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
2708       break;
2709
2710     case By_Descriptor_A:
2711     case By_Short_Descriptor_A:
2712     case By_Descriptor_NCA:
2713     case By_Short_Descriptor_NCA:
2714       field_list = chainon (field_list,
2715                             make_descriptor_field ("SCALE",
2716                                                    gnat_type_for_size (8, 1),
2717                                                    record_type,
2718                                                    size_zero_node));
2719
2720       field_list = chainon (field_list,
2721                             make_descriptor_field ("DIGITS",
2722                                                    gnat_type_for_size (8, 1),
2723                                                    record_type,
2724                                                    size_zero_node));
2725
2726       field_list
2727         = chainon (field_list,
2728                    make_descriptor_field
2729                    ("AFLAGS", gnat_type_for_size (8, 1), record_type,
2730                     size_int ((mech == By_Descriptor_NCA ||
2731                               mech == By_Short_Descriptor_NCA)
2732                               ? 0
2733                               /* Set FL_COLUMN, FL_COEFF, and FL_BOUNDS.  */
2734                               : (TREE_CODE (type) == ARRAY_TYPE
2735                                  && TYPE_CONVENTION_FORTRAN_P (type)
2736                                  ? 224 : 192))));
2737
2738       field_list = chainon (field_list,
2739                             make_descriptor_field ("DIMCT",
2740                                                    gnat_type_for_size (8, 1),
2741                                                    record_type,
2742                                                    size_int (ndim)));
2743
2744       field_list = chainon (field_list,
2745                             make_descriptor_field ("ARSIZE",
2746                                                    gnat_type_for_size (32, 1),
2747                                                    record_type,
2748                                                    size_in_bytes (type)));
2749
2750       /* Now build a pointer to the 0,0,0... element.  */
2751       tem = build0 (PLACEHOLDER_EXPR, type);
2752       for (i = 0, inner_type = type; i < ndim;
2753            i++, inner_type = TREE_TYPE (inner_type))
2754         tem = build4 (ARRAY_REF, TREE_TYPE (inner_type), tem,
2755                       convert (TYPE_DOMAIN (inner_type), size_zero_node),
2756                       NULL_TREE, NULL_TREE);
2757
2758       field_list
2759         = chainon (field_list,
2760                    make_descriptor_field
2761                    ("A0",
2762                     build_pointer_type_for_mode (inner_type, SImode, false),
2763                     record_type,
2764                     build1 (ADDR_EXPR,
2765                             build_pointer_type_for_mode (inner_type, SImode,
2766                                                          false),
2767                             tem)));
2768
2769       /* Next come the addressing coefficients.  */
2770       tem = size_one_node;
2771       for (i = 0; i < ndim; i++)
2772         {
2773           char fname[3];
2774           tree idx_length
2775             = size_binop (MULT_EXPR, tem,
2776                           size_binop (PLUS_EXPR,
2777                                       size_binop (MINUS_EXPR,
2778                                                   TYPE_MAX_VALUE (idx_arr[i]),
2779                                                   TYPE_MIN_VALUE (idx_arr[i])),
2780                                       size_int (1)));
2781
2782           fname[0] = ((mech == By_Descriptor_NCA ||
2783                        mech == By_Short_Descriptor_NCA) ? 'S' : 'M');
2784           fname[1] = '0' + i, fname[2] = 0;
2785           field_list
2786             = chainon (field_list,
2787                        make_descriptor_field (fname,
2788                                               gnat_type_for_size (32, 1),
2789                                               record_type, idx_length));
2790
2791           if (mech == By_Descriptor_NCA || mech == By_Short_Descriptor_NCA)
2792             tem = idx_length;
2793         }
2794
2795       /* Finally here are the bounds.  */
2796       for (i = 0; i < ndim; i++)
2797         {
2798           char fname[3];
2799
2800           fname[0] = 'L', fname[1] = '0' + i, fname[2] = 0;
2801           field_list
2802             = chainon (field_list,
2803                        make_descriptor_field
2804                        (fname, gnat_type_for_size (32, 1), record_type,
2805                         TYPE_MIN_VALUE (idx_arr[i])));
2806
2807           fname[0] = 'U';
2808           field_list
2809             = chainon (field_list,
2810                        make_descriptor_field
2811                        (fname, gnat_type_for_size (32, 1), record_type,
2812                         TYPE_MAX_VALUE (idx_arr[i])));
2813         }
2814       break;
2815
2816     default:
2817       post_error ("unsupported descriptor type for &", gnat_entity);
2818     }
2819
2820   TYPE_NAME (record_type) = create_concat_name (gnat_entity, "DESC");
2821   finish_record_type (record_type, field_list, 0, false);
2822   return record_type;
2823 }
2824
2825 /* Build a 64bit VMS descriptor from a Mechanism_Type, which must specify
2826    a descriptor type, and the GCC type of an object.  Each FIELD_DECL
2827    in the type contains in its DECL_INITIAL the expression to use when
2828    a constructor is made for the type.  GNAT_ENTITY is an entity used
2829    to print out an error message if the mechanism cannot be applied to
2830    an object of that type and also for the name.  */
2831
2832 tree
2833 build_vms_descriptor (tree type, Mechanism_Type mech, Entity_Id gnat_entity)
2834 {
2835   tree record64_type = make_node (RECORD_TYPE);
2836   tree pointer64_type;
2837   tree field_list64 = 0;
2838   int klass;
2839   int dtype = 0;
2840   tree inner_type;
2841   int ndim;
2842   int i;
2843   tree *idx_arr;
2844   tree tem;
2845
2846   /* If TYPE is an unconstrained array, use the underlying array type.  */
2847   if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
2848     type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type))));
2849
2850   /* If this is an array, compute the number of dimensions in the array,
2851      get the index types, and point to the inner type.  */
2852   if (TREE_CODE (type) != ARRAY_TYPE)
2853     ndim = 0;
2854   else
2855     for (ndim = 1, inner_type = type;
2856          TREE_CODE (TREE_TYPE (inner_type)) == ARRAY_TYPE
2857          && TYPE_MULTI_ARRAY_P (TREE_TYPE (inner_type));
2858          ndim++, inner_type = TREE_TYPE (inner_type))
2859       ;
2860
2861   idx_arr = (tree *) alloca (ndim * sizeof (tree));
2862
2863   if (mech != By_Descriptor_NCA
2864       && TREE_CODE (type) == ARRAY_TYPE && TYPE_CONVENTION_FORTRAN_P (type))
2865     for (i = ndim - 1, inner_type = type;
2866          i >= 0;
2867          i--, inner_type = TREE_TYPE (inner_type))
2868       idx_arr[i] = TYPE_DOMAIN (inner_type);
2869   else
2870     for (i = 0, inner_type = type;
2871          i < ndim;
2872          i++, inner_type = TREE_TYPE (inner_type))
2873       idx_arr[i] = TYPE_DOMAIN (inner_type);
2874
2875   /* Now get the DTYPE value.  */
2876   switch (TREE_CODE (type))
2877     {
2878     case INTEGER_TYPE:
2879     case ENUMERAL_TYPE:
2880     case BOOLEAN_TYPE:
2881       if (TYPE_VAX_FLOATING_POINT_P (type))
2882         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2883           {
2884           case 6:
2885             dtype = 10;
2886             break;
2887           case 9:
2888             dtype = 11;
2889             break;
2890           case 15:
2891             dtype = 27;
2892             break;
2893           }
2894       else
2895         switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
2896           {
2897           case 8:
2898             dtype = TYPE_UNSIGNED (type) ? 2 : 6;
2899             break;
2900           case 16:
2901             dtype = TYPE_UNSIGNED (type) ? 3 : 7;
2902             break;
2903           case 32:
2904             dtype = TYPE_UNSIGNED (type) ? 4 : 8;
2905             break;
2906           case 64:
2907             dtype = TYPE_UNSIGNED (type) ? 5 : 9;
2908             break;
2909           case 128:
2910             dtype = TYPE_UNSIGNED (type) ? 25 : 26;
2911             break;
2912           }
2913       break;
2914
2915     case REAL_TYPE:
2916       dtype = GET_MODE_BITSIZE (TYPE_MODE (type)) == 32 ? 52 : 53;
2917       break;
2918
2919     case COMPLEX_TYPE:
2920       if (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE
2921           && TYPE_VAX_FLOATING_POINT_P (type))
2922         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2923           {
2924           case 6:
2925             dtype = 12;
2926             break;
2927           case 9:
2928             dtype = 13;
2929             break;
2930           case 15:
2931             dtype = 29;
2932           }
2933       else
2934         dtype = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) == 32 ? 54: 55;
2935       break;
2936
2937     case ARRAY_TYPE:
2938       dtype = 14;
2939       break;
2940
2941     default:
2942       break;
2943     }
2944
2945   /* Get the CLASS value.  */
2946   switch (mech)
2947     {
2948     case By_Descriptor_A:
2949       klass = 4;
2950       break;
2951     case By_Descriptor_NCA:
2952       klass = 10;
2953       break;
2954     case By_Descriptor_SB:
2955       klass = 15;
2956       break;
2957     case By_Descriptor:
2958     case By_Descriptor_S:
2959     default:
2960       klass = 1;
2961       break;
2962     }
2963
2964   /* Make the type for a 64bit descriptor for VMS.  The first six fields
2965      are the same for all types.  */
2966
2967   field_list64 = chainon (field_list64,
2968                         make_descriptor_field ("MBO",
2969                                                gnat_type_for_size (16, 1),
2970                                                record64_type, size_int (1)));
2971
2972   field_list64 = chainon (field_list64,
2973                         make_descriptor_field ("DTYPE",
2974                                                gnat_type_for_size (8, 1),
2975                                                record64_type, size_int (dtype)));
2976   field_list64 = chainon (field_list64,
2977                         make_descriptor_field ("CLASS",
2978                                                gnat_type_for_size (8, 1),
2979                                                record64_type, size_int (klass)));
2980
2981   field_list64 = chainon (field_list64,
2982                         make_descriptor_field ("MBMO",
2983                                                gnat_type_for_size (32, 1),
2984                                                record64_type, ssize_int (-1)));
2985
2986   field_list64
2987     = chainon (field_list64,
2988                make_descriptor_field
2989                ("LENGTH", gnat_type_for_size (64, 1), record64_type,
2990                 size_in_bytes (mech == By_Descriptor_A ? inner_type : type)));
2991
2992   pointer64_type = build_pointer_type_for_mode (type, DImode, false);
2993
2994   field_list64
2995     = chainon (field_list64,
2996                make_descriptor_field
2997                ("POINTER", pointer64_type, record64_type,
2998                 build_unary_op (ADDR_EXPR,
2999                                 pointer64_type,
3000                                 build0 (PLACEHOLDER_EXPR, type))));
3001
3002   switch (mech)
3003     {
3004     case By_Descriptor:
3005     case By_Descriptor_S:
3006       break;
3007
3008     case By_Descriptor_SB:
3009       field_list64
3010         = chainon (field_list64,
3011                    make_descriptor_field
3012                    ("SB_L1", gnat_type_for_size (64, 1), record64_type,
3013                     TREE_CODE (type) == ARRAY_TYPE
3014                     ? TYPE_MIN_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
3015       field_list64
3016         = chainon (field_list64,
3017                    make_descriptor_field
3018                    ("SB_U1", gnat_type_for_size (64, 1), record64_type,
3019                     TREE_CODE (type) == ARRAY_TYPE
3020                     ? TYPE_MAX_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
3021       break;
3022
3023     case By_Descriptor_A:
3024     case By_Descriptor_NCA:
3025       field_list64 = chainon (field_list64,
3026                             make_descriptor_field ("SCALE",
3027                                                    gnat_type_for_size (8, 1),
3028                                                    record64_type,
3029                                                    size_zero_node));
3030
3031       field_list64 = chainon (field_list64,
3032                             make_descriptor_field ("DIGITS",
3033                                                    gnat_type_for_size (8, 1),
3034                                                    record64_type,
3035                                                    size_zero_node));
3036
3037       field_list64
3038         = chainon (field_list64,
3039                    make_descriptor_field
3040                    ("AFLAGS", gnat_type_for_size (8, 1), record64_type,
3041                     size_int (mech == By_Descriptor_NCA
3042                               ? 0
3043                               /* Set FL_COLUMN, FL_COEFF, and FL_BOUNDS.  */
3044                               : (TREE_CODE (type) == ARRAY_TYPE
3045                                  && TYPE_CONVENTION_FORTRAN_P (type)
3046                                  ? 224 : 192))));
3047
3048       field_list64 = chainon (field_list64,
3049                             make_descriptor_field ("DIMCT",
3050                                                    gnat_type_for_size (8, 1),
3051                                                    record64_type,
3052                                                    size_int (ndim)));
3053
3054       field_list64 = chainon (field_list64,
3055                             make_descriptor_field ("MBZ",
3056                                                    gnat_type_for_size (32, 1),
3057                                                    record64_type,
3058                                                    size_int (0)));
3059       field_list64 = chainon (field_list64,
3060                             make_descriptor_field ("ARSIZE",
3061                                                    gnat_type_for_size (64, 1),
3062                                                    record64_type,
3063                                                    size_in_bytes (type)));
3064
3065       /* Now build a pointer to the 0,0,0... element.  */
3066       tem = build0 (PLACEHOLDER_EXPR, type);
3067       for (i = 0, inner_type = type; i < ndim;
3068            i++, inner_type = TREE_TYPE (inner_type))
3069         tem = build4 (ARRAY_REF, TREE_TYPE (inner_type), tem,
3070                       convert (TYPE_DOMAIN (inner_type), size_zero_node),
3071                       NULL_TREE, NULL_TREE);
3072
3073       field_list64
3074         = chainon (field_list64,
3075                    make_descriptor_field
3076                    ("A0",
3077                     build_pointer_type_for_mode (inner_type, DImode, false),
3078                     record64_type,
3079                     build1 (ADDR_EXPR,
3080                             build_pointer_type_for_mode (inner_type, DImode,
3081                                                          false),
3082                             tem)));
3083
3084       /* Next come the addressing coefficients.  */
3085       tem = size_one_node;
3086       for (i = 0; i < ndim; i++)
3087         {
3088           char fname[3];
3089           tree idx_length
3090             = size_binop (MULT_EXPR, tem,
3091                           size_binop (PLUS_EXPR,
3092                                       size_binop (MINUS_EXPR,
3093                                                   TYPE_MAX_VALUE (idx_arr[i]),
3094                                                   TYPE_MIN_VALUE (idx_arr[i])),
3095                                       size_int (1)));
3096
3097           fname[0] = (mech == By_Descriptor_NCA ? 'S' : 'M');
3098           fname[1] = '0' + i, fname[2] = 0;
3099           field_list64
3100             = chainon (field_list64,
3101                        make_descriptor_field (fname,
3102                                               gnat_type_for_size (64, 1),
3103                                               record64_type, idx_length));
3104
3105           if (mech == By_Descriptor_NCA)
3106             tem = idx_length;
3107         }
3108
3109       /* Finally here are the bounds.  */
3110       for (i = 0; i < ndim; i++)
3111         {
3112           char fname[3];
3113
3114           fname[0] = 'L', fname[1] = '0' + i, fname[2] = 0;
3115           field_list64
3116             = chainon (field_list64,
3117                        make_descriptor_field
3118                        (fname, gnat_type_for_size (64, 1), record64_type,
3119                         TYPE_MIN_VALUE (idx_arr[i])));
3120
3121           fname[0] = 'U';
3122           field_list64
3123             = chainon (field_list64,
3124                        make_descriptor_field
3125                        (fname, gnat_type_for_size (64, 1), record64_type,
3126                         TYPE_MAX_VALUE (idx_arr[i])));
3127         }
3128       break;
3129
3130     default:
3131       post_error ("unsupported descriptor type for &", gnat_entity);
3132     }
3133
3134   TYPE_NAME (record64_type) = create_concat_name (gnat_entity, "DESC64");
3135   finish_record_type (record64_type, field_list64, 0, false);
3136   return record64_type;
3137 }
3138
3139 /* Utility routine for above code to make a field.  */
3140
3141 static tree
3142 make_descriptor_field (const char *name, tree type,
3143                        tree rec_type, tree initial)
3144 {
3145   tree field
3146     = create_field_decl (get_identifier (name), type, rec_type, 0, 0, 0, 0);
3147
3148   DECL_INITIAL (field) = initial;
3149   return field;
3150 }
3151
3152 /* Convert GNU_EXPR, a pointer to a 64bit VMS descriptor, to GNU_TYPE, a
3153    regular pointer or fat pointer type.  GNAT_SUBPROG is the subprogram to
3154    which the VMS descriptor is passed.  */
3155
3156 static tree
3157 convert_vms_descriptor64 (tree gnu_type, tree gnu_expr, Entity_Id gnat_subprog)
3158 {
3159   tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr));
3160   tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr);
3161   /* The CLASS field is the 3rd field in the descriptor.  */
3162   tree klass = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (desc_type)));
3163   /* The POINTER field is the 6th field in the descriptor.  */
3164   tree pointer64 = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (klass)));
3165
3166   /* Retrieve the value of the POINTER field.  */
3167   tree gnu_expr64
3168     = build3 (COMPONENT_REF, TREE_TYPE (pointer64), desc, pointer64, NULL_TREE);
3169
3170   if (POINTER_TYPE_P (gnu_type))
3171     return convert (gnu_type, gnu_expr64);
3172
3173   else if (TYPE_IS_FAT_POINTER_P (gnu_type))
3174     {
3175       tree p_array_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
3176       tree p_bounds_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
3177       tree template_type = TREE_TYPE (p_bounds_type);
3178       tree min_field = TYPE_FIELDS (template_type);
3179       tree max_field = TREE_CHAIN (TYPE_FIELDS (template_type));
3180       tree template_tree, template_addr, aflags, dimct, t, u;
3181       /* See the head comment of build_vms_descriptor.  */
3182       int iklass = TREE_INT_CST_LOW (DECL_INITIAL (klass));
3183       tree lfield, ufield;
3184
3185       /* Convert POINTER to the type of the P_ARRAY field.  */
3186       gnu_expr64 = convert (p_array_type, gnu_expr64);
3187
3188       switch (iklass)
3189         {
3190         case 1:  /* Class S  */
3191         case 15: /* Class SB */
3192           /* Build {1, LENGTH} template; LENGTH64 is the 5th field.  */
3193           t = TREE_CHAIN (TREE_CHAIN (klass));
3194           t = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3195           t = tree_cons (min_field,
3196                          convert (TREE_TYPE (min_field), integer_one_node),
3197                          tree_cons (max_field,
3198                                     convert (TREE_TYPE (max_field), t),
3199                                     NULL_TREE));
3200           template_tree = gnat_build_constructor (template_type, t);
3201           template_addr = build_unary_op (ADDR_EXPR, NULL_TREE, template_tree);
3202
3203           /* For class S, we are done.  */
3204           if (iklass == 1)
3205             break;
3206
3207           /* Test that we really have a SB descriptor, like DEC Ada.  */
3208           t = build3 (COMPONENT_REF, TREE_TYPE (klass), desc, klass, NULL);
3209           u = convert (TREE_TYPE (klass), DECL_INITIAL (klass));
3210           u = build_binary_op (EQ_EXPR, integer_type_node, t, u);
3211           /* If so, there is already a template in the descriptor and
3212              it is located right after the POINTER field.  The fields are
3213              64bits so they must be repacked. */
3214           t = TREE_CHAIN (pointer64);
3215           lfield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3216           lfield = convert (TREE_TYPE (TYPE_FIELDS (template_type)), lfield);
3217
3218           t = TREE_CHAIN (t);
3219           ufield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3220           ufield = convert
3221            (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (template_type))), ufield);
3222
3223           /* Build the template in the form of a constructor. */
3224           t = tree_cons (TYPE_FIELDS (template_type), lfield,
3225                          tree_cons (TREE_CHAIN (TYPE_FIELDS (template_type)),
3226                                     ufield, NULL_TREE));
3227           template_tree = gnat_build_constructor (template_type, t);
3228
3229           /* Otherwise use the {1, LENGTH} template we build above.  */
3230           template_addr = build3 (COND_EXPR, p_bounds_type, u,
3231                                   build_unary_op (ADDR_EXPR, p_bounds_type,
3232                                                  template_tree),
3233                                   template_addr);
3234           break;
3235
3236         case 4:  /* Class A */
3237           /* The AFLAGS field is the 3rd field after the pointer in the
3238              descriptor.  */
3239           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (pointer64)));
3240           aflags = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3241           /* The DIMCT field is the next field in the descriptor after
3242              aflags.  */
3243           t = TREE_CHAIN (t);
3244           dimct = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3245           /* Raise CONSTRAINT_ERROR if either more than 1 dimension
3246              or FL_COEFF or FL_BOUNDS not set.  */
3247           u = build_int_cst (TREE_TYPE (aflags), 192);
3248           u = build_binary_op (TRUTH_OR_EXPR, integer_type_node,
3249                                build_binary_op (NE_EXPR, integer_type_node,
3250                                                 dimct,
3251                                                 convert (TREE_TYPE (dimct),
3252                                                          size_one_node)),
3253                                build_binary_op (NE_EXPR, integer_type_node,
3254                                                 build2 (BIT_AND_EXPR,
3255                                                         TREE_TYPE (aflags),
3256                                                         aflags, u),
3257                                                 u));
3258           /* There is already a template in the descriptor and it is located
3259              in block 3.  The fields are 64bits so they must be repacked. */
3260           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN
3261               (t)))));
3262           lfield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3263           lfield = convert (TREE_TYPE (TYPE_FIELDS (template_type)), lfield);
3264
3265           t = TREE_CHAIN (t);
3266           ufield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3267           ufield = convert
3268            (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (template_type))), ufield);
3269
3270           /* Build the template in the form of a constructor. */
3271           t = tree_cons (TYPE_FIELDS (template_type), lfield,
3272                          tree_cons (TREE_CHAIN (TYPE_FIELDS (template_type)),
3273                                     ufield, NULL_TREE));
3274           template_tree = gnat_build_constructor (template_type, t);
3275           template_tree = build3 (COND_EXPR, template_type, u,
3276                             build_call_raise (CE_Length_Check_Failed, Empty,
3277                                               N_Raise_Constraint_Error),
3278                             template_tree);
3279           template_addr
3280             = build_unary_op (ADDR_EXPR, p_bounds_type, template_tree);
3281           break;
3282
3283         case 10: /* Class NCA */
3284         default:
3285           post_error ("unsupported descriptor type for &", gnat_subprog);
3286           template_addr = integer_zero_node;
3287           break;
3288         }
3289
3290       /* Build the fat pointer in the form of a constructor.  */
3291       t = tree_cons (TYPE_FIELDS (gnu_type), gnu_expr64,
3292                      tree_cons (TREE_CHAIN (TYPE_FIELDS (gnu_type)),
3293                                 template_addr, NULL_TREE));
3294       return gnat_build_constructor (gnu_type, t);
3295     }
3296
3297   else
3298     gcc_unreachable ();
3299 }
3300
3301 /* Convert GNU_EXPR, a pointer to a 32bit VMS descriptor, to GNU_TYPE, a
3302    regular pointer or fat pointer type.  GNAT_SUBPROG is the subprogram to
3303    which the VMS descriptor is passed.  */
3304
3305 static tree
3306 convert_vms_descriptor32 (tree gnu_type, tree gnu_expr, Entity_Id gnat_subprog)
3307 {
3308   tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr));
3309   tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr);
3310   /* The CLASS field is the 3rd field in the descriptor.  */
3311   tree klass = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (desc_type)));
3312   /* The POINTER field is the 4th field in the descriptor.  */
3313   tree pointer = TREE_CHAIN (klass);
3314
3315   /* Retrieve the value of the POINTER field.  */
3316   tree gnu_expr32
3317     = build3 (COMPONENT_REF, TREE_TYPE (pointer), desc, pointer, NULL_TREE);
3318
3319   if (POINTER_TYPE_P (gnu_type))
3320     return convert (gnu_type, gnu_expr32);
3321
3322   else if (TYPE_IS_FAT_POINTER_P (gnu_type))
3323     {
3324       tree p_array_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
3325       tree p_bounds_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
3326       tree template_type = TREE_TYPE (p_bounds_type);
3327       tree min_field = TYPE_FIELDS (template_type);
3328       tree max_field = TREE_CHAIN (TYPE_FIELDS (template_type));
3329       tree template_tree, template_addr, aflags, dimct, t, u;
3330       /* See the head comment of build_vms_descriptor.  */
3331       int iklass = TREE_INT_CST_LOW (DECL_INITIAL (klass));
3332
3333       /* Convert POINTER to the type of the P_ARRAY field.  */
3334       gnu_expr32 = convert (p_array_type, gnu_expr32);
3335
3336       switch (iklass)
3337         {
3338         case 1:  /* Class S  */
3339         case 15: /* Class SB */
3340           /* Build {1, LENGTH} template; LENGTH is the 1st field.  */
3341           t = TYPE_FIELDS (desc_type);
3342           t = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3343           t = tree_cons (min_field,
3344                          convert (TREE_TYPE (min_field), integer_one_node),
3345                          tree_cons (max_field,
3346                                     convert (TREE_TYPE (max_field), t),
3347                                     NULL_TREE));
3348           template_tree = gnat_build_constructor (template_type, t);
3349           template_addr = build_unary_op (ADDR_EXPR, NULL_TREE, template_tree);
3350
3351           /* For class S, we are done.  */
3352           if (iklass == 1)
3353             break;
3354
3355           /* Test that we really have a SB descriptor, like DEC Ada.  */
3356           t = build3 (COMPONENT_REF, TREE_TYPE (klass), desc, klass, NULL);
3357           u = convert (TREE_TYPE (klass), DECL_INITIAL (klass));
3358           u = build_binary_op (EQ_EXPR, integer_type_node, t, u);
3359           /* If so, there is already a template in the descriptor and
3360              it is located right after the POINTER field.  */
3361           t = TREE_CHAIN (pointer);
3362           template_tree
3363             = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3364           /* Otherwise use the {1, LENGTH} template we build above.  */
3365           template_addr = build3 (COND_EXPR, p_bounds_type, u,
3366                                   build_unary_op (ADDR_EXPR, p_bounds_type,
3367                                                  template_tree),
3368                                   template_addr);
3369           break;
3370
3371         case 4:  /* Class A */
3372           /* The AFLAGS field is the 7th field in the descriptor.  */
3373           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (pointer)));
3374           aflags = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3375           /* The DIMCT field is the 8th field in the descriptor.  */
3376           t = TREE_CHAIN (t);
3377           dimct = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3378           /* Raise CONSTRAINT_ERROR if either more than 1 dimension
3379              or FL_COEFF or FL_BOUNDS not set.  */
3380           u = build_int_cst (TREE_TYPE (aflags), 192);
3381           u = build_binary_op (TRUTH_OR_EXPR, integer_type_node,
3382                                build_binary_op (NE_EXPR, integer_type_node,
3383                                                 dimct,
3384                                                 convert (TREE_TYPE (dimct),
3385                                                          size_one_node)),
3386                                build_binary_op (NE_EXPR, integer_type_node,
3387                                                 build2 (BIT_AND_EXPR,
3388                                                         TREE_TYPE (aflags),
3389                                                         aflags, u),
3390                                                 u));
3391           /* There is already a template in the descriptor and it is
3392              located at the start of block 3 (12th field).  */
3393           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (t))));
3394           template_tree
3395             = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3396           template_tree = build3 (COND_EXPR, TREE_TYPE (t), u,
3397                             build_call_raise (CE_Length_Check_Failed, Empty,
3398                                               N_Raise_Constraint_Error),
3399                             template_tree);
3400           template_addr
3401             = build_unary_op (ADDR_EXPR, p_bounds_type, template_tree);
3402           break;
3403
3404         case 10: /* Class NCA */
3405         default:
3406           post_error ("unsupported descriptor type for &", gnat_subprog);
3407           template_addr = integer_zero_node;
3408           break;
3409         }
3410
3411       /* Build the fat pointer in the form of a constructor.  */
3412       t = tree_cons (TYPE_FIELDS (gnu_type), gnu_expr32,
3413                      tree_cons (TREE_CHAIN (TYPE_FIELDS (gnu_type)),
3414                                 template_addr, NULL_TREE));
3415
3416       return gnat_build_constructor (gnu_type, t);
3417     }
3418
3419   else
3420     gcc_unreachable ();
3421 }
3422
3423 /* Convert GNU_EXPR, a pointer to a VMS descriptor, to GNU_TYPE, a regular
3424    pointer or fat pointer type.  GNU_EXPR_ALT_TYPE is the alternate (32-bit)
3425    pointer type of GNU_EXPR.  GNAT_SUBPROG is the subprogram to which the
3426    VMS descriptor is passed.  */
3427
3428 static tree
3429 convert_vms_descriptor (tree gnu_type, tree gnu_expr, tree gnu_expr_alt_type,
3430                         Entity_Id gnat_subprog)
3431 {
3432   tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr));
3433   tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr);
3434   tree mbo = TYPE_FIELDS (desc_type);
3435   const char *mbostr = IDENTIFIER_POINTER (DECL_NAME (mbo));
3436   tree mbmo = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (mbo)));
3437   tree is64bit, gnu_expr32, gnu_expr64;
3438
3439   /* If the field name is not MBO, it must be 32-bit and no alternate.
3440      Otherwise primary must be 64-bit and alternate 32-bit.  */
3441   if (strcmp (mbostr, "MBO") != 0)
3442     return convert_vms_descriptor32 (gnu_type, gnu_expr, gnat_subprog);
3443
3444   /* Build the test for 64-bit descriptor.  */
3445   mbo = build3 (COMPONENT_REF, TREE_TYPE (mbo), desc, mbo, NULL_TREE);
3446   mbmo = build3 (COMPONENT_REF, TREE_TYPE (mbmo), desc, mbmo, NULL_TREE);
3447   is64bit
3448     = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
3449                        build_binary_op (EQ_EXPR, integer_type_node,
3450                                         convert (integer_type_node, mbo),
3451                                         integer_one_node),
3452                        build_binary_op (EQ_EXPR, integer_type_node,
3453                                         convert (integer_type_node, mbmo),
3454                                         integer_minus_one_node));
3455
3456   /* Build the 2 possible end results.  */
3457   gnu_expr64 = convert_vms_descriptor64 (gnu_type, gnu_expr, gnat_subprog);
3458   gnu_expr = fold_convert (gnu_expr_alt_type, gnu_expr);
3459   gnu_expr32 = convert_vms_descriptor32 (gnu_type, gnu_expr, gnat_subprog);
3460
3461   return build3 (COND_EXPR, gnu_type, is64bit, gnu_expr64, gnu_expr32);
3462 }
3463
3464 /* Build a stub for the subprogram specified by the GCC tree GNU_SUBPROG
3465    and the GNAT node GNAT_SUBPROG.  */
3466
3467 void
3468 build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog)
3469 {
3470   tree gnu_subprog_type, gnu_subprog_addr, gnu_subprog_call;
3471   tree gnu_stub_param, gnu_param_list, gnu_arg_types, gnu_param;
3472   tree gnu_stub_decl = DECL_FUNCTION_STUB (gnu_subprog);
3473   tree gnu_body;
3474
3475   gnu_subprog_type = TREE_TYPE (gnu_subprog);
3476   gnu_param_list = NULL_TREE;
3477
3478   begin_subprog_body (gnu_stub_decl);
3479   gnat_pushlevel ();
3480
3481   start_stmt_group ();
3482
3483   /* Loop over the parameters of the stub and translate any of them
3484      passed by descriptor into a by reference one.  */
3485   for (gnu_stub_param = DECL_ARGUMENTS (gnu_stub_decl),
3486        gnu_arg_types = TYPE_ARG_TYPES (gnu_subprog_type);
3487        gnu_stub_param;
3488        gnu_stub_param = TREE_CHAIN (gnu_stub_param),
3489        gnu_arg_types = TREE_CHAIN (gnu_arg_types))
3490     {
3491       if (DECL_BY_DESCRIPTOR_P (gnu_stub_param))
3492         gnu_param
3493           = convert_vms_descriptor (TREE_VALUE (gnu_arg_types),
3494                                     gnu_stub_param,
3495                                     DECL_PARM_ALT_TYPE (gnu_stub_param),
3496                                     gnat_subprog);
3497       else
3498         gnu_param = gnu_stub_param;
3499
3500       gnu_param_list = tree_cons (NULL_TREE, gnu_param, gnu_param_list);
3501     }
3502
3503   gnu_body = end_stmt_group ();
3504
3505   /* Invoke the internal subprogram.  */
3506   gnu_subprog_addr = build1 (ADDR_EXPR, build_pointer_type (gnu_subprog_type),
3507                              gnu_subprog);
3508   gnu_subprog_call = build_call_list (TREE_TYPE (gnu_subprog_type),
3509                                       gnu_subprog_addr,
3510                                       nreverse (gnu_param_list));
3511
3512   /* Propagate the return value, if any.  */
3513   if (VOID_TYPE_P (TREE_TYPE (gnu_subprog_type)))
3514     append_to_statement_list (gnu_subprog_call, &gnu_body);
3515   else
3516     append_to_statement_list (build_return_expr (DECL_RESULT (gnu_stub_decl),
3517                                                  gnu_subprog_call),
3518                               &gnu_body);
3519
3520   gnat_poplevel ();
3521
3522   allocate_struct_function (gnu_stub_decl, false);
3523   end_subprog_body (gnu_body);
3524 }
3525 \f
3526 /* Build a type to be used to represent an aliased object whose nominal
3527    type is an unconstrained array.  This consists of a RECORD_TYPE containing
3528    a field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an
3529    ARRAY_TYPE.  If ARRAY_TYPE is that of the unconstrained array, this
3530    is used to represent an arbitrary unconstrained object.  Use NAME
3531    as the name of the record.  */
3532
3533 tree
3534 build_unc_object_type (tree template_type, tree object_type, tree name)
3535 {
3536   tree type = make_node (RECORD_TYPE);
3537   tree template_field = create_field_decl (get_identifier ("BOUNDS"),
3538                                            template_type, type, 0, 0, 0, 1);
3539   tree array_field = create_field_decl (get_identifier ("ARRAY"), object_type,
3540                                         type, 0, 0, 0, 1);
3541
3542   TYPE_NAME (type) = name;
3543   TYPE_CONTAINS_TEMPLATE_P (type) = 1;
3544   finish_record_type (type,
3545                       chainon (chainon (NULL_TREE, template_field),
3546                                array_field),
3547                       0, true);
3548
3549   return type;
3550 }
3551
3552 /* Same, taking a thin or fat pointer type instead of a template type. */
3553
3554 tree
3555 build_unc_object_type_from_ptr (tree thin_fat_ptr_type, tree object_type,
3556                                 tree name)
3557 {
3558   tree template_type;
3559
3560   gcc_assert (TYPE_IS_FAT_OR_THIN_POINTER_P (thin_fat_ptr_type));
3561
3562   template_type
3563     = (TYPE_IS_FAT_POINTER_P (thin_fat_ptr_type)
3564        ? TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (thin_fat_ptr_type))))
3565        : TREE_TYPE (TYPE_FIELDS (TREE_TYPE (thin_fat_ptr_type))));
3566   return build_unc_object_type (template_type, object_type, name);
3567 }
3568
3569 /* Shift the component offsets within an unconstrained object TYPE to make it
3570    suitable for use as a designated type for thin pointers.  */
3571
3572 void
3573 shift_unc_components_for_thin_pointers (tree type)
3574 {
3575   /* Thin pointer values designate the ARRAY data of an unconstrained object,
3576      allocated past the BOUNDS template.  The designated type is adjusted to
3577      have ARRAY at position zero and the template at a negative offset, so
3578      that COMPONENT_REFs on (*thin_ptr) designate the proper location.  */
3579
3580   tree bounds_field = TYPE_FIELDS (type);
3581   tree array_field  = TREE_CHAIN (TYPE_FIELDS (type));
3582
3583   DECL_FIELD_OFFSET (bounds_field)
3584     = size_binop (MINUS_EXPR, size_zero_node, byte_position (array_field));
3585
3586   DECL_FIELD_OFFSET (array_field) = size_zero_node;
3587   DECL_FIELD_BIT_OFFSET (array_field) = bitsize_zero_node;
3588 }
3589 \f
3590 /* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE.
3591    In the normal case this is just two adjustments, but we have more to
3592    do if NEW_TYPE is an UNCONSTRAINED_ARRAY_TYPE.  */
3593
3594 void
3595 update_pointer_to (tree old_type, tree new_type)
3596 {
3597   tree ptr = TYPE_POINTER_TO (old_type);
3598   tree ref = TYPE_REFERENCE_TO (old_type);
3599   tree ptr1, ref1;
3600   tree type;
3601
3602   /* If this is the main variant, process all the other variants first.  */
3603   if (TYPE_MAIN_VARIANT (old_type) == old_type)
3604     for (type = TYPE_NEXT_VARIANT (old_type); type;
3605          type = TYPE_NEXT_VARIANT (type))
3606       update_pointer_to (type, new_type);
3607
3608   /* If no pointers and no references, we are done.  */
3609   if (!ptr && !ref)
3610     return;
3611
3612   /* Merge the old type qualifiers in the new type.
3613
3614      Each old variant has qualifiers for specific reasons, and the new
3615      designated type as well.  Each set of qualifiers represents useful
3616      information grabbed at some point, and merging the two simply unifies
3617      these inputs into the final type description.
3618
3619      Consider for instance a volatile type frozen after an access to constant
3620      type designating it; after the designated type's freeze, we get here with
3621      a volatile NEW_TYPE and a dummy OLD_TYPE with a readonly variant, created
3622      when the access type was processed.  We will make a volatile and readonly
3623      designated type, because that's what it really is.
3624
3625      We might also get here for a non-dummy OLD_TYPE variant with different
3626      qualifiers than those of NEW_TYPE, for instance in some cases of pointers
3627      to private record type elaboration (see the comments around the call to
3628      this routine in gnat_to_gnu_entity <E_Access_Type>).  We have to merge
3629      the qualifiers in those cases too, to avoid accidentally discarding the
3630      initial set, and will often end up with OLD_TYPE == NEW_TYPE then.  */
3631   new_type
3632     = build_qualified_type (new_type,
3633                             TYPE_QUALS (old_type) | TYPE_QUALS (new_type));
3634
3635   /* If old type and new type are identical, there is nothing to do.  */
3636   if (old_type == new_type)
3637     return;
3638
3639   /* Otherwise, first handle the simple case.  */
3640   if (TREE_CODE (new_type) != UNCONSTRAINED_ARRAY_TYPE)
3641     {
3642       TYPE_POINTER_TO (new_type) = ptr;
3643       TYPE_REFERENCE_TO (new_type) = ref;
3644
3645       for (; ptr; ptr = TYPE_NEXT_PTR_TO (ptr))
3646         for (ptr1 = TYPE_MAIN_VARIANT (ptr); ptr1;
3647              ptr1 = TYPE_NEXT_VARIANT (ptr1))
3648           TREE_TYPE (ptr1) = new_type;
3649
3650       for (; ref; ref = TYPE_NEXT_REF_TO (ref))
3651         for (ref1 = TYPE_MAIN_VARIANT (ref); ref1;
3652              ref1 = TYPE_NEXT_VARIANT (ref1))
3653           TREE_TYPE (ref1) = new_type;
3654     }
3655
3656   /* Now deal with the unconstrained array case.  In this case the "pointer"
3657      is actually a RECORD_TYPE where both fields are pointers to dummy nodes.
3658      Turn them into pointers to the correct types using update_pointer_to.  */
3659   else if (!TYPE_IS_FAT_POINTER_P (ptr))
3660     gcc_unreachable ();
3661
3662   else
3663     {
3664       tree new_obj_rec = TYPE_OBJECT_RECORD_TYPE (new_type);
3665       tree array_field = TYPE_FIELDS (ptr);
3666       tree bounds_field = TREE_CHAIN (TYPE_FIELDS (ptr));
3667       tree new_ptr = TYPE_POINTER_TO (new_type);
3668       tree new_ref;
3669       tree var;
3670
3671       /* Make pointers to the dummy template point to the real template.  */
3672       update_pointer_to
3673         (TREE_TYPE (TREE_TYPE (bounds_field)),
3674          TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (new_ptr)))));
3675
3676       /* The references to the template bounds present in the array type
3677          are made through a PLACEHOLDER_EXPR of type NEW_PTR.  Since we
3678          are updating PTR to make it a full replacement for NEW_PTR as
3679          pointer to NEW_TYPE, we must rework the PLACEHOLDER_EXPR so as
3680          to make it of type PTR.  */
3681       new_ref = build3 (COMPONENT_REF, TREE_TYPE (bounds_field),
3682                         build0 (PLACEHOLDER_EXPR, ptr),
3683                         bounds_field, NULL_TREE);
3684
3685       /* Create the new array for the new PLACEHOLDER_EXPR and make pointers
3686          to the dummy array point to it.  */
3687       update_pointer_to
3688         (TREE_TYPE (TREE_TYPE (array_field)),
3689          substitute_in_type (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (new_ptr))),
3690                              TREE_CHAIN (TYPE_FIELDS (new_ptr)), new_ref));
3691
3692       /* Make PTR the pointer to NEW_TYPE.  */
3693       TYPE_POINTER_TO (new_type) = TYPE_REFERENCE_TO (new_type)
3694         = TREE_TYPE (new_type) = ptr;
3695
3696       /* And show the original pointer NEW_PTR to the debugger.  This is the
3697          counterpart of the equivalent processing in gnat_pushdecl when the
3698          unconstrained array type is frozen after access types to it.  Note
3699          that update_pointer_to can be invoked multiple times on the same
3700          couple of types because of the type variants.  */
3701       if (TYPE_NAME (ptr)
3702           && TREE_CODE (TYPE_NAME (ptr)) == TYPE_DECL
3703           && !DECL_ORIGINAL_TYPE (TYPE_NAME (ptr)))
3704         {
3705           DECL_ORIGINAL_TYPE (TYPE_NAME (ptr)) = new_ptr;
3706           DECL_ARTIFICIAL (TYPE_NAME (ptr)) = 0;
3707         }
3708       for (var = TYPE_MAIN_VARIANT (ptr); var; var = TYPE_NEXT_VARIANT (var))
3709         SET_TYPE_UNCONSTRAINED_ARRAY (var, new_type);
3710
3711       /* Now handle updating the allocation record, what the thin pointer
3712          points to.  Update all pointers from the old record into the new
3713          one, update the type of the array field, and recompute the size.  */
3714       update_pointer_to (TYPE_OBJECT_RECORD_TYPE (old_type), new_obj_rec);
3715
3716       TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec)))
3717         = TREE_TYPE (TREE_TYPE (array_field));
3718
3719       /* The size recomputation needs to account for alignment constraints, so
3720          we let layout_type work it out.  This will reset the field offsets to
3721          what they would be in a regular record, so we shift them back to what
3722          we want them to be for a thin pointer designated type afterwards.  */
3723       DECL_SIZE (TYPE_FIELDS (new_obj_rec)) = 0;
3724       DECL_SIZE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec))) = 0;
3725       TYPE_SIZE (new_obj_rec) = 0;
3726       layout_type (new_obj_rec);
3727
3728       shift_unc_components_for_thin_pointers (new_obj_rec);
3729
3730       /* We are done, at last.  */
3731       rest_of_record_type_compilation (ptr);
3732     }
3733 }
3734 \f
3735 /* Convert EXPR, a pointer to a constrained array, into a pointer to an
3736    unconstrained one.  This involves making or finding a template.  */
3737
3738 static tree
3739 convert_to_fat_pointer (tree type, tree expr)
3740 {
3741   tree template_type = TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type))));
3742   tree p_array_type = TREE_TYPE (TYPE_FIELDS (type));
3743   tree etype = TREE_TYPE (expr);
3744   tree template_tree;
3745
3746   /* If EXPR is null, make a fat pointer that contains null pointers to the
3747      template and array.  */
3748   if (integer_zerop (expr))
3749     return
3750       gnat_build_constructor
3751         (type,
3752          tree_cons (TYPE_FIELDS (type),
3753                     convert (p_array_type, expr),
3754                     tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3755                                convert (build_pointer_type (template_type),
3756                                         expr),
3757                                NULL_TREE)));
3758
3759   /* If EXPR is a thin pointer, make template and data from the record..  */
3760   else if (TYPE_IS_THIN_POINTER_P (etype))
3761     {
3762       tree fields = TYPE_FIELDS (TREE_TYPE (etype));
3763
3764       expr = save_expr (expr);
3765       if (TREE_CODE (expr) == ADDR_EXPR)
3766         expr = TREE_OPERAND (expr, 0);
3767       else
3768         expr = build1 (INDIRECT_REF, TREE_TYPE (etype), expr);
3769
3770       template_tree = build_component_ref (expr, NULL_TREE, fields, false);
3771       expr = build_unary_op (ADDR_EXPR, NULL_TREE,
3772                              build_component_ref (expr, NULL_TREE,
3773                                                   TREE_CHAIN (fields), false));
3774     }
3775
3776   /* Otherwise, build the constructor for the template.  */
3777   else
3778     template_tree = build_template (template_type, TREE_TYPE (etype), expr);
3779
3780   /* The final result is a constructor for the fat pointer.
3781
3782      If EXPR is an argument of a foreign convention subprogram, the type it
3783      points to is directly the component type.  In this case, the expression
3784      type may not match the corresponding FIELD_DECL type at this point, so we
3785      call "convert" here to fix that up if necessary.  This type consistency is
3786      required, for instance because it ensures that possible later folding of
3787      COMPONENT_REFs against this constructor always yields something of the
3788      same type as the initial reference.
3789
3790      Note that the call to "build_template" above is still fine because it
3791      will only refer to the provided TEMPLATE_TYPE in this case.  */
3792   return
3793     gnat_build_constructor
3794       (type,
3795        tree_cons (TYPE_FIELDS (type),
3796                   convert (p_array_type, expr),
3797                   tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3798                              build_unary_op (ADDR_EXPR, NULL_TREE,
3799                                              template_tree),
3800                              NULL_TREE)));
3801 }
3802 \f
3803 /* Convert to a thin pointer type, TYPE.  The only thing we know how to convert
3804    is something that is a fat pointer, so convert to it first if it EXPR
3805    is not already a fat pointer.  */
3806
3807 static tree
3808 convert_to_thin_pointer (tree type, tree expr)
3809 {
3810   if (!TYPE_IS_FAT_POINTER_P (TREE_TYPE (expr)))
3811     expr
3812       = convert_to_fat_pointer
3813         (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type))), expr);
3814
3815   /* We get the pointer to the data and use a NOP_EXPR to make it the
3816      proper GCC type.  */
3817   expr = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (TREE_TYPE (expr)),
3818                               false);
3819   expr = build1 (NOP_EXPR, type, expr);
3820
3821   return expr;
3822 }
3823 \f
3824 /* Create an expression whose value is that of EXPR,
3825    converted to type TYPE.  The TREE_TYPE of the value
3826    is always TYPE.  This function implements all reasonable
3827    conversions; callers should filter out those that are
3828    not permitted by the language being compiled.  */
3829
3830 tree
3831 convert (tree type, tree expr)
3832 {
3833   enum tree_code code = TREE_CODE (type);
3834   tree etype = TREE_TYPE (expr);
3835   enum tree_code ecode = TREE_CODE (etype);
3836
3837   /* If EXPR is already the right type, we are done.  */
3838   if (type == etype)
3839     return expr;
3840
3841   /* If both input and output have padding and are of variable size, do this
3842      as an unchecked conversion.  Likewise if one is a mere variant of the
3843      other, so we avoid a pointless unpad/repad sequence.  */
3844   else if (code == RECORD_TYPE && ecode == RECORD_TYPE
3845            && TYPE_PADDING_P (type) && TYPE_PADDING_P (etype)
3846            && (!TREE_CONSTANT (TYPE_SIZE (type))
3847                || !TREE_CONSTANT (TYPE_SIZE (etype))
3848                || gnat_types_compatible_p (type, etype)
3849                || TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type)))
3850                   == TYPE_NAME (TREE_TYPE (TYPE_FIELDS (etype)))))
3851     ;
3852
3853   /* If the output type has padding, convert to the inner type and make a
3854      constructor to build the record, unless a variable size is involved.  */
3855   else if (code == RECORD_TYPE && TYPE_PADDING_P (type))
3856     {
3857       /* If we previously converted from another type and our type is
3858          of variable size, remove the conversion to avoid the need for
3859          variable-sized temporaries.  Likewise for a conversion between
3860          original and packable version.  */
3861       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
3862           && (!TREE_CONSTANT (TYPE_SIZE (type))
3863               || (ecode == RECORD_TYPE
3864                   && TYPE_NAME (etype)
3865                      == TYPE_NAME (TREE_TYPE (TREE_OPERAND (expr, 0))))))
3866         expr = TREE_OPERAND (expr, 0);
3867
3868       /* If we are just removing the padding from expr, convert the original
3869          object if we have variable size in order to avoid the need for some
3870          variable-sized temporaries.  Likewise if the padding is a variant
3871          of the other, so we avoid a pointless unpad/repad sequence.  */
3872       if (TREE_CODE (expr) == COMPONENT_REF
3873           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (expr, 0)))
3874           && (!TREE_CONSTANT (TYPE_SIZE (type))
3875               || gnat_types_compatible_p (type,
3876                                           TREE_TYPE (TREE_OPERAND (expr, 0)))
3877               || (ecode == RECORD_TYPE
3878                   && TYPE_NAME (etype)
3879                      == TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type))))))
3880         return convert (type, TREE_OPERAND (expr, 0));
3881
3882       /* If the inner type is of self-referential size and the expression type
3883          is a record, do this as an unchecked conversion.  But first pad the
3884          expression if possible to have the same size on both sides.  */
3885       if (TREE_CODE (etype) == RECORD_TYPE
3886           && CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type))))
3887         {
3888           if (TREE_CONSTANT (TYPE_SIZE (etype)))
3889             expr = convert (maybe_pad_type (etype, TYPE_SIZE (type), 0, Empty,
3890                             false, false, false, true), expr);
3891           return unchecked_convert (type, expr, false);
3892         }
3893
3894       /* If we are converting between array types with variable size, do the
3895          final conversion as an unchecked conversion, again to avoid the need
3896          for some variable-sized temporaries.  If valid, this conversion is
3897          very likely purely technical and without real effects.  */
3898       if (TREE_CODE (etype) == ARRAY_TYPE
3899           && TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == ARRAY_TYPE
3900           && !TREE_CONSTANT (TYPE_SIZE (etype))
3901           && !TREE_CONSTANT (TYPE_SIZE (type)))
3902         return unchecked_convert (type,
3903                                   convert (TREE_TYPE (TYPE_FIELDS (type)),
3904                                            expr),
3905                                   false);
3906
3907       return
3908         gnat_build_constructor (type,
3909                                 tree_cons (TYPE_FIELDS (type),
3910                                            convert (TREE_TYPE
3911                                                     (TYPE_FIELDS (type)),
3912                                                     expr),
3913                                            NULL_TREE));
3914     }
3915
3916   /* If the input type has padding, remove it and convert to the output type.
3917      The conditions ordering is arranged to ensure that the output type is not
3918      a padding type here, as it is not clear whether the conversion would
3919      always be correct if this was to happen.  */
3920   else if (ecode == RECORD_TYPE && TYPE_PADDING_P (etype))
3921     {
3922       tree unpadded;
3923
3924       /* If we have just converted to this padded type, just get the
3925          inner expression.  */
3926       if (TREE_CODE (expr) == CONSTRUCTOR
3927           && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (expr))
3928           && VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->index
3929              == TYPE_FIELDS (etype))
3930         unpadded
3931           = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->value;
3932
3933       /* Otherwise, build an explicit component reference.  */
3934       else
3935         unpadded
3936           = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (etype), false);
3937
3938       return convert (type, unpadded);
3939     }
3940
3941   /* If the input is a biased type, adjust first.  */
3942   if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype))
3943     return convert (type, fold_build2 (PLUS_EXPR, TREE_TYPE (etype),
3944                                        fold_convert (TREE_TYPE (etype),
3945                                                      expr),
3946                                        TYPE_MIN_VALUE (etype)));
3947
3948   /* If the input is a justified modular type, we need to extract the actual
3949      object before converting it to any other type with the exceptions of an
3950      unconstrained array or of a mere type variant.  It is useful to avoid the
3951      extraction and conversion in the type variant case because it could end
3952      up replacing a VAR_DECL expr by a constructor and we might be about the
3953      take the address of the result.  */
3954   if (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)
3955       && code != UNCONSTRAINED_ARRAY_TYPE
3956       && TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (etype))
3957     return convert (type, build_component_ref (expr, NULL_TREE,
3958                                                TYPE_FIELDS (etype), false));
3959
3960   /* If converting to a type that contains a template, convert to the data
3961      type and then build the template. */
3962   if (code == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (type))
3963     {
3964       tree obj_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type)));
3965
3966       /* If the source already has a template, get a reference to the
3967          associated array only, as we are going to rebuild a template
3968          for the target type anyway.  */
3969       expr = maybe_unconstrained_array (expr);
3970
3971       return
3972         gnat_build_constructor
3973           (type,
3974            tree_cons (TYPE_FIELDS (type),
3975                       build_template (TREE_TYPE (TYPE_FIELDS (type)),
3976                                       obj_type, NULL_TREE),
3977                       tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3978                                  convert (obj_type, expr), NULL_TREE)));
3979     }
3980
3981   /* There are some special cases of expressions that we process
3982      specially.  */
3983   switch (TREE_CODE (expr))
3984     {
3985     case ERROR_MARK:
3986       return expr;
3987
3988     case NULL_EXPR:
3989       /* Just set its type here.  For TRANSFORM_EXPR, we will do the actual
3990          conversion in gnat_expand_expr.  NULL_EXPR does not represent
3991          and actual value, so no conversion is needed.  */
3992       expr = copy_node (expr);
3993       TREE_TYPE (expr) = type;
3994       return expr;
3995
3996     case STRING_CST:
3997       /* If we are converting a STRING_CST to another constrained array type,
3998          just make a new one in the proper type.  */
3999       if (code == ecode && AGGREGATE_TYPE_P (etype)
4000           && !(TREE_CODE (TYPE_SIZE (etype)) == INTEGER_CST
4001                && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
4002         {
4003           expr = copy_node (expr);
4004           TREE_TYPE (expr) = type;
4005           return expr;
4006         }
4007       break;
4008
4009     case VECTOR_CST:
4010       /* If we are converting a VECTOR_CST to a mere variant type, just make
4011          a new one in the proper type.  */
4012       if (code == ecode && gnat_types_compatible_p (type, etype))
4013         {
4014           expr = copy_node (expr);
4015           TREE_TYPE (expr) = type;
4016           return expr;
4017         }
4018
4019     case CONSTRUCTOR:
4020       /* If we are converting a CONSTRUCTOR to a mere variant type, just make
4021          a new one in the proper type.  */
4022       if (code == ecode && gnat_types_compatible_p (type, etype))
4023         {
4024           expr = copy_node (expr);
4025           TREE_TYPE (expr) = type;
4026           return expr;
4027         }
4028
4029       /* Likewise for a conversion between original and packable version, but
4030          we have to work harder in order to preserve type consistency.  */
4031       if (code == ecode
4032           && code == RECORD_TYPE
4033           && TYPE_NAME (type) == TYPE_NAME (etype))
4034         {
4035           VEC(constructor_elt,gc) *e = CONSTRUCTOR_ELTS (expr);
4036           unsigned HOST_WIDE_INT len = VEC_length (constructor_elt, e);
4037           VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, len);
4038           tree efield = TYPE_FIELDS (etype), field = TYPE_FIELDS (type);
4039           unsigned HOST_WIDE_INT idx;
4040           tree index, value;
4041
4042           /* Whether we need to clear TREE_CONSTANT et al. on the output
4043              constructor when we convert in place.  */
4044           bool clear_constant = false;
4045
4046           FOR_EACH_CONSTRUCTOR_ELT(e, idx, index, value)
4047             {
4048               constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
4049               /* We expect only simple constructors.  Otherwise, punt.  */
4050               if (!(index == efield || index == DECL_ORIGINAL_FIELD (efield)))
4051                 break;
4052               elt->index = field;
4053               elt->value = convert (TREE_TYPE (field), value);
4054
4055               /* If packing has made this field a bitfield and the input
4056                  value couldn't be emitted statically any more, we need to
4057                  clear TREE_CONSTANT on our output.  */
4058               if (!clear_constant && TREE_CONSTANT (expr)
4059                   && !CONSTRUCTOR_BITFIELD_P (efield)
4060                   && CONSTRUCTOR_BITFIELD_P (field)
4061                   && !initializer_constant_valid_for_bitfield_p (value))
4062                 clear_constant = true;
4063
4064               efield = TREE_CHAIN (efield);
4065               field = TREE_CHAIN (field);
4066             }
4067
4068           /* If we have been able to match and convert all the input fields
4069              to their output type, convert in place now.  We'll fallback to a
4070              view conversion downstream otherwise.  */
4071           if (idx == len)
4072             {
4073               expr = copy_node (expr);
4074               TREE_TYPE (expr) = type;
4075               CONSTRUCTOR_ELTS (expr) = v;
4076               if (clear_constant)
4077                 TREE_CONSTANT (expr) = TREE_STATIC (expr) = false;
4078               return expr;
4079             }
4080         }
4081
4082       /* Likewise for a conversion between array type and vector type with a
4083          compatible representative array.  */
4084       else if (code == VECTOR_TYPE
4085                && ecode == ARRAY_TYPE
4086                && gnat_types_compatible_p (TYPE_REPRESENTATIVE_ARRAY (type),
4087                                            etype))
4088         {
4089           VEC(constructor_elt,gc) *e = CONSTRUCTOR_ELTS (expr);
4090           unsigned HOST_WIDE_INT len = VEC_length (constructor_elt, e);
4091           VEC(constructor_elt,gc) *v;
4092           unsigned HOST_WIDE_INT ix;
4093           tree value;
4094
4095           /* Build a VECTOR_CST from a *constant* array constructor.  */
4096           if (TREE_CONSTANT (expr))
4097             {
4098               bool constant_p = true;
4099
4100               /* Iterate through elements and check if all constructor
4101                  elements are *_CSTs.  */
4102               FOR_EACH_CONSTRUCTOR_VALUE (e, ix, value)
4103                 if (!CONSTANT_CLASS_P (value))
4104                   {
4105                     constant_p = false;
4106                     break;
4107                   }
4108
4109               if (constant_p)
4110                 return build_vector_from_ctor (type,
4111                                                CONSTRUCTOR_ELTS (expr));
4112             }
4113
4114           /* Otherwise, build a regular vector constructor.  */
4115           v = VEC_alloc (constructor_elt, gc, len);
4116           FOR_EACH_CONSTRUCTOR_VALUE (e, ix, value)
4117             {
4118               constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
4119               elt->index = NULL_TREE;
4120               elt->value = value;
4121             }
4122           expr = copy_node (expr);
4123           TREE_TYPE (expr) = type;
4124           CONSTRUCTOR_ELTS (expr) = v;
4125           return expr;
4126         }
4127       break;
4128
4129     case UNCONSTRAINED_ARRAY_REF:
4130       /* Convert this to the type of the inner array by getting the address of
4131          the array from the template.  */
4132       expr = build_unary_op (INDIRECT_REF, NULL_TREE,
4133                              build_component_ref (TREE_OPERAND (expr, 0),
4134                                                   get_identifier ("P_ARRAY"),
4135                                                   NULL_TREE, false));
4136       etype = TREE_TYPE (expr);
4137       ecode = TREE_CODE (etype);
4138       break;
4139
4140     case VIEW_CONVERT_EXPR:
4141       {
4142         /* GCC 4.x is very sensitive to type consistency overall, and view
4143            conversions thus are very frequent.  Even though just "convert"ing
4144            the inner operand to the output type is fine in most cases, it
4145            might expose unexpected input/output type mismatches in special
4146            circumstances so we avoid such recursive calls when we can.  */
4147         tree op0 = TREE_OPERAND (expr, 0);
4148
4149         /* If we are converting back to the original type, we can just
4150            lift the input conversion.  This is a common occurrence with
4151            switches back-and-forth amongst type variants.  */
4152         if (type == TREE_TYPE (op0))
4153           return op0;
4154
4155         /* Otherwise, if we're converting between two aggregate or vector
4156            types, we might be allowed to substitute the VIEW_CONVERT_EXPR
4157            target type in place or to just convert the inner expression.  */
4158         if ((AGGREGATE_TYPE_P (type) && AGGREGATE_TYPE_P (etype))
4159             || (VECTOR_TYPE_P (type) && VECTOR_TYPE_P (etype)))
4160           {
4161             /* If we are converting between mere variants, we can just
4162                substitute the VIEW_CONVERT_EXPR in place.  */
4163             if (gnat_types_compatible_p (type, etype))
4164               return build1 (VIEW_CONVERT_EXPR, type, op0);
4165
4166             /* Otherwise, we may just bypass the input view conversion unless
4167                one of the types is a fat pointer,  which is handled by
4168                specialized code below which relies on exact type matching.  */
4169             else if (!TYPE_IS_FAT_POINTER_P (type)
4170                      && !TYPE_IS_FAT_POINTER_P (etype))
4171               return convert (type, op0);
4172           }
4173       }
4174       break;
4175
4176     case INDIRECT_REF:
4177       /* If both types are record types, just convert the pointer and
4178          make a new INDIRECT_REF.
4179
4180          ??? Disable this for now since it causes problems with the
4181          code in build_binary_op for MODIFY_EXPR which wants to
4182          strip off conversions.  But that code really is a mess and
4183          we need to do this a much better way some time.  */
4184       if (0
4185           && (TREE_CODE (type) == RECORD_TYPE
4186               || TREE_CODE (type) == UNION_TYPE)
4187           && (TREE_CODE (etype) == RECORD_TYPE
4188               || TREE_CODE (etype) == UNION_TYPE)
4189           && !TYPE_IS_FAT_POINTER_P (type) && !TYPE_IS_FAT_POINTER_P (etype))
4190         return build_unary_op (INDIRECT_REF, NULL_TREE,
4191                                convert (build_pointer_type (type),
4192                                         TREE_OPERAND (expr, 0)));
4193       break;
4194
4195     default:
4196       break;
4197     }
4198
4199   /* Check for converting to a pointer to an unconstrained array.  */
4200   if (TYPE_IS_FAT_POINTER_P (type) && !TYPE_IS_FAT_POINTER_P (etype))
4201     return convert_to_fat_pointer (type, expr);
4202
4203   /* If we are converting between two aggregate or vector types that are mere
4204      variants, just make a VIEW_CONVERT_EXPR.  Likewise when we are converting
4205      to a vector type from its representative array type.  */
4206   else if ((code == ecode
4207             && (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
4208             && gnat_types_compatible_p (type, etype))
4209            || (code == VECTOR_TYPE
4210                && ecode == ARRAY_TYPE
4211                && gnat_types_compatible_p (TYPE_REPRESENTATIVE_ARRAY (type),
4212                                            etype)))
4213     return build1 (VIEW_CONVERT_EXPR, type, expr);
4214
4215   /* In all other cases of related types, make a NOP_EXPR.  */
4216   else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype)
4217            || (code == INTEGER_CST && ecode == INTEGER_CST
4218                && (type == TREE_TYPE (etype) || etype == TREE_TYPE (type))))
4219     return fold_convert (type, expr);
4220
4221   switch (code)
4222     {
4223     case VOID_TYPE:
4224       return fold_build1 (CONVERT_EXPR, type, expr);
4225
4226     case INTEGER_TYPE:
4227       if (TYPE_HAS_ACTUAL_BOUNDS_P (type)
4228           && (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE
4229               || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))))
4230         return unchecked_convert (type, expr, false);
4231       else if (TYPE_BIASED_REPRESENTATION_P (type))
4232         return fold_convert (type,
4233                              fold_build2 (MINUS_EXPR, TREE_TYPE (type),
4234                                           convert (TREE_TYPE (type), expr),
4235                                           TYPE_MIN_VALUE (type)));
4236
4237       /* ... fall through ... */
4238
4239     case ENUMERAL_TYPE:
4240     case BOOLEAN_TYPE:
4241       /* If we are converting an additive expression to an integer type
4242          with lower precision, be wary of the optimization that can be
4243          applied by convert_to_integer.  There are 2 problematic cases:
4244            - if the first operand was originally of a biased type,
4245              because we could be recursively called to convert it
4246              to an intermediate type and thus rematerialize the
4247              additive operator endlessly,
4248            - if the expression contains a placeholder, because an
4249              intermediate conversion that changes the sign could
4250              be inserted and thus introduce an artificial overflow
4251              at compile time when the placeholder is substituted.  */
4252       if (code == INTEGER_TYPE
4253           && ecode == INTEGER_TYPE
4254           && TYPE_PRECISION (type) < TYPE_PRECISION (etype)
4255           && (TREE_CODE (expr) == PLUS_EXPR || TREE_CODE (expr) == MINUS_EXPR))
4256         {
4257           tree op0 = get_unwidened (TREE_OPERAND (expr, 0), type);
4258
4259           if ((TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
4260                && TYPE_BIASED_REPRESENTATION_P (TREE_TYPE (op0)))
4261               || CONTAINS_PLACEHOLDER_P (expr))
4262             return build1 (NOP_EXPR, type, expr);
4263         }
4264
4265       return fold (convert_to_integer (type, expr));
4266
4267     case POINTER_TYPE:
4268     case REFERENCE_TYPE:
4269       /* If converting between two pointers to records denoting
4270          both a template and type, adjust if needed to account
4271          for any differing offsets, since one might be negative.  */
4272       if (TYPE_IS_THIN_POINTER_P (etype) && TYPE_IS_THIN_POINTER_P (type))
4273         {
4274           tree bit_diff
4275             = size_diffop (bit_position (TYPE_FIELDS (TREE_TYPE (etype))),
4276                            bit_position (TYPE_FIELDS (TREE_TYPE (type))));
4277           tree byte_diff = size_binop (CEIL_DIV_EXPR, bit_diff,
4278                                        sbitsize_int (BITS_PER_UNIT));
4279
4280           expr = build1 (NOP_EXPR, type, expr);
4281           TREE_CONSTANT (expr) = TREE_CONSTANT (TREE_OPERAND (expr, 0));
4282           if (integer_zerop (byte_diff))
4283             return expr;
4284
4285           return build_binary_op (POINTER_PLUS_EXPR, type, expr,
4286                                   fold (convert (sizetype, byte_diff)));
4287         }
4288
4289       /* If converting to a thin pointer, handle specially.  */
4290       if (TYPE_IS_THIN_POINTER_P (type)
4291           && TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)))
4292         return convert_to_thin_pointer (type, expr);
4293
4294       /* If converting fat pointer to normal pointer, get the pointer to the
4295          array and then convert it.  */
4296       else if (TYPE_IS_FAT_POINTER_P (etype))
4297         expr = build_component_ref (expr, get_identifier ("P_ARRAY"),
4298                                     NULL_TREE, false);
4299
4300       return fold (convert_to_pointer (type, expr));
4301
4302     case REAL_TYPE:
4303       return fold (convert_to_real (type, expr));
4304
4305     case RECORD_TYPE:
4306       if (TYPE_JUSTIFIED_MODULAR_P (type) && !AGGREGATE_TYPE_P (etype))
4307         return
4308           gnat_build_constructor
4309             (type, tree_cons (TYPE_FIELDS (type),
4310                               convert (TREE_TYPE (TYPE_FIELDS (type)), expr),
4311                               NULL_TREE));
4312
4313       /* ... fall through ... */
4314
4315     case ARRAY_TYPE:
4316       /* In these cases, assume the front-end has validated the conversion.
4317          If the conversion is valid, it will be a bit-wise conversion, so
4318          it can be viewed as an unchecked conversion.  */
4319       return unchecked_convert (type, expr, false);
4320
4321     case UNION_TYPE:
4322       /* This is a either a conversion between a tagged type and some
4323          subtype, which we have to mark as a UNION_TYPE because of
4324          overlapping fields or a conversion of an Unchecked_Union.  */
4325       return unchecked_convert (type, expr, false);
4326
4327     case UNCONSTRAINED_ARRAY_TYPE:
4328       /* If the input is a VECTOR_TYPE, convert to the representative
4329          array type first.  */
4330       if (ecode == VECTOR_TYPE)
4331         {
4332           expr = convert (TYPE_REPRESENTATIVE_ARRAY (etype), expr);
4333           etype = TREE_TYPE (expr);
4334           ecode = TREE_CODE (etype);
4335         }
4336
4337       /* If EXPR is a constrained array, take its address, convert it to a
4338          fat pointer, and then dereference it.  Likewise if EXPR is a
4339          record containing both a template and a constrained array.
4340          Note that a record representing a justified modular type
4341          always represents a packed constrained array.  */
4342       if (ecode == ARRAY_TYPE
4343           || (ecode == INTEGER_TYPE && TYPE_HAS_ACTUAL_BOUNDS_P (etype))
4344           || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))
4345           || (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)))
4346         return
4347           build_unary_op
4348             (INDIRECT_REF, NULL_TREE,
4349              convert_to_fat_pointer (TREE_TYPE (type),
4350                                      build_unary_op (ADDR_EXPR,
4351                                                      NULL_TREE, expr)));
4352
4353       /* Do something very similar for converting one unconstrained
4354          array to another.  */
4355       else if (ecode == UNCONSTRAINED_ARRAY_TYPE)
4356         return
4357           build_unary_op (INDIRECT_REF, NULL_TREE,
4358                           convert (TREE_TYPE (type),
4359                                    build_unary_op (ADDR_EXPR,
4360                                                    NULL_TREE, expr)));
4361       else
4362         gcc_unreachable ();
4363
4364     case COMPLEX_TYPE:
4365       return fold (convert_to_complex (type, expr));
4366
4367     default:
4368       gcc_unreachable ();
4369     }
4370 }
4371 \f
4372 /* Remove all conversions that are done in EXP.  This includes converting
4373    from a padded type or to a justified modular type.  If TRUE_ADDRESS
4374    is true, always return the address of the containing object even if
4375    the address is not bit-aligned.  */
4376
4377 tree
4378 remove_conversions (tree exp, bool true_address)
4379 {
4380   switch (TREE_CODE (exp))
4381     {
4382     case CONSTRUCTOR:
4383       if (true_address
4384           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
4385           && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (exp)))
4386         return
4387           remove_conversions (VEC_index (constructor_elt,
4388                                          CONSTRUCTOR_ELTS (exp), 0)->value,
4389                               true);
4390       break;
4391
4392     case COMPONENT_REF:
4393       if (TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
4394         return remove_conversions (TREE_OPERAND (exp, 0), true_address);
4395       break;
4396
4397     case VIEW_CONVERT_EXPR:  case NON_LVALUE_EXPR:
4398     CASE_CONVERT:
4399       return remove_conversions (TREE_OPERAND (exp, 0), true_address);
4400
4401     default:
4402       break;
4403     }
4404
4405   return exp;
4406 }
4407 \f
4408 /* If EXP's type is an UNCONSTRAINED_ARRAY_TYPE, return an expression that
4409    refers to the underlying array.  If its type has TYPE_CONTAINS_TEMPLATE_P,
4410    likewise return an expression pointing to the underlying array.  */
4411
4412 tree
4413 maybe_unconstrained_array (tree exp)
4414 {
4415   enum tree_code code = TREE_CODE (exp);
4416   tree new_exp;
4417
4418   switch (TREE_CODE (TREE_TYPE (exp)))
4419     {
4420     case UNCONSTRAINED_ARRAY_TYPE:
4421       if (code == UNCONSTRAINED_ARRAY_REF)
4422         {
4423           new_exp
4424             = build_unary_op (INDIRECT_REF, NULL_TREE,
4425                               build_component_ref (TREE_OPERAND (exp, 0),
4426                                                    get_identifier ("P_ARRAY"),
4427                                                    NULL_TREE, false));
4428           TREE_READONLY (new_exp) = TREE_STATIC (new_exp)
4429             = TREE_READONLY (exp);
4430           return new_exp;
4431         }
4432
4433       else if (code == NULL_EXPR)
4434         return build1 (NULL_EXPR,
4435                        TREE_TYPE (TREE_TYPE (TYPE_FIELDS
4436                                              (TREE_TYPE (TREE_TYPE (exp))))),
4437                        TREE_OPERAND (exp, 0));
4438
4439     case RECORD_TYPE:
4440       /* If this is a padded type, convert to the unpadded type and see if
4441          it contains a template.  */
4442       if (TYPE_PADDING_P (TREE_TYPE (exp)))
4443         {
4444           new_exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
4445           if (TREE_CODE (TREE_TYPE (new_exp)) == RECORD_TYPE
4446               && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new_exp)))
4447             return
4448               build_component_ref (new_exp, NULL_TREE,
4449                                    TREE_CHAIN
4450                                    (TYPE_FIELDS (TREE_TYPE (new_exp))),
4451                                    0);
4452         }
4453       else if (TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (exp)))
4454         return
4455           build_component_ref (exp, NULL_TREE,
4456                                TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (exp))), 0);
4457       break;
4458
4459     default:
4460       break;
4461     }
4462
4463   return exp;
4464 }
4465
4466 /* If EXP's type is a VECTOR_TYPE, return EXP converted to the associated
4467    TYPE_REPRESENTATIVE_ARRAY.  */
4468
4469 tree
4470 maybe_vector_array (tree exp)
4471 {
4472   tree etype = TREE_TYPE (exp);
4473
4474   if (VECTOR_TYPE_P (etype))
4475     exp = convert (TYPE_REPRESENTATIVE_ARRAY (etype), exp);
4476
4477   return exp;
4478 }
4479 \f
4480 /* Return true if EXPR is an expression that can be folded as an operand
4481    of a VIEW_CONVERT_EXPR.  See ada-tree.h for a complete rationale.  */
4482
4483 static bool
4484 can_fold_for_view_convert_p (tree expr)
4485 {
4486   tree t1, t2;
4487
4488   /* The folder will fold NOP_EXPRs between integral types with the same
4489      precision (in the middle-end's sense).  We cannot allow it if the
4490      types don't have the same precision in the Ada sense as well.  */
4491   if (TREE_CODE (expr) != NOP_EXPR)
4492     return true;
4493
4494   t1 = TREE_TYPE (expr);
4495   t2 = TREE_TYPE (TREE_OPERAND (expr, 0));
4496
4497   /* Defer to the folder for non-integral conversions.  */
4498   if (!(INTEGRAL_TYPE_P (t1) && INTEGRAL_TYPE_P (t2)))
4499     return true;
4500
4501   /* Only fold conversions that preserve both precisions.  */
4502   if (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
4503       && operand_equal_p (rm_size (t1), rm_size (t2), 0))
4504     return true;
4505
4506   return false;
4507 }
4508
4509 /* Return an expression that does an unchecked conversion of EXPR to TYPE.
4510    If NOTRUNC_P is true, truncation operations should be suppressed.
4511
4512    Special care is required with (source or target) integral types whose
4513    precision is not equal to their size, to make sure we fetch or assign
4514    the value bits whose location might depend on the endianness, e.g.
4515
4516      Rmsize : constant := 8;
4517      subtype Int is Integer range 0 .. 2 ** Rmsize - 1;
4518
4519      type Bit_Array is array (1 .. Rmsize) of Boolean;
4520      pragma Pack (Bit_Array);
4521
4522      function To_Bit_Array is new Unchecked_Conversion (Int, Bit_Array);
4523
4524      Value : Int := 2#1000_0001#;
4525      Vbits : Bit_Array := To_Bit_Array (Value);
4526
4527    we expect the 8 bits at Vbits'Address to always contain Value, while
4528    their original location depends on the endianness, at Value'Address
4529    on a little-endian architecture but not on a big-endian one.  */
4530
4531 tree
4532 unchecked_convert (tree type, tree expr, bool notrunc_p)
4533 {
4534   tree etype = TREE_TYPE (expr);
4535
4536   /* If the expression is already the right type, we are done.  */
4537   if (etype == type)
4538     return expr;
4539
4540   /* If both types types are integral just do a normal conversion.
4541      Likewise for a conversion to an unconstrained array.  */
4542   if ((((INTEGRAL_TYPE_P (type)
4543          && !(TREE_CODE (type) == INTEGER_TYPE
4544               && TYPE_VAX_FLOATING_POINT_P (type)))
4545         || (POINTER_TYPE_P (type) && ! TYPE_IS_THIN_POINTER_P (type))
4546         || (TREE_CODE (type) == RECORD_TYPE
4547             && TYPE_JUSTIFIED_MODULAR_P (type)))
4548        && ((INTEGRAL_TYPE_P (etype)
4549             && !(TREE_CODE (etype) == INTEGER_TYPE
4550                  && TYPE_VAX_FLOATING_POINT_P (etype)))
4551            || (POINTER_TYPE_P (etype) && !TYPE_IS_THIN_POINTER_P (etype))
4552            || (TREE_CODE (etype) == RECORD_TYPE
4553                && TYPE_JUSTIFIED_MODULAR_P (etype))))
4554       || TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
4555     {
4556       if (TREE_CODE (etype) == INTEGER_TYPE
4557           && TYPE_BIASED_REPRESENTATION_P (etype))
4558         {
4559           tree ntype = copy_type (etype);
4560           TYPE_BIASED_REPRESENTATION_P (ntype) = 0;
4561           TYPE_MAIN_VARIANT (ntype) = ntype;
4562           expr = build1 (NOP_EXPR, ntype, expr);
4563         }
4564
4565       if (TREE_CODE (type) == INTEGER_TYPE
4566           && TYPE_BIASED_REPRESENTATION_P (type))
4567         {
4568           tree rtype = copy_type (type);
4569           TYPE_BIASED_REPRESENTATION_P (rtype) = 0;
4570           TYPE_MAIN_VARIANT (rtype) = rtype;
4571           expr = convert (rtype, expr);
4572           expr = build1 (NOP_EXPR, type, expr);
4573         }
4574       else
4575         expr = convert (type, expr);
4576     }
4577
4578   /* If we are converting to an integral type whose precision is not equal
4579      to its size, first unchecked convert to a record that contains an
4580      object of the output type.  Then extract the field. */
4581   else if (INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
4582            && 0 != compare_tree_int (TYPE_RM_SIZE (type),
4583                                      GET_MODE_BITSIZE (TYPE_MODE (type))))
4584     {
4585       tree rec_type = make_node (RECORD_TYPE);
4586       tree field = create_field_decl (get_identifier ("OBJ"), type,
4587                                       rec_type, 1, 0, 0, 0);
4588
4589       TYPE_FIELDS (rec_type) = field;
4590       layout_type (rec_type);
4591
4592       expr = unchecked_convert (rec_type, expr, notrunc_p);
4593       expr = build_component_ref (expr, NULL_TREE, field, 0);
4594     }
4595
4596   /* Similarly if we are converting from an integral type whose precision
4597      is not equal to its size.  */
4598   else if (INTEGRAL_TYPE_P (etype) && TYPE_RM_SIZE (etype)
4599       && 0 != compare_tree_int (TYPE_RM_SIZE (etype),
4600                                 GET_MODE_BITSIZE (TYPE_MODE (etype))))
4601     {
4602       tree rec_type = make_node (RECORD_TYPE);
4603       tree field
4604         = create_field_decl (get_identifier ("OBJ"), etype, rec_type,
4605                              1, 0, 0, 0);
4606
4607       TYPE_FIELDS (rec_type) = field;
4608       layout_type (rec_type);
4609
4610       expr = gnat_build_constructor (rec_type, build_tree_list (field, expr));
4611       expr = unchecked_convert (type, expr, notrunc_p);
4612     }
4613
4614   /* We have a special case when we are converting between two unconstrained
4615      array types.  In that case, take the address, convert the fat pointer
4616      types, and dereference.  */
4617   else if (TREE_CODE (etype) == UNCONSTRAINED_ARRAY_TYPE
4618            && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
4619     expr = build_unary_op (INDIRECT_REF, NULL_TREE,
4620                            build1 (VIEW_CONVERT_EXPR, TREE_TYPE (type),
4621                                    build_unary_op (ADDR_EXPR, NULL_TREE,
4622                                                    expr)));
4623
4624   /* Another special case is when we are converting to a vector type from its
4625      representative array type; this a regular conversion.  */
4626   else if (TREE_CODE (type) == VECTOR_TYPE
4627            && TREE_CODE (etype) == ARRAY_TYPE
4628            && gnat_types_compatible_p (TYPE_REPRESENTATIVE_ARRAY (type),
4629                                        etype))
4630     expr = convert (type, expr);
4631
4632   else
4633     {
4634       expr = maybe_unconstrained_array (expr);
4635       etype = TREE_TYPE (expr);
4636       if (can_fold_for_view_convert_p (expr))
4637         expr = fold_build1 (VIEW_CONVERT_EXPR, type, expr);
4638       else
4639         expr = build1 (VIEW_CONVERT_EXPR, type, expr);
4640     }
4641
4642   /* If the result is an integral type whose precision is not equal to its
4643      size, sign- or zero-extend the result.  We need not do this if the input
4644      is an integral type of the same precision and signedness or if the output
4645      is a biased type or if both the input and output are unsigned.  */
4646   if (!notrunc_p
4647       && INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
4648       && !(TREE_CODE (type) == INTEGER_TYPE
4649            && TYPE_BIASED_REPRESENTATION_P (type))
4650       && 0 != compare_tree_int (TYPE_RM_SIZE (type),
4651                                 GET_MODE_BITSIZE (TYPE_MODE (type)))
4652       && !(INTEGRAL_TYPE_P (etype)
4653            && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (etype)
4654            && operand_equal_p (TYPE_RM_SIZE (type),
4655                                (TYPE_RM_SIZE (etype) != 0
4656                                 ? TYPE_RM_SIZE (etype) : TYPE_SIZE (etype)),
4657                                0))
4658       && !(TYPE_UNSIGNED (type) && TYPE_UNSIGNED (etype)))
4659     {
4660       tree base_type = gnat_type_for_mode (TYPE_MODE (type),
4661                                            TYPE_UNSIGNED (type));
4662       tree shift_expr
4663         = convert (base_type,
4664                    size_binop (MINUS_EXPR,
4665                                bitsize_int
4666                                (GET_MODE_BITSIZE (TYPE_MODE (type))),
4667                                TYPE_RM_SIZE (type)));
4668       expr
4669         = convert (type,
4670                    build_binary_op (RSHIFT_EXPR, base_type,
4671                                     build_binary_op (LSHIFT_EXPR, base_type,
4672                                                      convert (base_type, expr),
4673                                                      shift_expr),
4674                                     shift_expr));
4675     }
4676
4677   /* An unchecked conversion should never raise Constraint_Error.  The code
4678      below assumes that GCC's conversion routines overflow the same way that
4679      the underlying hardware does.  This is probably true.  In the rare case
4680      when it is false, we can rely on the fact that such conversions are
4681      erroneous anyway.  */
4682   if (TREE_CODE (expr) == INTEGER_CST)
4683     TREE_OVERFLOW (expr) = 0;
4684
4685   /* If the sizes of the types differ and this is an VIEW_CONVERT_EXPR,
4686      show no longer constant.  */
4687   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
4688       && !operand_equal_p (TYPE_SIZE_UNIT (type), TYPE_SIZE_UNIT (etype),
4689                            OEP_ONLY_CONST))
4690     TREE_CONSTANT (expr) = 0;
4691
4692   return expr;
4693 }
4694 \f
4695 /* Return the appropriate GCC tree code for the specified GNAT_TYPE,
4696    the latter being a record type as predicated by Is_Record_Type.  */
4697
4698 enum tree_code
4699 tree_code_for_record_type (Entity_Id gnat_type)
4700 {
4701   Node_Id component_list
4702     = Component_List (Type_Definition
4703                       (Declaration_Node
4704                        (Implementation_Base_Type (gnat_type))));
4705   Node_Id component;
4706
4707  /* Make this a UNION_TYPE unless it's either not an Unchecked_Union or
4708     we have a non-discriminant field outside a variant.  In either case,
4709     it's a RECORD_TYPE.  */
4710
4711   if (!Is_Unchecked_Union (gnat_type))
4712     return RECORD_TYPE;
4713
4714   for (component = First_Non_Pragma (Component_Items (component_list));
4715        Present (component);
4716        component = Next_Non_Pragma (component))
4717     if (Ekind (Defining_Entity (component)) == E_Component)
4718       return RECORD_TYPE;
4719
4720   return UNION_TYPE;
4721 }
4722
4723 /* Return true if GNAT_TYPE is a "double" floating-point type, i.e. whose
4724    size is equal to 64 bits, or an array of such a type.  Set ALIGN_CLAUSE
4725    according to the presence of an alignment clause on the type or, if it
4726    is an array, on the component type.  */
4727
4728 bool
4729 is_double_float_or_array (Entity_Id gnat_type, bool *align_clause)
4730 {
4731   gnat_type = Underlying_Type (gnat_type);
4732
4733   *align_clause = Present (Alignment_Clause (gnat_type));
4734
4735   if (Is_Array_Type (gnat_type))
4736     {
4737       gnat_type = Underlying_Type (Component_Type (gnat_type));
4738       if (Present (Alignment_Clause (gnat_type)))
4739         *align_clause = true;
4740     }
4741
4742   if (!Is_Floating_Point_Type (gnat_type))
4743     return false;
4744
4745   if (UI_To_Int (Esize (gnat_type)) != 64)
4746     return false;
4747
4748   return true;
4749 }
4750
4751 /* Return true if GNAT_TYPE is a "double" or larger scalar type, i.e. whose
4752    size is greater or equal to 64 bits, or an array of such a type.  Set
4753    ALIGN_CLAUSE according to the presence of an alignment clause on the
4754    type or, if it is an array, on the component type.  */
4755
4756 bool
4757 is_double_scalar_or_array (Entity_Id gnat_type, bool *align_clause)
4758 {
4759   gnat_type = Underlying_Type (gnat_type);
4760
4761   *align_clause = Present (Alignment_Clause (gnat_type));
4762
4763   if (Is_Array_Type (gnat_type))
4764     {
4765       gnat_type = Underlying_Type (Component_Type (gnat_type));
4766       if (Present (Alignment_Clause (gnat_type)))
4767         *align_clause = true;
4768     }
4769
4770   if (!Is_Scalar_Type (gnat_type))
4771     return false;
4772
4773   if (UI_To_Int (Esize (gnat_type)) < 64)
4774     return false;
4775
4776   return true;
4777 }
4778
4779 /* Return true if GNU_TYPE is suitable as the type of a non-aliased
4780    component of an aggregate type.  */
4781
4782 bool
4783 type_for_nonaliased_component_p (tree gnu_type)
4784 {
4785   /* If the type is passed by reference, we may have pointers to the
4786      component so it cannot be made non-aliased. */
4787   if (must_pass_by_ref (gnu_type) || default_pass_by_ref (gnu_type))
4788     return false;
4789
4790   /* We used to say that any component of aggregate type is aliased
4791      because the front-end may take 'Reference of it.  The front-end
4792      has been enhanced in the meantime so as to use a renaming instead
4793      in most cases, but the back-end can probably take the address of
4794      such a component too so we go for the conservative stance.
4795
4796      For instance, we might need the address of any array type, even
4797      if normally passed by copy, to construct a fat pointer if the
4798      component is used as an actual for an unconstrained formal.
4799
4800      Likewise for record types: even if a specific record subtype is
4801      passed by copy, the parent type might be passed by ref (e.g. if
4802      it's of variable size) and we might take the address of a child
4803      component to pass to a parent formal.  We have no way to check
4804      for such conditions here.  */
4805   if (AGGREGATE_TYPE_P (gnu_type))
4806     return false;
4807
4808   return true;
4809 }
4810
4811 /* Perform final processing on global variables.  */
4812
4813 void
4814 gnat_write_global_declarations (void)
4815 {
4816   /* Proceed to optimize and emit assembly.
4817      FIXME: shouldn't be the front end's responsibility to call this.  */
4818   cgraph_finalize_compilation_unit ();
4819
4820   /* Emit debug info for all global declarations.  */
4821   emit_debug_global_declarations (VEC_address (tree, global_decls),
4822                                   VEC_length (tree, global_decls));
4823 }
4824
4825 /* ************************************************************************
4826  * *                           GCC builtins support                       *
4827  * ************************************************************************ */
4828
4829 /* The general scheme is fairly simple:
4830
4831    For each builtin function/type to be declared, gnat_install_builtins calls
4832    internal facilities which eventually get to gnat_push_decl, which in turn
4833    tracks the so declared builtin function decls in the 'builtin_decls' global
4834    datastructure. When an Intrinsic subprogram declaration is processed, we
4835    search this global datastructure to retrieve the associated BUILT_IN DECL
4836    node.  */
4837
4838 /* Search the chain of currently available builtin declarations for a node
4839    corresponding to function NAME (an IDENTIFIER_NODE).  Return the first node
4840    found, if any, or NULL_TREE otherwise.  */
4841 tree
4842 builtin_decl_for (tree name)
4843 {
4844   unsigned i;
4845   tree decl;
4846
4847   for (i = 0; VEC_iterate(tree, builtin_decls, i, decl); i++)
4848     if (DECL_NAME (decl) == name)
4849       return decl;
4850
4851   return NULL_TREE;
4852 }
4853
4854 /* The code below eventually exposes gnat_install_builtins, which declares
4855    the builtin types and functions we might need, either internally or as
4856    user accessible facilities.
4857
4858    ??? This is a first implementation shot, still in rough shape.  It is
4859    heavily inspired from the "C" family implementation, with chunks copied
4860    verbatim from there.
4861
4862    Two obvious TODO candidates are
4863    o Use a more efficient name/decl mapping scheme
4864    o Devise a middle-end infrastructure to avoid having to copy
4865      pieces between front-ends.  */
4866
4867 /* ----------------------------------------------------------------------- *
4868  *                         BUILTIN ELEMENTARY TYPES                        *
4869  * ----------------------------------------------------------------------- */
4870
4871 /* Standard data types to be used in builtin argument declarations.  */
4872
4873 enum c_tree_index
4874 {
4875     CTI_SIGNED_SIZE_TYPE, /* For format checking only.  */
4876     CTI_STRING_TYPE,
4877     CTI_CONST_STRING_TYPE,
4878
4879     CTI_MAX
4880 };
4881
4882 static tree c_global_trees[CTI_MAX];
4883
4884 #define signed_size_type_node   c_global_trees[CTI_SIGNED_SIZE_TYPE]
4885 #define string_type_node        c_global_trees[CTI_STRING_TYPE]
4886 #define const_string_type_node  c_global_trees[CTI_CONST_STRING_TYPE]
4887
4888 /* ??? In addition some attribute handlers, we currently don't support a
4889    (small) number of builtin-types, which in turns inhibits support for a
4890    number of builtin functions.  */
4891 #define wint_type_node    void_type_node
4892 #define intmax_type_node  void_type_node
4893 #define uintmax_type_node void_type_node
4894
4895 /* Build the void_list_node (void_type_node having been created).  */
4896
4897 static tree
4898 build_void_list_node (void)
4899 {
4900   tree t = build_tree_list (NULL_TREE, void_type_node);
4901   return t;
4902 }
4903
4904 /* Used to help initialize the builtin-types.def table.  When a type of
4905    the correct size doesn't exist, use error_mark_node instead of NULL.
4906    The later results in segfaults even when a decl using the type doesn't
4907    get invoked.  */
4908
4909 static tree
4910 builtin_type_for_size (int size, bool unsignedp)
4911 {
4912   tree type = lang_hooks.types.type_for_size (size, unsignedp);
4913   return type ? type : error_mark_node;
4914 }
4915
4916 /* Build/push the elementary type decls that builtin functions/types
4917    will need.  */
4918
4919 static void
4920 install_builtin_elementary_types (void)
4921 {
4922   signed_size_type_node = size_type_node;
4923   pid_type_node = integer_type_node;
4924   void_list_node = build_void_list_node ();
4925
4926   string_type_node = build_pointer_type (char_type_node);
4927   const_string_type_node
4928     = build_pointer_type (build_qualified_type
4929                           (char_type_node, TYPE_QUAL_CONST));
4930 }
4931
4932 /* ----------------------------------------------------------------------- *
4933  *                          BUILTIN FUNCTION TYPES                         *
4934  * ----------------------------------------------------------------------- */
4935
4936 /* Now, builtin function types per se.  */
4937
4938 enum c_builtin_type
4939 {
4940 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
4941 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
4942 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
4943 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
4944 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4945 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4946 #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
4947 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME,
4948 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME,
4949 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
4950 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
4951 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
4952 #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4953 #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4954 #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG6) \
4955   NAME,
4956 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
4957 #include "builtin-types.def"
4958 #undef DEF_PRIMITIVE_TYPE
4959 #undef DEF_FUNCTION_TYPE_0
4960 #undef DEF_FUNCTION_TYPE_1
4961 #undef DEF_FUNCTION_TYPE_2
4962 #undef DEF_FUNCTION_TYPE_3
4963 #undef DEF_FUNCTION_TYPE_4
4964 #undef DEF_FUNCTION_TYPE_5
4965 #undef DEF_FUNCTION_TYPE_6
4966 #undef DEF_FUNCTION_TYPE_7
4967 #undef DEF_FUNCTION_TYPE_VAR_0
4968 #undef DEF_FUNCTION_TYPE_VAR_1
4969 #undef DEF_FUNCTION_TYPE_VAR_2
4970 #undef DEF_FUNCTION_TYPE_VAR_3
4971 #undef DEF_FUNCTION_TYPE_VAR_4
4972 #undef DEF_FUNCTION_TYPE_VAR_5
4973 #undef DEF_POINTER_TYPE
4974   BT_LAST
4975 };
4976
4977 typedef enum c_builtin_type builtin_type;
4978
4979 /* A temporary array used in communication with def_fn_type.  */
4980 static GTY(()) tree builtin_types[(int) BT_LAST + 1];
4981
4982 /* A helper function for install_builtin_types.  Build function type
4983    for DEF with return type RET and N arguments.  If VAR is true, then the
4984    function should be variadic after those N arguments.
4985
4986    Takes special care not to ICE if any of the types involved are
4987    error_mark_node, which indicates that said type is not in fact available
4988    (see builtin_type_for_size).  In which case the function type as a whole
4989    should be error_mark_node.  */
4990
4991 static void
4992 def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
4993 {
4994   tree args = NULL, t;
4995   va_list list;
4996   int i;
4997
4998   va_start (list, n);
4999   for (i = 0; i < n; ++i)
5000     {
5001       builtin_type a = (builtin_type) va_arg (list, int);
5002       t = builtin_types[a];
5003       if (t == error_mark_node)
5004         goto egress;
5005       args = tree_cons (NULL_TREE, t, args);
5006     }
5007   va_end (list);
5008
5009   args = nreverse (args);
5010   if (!var)
5011     args = chainon (args, void_list_node);
5012
5013   t = builtin_types[ret];
5014   if (t == error_mark_node)
5015     goto egress;
5016   t = build_function_type (t, args);
5017
5018  egress:
5019   builtin_types[def] = t;
5020 }
5021
5022 /* Build the builtin function types and install them in the builtin_types
5023    array for later use in builtin function decls.  */
5024
5025 static void
5026 install_builtin_function_types (void)
5027 {
5028   tree va_list_ref_type_node;
5029   tree va_list_arg_type_node;
5030
5031   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
5032     {
5033       va_list_arg_type_node = va_list_ref_type_node =
5034         build_pointer_type (TREE_TYPE (va_list_type_node));
5035     }
5036   else
5037     {
5038       va_list_arg_type_node = va_list_type_node;
5039       va_list_ref_type_node = build_reference_type (va_list_type_node);
5040     }
5041
5042 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
5043   builtin_types[ENUM] = VALUE;
5044 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
5045   def_fn_type (ENUM, RETURN, 0, 0);
5046 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
5047   def_fn_type (ENUM, RETURN, 0, 1, ARG1);
5048 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
5049   def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
5050 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
5051   def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
5052 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
5053   def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4);
5054 #define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
5055   def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
5056 #define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
5057                             ARG6)                                       \
5058   def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
5059 #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
5060                             ARG6, ARG7)                                 \
5061   def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
5062 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
5063   def_fn_type (ENUM, RETURN, 1, 0);
5064 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
5065   def_fn_type (ENUM, RETURN, 1, 1, ARG1);
5066 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
5067   def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
5068 #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
5069   def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
5070 #define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
5071   def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4);
5072 #define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
5073   def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
5074 #define DEF_POINTER_TYPE(ENUM, TYPE) \
5075   builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]);
5076
5077 #include "builtin-types.def"
5078
5079 #undef DEF_PRIMITIVE_TYPE
5080 #undef DEF_FUNCTION_TYPE_1
5081 #undef DEF_FUNCTION_TYPE_2
5082 #undef DEF_FUNCTION_TYPE_3
5083 #undef DEF_FUNCTION_TYPE_4
5084 #undef DEF_FUNCTION_TYPE_5
5085 #undef DEF_FUNCTION_TYPE_6
5086 #undef DEF_FUNCTION_TYPE_VAR_0
5087 #undef DEF_FUNCTION_TYPE_VAR_1
5088 #undef DEF_FUNCTION_TYPE_VAR_2
5089 #undef DEF_FUNCTION_TYPE_VAR_3
5090 #undef DEF_FUNCTION_TYPE_VAR_4
5091 #undef DEF_FUNCTION_TYPE_VAR_5
5092 #undef DEF_POINTER_TYPE
5093   builtin_types[(int) BT_LAST] = NULL_TREE;
5094 }
5095
5096 /* ----------------------------------------------------------------------- *
5097  *                            BUILTIN ATTRIBUTES                           *
5098  * ----------------------------------------------------------------------- */
5099
5100 enum built_in_attribute
5101 {
5102 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
5103 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
5104 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
5105 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
5106 #include "builtin-attrs.def"
5107 #undef DEF_ATTR_NULL_TREE
5108 #undef DEF_ATTR_INT
5109 #undef DEF_ATTR_IDENT
5110 #undef DEF_ATTR_TREE_LIST
5111   ATTR_LAST
5112 };
5113
5114 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
5115
5116 static void
5117 install_builtin_attributes (void)
5118 {
5119   /* Fill in the built_in_attributes array.  */
5120 #define DEF_ATTR_NULL_TREE(ENUM)                                \
5121   built_in_attributes[(int) ENUM] = NULL_TREE;
5122 #define DEF_ATTR_INT(ENUM, VALUE)                               \
5123   built_in_attributes[(int) ENUM] = build_int_cst (NULL_TREE, VALUE);
5124 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
5125   built_in_attributes[(int) ENUM] = get_identifier (STRING);
5126 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
5127   built_in_attributes[(int) ENUM]                       \
5128     = tree_cons (built_in_attributes[(int) PURPOSE],    \
5129                  built_in_attributes[(int) VALUE],      \
5130                  built_in_attributes[(int) CHAIN]);
5131 #include "builtin-attrs.def"
5132 #undef DEF_ATTR_NULL_TREE
5133 #undef DEF_ATTR_INT
5134 #undef DEF_ATTR_IDENT
5135 #undef DEF_ATTR_TREE_LIST
5136 }
5137
5138 /* Handle a "const" attribute; arguments as in
5139    struct attribute_spec.handler.  */
5140
5141 static tree
5142 handle_const_attribute (tree *node, tree ARG_UNUSED (name),
5143                         tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5144                         bool *no_add_attrs)
5145 {
5146   if (TREE_CODE (*node) == FUNCTION_DECL)
5147     TREE_READONLY (*node) = 1;
5148   else
5149     *no_add_attrs = true;
5150
5151   return NULL_TREE;
5152 }
5153
5154 /* Handle a "nothrow" attribute; arguments as in
5155    struct attribute_spec.handler.  */
5156
5157 static tree
5158 handle_nothrow_attribute (tree *node, tree ARG_UNUSED (name),
5159                           tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5160                           bool *no_add_attrs)
5161 {
5162   if (TREE_CODE (*node) == FUNCTION_DECL)
5163     TREE_NOTHROW (*node) = 1;
5164   else
5165     *no_add_attrs = true;
5166
5167   return NULL_TREE;
5168 }
5169
5170 /* Handle a "pure" attribute; arguments as in
5171    struct attribute_spec.handler.  */
5172
5173 static tree
5174 handle_pure_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5175                        int ARG_UNUSED (flags), bool *no_add_attrs)
5176 {
5177   if (TREE_CODE (*node) == FUNCTION_DECL)
5178     DECL_PURE_P (*node) = 1;
5179   /* ??? TODO: Support types.  */
5180   else
5181     {
5182       warning (OPT_Wattributes, "%qs attribute ignored",
5183                IDENTIFIER_POINTER (name));
5184       *no_add_attrs = true;
5185     }
5186
5187   return NULL_TREE;
5188 }
5189
5190 /* Handle a "no vops" attribute; arguments as in
5191    struct attribute_spec.handler.  */
5192
5193 static tree
5194 handle_novops_attribute (tree *node, tree ARG_UNUSED (name),
5195                          tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5196                          bool *ARG_UNUSED (no_add_attrs))
5197 {
5198   gcc_assert (TREE_CODE (*node) == FUNCTION_DECL);
5199   DECL_IS_NOVOPS (*node) = 1;
5200   return NULL_TREE;
5201 }
5202
5203 /* Helper for nonnull attribute handling; fetch the operand number
5204    from the attribute argument list.  */
5205
5206 static bool
5207 get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp)
5208 {
5209   /* Verify the arg number is a constant.  */
5210   if (TREE_CODE (arg_num_expr) != INTEGER_CST
5211       || TREE_INT_CST_HIGH (arg_num_expr) != 0)
5212     return false;
5213
5214   *valp = TREE_INT_CST_LOW (arg_num_expr);
5215   return true;
5216 }
5217
5218 /* Handle the "nonnull" attribute.  */
5219 static tree
5220 handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
5221                           tree args, int ARG_UNUSED (flags),
5222                           bool *no_add_attrs)
5223 {
5224   tree type = *node;
5225   unsigned HOST_WIDE_INT attr_arg_num;
5226
5227   /* If no arguments are specified, all pointer arguments should be
5228      non-null.  Verify a full prototype is given so that the arguments
5229      will have the correct types when we actually check them later.  */
5230   if (!args)
5231     {
5232       if (!TYPE_ARG_TYPES (type))
5233         {
5234           error ("nonnull attribute without arguments on a non-prototype");
5235           *no_add_attrs = true;
5236         }
5237       return NULL_TREE;
5238     }
5239
5240   /* Argument list specified.  Verify that each argument number references
5241      a pointer argument.  */
5242   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
5243     {
5244       tree argument;
5245       unsigned HOST_WIDE_INT arg_num = 0, ck_num;
5246
5247       if (!get_nonnull_operand (TREE_VALUE (args), &arg_num))
5248         {
5249           error ("nonnull argument has invalid operand number (argument %lu)",
5250                  (unsigned long) attr_arg_num);
5251           *no_add_attrs = true;
5252           return NULL_TREE;
5253         }
5254
5255       argument = TYPE_ARG_TYPES (type);
5256       if (argument)
5257         {
5258           for (ck_num = 1; ; ck_num++)
5259             {
5260               if (!argument || ck_num == arg_num)
5261                 break;
5262               argument = TREE_CHAIN (argument);
5263             }
5264
5265           if (!argument
5266               || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
5267             {
5268               error ("nonnull argument with out-of-range operand number (argument %lu, operand %lu)",
5269                      (unsigned long) attr_arg_num, (unsigned long) arg_num);
5270               *no_add_attrs = true;
5271               return NULL_TREE;
5272             }
5273
5274           if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
5275             {
5276               error ("nonnull argument references non-pointer operand (argument %lu, operand %lu)",
5277                    (unsigned long) attr_arg_num, (unsigned long) arg_num);
5278               *no_add_attrs = true;
5279               return NULL_TREE;
5280             }
5281         }
5282     }
5283
5284   return NULL_TREE;
5285 }
5286
5287 /* Handle a "sentinel" attribute.  */
5288
5289 static tree
5290 handle_sentinel_attribute (tree *node, tree name, tree args,
5291                            int ARG_UNUSED (flags), bool *no_add_attrs)
5292 {
5293   tree params = TYPE_ARG_TYPES (*node);
5294
5295   if (!params)
5296     {
5297       warning (OPT_Wattributes,
5298                "%qs attribute requires prototypes with named arguments",
5299                IDENTIFIER_POINTER (name));
5300       *no_add_attrs = true;
5301     }
5302   else
5303     {
5304       while (TREE_CHAIN (params))
5305         params = TREE_CHAIN (params);
5306
5307       if (VOID_TYPE_P (TREE_VALUE (params)))
5308         {
5309           warning (OPT_Wattributes,
5310                    "%qs attribute only applies to variadic functions",
5311                    IDENTIFIER_POINTER (name));
5312           *no_add_attrs = true;
5313         }
5314     }
5315
5316   if (args)
5317     {
5318       tree position = TREE_VALUE (args);
5319
5320       if (TREE_CODE (position) != INTEGER_CST)
5321         {
5322           warning (0, "requested position is not an integer constant");
5323           *no_add_attrs = true;
5324         }
5325       else
5326         {
5327           if (tree_int_cst_lt (position, integer_zero_node))
5328             {
5329               warning (0, "requested position is less than zero");
5330               *no_add_attrs = true;
5331             }
5332         }
5333     }
5334
5335   return NULL_TREE;
5336 }
5337
5338 /* Handle a "noreturn" attribute; arguments as in
5339    struct attribute_spec.handler.  */
5340
5341 static tree
5342 handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5343                            int ARG_UNUSED (flags), bool *no_add_attrs)
5344 {
5345   tree type = TREE_TYPE (*node);
5346
5347   /* See FIXME comment in c_common_attribute_table.  */
5348   if (TREE_CODE (*node) == FUNCTION_DECL)
5349     TREE_THIS_VOLATILE (*node) = 1;
5350   else if (TREE_CODE (type) == POINTER_TYPE
5351            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5352     TREE_TYPE (*node)
5353       = build_pointer_type
5354         (build_type_variant (TREE_TYPE (type),
5355                              TYPE_READONLY (TREE_TYPE (type)), 1));
5356   else
5357     {
5358       warning (OPT_Wattributes, "%qs attribute ignored",
5359                IDENTIFIER_POINTER (name));
5360       *no_add_attrs = true;
5361     }
5362
5363   return NULL_TREE;
5364 }
5365
5366 /* Handle a "malloc" attribute; arguments as in
5367    struct attribute_spec.handler.  */
5368
5369 static tree
5370 handle_malloc_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5371                          int ARG_UNUSED (flags), bool *no_add_attrs)
5372 {
5373   if (TREE_CODE (*node) == FUNCTION_DECL
5374       && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node))))
5375     DECL_IS_MALLOC (*node) = 1;
5376   else
5377     {
5378       warning (OPT_Wattributes, "%qs attribute ignored",
5379                IDENTIFIER_POINTER (name));
5380       *no_add_attrs = true;
5381     }
5382
5383   return NULL_TREE;
5384 }
5385
5386 /* Fake handler for attributes we don't properly support.  */
5387
5388 tree
5389 fake_attribute_handler (tree * ARG_UNUSED (node),
5390                         tree ARG_UNUSED (name),
5391                         tree ARG_UNUSED (args),
5392                         int  ARG_UNUSED (flags),
5393                         bool * ARG_UNUSED (no_add_attrs))
5394 {
5395   return NULL_TREE;
5396 }
5397
5398 /* Handle a "type_generic" attribute.  */
5399
5400 static tree
5401 handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name),
5402                                tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5403                                bool * ARG_UNUSED (no_add_attrs))
5404 {
5405   tree params;
5406
5407   /* Ensure we have a function type.  */
5408   gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
5409
5410   params = TYPE_ARG_TYPES (*node);
5411   while (params && ! VOID_TYPE_P (TREE_VALUE (params)))
5412     params = TREE_CHAIN (params);
5413
5414   /* Ensure we have a variadic function.  */
5415   gcc_assert (!params);
5416
5417   return NULL_TREE;
5418 }
5419
5420 /* Handle a "vector_size" attribute; arguments as in
5421    struct attribute_spec.handler.  */
5422
5423 static tree
5424 handle_vector_size_attribute (tree *node, tree name, tree args,
5425                               int ARG_UNUSED (flags),
5426                               bool *no_add_attrs)
5427 {
5428   unsigned HOST_WIDE_INT vecsize, nunits;
5429   enum machine_mode orig_mode;
5430   tree type = *node, new_type, size;
5431
5432   *no_add_attrs = true;
5433
5434   size = TREE_VALUE (args);
5435
5436   if (!host_integerp (size, 1))
5437     {
5438       warning (OPT_Wattributes, "%qs attribute ignored",
5439                IDENTIFIER_POINTER (name));
5440       return NULL_TREE;
5441     }
5442
5443   /* Get the vector size (in bytes).  */
5444   vecsize = tree_low_cst (size, 1);
5445
5446   /* We need to provide for vector pointers, vector arrays, and
5447      functions returning vectors.  For example:
5448
5449        __attribute__((vector_size(16))) short *foo;
5450
5451      In this case, the mode is SI, but the type being modified is
5452      HI, so we need to look further.  */
5453
5454   while (POINTER_TYPE_P (type)
5455          || TREE_CODE (type) == FUNCTION_TYPE
5456          || TREE_CODE (type) == METHOD_TYPE
5457          || TREE_CODE (type) == ARRAY_TYPE
5458          || TREE_CODE (type) == OFFSET_TYPE)
5459     type = TREE_TYPE (type);
5460
5461   /* Get the mode of the type being modified.  */
5462   orig_mode = TYPE_MODE (type);
5463
5464   if ((!INTEGRAL_TYPE_P (type)
5465        && !SCALAR_FLOAT_TYPE_P (type)
5466        && !FIXED_POINT_TYPE_P (type))
5467       || (!SCALAR_FLOAT_MODE_P (orig_mode)
5468           && GET_MODE_CLASS (orig_mode) != MODE_INT
5469           && !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))
5470       || !host_integerp (TYPE_SIZE_UNIT (type), 1)
5471       || TREE_CODE (type) == BOOLEAN_TYPE)
5472     {
5473       error ("invalid vector type for attribute %qs",
5474              IDENTIFIER_POINTER (name));
5475       return NULL_TREE;
5476     }
5477
5478   if (vecsize % tree_low_cst (TYPE_SIZE_UNIT (type), 1))
5479     {
5480       error ("vector size not an integral multiple of component size");
5481       return NULL;
5482     }
5483
5484   if (vecsize == 0)
5485     {
5486       error ("zero vector size");
5487       return NULL;
5488     }
5489
5490   /* Calculate how many units fit in the vector.  */
5491   nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5492   if (nunits & (nunits - 1))
5493     {
5494       error ("number of components of the vector not a power of two");
5495       return NULL_TREE;
5496     }
5497
5498   new_type = build_vector_type (type, nunits);
5499
5500   /* Build back pointers if needed.  */
5501   *node = lang_hooks.types.reconstruct_complex_type (*node, new_type);
5502
5503   return NULL_TREE;
5504 }
5505
5506 /* Handle a "vector_type" attribute; arguments as in
5507    struct attribute_spec.handler.  */
5508
5509 static tree
5510 handle_vector_type_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5511                               int ARG_UNUSED (flags),
5512                               bool *no_add_attrs)
5513 {
5514   /* Vector representative type and size.  */
5515   tree rep_type = *node;
5516   tree rep_size = TYPE_SIZE_UNIT (rep_type);
5517   tree rep_name;
5518
5519   /* Vector size in bytes and number of units.  */
5520   unsigned HOST_WIDE_INT vec_bytes, vec_units;
5521
5522   /* Vector element type and mode.  */
5523   tree elem_type;
5524   enum machine_mode elem_mode;
5525
5526   *no_add_attrs = true;
5527
5528   /* Get the representative array type, possibly nested within a
5529      padding record e.g. for alignment purposes.  */
5530
5531   if (TYPE_IS_PADDING_P (rep_type))
5532     rep_type = TREE_TYPE (TYPE_FIELDS (rep_type));
5533
5534   if (TREE_CODE (rep_type) != ARRAY_TYPE)
5535     {
5536       error ("attribute %qs applies to array types only",
5537              IDENTIFIER_POINTER (name));
5538       return NULL_TREE;
5539     }
5540
5541   /* Silently punt on variable sizes.  We can't make vector types for them,
5542      need to ignore them on front-end generated subtypes of unconstrained
5543      bases, and this attribute is for binding implementors, not end-users, so
5544      we should never get there from legitimate explicit uses.  */
5545
5546   if (!host_integerp (rep_size, 1))
5547     return NULL_TREE;
5548
5549   /* Get the element type/mode and check this is something we know
5550      how to make vectors of.  */
5551
5552   elem_type = TREE_TYPE (rep_type);
5553   elem_mode = TYPE_MODE (elem_type);
5554
5555   if ((!INTEGRAL_TYPE_P (elem_type)
5556        && !SCALAR_FLOAT_TYPE_P (elem_type)
5557        && !FIXED_POINT_TYPE_P (elem_type))
5558       || (!SCALAR_FLOAT_MODE_P (elem_mode)
5559           && GET_MODE_CLASS (elem_mode) != MODE_INT
5560           && !ALL_SCALAR_FIXED_POINT_MODE_P (elem_mode))
5561       || !host_integerp (TYPE_SIZE_UNIT (elem_type), 1))
5562     {
5563       error ("invalid element type for attribute %qs",
5564              IDENTIFIER_POINTER (name));
5565       return NULL_TREE;
5566     }
5567
5568   /* Sanity check the vector size and element type consistency.  */
5569
5570   vec_bytes = tree_low_cst (rep_size, 1);
5571
5572   if (vec_bytes % tree_low_cst (TYPE_SIZE_UNIT (elem_type), 1))
5573     {
5574       error ("vector size not an integral multiple of component size");
5575       return NULL;
5576     }
5577
5578   if (vec_bytes == 0)
5579     {
5580       error ("zero vector size");
5581       return NULL;
5582     }
5583
5584   vec_units = vec_bytes / tree_low_cst (TYPE_SIZE_UNIT (elem_type), 1);
5585   if (vec_units & (vec_units - 1))
5586     {
5587       error ("number of components of the vector not a power of two");
5588       return NULL_TREE;
5589     }
5590
5591   /* Build the vector type and replace.  */
5592
5593   *node = build_vector_type (elem_type, vec_units);
5594   rep_name = TYPE_NAME (rep_type);
5595   if (TREE_CODE (rep_name) == TYPE_DECL)
5596     rep_name = DECL_NAME (rep_name);
5597   TYPE_NAME (*node) = rep_name;
5598   TYPE_REPRESENTATIVE_ARRAY (*node) = rep_type;
5599
5600   return NULL_TREE;
5601 }
5602
5603 /* ----------------------------------------------------------------------- *
5604  *                              BUILTIN FUNCTIONS                          *
5605  * ----------------------------------------------------------------------- */
5606
5607 /* Worker for DEF_BUILTIN.  Possibly define a builtin function with one or two
5608    names.  Does not declare a non-__builtin_ function if flag_no_builtin, or
5609    if nonansi_p and flag_no_nonansi_builtin.  */
5610
5611 static void
5612 def_builtin_1 (enum built_in_function fncode,
5613                const char *name,
5614                enum built_in_class fnclass,
5615                tree fntype, tree libtype,
5616                bool both_p, bool fallback_p,
5617                bool nonansi_p ATTRIBUTE_UNUSED,
5618                tree fnattrs, bool implicit_p)
5619 {
5620   tree decl;
5621   const char *libname;
5622
5623   /* Preserve an already installed decl.  It most likely was setup in advance
5624      (e.g. as part of the internal builtins) for specific reasons.  */
5625   if (built_in_decls[(int) fncode] != NULL_TREE)
5626     return;
5627
5628   gcc_assert ((!both_p && !fallback_p)
5629               || !strncmp (name, "__builtin_",
5630                            strlen ("__builtin_")));
5631
5632   libname = name + strlen ("__builtin_");
5633   decl = add_builtin_function (name, fntype, fncode, fnclass,
5634                                (fallback_p ? libname : NULL),
5635                                fnattrs);
5636   if (both_p)
5637     /* ??? This is normally further controlled by command-line options
5638        like -fno-builtin, but we don't have them for Ada.  */
5639     add_builtin_function (libname, libtype, fncode, fnclass,
5640                           NULL, fnattrs);
5641
5642   built_in_decls[(int) fncode] = decl;
5643   if (implicit_p)
5644     implicit_built_in_decls[(int) fncode] = decl;
5645 }
5646
5647 static int flag_isoc94 = 0;
5648 static int flag_isoc99 = 0;
5649
5650 /* Install what the common builtins.def offers.  */
5651
5652 static void
5653 install_builtin_functions (void)
5654 {
5655 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P, \
5656                     NONANSI_P, ATTRS, IMPLICIT, COND)                   \
5657   if (NAME && COND)                                                     \
5658     def_builtin_1 (ENUM, NAME, CLASS,                                   \
5659                    builtin_types[(int) TYPE],                           \
5660                    builtin_types[(int) LIBTYPE],                        \
5661                    BOTH_P, FALLBACK_P, NONANSI_P,                       \
5662                    built_in_attributes[(int) ATTRS], IMPLICIT);
5663 #include "builtins.def"
5664 #undef DEF_BUILTIN
5665 }
5666
5667 /* ----------------------------------------------------------------------- *
5668  *                              BUILTIN FUNCTIONS                          *
5669  * ----------------------------------------------------------------------- */
5670
5671 /* Install the builtin functions we might need.  */
5672
5673 void
5674 gnat_install_builtins (void)
5675 {
5676   install_builtin_elementary_types ();
5677   install_builtin_function_types ();
5678   install_builtin_attributes ();
5679
5680   /* Install builtins used by generic middle-end pieces first.  Some of these
5681      know about internal specificities and control attributes accordingly, for
5682      instance __builtin_alloca vs no-throw and -fstack-check.  We will ignore
5683      the generic definition from builtins.def.  */
5684   build_common_builtin_nodes ();
5685
5686   /* Now, install the target specific builtins, such as the AltiVec family on
5687      ppc, and the common set as exposed by builtins.def.  */
5688   targetm.init_builtins ();
5689   install_builtin_functions ();
5690 }
5691
5692 #include "gt-ada-utils.h"
5693 #include "gtype-ada.h"