OSDN Git Service

* cgraphunit.c (cgraph_finalize_compilation_unit): Call
[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 /* We have attribute handlers using C specific format specifiers in warning
27    messages.  Make sure they are properly recognized.  */
28 #define GCC_DIAG_STYLE __gcc_cdiag__
29
30 #include "config.h"
31 #include "system.h"
32 #include "coretypes.h"
33 #include "tm.h"
34 #include "tree.h"
35 #include "flags.h"
36 #include "toplev.h"
37 #include "rtl.h"
38 #include "output.h"
39 #include "ggc.h"
40 #include "debug.h"
41 #include "convert.h"
42 #include "target.h"
43 #include "function.h"
44 #include "langhooks.h"
45 #include "pointer-set.h"
46 #include "cgraph.h"
47 #include "tree-dump.h"
48 #include "tree-inline.h"
49 #include "tree-iterator.h"
50 #include "gimple.h"
51
52 #include "ada.h"
53 #include "types.h"
54 #include "atree.h"
55 #include "elists.h"
56 #include "namet.h"
57 #include "nlists.h"
58 #include "stringt.h"
59 #include "uintp.h"
60 #include "fe.h"
61 #include "sinfo.h"
62 #include "einfo.h"
63 #include "ada-tree.h"
64 #include "gigi.h"
65
66 #ifndef MAX_FIXED_MODE_SIZE
67 #define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode)
68 #endif
69
70 #ifndef MAX_BITS_PER_WORD
71 #define MAX_BITS_PER_WORD  BITS_PER_WORD
72 #endif
73
74 /* If nonzero, pretend we are allocating at global level.  */
75 int force_global;
76
77 /* The default alignment of "double" floating-point types, i.e. floating
78    point types whose size is equal to 64 bits, or 0 if this alignment is
79    not specifically capped.  */
80 int double_float_alignment;
81
82 /* The default alignment of "double" or larger scalar types, i.e. scalar
83    types whose size is greater or equal to 64 bits, or 0 if this alignment
84    is not specifically capped.  */
85 int double_scalar_alignment;
86
87 /* Tree nodes for the various types and decls we create.  */
88 tree gnat_std_decls[(int) ADT_LAST];
89
90 /* Functions to call for each of the possible raise reasons.  */
91 tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
92
93 /* Forward declarations for handlers of attributes.  */
94 static tree handle_const_attribute (tree *, tree, tree, int, bool *);
95 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
96 static tree handle_pure_attribute (tree *, tree, tree, int, bool *);
97 static tree handle_novops_attribute (tree *, tree, tree, int, bool *);
98 static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
99 static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *);
100 static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
101 static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
102 static tree handle_type_generic_attribute (tree *, tree, tree, int, bool *);
103 static tree handle_vector_size_attribute (tree *, tree, tree, int, bool *);
104
105 /* Fake handler for attributes we don't properly support, typically because
106    they'd require dragging a lot of the common-c front-end circuitry.  */
107 static tree fake_attribute_handler      (tree *, tree, tree, int, bool *);
108
109 /* Table of machine-independent internal attributes for Ada.  We support
110    this minimal set of attributes to accommodate the needs of builtins.  */
111 const struct attribute_spec gnat_internal_attribute_table[] =
112 {
113   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
114   { "const",        0, 0,  true,  false, false, handle_const_attribute   },
115   { "nothrow",      0, 0,  true,  false, false, handle_nothrow_attribute },
116   { "pure",         0, 0,  true,  false, false, handle_pure_attribute },
117   { "no vops",      0, 0,  true,  false, false, handle_novops_attribute },
118   { "nonnull",      0, -1, false, true,  true,  handle_nonnull_attribute },
119   { "sentinel",     0, 1,  false, true,  true,  handle_sentinel_attribute },
120   { "noreturn",     0, 0,  true,  false, false, handle_noreturn_attribute },
121   { "malloc",       0, 0,  true,  false, false, handle_malloc_attribute },
122   { "type generic", 0, 0,  false, true, true, handle_type_generic_attribute },
123
124   { "vector_size",  1, 1,  false, true, false,  handle_vector_size_attribute },
125
126   /* ??? format and format_arg are heavy and not supported, which actually
127      prevents support for stdio builtins, which we however declare as part
128      of the common builtins.def contents.  */
129   { "format",     3, 3,  false, true,  true,  fake_attribute_handler },
130   { "format_arg", 1, 1,  false, true,  true,  fake_attribute_handler },
131
132   { NULL,         0, 0, false, false, false, NULL }
133 };
134
135 /* Associates a GNAT tree node to a GCC tree node. It is used in
136    `save_gnu_tree', `get_gnu_tree' and `present_gnu_tree'. See documentation
137    of `save_gnu_tree' for more info.  */
138 static GTY((length ("max_gnat_nodes"))) tree *associate_gnat_to_gnu;
139
140 #define GET_GNU_TREE(GNAT_ENTITY)       \
141   associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id]
142
143 #define SET_GNU_TREE(GNAT_ENTITY,VAL)   \
144   associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id] = (VAL)
145
146 #define PRESENT_GNU_TREE(GNAT_ENTITY)   \
147   (associate_gnat_to_gnu[(GNAT_ENTITY) - First_Node_Id] != NULL_TREE)
148
149 /* Associates a GNAT entity to a GCC tree node used as a dummy, if any.  */
150 static GTY((length ("max_gnat_nodes"))) tree *dummy_node_table;
151
152 #define GET_DUMMY_NODE(GNAT_ENTITY)     \
153   dummy_node_table[(GNAT_ENTITY) - First_Node_Id]
154
155 #define SET_DUMMY_NODE(GNAT_ENTITY,VAL) \
156   dummy_node_table[(GNAT_ENTITY) - First_Node_Id] = (VAL)
157
158 #define PRESENT_DUMMY_NODE(GNAT_ENTITY) \
159   (dummy_node_table[(GNAT_ENTITY) - First_Node_Id] != NULL_TREE)
160
161 /* This variable keeps a table for types for each precision so that we only
162    allocate each of them once. Signed and unsigned types are kept separate.
163
164    Note that these types are only used when fold-const requests something
165    special.  Perhaps we should NOT share these types; we'll see how it
166    goes later.  */
167 static GTY(()) tree signed_and_unsigned_types[2 * MAX_BITS_PER_WORD + 1][2];
168
169 /* Likewise for float types, but record these by mode.  */
170 static GTY(()) tree float_types[NUM_MACHINE_MODES];
171
172 /* For each binding contour we allocate a binding_level structure to indicate
173    the binding depth.  */
174
175 struct GTY((chain_next ("%h.chain"))) gnat_binding_level {
176   /* The binding level containing this one (the enclosing binding level). */
177   struct gnat_binding_level *chain;
178   /* The BLOCK node for this level.  */
179   tree block;
180   /* If nonzero, the setjmp buffer that needs to be updated for any
181      variable-sized definition within this context.  */
182   tree jmpbuf_decl;
183 };
184
185 /* The binding level currently in effect.  */
186 static GTY(()) struct gnat_binding_level *current_binding_level;
187
188 /* A chain of gnat_binding_level structures awaiting reuse.  */
189 static GTY((deletable)) struct gnat_binding_level *free_binding_level;
190
191 /* An array of global declarations.  */
192 static GTY(()) VEC(tree,gc) *global_decls;
193
194 /* An array of builtin function declarations.  */
195 static GTY(()) VEC(tree,gc) *builtin_decls;
196
197 /* An array of global renaming pointers.  */
198 static GTY(()) VEC(tree,gc) *global_renaming_pointers;
199
200 /* A chain of unused BLOCK nodes. */
201 static GTY((deletable)) tree free_block_chain;
202
203 static tree merge_sizes (tree, tree, tree, bool, bool);
204 static tree compute_related_constant (tree, tree);
205 static tree split_plus (tree, tree *);
206 static void gnat_gimplify_function (tree);
207 static tree float_type_for_precision (int, enum machine_mode);
208 static tree convert_to_fat_pointer (tree, tree);
209 static tree convert_to_thin_pointer (tree, tree);
210 static tree make_descriptor_field (const char *,tree, tree, tree);
211 static bool potential_alignment_gap (tree, tree, tree);
212 \f
213 /* Initialize the association of GNAT nodes to GCC trees.  */
214
215 void
216 init_gnat_to_gnu (void)
217 {
218   associate_gnat_to_gnu
219     = (tree *) ggc_alloc_cleared (max_gnat_nodes * sizeof (tree));
220 }
221
222 /* GNAT_ENTITY is a GNAT tree node for an entity.   GNU_DECL is the GCC tree
223    which is to be associated with GNAT_ENTITY. Such GCC tree node is always
224    a ..._DECL node.  If NO_CHECK is true, the latter check is suppressed.
225
226    If GNU_DECL is zero, a previous association is to be reset.  */
227
228 void
229 save_gnu_tree (Entity_Id gnat_entity, tree gnu_decl, bool no_check)
230 {
231   /* Check that GNAT_ENTITY is not already defined and that it is being set
232      to something which is a decl.  Raise gigi 401 if not.  Usually, this
233      means GNAT_ENTITY is defined twice, but occasionally is due to some
234      Gigi problem.  */
235   gcc_assert (!(gnu_decl
236                 && (PRESENT_GNU_TREE (gnat_entity)
237                     || (!no_check && !DECL_P (gnu_decl)))));
238
239   SET_GNU_TREE (gnat_entity, gnu_decl);
240 }
241
242 /* GNAT_ENTITY is a GNAT tree node for a defining identifier.
243    Return the ..._DECL node that was associated with it.  If there is no tree
244    node associated with GNAT_ENTITY, abort.
245
246    In some cases, such as delayed elaboration or expressions that need to
247    be elaborated only once, GNAT_ENTITY is really not an entity.  */
248
249 tree
250 get_gnu_tree (Entity_Id gnat_entity)
251 {
252   gcc_assert (PRESENT_GNU_TREE (gnat_entity));
253   return GET_GNU_TREE (gnat_entity);
254 }
255
256 /* Return nonzero if a GCC tree has been associated with GNAT_ENTITY.  */
257
258 bool
259 present_gnu_tree (Entity_Id gnat_entity)
260 {
261   return PRESENT_GNU_TREE (gnat_entity);
262 }
263 \f
264 /* Initialize the association of GNAT nodes to GCC trees as dummies.  */
265
266 void
267 init_dummy_type (void)
268 {
269   dummy_node_table
270     = (tree *) ggc_alloc_cleared (max_gnat_nodes * sizeof (tree));
271 }
272
273 /* Make a dummy type corresponding to GNAT_TYPE.  */
274
275 tree
276 make_dummy_type (Entity_Id gnat_type)
277 {
278   Entity_Id gnat_underlying = Gigi_Equivalent_Type (gnat_type);
279   tree gnu_type;
280
281   /* If there is an equivalent type, get its underlying type.  */
282   if (Present (gnat_underlying))
283     gnat_underlying = Underlying_Type (gnat_underlying);
284
285   /* If there was no equivalent type (can only happen when just annotating
286      types) or underlying type, go back to the original type.  */
287   if (No (gnat_underlying))
288     gnat_underlying = gnat_type;
289
290   /* If it there already a dummy type, use that one.  Else make one.  */
291   if (PRESENT_DUMMY_NODE (gnat_underlying))
292     return GET_DUMMY_NODE (gnat_underlying);
293
294   /* If this is a record, make a RECORD_TYPE or UNION_TYPE; else make
295      an ENUMERAL_TYPE.  */
296   gnu_type = make_node (Is_Record_Type (gnat_underlying)
297                         ? tree_code_for_record_type (gnat_underlying)
298                         : ENUMERAL_TYPE);
299   TYPE_NAME (gnu_type) = get_entity_name (gnat_type);
300   TYPE_DUMMY_P (gnu_type) = 1;
301   TYPE_STUB_DECL (gnu_type)
302     = create_type_stub_decl (TYPE_NAME (gnu_type), gnu_type);
303   if (AGGREGATE_TYPE_P (gnu_type))
304     TYPE_BY_REFERENCE_P (gnu_type) = Is_By_Reference_Type (gnat_type);
305
306   SET_DUMMY_NODE (gnat_underlying, gnu_type);
307
308   return gnu_type;
309 }
310 \f
311 /* Return nonzero if we are currently in the global binding level.  */
312
313 int
314 global_bindings_p (void)
315 {
316   return ((force_global || !current_function_decl) ? -1 : 0);
317 }
318
319 /* Enter a new binding level. */
320
321 void
322 gnat_pushlevel (void)
323 {
324   struct gnat_binding_level *newlevel = NULL;
325
326   /* Reuse a struct for this binding level, if there is one.  */
327   if (free_binding_level)
328     {
329       newlevel = free_binding_level;
330       free_binding_level = free_binding_level->chain;
331     }
332   else
333     newlevel
334       = (struct gnat_binding_level *)
335         ggc_alloc (sizeof (struct gnat_binding_level));
336
337   /* Use a free BLOCK, if any; otherwise, allocate one.  */
338   if (free_block_chain)
339     {
340       newlevel->block = free_block_chain;
341       free_block_chain = BLOCK_CHAIN (free_block_chain);
342       BLOCK_CHAIN (newlevel->block) = NULL_TREE;
343     }
344   else
345     newlevel->block = make_node (BLOCK);
346
347   /* Point the BLOCK we just made to its parent.  */
348   if (current_binding_level)
349     BLOCK_SUPERCONTEXT (newlevel->block) = current_binding_level->block;
350
351   BLOCK_VARS (newlevel->block) = BLOCK_SUBBLOCKS (newlevel->block) = NULL_TREE;
352   TREE_USED (newlevel->block) = 1;
353
354   /* Add this level to the front of the chain (stack) of levels that are
355      active.  */
356   newlevel->chain = current_binding_level;
357   newlevel->jmpbuf_decl = NULL_TREE;
358   current_binding_level = newlevel;
359 }
360
361 /* Set SUPERCONTEXT of the BLOCK for the current binding level to FNDECL
362    and point FNDECL to this BLOCK.  */
363
364 void
365 set_current_block_context (tree fndecl)
366 {
367   BLOCK_SUPERCONTEXT (current_binding_level->block) = fndecl;
368   DECL_INITIAL (fndecl) = current_binding_level->block;
369 }
370
371 /* Set the jmpbuf_decl for the current binding level to DECL.  */
372
373 void
374 set_block_jmpbuf_decl (tree decl)
375 {
376   current_binding_level->jmpbuf_decl = decl;
377 }
378
379 /* Get the jmpbuf_decl, if any, for the current binding level.  */
380
381 tree
382 get_block_jmpbuf_decl (void)
383 {
384   return current_binding_level->jmpbuf_decl;
385 }
386
387 /* Exit a binding level. Set any BLOCK into the current code group.  */
388
389 void
390 gnat_poplevel (void)
391 {
392   struct gnat_binding_level *level = current_binding_level;
393   tree block = level->block;
394
395   BLOCK_VARS (block) = nreverse (BLOCK_VARS (block));
396   BLOCK_SUBBLOCKS (block) = nreverse (BLOCK_SUBBLOCKS (block));
397
398   /* If this is a function-level BLOCK don't do anything.  Otherwise, if there
399      are no variables free the block and merge its subblocks into those of its
400      parent block. Otherwise, add it to the list of its parent.  */
401   if (TREE_CODE (BLOCK_SUPERCONTEXT (block)) == FUNCTION_DECL)
402     ;
403   else if (BLOCK_VARS (block) == NULL_TREE)
404     {
405       BLOCK_SUBBLOCKS (level->chain->block)
406         = chainon (BLOCK_SUBBLOCKS (block),
407                    BLOCK_SUBBLOCKS (level->chain->block));
408       BLOCK_CHAIN (block) = free_block_chain;
409       free_block_chain = block;
410     }
411   else
412     {
413       BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (level->chain->block);
414       BLOCK_SUBBLOCKS (level->chain->block) = block;
415       TREE_USED (block) = 1;
416       set_block_for_group (block);
417     }
418
419   /* Free this binding structure.  */
420   current_binding_level = level->chain;
421   level->chain = free_binding_level;
422   free_binding_level = level;
423 }
424
425 \f
426 /* Records a ..._DECL node DECL as belonging to the current lexical scope
427    and uses GNAT_NODE for location information and propagating flags.  */
428
429 void
430 gnat_pushdecl (tree decl, Node_Id gnat_node)
431 {
432   /* If this decl is public external or at toplevel, there is no context.
433      But PARM_DECLs always go in the level of its function.  */
434   if (TREE_CODE (decl) != PARM_DECL
435       && ((DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
436           || global_bindings_p ()))
437     DECL_CONTEXT (decl) = 0;
438   else
439     {
440       DECL_CONTEXT (decl) = current_function_decl;
441
442       /* Functions imported in another function are not really nested.  */
443       if (TREE_CODE (decl) == FUNCTION_DECL && TREE_PUBLIC (decl))
444         DECL_NO_STATIC_CHAIN (decl) = 1;
445     }
446
447   TREE_NO_WARNING (decl) = (gnat_node == Empty || Warnings_Off (gnat_node));
448
449   /* Set the location of DECL and emit a declaration for it.  */
450   if (Present (gnat_node))
451     Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (decl));
452   add_decl_expr (decl, gnat_node);
453
454   /* Put the declaration on the list.  The list of declarations is in reverse
455      order.  The list will be reversed later.  Put global variables in the
456      globals list and builtin functions in a dedicated list to speed up
457      further lookups.  Don't put TYPE_DECLs for UNCONSTRAINED_ARRAY_TYPE into
458      the list, as they will cause trouble with the debugger and aren't needed
459      anyway.  */
460   if (TREE_CODE (decl) != TYPE_DECL
461       || TREE_CODE (TREE_TYPE (decl)) != UNCONSTRAINED_ARRAY_TYPE)
462     {
463       if (global_bindings_p ())
464         {
465           VEC_safe_push (tree, gc, global_decls, decl);
466
467           if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
468             VEC_safe_push (tree, gc, builtin_decls, decl);
469         }
470       else
471         {
472           TREE_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
473           BLOCK_VARS (current_binding_level->block) = decl;
474         }
475     }
476
477   /* For the declaration of a type, set its name if it either is not already
478      set or if the previous type name was not derived from a source name.
479      We'd rather have the type named with a real name and all the pointer
480      types to the same object have the same POINTER_TYPE node.  Code in the
481      equivalent function of c-decl.c makes a copy of the type node here, but
482      that may cause us trouble with incomplete types.  We make an exception
483      for fat pointer types because the compiler automatically builds them
484      for unconstrained array types and the debugger uses them to represent
485      both these and pointers to these.  */
486   if (TREE_CODE (decl) == TYPE_DECL && DECL_NAME (decl))
487     {
488       tree t = TREE_TYPE (decl);
489
490       if (!(TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL))
491         ;
492       else if (TYPE_FAT_POINTER_P (t))
493         {
494           tree tt = build_variant_type_copy (t);
495           TYPE_NAME (tt) = decl;
496           TREE_USED (tt) = TREE_USED (t);
497           TREE_TYPE (decl) = tt;
498           DECL_ORIGINAL_TYPE (decl) = t;
499           t = NULL_TREE;
500         }
501       else if (DECL_ARTIFICIAL (TYPE_NAME (t)) && !DECL_ARTIFICIAL (decl))
502         ;
503       else
504         t = NULL_TREE;
505
506       /* Propagate the name to all the variants.  This is needed for
507          the type qualifiers machinery to work properly.  */
508       if (t)
509         for (t = TYPE_MAIN_VARIANT (t); t; t = TYPE_NEXT_VARIANT (t))
510           TYPE_NAME (t) = decl;
511     }
512 }
513 \f
514 /* Do little here.  Set up the standard declarations later after the
515    front end has been run.  */
516
517 void
518 gnat_init_decl_processing (void)
519 {
520   /* Make the binding_level structure for global names.  */
521   current_function_decl = 0;
522   current_binding_level = 0;
523   free_binding_level = 0;
524   gnat_pushlevel ();
525
526   build_common_tree_nodes (true, true);
527
528   /* In Ada, we use a signed type for SIZETYPE.  Use the signed type
529      corresponding to the width of Pmode.  In most cases when ptr_mode
530      and Pmode differ, C will use the width of ptr_mode for SIZETYPE.
531      But we get far better code using the width of Pmode.  */
532   size_type_node = gnat_type_for_mode (Pmode, 0);
533   set_sizetype (size_type_node);
534
535   /* In Ada, we use an unsigned 8-bit type for the default boolean type.  */
536   boolean_type_node = make_unsigned_type (8);
537   TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
538   SET_TYPE_RM_MAX_VALUE (boolean_type_node,
539                          build_int_cst (boolean_type_node, 1));
540   SET_TYPE_RM_SIZE (boolean_type_node, bitsize_int (1));
541
542   build_common_tree_nodes_2 (0);
543   boolean_true_node = TYPE_MAX_VALUE (boolean_type_node);
544
545   ptr_void_type_node = build_pointer_type (void_type_node);
546 }
547 \f
548 /* Record TYPE as a builtin type for Ada.  NAME is the name of the type.  */
549
550 void
551 record_builtin_type (const char *name, tree type)
552 {
553   tree type_decl = build_decl (input_location,
554                                TYPE_DECL, get_identifier (name), type);
555
556   gnat_pushdecl (type_decl, Empty);
557
558   if (debug_hooks->type_decl)
559     debug_hooks->type_decl (type_decl, false);
560 }
561 \f
562 /* Given a record type RECORD_TYPE and a chain of FIELD_DECL nodes FIELDLIST,
563    finish constructing the record or union type.  If REP_LEVEL is zero, this
564    record has no representation clause and so will be entirely laid out here.
565    If REP_LEVEL is one, this record has a representation clause and has been
566    laid out already; only set the sizes and alignment.  If REP_LEVEL is two,
567    this record is derived from a parent record and thus inherits its layout;
568    only make a pass on the fields to finalize them.  If DO_NOT_FINALIZE is
569    true, the record type is expected to be modified afterwards so it will
570    not be sent to the back-end for finalization.  */
571
572 void
573 finish_record_type (tree record_type, tree fieldlist, int rep_level,
574                     bool do_not_finalize)
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) = fieldlist;
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     fieldlist = nreverse (fieldlist);
630
631   for (field = fieldlist; 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_IS_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 (fieldlist);
736
737   /* If the type is discriminated, it can be used to access all its
738      constrained subtypes, so force structural equality checks.  */
739   if (CONTAINS_PLACEHOLDER_P (size))
740     SET_TYPE_STRUCTURAL_EQUALITY (record_type);
741
742   if (rep_level < 2)
743     {
744       /* If this is a padding record, we never want to make the size smaller
745          than what was specified in it, if any.  */
746       if (TREE_CODE (record_type) == RECORD_TYPE
747           && TYPE_IS_PADDING_P (record_type) && TYPE_SIZE (record_type))
748         size = TYPE_SIZE (record_type);
749
750       /* Now set any of the values we've just computed that apply.  */
751       if (!TYPE_IS_FAT_POINTER_P (record_type)
752           && !TYPE_CONTAINS_TEMPLATE_P (record_type))
753         SET_TYPE_ADA_SIZE (record_type, ada_size);
754
755       if (rep_level > 0)
756         {
757           tree size_unit = had_size_unit
758                            ? TYPE_SIZE_UNIT (record_type)
759                            : convert (sizetype,
760                                       size_binop (CEIL_DIV_EXPR, size,
761                                                   bitsize_unit_node));
762           unsigned int align = TYPE_ALIGN (record_type);
763
764           TYPE_SIZE (record_type) = variable_size (round_up (size, align));
765           TYPE_SIZE_UNIT (record_type)
766             = variable_size (round_up (size_unit, align / BITS_PER_UNIT));
767
768           compute_record_mode (record_type);
769         }
770     }
771
772   if (!do_not_finalize)
773     rest_of_record_type_compilation (record_type);
774 }
775
776 /* Wrap up compilation of RECORD_TYPE, i.e. most notably output all
777    the debug information associated with it.  It need not be invoked
778    directly in most cases since finish_record_type takes care of doing
779    so, unless explicitly requested not to through DO_NOT_FINALIZE.  */
780
781 void
782 rest_of_record_type_compilation (tree record_type)
783 {
784   tree fieldlist = TYPE_FIELDS (record_type);
785   tree field;
786   enum tree_code code = TREE_CODE (record_type);
787   bool var_size = false;
788
789   for (field = fieldlist; field; field = TREE_CHAIN (field))
790     {
791       /* We need to make an XVE/XVU record if any field has variable size,
792          whether or not the record does.  For example, if we have a union,
793          it may be that all fields, rounded up to the alignment, have the
794          same size, in which case we'll use that size.  But the debug
795          output routines (except Dwarf2) won't be able to output the fields,
796          so we need to make the special record.  */
797       if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST
798           /* If a field has a non-constant qualifier, the record will have
799              variable size too.  */
800           || (code == QUAL_UNION_TYPE
801               && TREE_CODE (DECL_QUALIFIER (field)) != INTEGER_CST))
802         {
803           var_size = true;
804           break;
805         }
806     }
807
808   /* If this record is of variable size, rename it so that the
809      debugger knows it is and make a new, parallel, record
810      that tells the debugger how the record is laid out.  See
811      exp_dbug.ads.  But don't do this for records that are padding
812      since they confuse GDB.  */
813   if (var_size
814       && !(TREE_CODE (record_type) == RECORD_TYPE
815            && TYPE_IS_PADDING_P (record_type)))
816     {
817       tree new_record_type
818         = make_node (TREE_CODE (record_type) == QUAL_UNION_TYPE
819                      ? UNION_TYPE : TREE_CODE (record_type));
820       tree orig_name = TYPE_NAME (record_type), new_name;
821       tree last_pos = bitsize_zero_node;
822       tree old_field, prev_old_field = NULL_TREE;
823
824       if (TREE_CODE (orig_name) == TYPE_DECL)
825         orig_name = DECL_NAME (orig_name);
826
827       new_name
828         = concat_name (orig_name, TREE_CODE (record_type) == QUAL_UNION_TYPE
829                                   ? "XVU" : "XVE");
830       TYPE_NAME (new_record_type) = new_name;
831       TYPE_ALIGN (new_record_type) = BIGGEST_ALIGNMENT;
832       TYPE_STUB_DECL (new_record_type)
833         = create_type_stub_decl (new_name, new_record_type);
834       DECL_IGNORED_P (TYPE_STUB_DECL (new_record_type))
835         = DECL_IGNORED_P (TYPE_STUB_DECL (record_type));
836       TYPE_SIZE (new_record_type) = size_int (TYPE_ALIGN (record_type));
837       TYPE_SIZE_UNIT (new_record_type)
838         = size_int (TYPE_ALIGN (record_type) / BITS_PER_UNIT);
839
840       add_parallel_type (TYPE_STUB_DECL (record_type), new_record_type);
841
842       /* Now scan all the fields, replacing each field with a new
843          field corresponding to the new encoding.  */
844       for (old_field = TYPE_FIELDS (record_type); old_field;
845            old_field = TREE_CHAIN (old_field))
846         {
847           tree field_type = TREE_TYPE (old_field);
848           tree field_name = DECL_NAME (old_field);
849           tree new_field;
850           tree curpos = bit_position (old_field);
851           bool var = false;
852           unsigned int align = 0;
853           tree pos;
854
855           /* See how the position was modified from the last position.
856
857           There are two basic cases we support: a value was added
858           to the last position or the last position was rounded to
859           a boundary and they something was added.  Check for the
860           first case first.  If not, see if there is any evidence
861           of rounding.  If so, round the last position and try
862           again.
863
864           If this is a union, the position can be taken as zero. */
865
866           /* Some computations depend on the shape of the position expression,
867              so strip conversions to make sure it's exposed.  */
868           curpos = remove_conversions (curpos, true);
869
870           if (TREE_CODE (new_record_type) == UNION_TYPE)
871             pos = bitsize_zero_node, align = 0;
872           else
873             pos = compute_related_constant (curpos, last_pos);
874
875           if (!pos && TREE_CODE (curpos) == MULT_EXPR
876               && host_integerp (TREE_OPERAND (curpos, 1), 1))
877             {
878               tree offset = TREE_OPERAND (curpos, 0);
879               align = tree_low_cst (TREE_OPERAND (curpos, 1), 1);
880
881               /* An offset which is a bitwise AND with a negative power of 2
882                  means an alignment corresponding to this power of 2.  */
883               offset = remove_conversions (offset, true);
884               if (TREE_CODE (offset) == BIT_AND_EXPR
885                   && host_integerp (TREE_OPERAND (offset, 1), 0)
886                   && tree_int_cst_sgn (TREE_OPERAND (offset, 1)) < 0)
887                 {
888                   unsigned int pow
889                     = - tree_low_cst (TREE_OPERAND (offset, 1), 0);
890                   if (exact_log2 (pow) > 0)
891                     align *= pow;
892                 }
893
894               pos = compute_related_constant (curpos,
895                                               round_up (last_pos, align));
896             }
897           else if (!pos && TREE_CODE (curpos) == PLUS_EXPR
898                    && TREE_CODE (TREE_OPERAND (curpos, 1)) == INTEGER_CST
899                    && TREE_CODE (TREE_OPERAND (curpos, 0)) == MULT_EXPR
900                    && host_integerp (TREE_OPERAND
901                                      (TREE_OPERAND (curpos, 0), 1),
902                                      1))
903             {
904               align
905                 = tree_low_cst
906                 (TREE_OPERAND (TREE_OPERAND (curpos, 0), 1), 1);
907               pos = compute_related_constant (curpos,
908                                               round_up (last_pos, align));
909             }
910           else if (potential_alignment_gap (prev_old_field, old_field,
911                                             pos))
912             {
913               align = TYPE_ALIGN (field_type);
914               pos = compute_related_constant (curpos,
915                                               round_up (last_pos, align));
916             }
917
918           /* If we can't compute a position, set it to zero.
919
920           ??? We really should abort here, but it's too much work
921           to get this correct for all cases.  */
922
923           if (!pos)
924             pos = bitsize_zero_node;
925
926           /* See if this type is variable-sized and make a pointer type
927              and indicate the indirection if so.  Beware that the debug
928              back-end may adjust the position computed above according
929              to the alignment of the field type, i.e. the pointer type
930              in this case, if we don't preventively counter that.  */
931           if (TREE_CODE (DECL_SIZE (old_field)) != INTEGER_CST)
932             {
933               field_type = build_pointer_type (field_type);
934               if (align != 0 && TYPE_ALIGN (field_type) > align)
935                 {
936                   field_type = copy_node (field_type);
937                   TYPE_ALIGN (field_type) = align;
938                 }
939               var = true;
940             }
941
942           /* Make a new field name, if necessary.  */
943           if (var || align != 0)
944             {
945               char suffix[16];
946
947               if (align != 0)
948                 sprintf (suffix, "XV%c%u", var ? 'L' : 'A',
949                          align / BITS_PER_UNIT);
950               else
951                 strcpy (suffix, "XVL");
952
953               field_name = concat_name (field_name, suffix);
954             }
955
956           new_field = create_field_decl (field_name, field_type,
957                                          new_record_type, 0,
958                                          DECL_SIZE (old_field), pos, 0);
959           TREE_CHAIN (new_field) = TYPE_FIELDS (new_record_type);
960           TYPE_FIELDS (new_record_type) = new_field;
961
962           /* If old_field is a QUAL_UNION_TYPE, take its size as being
963              zero.  The only time it's not the last field of the record
964              is when there are other components at fixed positions after
965              it (meaning there was a rep clause for every field) and we
966              want to be able to encode them.  */
967           last_pos = size_binop (PLUS_EXPR, bit_position (old_field),
968                                  (TREE_CODE (TREE_TYPE (old_field))
969                                   == QUAL_UNION_TYPE)
970                                  ? bitsize_zero_node
971                                  : DECL_SIZE (old_field));
972           prev_old_field = old_field;
973         }
974
975       TYPE_FIELDS (new_record_type)
976         = nreverse (TYPE_FIELDS (new_record_type));
977
978       rest_of_type_decl_compilation (TYPE_STUB_DECL (new_record_type));
979     }
980
981   rest_of_type_decl_compilation (TYPE_STUB_DECL (record_type));
982 }
983
984 /* Append PARALLEL_TYPE on the chain of parallel types for decl.  */
985
986 void
987 add_parallel_type (tree decl, tree parallel_type)
988 {
989   tree d = decl;
990
991   while (DECL_PARALLEL_TYPE (d))
992     d = TYPE_STUB_DECL (DECL_PARALLEL_TYPE (d));
993
994   SET_DECL_PARALLEL_TYPE (d, parallel_type);
995 }
996
997 /* Return the parallel type associated to a type, if any.  */
998
999 tree
1000 get_parallel_type (tree type)
1001 {
1002   if (TYPE_STUB_DECL (type))
1003     return DECL_PARALLEL_TYPE (TYPE_STUB_DECL (type));
1004   else
1005     return NULL_TREE;
1006 }
1007
1008 /* Utility function of above to merge LAST_SIZE, the previous size of a record
1009    with FIRST_BIT and SIZE that describe a field.  SPECIAL is true if this
1010    represents a QUAL_UNION_TYPE in which case we must look for COND_EXPRs and
1011    replace a value of zero with the old size.  If HAS_REP is true, we take the
1012    MAX of the end position of this field with LAST_SIZE.  In all other cases,
1013    we use FIRST_BIT plus SIZE.  Return an expression for the size.  */
1014
1015 static tree
1016 merge_sizes (tree last_size, tree first_bit, tree size, bool special,
1017              bool has_rep)
1018 {
1019   tree type = TREE_TYPE (last_size);
1020   tree new_size;
1021
1022   if (!special || TREE_CODE (size) != COND_EXPR)
1023     {
1024       new_size = size_binop (PLUS_EXPR, first_bit, size);
1025       if (has_rep)
1026         new_size = size_binop (MAX_EXPR, last_size, new_size);
1027     }
1028
1029   else
1030     new_size = fold_build3 (COND_EXPR, type, TREE_OPERAND (size, 0),
1031                             integer_zerop (TREE_OPERAND (size, 1))
1032                             ? last_size : merge_sizes (last_size, first_bit,
1033                                                        TREE_OPERAND (size, 1),
1034                                                        1, has_rep),
1035                             integer_zerop (TREE_OPERAND (size, 2))
1036                             ? last_size : merge_sizes (last_size, first_bit,
1037                                                        TREE_OPERAND (size, 2),
1038                                                        1, has_rep));
1039
1040   /* We don't need any NON_VALUE_EXPRs and they can confuse us (especially
1041      when fed through substitute_in_expr) into thinking that a constant
1042      size is not constant.  */
1043   while (TREE_CODE (new_size) == NON_LVALUE_EXPR)
1044     new_size = TREE_OPERAND (new_size, 0);
1045
1046   return new_size;
1047 }
1048
1049 /* Utility function of above to see if OP0 and OP1, both of SIZETYPE, are
1050    related by the addition of a constant.  Return that constant if so.  */
1051
1052 static tree
1053 compute_related_constant (tree op0, tree op1)
1054 {
1055   tree op0_var, op1_var;
1056   tree op0_con = split_plus (op0, &op0_var);
1057   tree op1_con = split_plus (op1, &op1_var);
1058   tree result = size_binop (MINUS_EXPR, op0_con, op1_con);
1059
1060   if (operand_equal_p (op0_var, op1_var, 0))
1061     return result;
1062   else if (operand_equal_p (op0, size_binop (PLUS_EXPR, op1_var, result), 0))
1063     return result;
1064   else
1065     return 0;
1066 }
1067
1068 /* Utility function of above to split a tree OP which may be a sum, into a
1069    constant part, which is returned, and a variable part, which is stored
1070    in *PVAR.  *PVAR may be bitsize_zero_node.  All operations must be of
1071    bitsizetype.  */
1072
1073 static tree
1074 split_plus (tree in, tree *pvar)
1075 {
1076   /* Strip NOPS in order to ease the tree traversal and maximize the
1077      potential for constant or plus/minus discovery. We need to be careful
1078      to always return and set *pvar to bitsizetype trees, but it's worth
1079      the effort.  */
1080   STRIP_NOPS (in);
1081
1082   *pvar = convert (bitsizetype, in);
1083
1084   if (TREE_CODE (in) == INTEGER_CST)
1085     {
1086       *pvar = bitsize_zero_node;
1087       return convert (bitsizetype, in);
1088     }
1089   else if (TREE_CODE (in) == PLUS_EXPR || TREE_CODE (in) == MINUS_EXPR)
1090     {
1091       tree lhs_var, rhs_var;
1092       tree lhs_con = split_plus (TREE_OPERAND (in, 0), &lhs_var);
1093       tree rhs_con = split_plus (TREE_OPERAND (in, 1), &rhs_var);
1094
1095       if (lhs_var == TREE_OPERAND (in, 0)
1096           && rhs_var == TREE_OPERAND (in, 1))
1097         return bitsize_zero_node;
1098
1099       *pvar = size_binop (TREE_CODE (in), lhs_var, rhs_var);
1100       return size_binop (TREE_CODE (in), lhs_con, rhs_con);
1101     }
1102   else
1103     return bitsize_zero_node;
1104 }
1105 \f
1106 /* Return a FUNCTION_TYPE node. RETURN_TYPE is the type returned by the
1107    subprogram. If it is void_type_node, then we are dealing with a procedure,
1108    otherwise we are dealing with a function. PARAM_DECL_LIST is a list of
1109    PARM_DECL nodes that are the subprogram arguments.  CICO_LIST is the
1110    copy-in/copy-out list to be stored into TYPE_CICO_LIST.
1111    RETURNS_UNCONSTRAINED is true if the function returns an unconstrained
1112    object.  RETURNS_BY_REF is true if the function returns by reference.
1113    RETURNS_BY_TARGET_PTR is true if the function is to be passed (as its
1114    first parameter) the address of the place to copy its result.  */
1115
1116 tree
1117 create_subprog_type (tree return_type, tree param_decl_list, tree cico_list,
1118                      bool returns_unconstrained, bool returns_by_ref,
1119                      bool returns_by_target_ptr)
1120 {
1121   /* A chain of TREE_LIST nodes whose TREE_VALUEs are the data type nodes of
1122      the subprogram formal parameters. This list is generated by traversing the
1123      input list of PARM_DECL nodes.  */
1124   tree param_type_list = NULL;
1125   tree param_decl;
1126   tree type;
1127
1128   for (param_decl = param_decl_list; param_decl;
1129        param_decl = TREE_CHAIN (param_decl))
1130     param_type_list = tree_cons (NULL_TREE, TREE_TYPE (param_decl),
1131                                  param_type_list);
1132
1133   /* The list of the function parameter types has to be terminated by the void
1134      type to signal to the back-end that we are not dealing with a variable
1135      parameter subprogram, but that the subprogram has a fixed number of
1136      parameters.  */
1137   param_type_list = tree_cons (NULL_TREE, void_type_node, param_type_list);
1138
1139   /* The list of argument types has been created in reverse
1140      so nreverse it.   */
1141   param_type_list = nreverse (param_type_list);
1142
1143   type = build_function_type (return_type, param_type_list);
1144
1145   /* TYPE may have been shared since GCC hashes types.  If it has a CICO_LIST
1146      or the new type should, make a copy of TYPE.  Likewise for
1147      RETURNS_UNCONSTRAINED and RETURNS_BY_REF.  */
1148   if (TYPE_CI_CO_LIST (type) || cico_list
1149       || TYPE_RETURNS_UNCONSTRAINED_P (type) != returns_unconstrained
1150       || TYPE_RETURNS_BY_REF_P (type) != returns_by_ref
1151       || TYPE_RETURNS_BY_TARGET_PTR_P (type) != returns_by_target_ptr)
1152     type = copy_type (type);
1153
1154   TYPE_CI_CO_LIST (type) = cico_list;
1155   TYPE_RETURNS_UNCONSTRAINED_P (type) = returns_unconstrained;
1156   TYPE_RETURNS_BY_REF_P (type) = returns_by_ref;
1157   TYPE_RETURNS_BY_TARGET_PTR_P (type) = returns_by_target_ptr;
1158   return type;
1159 }
1160 \f
1161 /* Return a copy of TYPE but safe to modify in any way.  */
1162
1163 tree
1164 copy_type (tree type)
1165 {
1166   tree new_type = copy_node (type);
1167
1168   /* copy_node clears this field instead of copying it, because it is
1169      aliased with TREE_CHAIN.  */
1170   TYPE_STUB_DECL (new_type) = TYPE_STUB_DECL (type);
1171
1172   TYPE_POINTER_TO (new_type) = 0;
1173   TYPE_REFERENCE_TO (new_type) = 0;
1174   TYPE_MAIN_VARIANT (new_type) = new_type;
1175   TYPE_NEXT_VARIANT (new_type) = 0;
1176
1177   return new_type;
1178 }
1179 \f
1180 /* Return a subtype of sizetype with range MIN to MAX and whose
1181    TYPE_INDEX_TYPE is INDEX.  GNAT_NODE is used for the position
1182    of the associated TYPE_DECL.  */
1183
1184 tree
1185 create_index_type (tree min, tree max, tree index, Node_Id gnat_node)
1186 {
1187   /* First build a type for the desired range.  */
1188   tree type = build_index_2_type (min, max);
1189
1190   /* If this type has the TYPE_INDEX_TYPE we want, return it.  */
1191   if (TYPE_INDEX_TYPE (type) == index)
1192     return type;
1193
1194   /* Otherwise, if TYPE_INDEX_TYPE is set, make a copy.  Note that we have
1195      no way of sharing these types, but that's only a small hole.  */
1196   if (TYPE_INDEX_TYPE (type))
1197     type = copy_type (type);
1198
1199   SET_TYPE_INDEX_TYPE (type, index);
1200   create_type_decl (NULL_TREE, type, NULL, true, false, gnat_node);
1201
1202   return type;
1203 }
1204
1205 /* Return a subtype of TYPE with range MIN to MAX.  If TYPE is NULL,
1206    sizetype is used.  */
1207
1208 tree
1209 create_range_type (tree type, tree min, tree max)
1210 {
1211   tree range_type;
1212
1213   if (type == NULL_TREE)
1214     type = sizetype;
1215
1216   /* First build a type with the base range.  */
1217   range_type
1218     = build_range_type (type, TYPE_MIN_VALUE (type), TYPE_MAX_VALUE (type));
1219
1220   min = convert (type, min);
1221   max = convert (type, max);
1222
1223   /* If this type has the TYPE_RM_{MIN,MAX}_VALUE we want, return it.  */
1224   if (TYPE_RM_MIN_VALUE (range_type)
1225       && TYPE_RM_MAX_VALUE (range_type)
1226       && operand_equal_p (TYPE_RM_MIN_VALUE (range_type), min, 0)
1227       && operand_equal_p (TYPE_RM_MAX_VALUE (range_type), max, 0))
1228     return range_type;
1229
1230   /* Otherwise, if TYPE_RM_{MIN,MAX}_VALUE is set, make a copy.  */
1231   if (TYPE_RM_MIN_VALUE (range_type) || TYPE_RM_MAX_VALUE (range_type))
1232     range_type = copy_type (range_type);
1233
1234   /* Then set the actual range.  */
1235   SET_TYPE_RM_MIN_VALUE (range_type, min);
1236   SET_TYPE_RM_MAX_VALUE (range_type, max);
1237
1238   return range_type;
1239 }
1240 \f
1241 /* Return a TYPE_DECL node suitable for the TYPE_STUB_DECL field of a type.
1242    TYPE_NAME gives the name of the type and TYPE is a ..._TYPE node giving
1243    its data type.  */
1244
1245 tree
1246 create_type_stub_decl (tree type_name, tree type)
1247 {
1248   /* Using a named TYPE_DECL ensures that a type name marker is emitted in
1249      STABS while setting DECL_ARTIFICIAL ensures that no DW_TAG_typedef is
1250      emitted in DWARF.  */
1251   tree type_decl = build_decl (input_location,
1252                                TYPE_DECL, type_name, type);
1253   DECL_ARTIFICIAL (type_decl) = 1;
1254   return type_decl;
1255 }
1256
1257 /* Return a TYPE_DECL node.  TYPE_NAME gives the name of the type and TYPE
1258    is a ..._TYPE node giving its data type.  ARTIFICIAL_P is true if this
1259    is a declaration that was generated by the compiler.  DEBUG_INFO_P is
1260    true if we need to write debug information about this type.  GNAT_NODE
1261    is used for the position of the decl.  */
1262
1263 tree
1264 create_type_decl (tree type_name, tree type, struct attrib *attr_list,
1265                   bool artificial_p, bool debug_info_p, Node_Id gnat_node)
1266 {
1267   enum tree_code code = TREE_CODE (type);
1268   bool named = TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL;
1269   tree type_decl;
1270
1271   /* Only the builtin TYPE_STUB_DECL should be used for dummy types.  */
1272   gcc_assert (!TYPE_IS_DUMMY_P (type));
1273
1274   /* If the type hasn't been named yet, we're naming it; preserve an existing
1275      TYPE_STUB_DECL that has been attached to it for some purpose.  */
1276   if (!named && TYPE_STUB_DECL (type))
1277     {
1278       type_decl = TYPE_STUB_DECL (type);
1279       DECL_NAME (type_decl) = type_name;
1280     }
1281   else
1282     type_decl = build_decl (input_location,
1283                             TYPE_DECL, type_name, type);
1284
1285   DECL_ARTIFICIAL (type_decl) = artificial_p;
1286   gnat_pushdecl (type_decl, gnat_node);
1287   process_attributes (type_decl, attr_list);
1288
1289   /* If we're naming the type, equate the TYPE_STUB_DECL to the name.
1290      This causes the name to be also viewed as a "tag" by the debug
1291      back-end, with the advantage that no DW_TAG_typedef is emitted
1292      for artificial "tagged" types in DWARF.  */
1293   if (!named)
1294     TYPE_STUB_DECL (type) = type_decl;
1295
1296   /* Pass the type declaration to the debug back-end unless this is an
1297      UNCONSTRAINED_ARRAY_TYPE that the back-end does not support, or a
1298      type for which debugging information was not requested, or else an
1299      ENUMERAL_TYPE or RECORD_TYPE (except for fat pointers) which are
1300      handled separately.  And do not pass dummy types either.  */
1301   if (code == UNCONSTRAINED_ARRAY_TYPE || !debug_info_p)
1302     DECL_IGNORED_P (type_decl) = 1;
1303   else if (code != ENUMERAL_TYPE
1304            && (code != RECORD_TYPE || TYPE_IS_FAT_POINTER_P (type))
1305            && !((code == POINTER_TYPE || code == REFERENCE_TYPE)
1306                 && TYPE_IS_DUMMY_P (TREE_TYPE (type)))
1307            && !(code == RECORD_TYPE
1308                 && TYPE_IS_DUMMY_P
1309                    (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (type))))))
1310     rest_of_type_decl_compilation (type_decl);
1311
1312   return type_decl;
1313 }
1314 \f
1315 /* Return a VAR_DECL or CONST_DECL node.
1316
1317    VAR_NAME gives the name of the variable.  ASM_NAME is its assembler name
1318    (if provided).  TYPE is its data type (a GCC ..._TYPE node).  VAR_INIT is
1319    the GCC tree for an optional initial expression; NULL_TREE if none.
1320
1321    CONST_FLAG is true if this variable is constant, in which case we might
1322    return a CONST_DECL node unless CONST_DECL_ALLOWED_P is false.
1323
1324    PUBLIC_FLAG is true if this is for a reference to a public entity or for a
1325    definition to be made visible outside of the current compilation unit, for
1326    instance variable definitions in a package specification.
1327
1328    EXTERN_FLAG is true when processing an external variable declaration (as
1329    opposed to a definition: no storage is to be allocated for the variable).
1330
1331    STATIC_FLAG is only relevant when not at top level.  In that case
1332    it indicates whether to always allocate storage to the variable.
1333
1334    GNAT_NODE is used for the position of the decl.  */
1335
1336 tree
1337 create_var_decl_1 (tree var_name, tree asm_name, tree type, tree var_init,
1338                    bool const_flag, bool public_flag, bool extern_flag,
1339                    bool static_flag, bool const_decl_allowed_p,
1340                    struct attrib *attr_list, Node_Id gnat_node)
1341 {
1342   bool init_const
1343     = (var_init != 0
1344        && gnat_types_compatible_p (type, TREE_TYPE (var_init))
1345        && (global_bindings_p () || static_flag
1346            ? initializer_constant_valid_p (var_init, TREE_TYPE (var_init)) != 0
1347            : TREE_CONSTANT (var_init)));
1348
1349   /* Whether we will make TREE_CONSTANT the DECL we produce here, in which
1350      case the initializer may be used in-lieu of the DECL node (as done in
1351      Identifier_to_gnu).  This is useful to prevent the need of elaboration
1352      code when an identifier for which such a decl is made is in turn used as
1353      an initializer.  We used to rely on CONST vs VAR_DECL for this purpose,
1354      but extra constraints apply to this choice (see below) and are not
1355      relevant to the distinction we wish to make. */
1356   bool constant_p = const_flag && init_const;
1357
1358   /* The actual DECL node.  CONST_DECL was initially intended for enumerals
1359      and may be used for scalars in general but not for aggregates.  */
1360   tree var_decl
1361     = build_decl (input_location,
1362                   (constant_p && const_decl_allowed_p
1363                    && !AGGREGATE_TYPE_P (type)) ? CONST_DECL : VAR_DECL,
1364                   var_name, type);
1365
1366   /* If this is external, throw away any initializations (they will be done
1367      elsewhere) unless this is a constant for which we would like to remain
1368      able to get the initializer.  If we are defining a global here, leave a
1369      constant initialization and save any variable elaborations for the
1370      elaboration routine.  If we are just annotating types, throw away the
1371      initialization if it isn't a constant.  */
1372   if ((extern_flag && !constant_p)
1373       || (type_annotate_only && var_init && !TREE_CONSTANT (var_init)))
1374     var_init = NULL_TREE;
1375
1376   /* At the global level, an initializer requiring code to be generated
1377      produces elaboration statements.  Check that such statements are allowed,
1378      that is, not violating a No_Elaboration_Code restriction.  */
1379   if (global_bindings_p () && var_init != 0 && ! init_const)
1380     Check_Elaboration_Code_Allowed (gnat_node);
1381
1382   /* Ada doesn't feature Fortran-like COMMON variables so we shouldn't
1383      try to fiddle with DECL_COMMON.  However, on platforms that don't
1384      support global BSS sections, uninitialized global variables would
1385      go in DATA instead, thus increasing the size of the executable.  */
1386   if (!flag_no_common
1387       && TREE_CODE (var_decl) == VAR_DECL
1388       && !have_global_bss_p ())
1389     DECL_COMMON (var_decl) = 1;
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   /* If it's public and not external, always allocate storage for it.
1399      At the global binding level we need to allocate static storage for the
1400      variable if and only if it's not external. If we are not at the top level
1401      we allocate automatic storage unless requested not to.  */
1402   TREE_STATIC (var_decl)
1403     = !extern_flag && (public_flag || static_flag || global_bindings_p ());
1404
1405   /* For an external constant whose initializer is not absolute, do not emit
1406      debug info.  In DWARF this would mean a global relocation in a read-only
1407      section which runs afoul of the PE-COFF runtime relocation mechanism.  */
1408   if (extern_flag
1409       && constant_p
1410       && initializer_constant_valid_p (var_init, TREE_TYPE (var_init))
1411            != null_pointer_node)
1412     DECL_IGNORED_P (var_decl) = 1;
1413
1414   if (asm_name && VAR_OR_FUNCTION_DECL_P (var_decl))
1415     SET_DECL_ASSEMBLER_NAME (var_decl, asm_name);
1416
1417   process_attributes (var_decl, attr_list);
1418
1419   /* Add this decl to the current binding level.  */
1420   gnat_pushdecl (var_decl, gnat_node);
1421
1422   if (TREE_SIDE_EFFECTS (var_decl))
1423     TREE_ADDRESSABLE (var_decl) = 1;
1424
1425   if (TREE_CODE (var_decl) != CONST_DECL)
1426     {
1427       if (global_bindings_p ())
1428         rest_of_decl_compilation (var_decl, true, 0);
1429     }
1430   else
1431     expand_decl (var_decl);
1432
1433   return var_decl;
1434 }
1435 \f
1436 /* Return true if TYPE, an aggregate type, contains (or is) an array.  */
1437
1438 static bool
1439 aggregate_type_contains_array_p (tree type)
1440 {
1441   switch (TREE_CODE (type))
1442     {
1443     case RECORD_TYPE:
1444     case UNION_TYPE:
1445     case QUAL_UNION_TYPE:
1446       {
1447         tree field;
1448         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1449           if (AGGREGATE_TYPE_P (TREE_TYPE (field))
1450               && aggregate_type_contains_array_p (TREE_TYPE (field)))
1451             return true;
1452         return false;
1453       }
1454
1455     case ARRAY_TYPE:
1456       return true;
1457
1458     default:
1459       gcc_unreachable ();
1460     }
1461 }
1462
1463 /* Return a FIELD_DECL node.  FIELD_NAME the field name, FIELD_TYPE is its
1464    type, and RECORD_TYPE is the type of the parent.  PACKED is nonzero if
1465    this field is in a record type with a "pragma pack".  If SIZE is nonzero
1466    it is the specified size for this field.  If POS is nonzero, it is the bit
1467    position.  If ADDRESSABLE is nonzero, it means we are allowed to take
1468    the address of this field for aliasing purposes. If it is negative, we
1469    should not make a bitfield, which is used by make_aligning_type.   */
1470
1471 tree
1472 create_field_decl (tree field_name, tree field_type, tree record_type,
1473                    int packed, tree size, tree pos, int addressable)
1474 {
1475   tree field_decl = build_decl (input_location,
1476                                 FIELD_DECL, field_name, field_type);
1477
1478   DECL_CONTEXT (field_decl) = record_type;
1479   TREE_READONLY (field_decl) = TYPE_READONLY (field_type);
1480
1481   /* If FIELD_TYPE is BLKmode, we must ensure this is aligned to at least a
1482      byte boundary since GCC cannot handle less-aligned BLKmode bitfields.
1483      Likewise for an aggregate without specified position that contains an
1484      array, because in this case slices of variable length of this array
1485      must be handled by GCC and variable-sized objects need to be aligned
1486      to at least a byte boundary.  */
1487   if (packed && (TYPE_MODE (field_type) == BLKmode
1488                  || (!pos
1489                      && AGGREGATE_TYPE_P (field_type)
1490                      && aggregate_type_contains_array_p (field_type))))
1491     DECL_ALIGN (field_decl) = BITS_PER_UNIT;
1492
1493   /* If a size is specified, use it.  Otherwise, if the record type is packed
1494      compute a size to use, which may differ from the object's natural size.
1495      We always set a size in this case to trigger the checks for bitfield
1496      creation below, which is typically required when no position has been
1497      specified.  */
1498   if (size)
1499     size = convert (bitsizetype, size);
1500   else if (packed == 1)
1501     {
1502       size = rm_size (field_type);
1503
1504       /* For a constant size larger than MAX_FIXED_MODE_SIZE, round up to
1505          byte.  */
1506       if (TREE_CODE (size) == INTEGER_CST
1507           && compare_tree_int (size, MAX_FIXED_MODE_SIZE) > 0)
1508         size = round_up (size, BITS_PER_UNIT);
1509     }
1510
1511   /* If we may, according to ADDRESSABLE, make a bitfield if a size is
1512      specified for two reasons: first if the size differs from the natural
1513      size.  Second, if the alignment is insufficient.  There are a number of
1514      ways the latter can be true.
1515
1516      We never make a bitfield if the type of the field has a nonconstant size,
1517      because no such entity requiring bitfield operations should reach here.
1518
1519      We do *preventively* make a bitfield when there might be the need for it
1520      but we don't have all the necessary information to decide, as is the case
1521      of a field with no specified position in a packed record.
1522
1523      We also don't look at STRICT_ALIGNMENT here, and rely on later processing
1524      in layout_decl or finish_record_type to clear the bit_field indication if
1525      it is in fact not needed.  */
1526   if (addressable >= 0
1527       && size
1528       && TREE_CODE (size) == INTEGER_CST
1529       && TREE_CODE (TYPE_SIZE (field_type)) == INTEGER_CST
1530       && (!tree_int_cst_equal (size, TYPE_SIZE (field_type))
1531           || (pos && !value_factor_p (pos, TYPE_ALIGN (field_type)))
1532           || packed
1533           || (TYPE_ALIGN (record_type) != 0
1534               && TYPE_ALIGN (record_type) < TYPE_ALIGN (field_type))))
1535     {
1536       DECL_BIT_FIELD (field_decl) = 1;
1537       DECL_SIZE (field_decl) = size;
1538       if (!packed && !pos)
1539         {
1540           if (TYPE_ALIGN (record_type) != 0
1541               && TYPE_ALIGN (record_type) < TYPE_ALIGN (field_type))
1542             DECL_ALIGN (field_decl) = TYPE_ALIGN (record_type);
1543           else
1544             DECL_ALIGN (field_decl) = TYPE_ALIGN (field_type);
1545         }
1546     }
1547
1548   DECL_PACKED (field_decl) = pos ? DECL_BIT_FIELD (field_decl) : packed;
1549
1550   /* Bump the alignment if need be, either for bitfield/packing purposes or
1551      to satisfy the type requirements if no such consideration applies.  When
1552      we get the alignment from the type, indicate if this is from an explicit
1553      user request, which prevents stor-layout from lowering it later on.  */
1554   {
1555     unsigned int bit_align
1556       = (DECL_BIT_FIELD (field_decl) ? 1
1557          : packed && TYPE_MODE (field_type) != BLKmode ? BITS_PER_UNIT : 0);
1558
1559     if (bit_align > DECL_ALIGN (field_decl))
1560       DECL_ALIGN (field_decl) = bit_align;
1561     else if (!bit_align && TYPE_ALIGN (field_type) > DECL_ALIGN (field_decl))
1562       {
1563         DECL_ALIGN (field_decl) = TYPE_ALIGN (field_type);
1564         DECL_USER_ALIGN (field_decl) = TYPE_USER_ALIGN (field_type);
1565       }
1566   }
1567
1568   if (pos)
1569     {
1570       /* We need to pass in the alignment the DECL is known to have.
1571          This is the lowest-order bit set in POS, but no more than
1572          the alignment of the record, if one is specified.  Note
1573          that an alignment of 0 is taken as infinite.  */
1574       unsigned int known_align;
1575
1576       if (host_integerp (pos, 1))
1577         known_align = tree_low_cst (pos, 1) & - tree_low_cst (pos, 1);
1578       else
1579         known_align = BITS_PER_UNIT;
1580
1581       if (TYPE_ALIGN (record_type)
1582           && (known_align == 0 || known_align > TYPE_ALIGN (record_type)))
1583         known_align = TYPE_ALIGN (record_type);
1584
1585       layout_decl (field_decl, known_align);
1586       SET_DECL_OFFSET_ALIGN (field_decl,
1587                              host_integerp (pos, 1) ? BIGGEST_ALIGNMENT
1588                              : BITS_PER_UNIT);
1589       pos_from_bit (&DECL_FIELD_OFFSET (field_decl),
1590                     &DECL_FIELD_BIT_OFFSET (field_decl),
1591                     DECL_OFFSET_ALIGN (field_decl), pos);
1592     }
1593
1594   /* In addition to what our caller says, claim the field is addressable if we
1595      know that its type is not suitable.
1596
1597      The field may also be "technically" nonaddressable, meaning that even if
1598      we attempt to take the field's address we will actually get the address
1599      of a copy.  This is the case for true bitfields, but the DECL_BIT_FIELD
1600      value we have at this point is not accurate enough, so we don't account
1601      for this here and let finish_record_type decide.  */
1602   if (!addressable && !type_for_nonaliased_component_p (field_type))
1603     addressable = 1;
1604
1605   DECL_NONADDRESSABLE_P (field_decl) = !addressable;
1606
1607   return field_decl;
1608 }
1609 \f
1610 /* Return a PARM_DECL node.  PARAM_NAME is the name of the parameter and
1611    PARAM_TYPE is its type.  READONLY is true if the parameter is readonly
1612    (either an In parameter or an address of a pass-by-ref parameter).  */
1613
1614 tree
1615 create_param_decl (tree param_name, tree param_type, bool readonly)
1616 {
1617   tree param_decl = build_decl (input_location,
1618                                 PARM_DECL, param_name, param_type);
1619
1620   /* Honor TARGET_PROMOTE_PROTOTYPES like the C compiler, as not doing so
1621      can lead to various ABI violations.  */
1622   if (targetm.calls.promote_prototypes (NULL_TREE)
1623       && INTEGRAL_TYPE_P (param_type)
1624       && TYPE_PRECISION (param_type) < TYPE_PRECISION (integer_type_node))
1625     {
1626       /* We have to be careful about biased types here.  Make a subtype
1627          of integer_type_node with the proper biasing.  */
1628       if (TREE_CODE (param_type) == INTEGER_TYPE
1629           && TYPE_BIASED_REPRESENTATION_P (param_type))
1630         {
1631           tree subtype
1632             = make_unsigned_type (TYPE_PRECISION (integer_type_node));
1633           TREE_TYPE (subtype) = integer_type_node;
1634           TYPE_BIASED_REPRESENTATION_P (subtype) = 1;
1635           SET_TYPE_RM_MIN_VALUE (subtype, TYPE_MIN_VALUE (param_type));
1636           SET_TYPE_RM_MAX_VALUE (subtype, TYPE_MAX_VALUE (param_type));
1637           param_type = subtype;
1638         }
1639       else
1640         param_type = integer_type_node;
1641     }
1642
1643   DECL_ARG_TYPE (param_decl) = param_type;
1644   TREE_READONLY (param_decl) = readonly;
1645   return param_decl;
1646 }
1647 \f
1648 /* Given a DECL and ATTR_LIST, process the listed attributes.  */
1649
1650 void
1651 process_attributes (tree decl, struct attrib *attr_list)
1652 {
1653   for (; attr_list; attr_list = attr_list->next)
1654     switch (attr_list->type)
1655       {
1656       case ATTR_MACHINE_ATTRIBUTE:
1657         decl_attributes (&decl, tree_cons (attr_list->name, attr_list->args,
1658                                            NULL_TREE),
1659                          ATTR_FLAG_TYPE_IN_PLACE);
1660         break;
1661
1662       case ATTR_LINK_ALIAS:
1663         if (! DECL_EXTERNAL (decl))
1664           {
1665             TREE_STATIC (decl) = 1;
1666             assemble_alias (decl, attr_list->name);
1667           }
1668         break;
1669
1670       case ATTR_WEAK_EXTERNAL:
1671         if (SUPPORTS_WEAK)
1672           declare_weak (decl);
1673         else
1674           post_error ("?weak declarations not supported on this target",
1675                       attr_list->error_point);
1676         break;
1677
1678       case ATTR_LINK_SECTION:
1679         if (targetm.have_named_sections)
1680           {
1681             DECL_SECTION_NAME (decl)
1682               = build_string (IDENTIFIER_LENGTH (attr_list->name),
1683                               IDENTIFIER_POINTER (attr_list->name));
1684             DECL_COMMON (decl) = 0;
1685           }
1686         else
1687           post_error ("?section attributes are not supported for this target",
1688                       attr_list->error_point);
1689         break;
1690
1691       case ATTR_LINK_CONSTRUCTOR:
1692         DECL_STATIC_CONSTRUCTOR (decl) = 1;
1693         TREE_USED (decl) = 1;
1694         break;
1695
1696       case ATTR_LINK_DESTRUCTOR:
1697         DECL_STATIC_DESTRUCTOR (decl) = 1;
1698         TREE_USED (decl) = 1;
1699         break;
1700
1701       case ATTR_THREAD_LOCAL_STORAGE:
1702         DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
1703         DECL_COMMON (decl) = 0;
1704         break;
1705       }
1706 }
1707 \f
1708 /* Record DECL as a global renaming pointer.  */
1709
1710 void
1711 record_global_renaming_pointer (tree decl)
1712 {
1713   gcc_assert (DECL_RENAMED_OBJECT (decl));
1714   VEC_safe_push (tree, gc, global_renaming_pointers, decl);
1715 }
1716
1717 /* Invalidate the global renaming pointers.   */
1718
1719 void
1720 invalidate_global_renaming_pointers (void)
1721 {
1722   unsigned int i;
1723   tree iter;
1724
1725   for (i = 0; VEC_iterate(tree, global_renaming_pointers, i, iter); i++)
1726     SET_DECL_RENAMED_OBJECT (iter, NULL_TREE);
1727
1728   VEC_free (tree, gc, global_renaming_pointers);
1729 }
1730
1731 /* Return true if VALUE is a known to be a multiple of FACTOR, which must be
1732    a power of 2. */
1733
1734 bool
1735 value_factor_p (tree value, HOST_WIDE_INT factor)
1736 {
1737   if (host_integerp (value, 1))
1738     return tree_low_cst (value, 1) % factor == 0;
1739
1740   if (TREE_CODE (value) == MULT_EXPR)
1741     return (value_factor_p (TREE_OPERAND (value, 0), factor)
1742             || value_factor_p (TREE_OPERAND (value, 1), factor));
1743
1744   return false;
1745 }
1746
1747 /* Given 2 consecutive field decls PREV_FIELD and CURR_FIELD, return true
1748    unless we can prove these 2 fields are laid out in such a way that no gap
1749    exist between the end of PREV_FIELD and the beginning of CURR_FIELD.  OFFSET
1750    is the distance in bits between the end of PREV_FIELD and the starting
1751    position of CURR_FIELD. It is ignored if null. */
1752
1753 static bool
1754 potential_alignment_gap (tree prev_field, tree curr_field, tree offset)
1755 {
1756   /* If this is the first field of the record, there cannot be any gap */
1757   if (!prev_field)
1758     return false;
1759
1760   /* If the previous field is a union type, then return False: The only
1761      time when such a field is not the last field of the record is when
1762      there are other components at fixed positions after it (meaning there
1763      was a rep clause for every field), in which case we don't want the
1764      alignment constraint to override them. */
1765   if (TREE_CODE (TREE_TYPE (prev_field)) == QUAL_UNION_TYPE)
1766     return false;
1767
1768   /* If the distance between the end of prev_field and the beginning of
1769      curr_field is constant, then there is a gap if the value of this
1770      constant is not null. */
1771   if (offset && host_integerp (offset, 1))
1772     return !integer_zerop (offset);
1773
1774   /* If the size and position of the previous field are constant,
1775      then check the sum of this size and position. There will be a gap
1776      iff it is not multiple of the current field alignment. */
1777   if (host_integerp (DECL_SIZE (prev_field), 1)
1778       && host_integerp (bit_position (prev_field), 1))
1779     return ((tree_low_cst (bit_position (prev_field), 1)
1780              + tree_low_cst (DECL_SIZE (prev_field), 1))
1781             % DECL_ALIGN (curr_field) != 0);
1782
1783   /* If both the position and size of the previous field are multiples
1784      of the current field alignment, there cannot be any gap. */
1785   if (value_factor_p (bit_position (prev_field), DECL_ALIGN (curr_field))
1786       && value_factor_p (DECL_SIZE (prev_field), DECL_ALIGN (curr_field)))
1787     return false;
1788
1789   /* Fallback, return that there may be a potential gap */
1790   return true;
1791 }
1792
1793 /* Returns a LABEL_DECL node for LABEL_NAME.  */
1794
1795 tree
1796 create_label_decl (tree label_name)
1797 {
1798   tree label_decl = build_decl (input_location,
1799                                 LABEL_DECL, label_name, void_type_node);
1800
1801   DECL_CONTEXT (label_decl)     = current_function_decl;
1802   DECL_MODE (label_decl)        = VOIDmode;
1803   DECL_SOURCE_LOCATION (label_decl) = input_location;
1804
1805   return label_decl;
1806 }
1807 \f
1808 /* Returns a FUNCTION_DECL node.  SUBPROG_NAME is the name of the subprogram,
1809    ASM_NAME is its assembler name, SUBPROG_TYPE is its type (a FUNCTION_TYPE
1810    node), PARAM_DECL_LIST is the list of the subprogram arguments (a list of
1811    PARM_DECL nodes chained through the TREE_CHAIN field).
1812
1813    INLINE_FLAG, PUBLIC_FLAG, EXTERN_FLAG, and ATTR_LIST are used to set the
1814    appropriate fields in the FUNCTION_DECL.  GNAT_NODE gives the location.  */
1815
1816 tree
1817 create_subprog_decl (tree subprog_name, tree asm_name,
1818                      tree subprog_type, tree param_decl_list, bool inline_flag,
1819                      bool public_flag, bool extern_flag,
1820                      struct attrib *attr_list, Node_Id gnat_node)
1821 {
1822   tree return_type  = TREE_TYPE (subprog_type);
1823   tree subprog_decl = build_decl (input_location,
1824                                   FUNCTION_DECL, subprog_name, subprog_type);
1825
1826   /* If this is a non-inline function nested inside an inlined external
1827      function, we cannot honor both requests without cloning the nested
1828      function in the current unit since it is private to the other unit.
1829      We could inline the nested function as well but it's probably better
1830      to err on the side of too little inlining.  */
1831   if (!inline_flag
1832       && current_function_decl
1833       && DECL_DECLARED_INLINE_P (current_function_decl)
1834       && DECL_EXTERNAL (current_function_decl))
1835     DECL_DECLARED_INLINE_P (current_function_decl) = 0;
1836
1837   DECL_EXTERNAL (subprog_decl)  = extern_flag;
1838   TREE_PUBLIC (subprog_decl)    = public_flag;
1839   TREE_STATIC (subprog_decl)    = 1;
1840   TREE_READONLY (subprog_decl)  = TYPE_READONLY (subprog_type);
1841   TREE_THIS_VOLATILE (subprog_decl) = TYPE_VOLATILE (subprog_type);
1842   TREE_SIDE_EFFECTS (subprog_decl) = TYPE_VOLATILE (subprog_type);
1843   DECL_DECLARED_INLINE_P (subprog_decl) = inline_flag;
1844   DECL_ARGUMENTS (subprog_decl) = param_decl_list;
1845   DECL_RESULT (subprog_decl)    = build_decl (input_location,
1846                                               RESULT_DECL, 0, return_type);
1847   DECL_ARTIFICIAL (DECL_RESULT (subprog_decl)) = 1;
1848   DECL_IGNORED_P (DECL_RESULT (subprog_decl)) = 1;
1849
1850   /* TREE_ADDRESSABLE is set on the result type to request the use of the
1851      target by-reference return mechanism.  This is not supported all the
1852      way down to RTL expansion with GCC 4, which ICEs on temporary creation
1853      attempts with such a type and expects DECL_BY_REFERENCE to be set on
1854      the RESULT_DECL instead - see gnat_genericize for more details.  */
1855   if (TREE_ADDRESSABLE (TREE_TYPE (DECL_RESULT (subprog_decl))))
1856     {
1857       tree result_decl = DECL_RESULT (subprog_decl);
1858
1859       TREE_ADDRESSABLE (TREE_TYPE (result_decl)) = 0;
1860       DECL_BY_REFERENCE (result_decl) = 1;
1861     }
1862
1863   if (asm_name)
1864     {
1865       SET_DECL_ASSEMBLER_NAME (subprog_decl, asm_name);
1866
1867       /* The expand_main_function circuitry expects "main_identifier_node" to
1868          designate the DECL_NAME of the 'main' entry point, in turn expected
1869          to be declared as the "main" function literally by default.  Ada
1870          program entry points are typically declared with a different name
1871          within the binder generated file, exported as 'main' to satisfy the
1872          system expectations.  Redirect main_identifier_node in this case.  */
1873       if (asm_name == main_identifier_node)
1874         main_identifier_node = DECL_NAME (subprog_decl);
1875     }
1876
1877   process_attributes (subprog_decl, attr_list);
1878
1879   /* Add this decl to the current binding level.  */
1880   gnat_pushdecl (subprog_decl, gnat_node);
1881
1882   /* Output the assembler code and/or RTL for the declaration.  */
1883   rest_of_decl_compilation (subprog_decl, global_bindings_p (), 0);
1884
1885   return subprog_decl;
1886 }
1887 \f
1888 /* Set up the framework for generating code for SUBPROG_DECL, a subprogram
1889    body.  This routine needs to be invoked before processing the declarations
1890    appearing in the subprogram.  */
1891
1892 void
1893 begin_subprog_body (tree subprog_decl)
1894 {
1895   tree param_decl;
1896
1897   current_function_decl = subprog_decl;
1898   announce_function (subprog_decl);
1899
1900   /* Enter a new binding level and show that all the parameters belong to
1901      this function.  */
1902   gnat_pushlevel ();
1903   for (param_decl = DECL_ARGUMENTS (subprog_decl); param_decl;
1904        param_decl = TREE_CHAIN (param_decl))
1905     DECL_CONTEXT (param_decl) = subprog_decl;
1906
1907   make_decl_rtl (subprog_decl);
1908
1909   /* We handle pending sizes via the elaboration of types, so we don't need to
1910      save them.  This causes them to be marked as part of the outer function
1911      and then discarded.  */
1912   get_pending_sizes ();
1913 }
1914
1915
1916 /* Helper for the genericization callback.  Return a dereference of VAL
1917    if it is of a reference type.  */
1918
1919 static tree
1920 convert_from_reference (tree val)
1921 {
1922   tree value_type, ref;
1923
1924   if (TREE_CODE (TREE_TYPE (val)) != REFERENCE_TYPE)
1925     return val;
1926
1927   value_type =  TREE_TYPE (TREE_TYPE (val));
1928   ref = build1 (INDIRECT_REF, value_type, val);
1929
1930   /* See if what we reference is CONST or VOLATILE, which requires
1931      looking into array types to get to the component type.  */
1932
1933   while (TREE_CODE (value_type) == ARRAY_TYPE)
1934     value_type = TREE_TYPE (value_type);
1935
1936   TREE_READONLY (ref)
1937     = (TYPE_QUALS (value_type) & TYPE_QUAL_CONST);
1938   TREE_THIS_VOLATILE (ref)
1939     = (TYPE_QUALS (value_type) & TYPE_QUAL_VOLATILE);
1940
1941   TREE_SIDE_EFFECTS (ref)
1942     = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
1943
1944   return ref;
1945 }
1946
1947 /* Helper for the genericization callback.  Returns true if T denotes
1948    a RESULT_DECL with DECL_BY_REFERENCE set.  */
1949
1950 static inline bool
1951 is_byref_result (tree t)
1952 {
1953   return (TREE_CODE (t) == RESULT_DECL && DECL_BY_REFERENCE (t));
1954 }
1955
1956
1957 /* Tree walking callback for gnat_genericize. Currently ...
1958
1959    o Adjust references to the function's DECL_RESULT if it is marked
1960      DECL_BY_REFERENCE and so has had its type turned into a reference
1961      type at the end of the function compilation.  */
1962
1963 static tree
1964 gnat_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
1965 {
1966   /* This implementation is modeled after what the C++ front-end is
1967      doing, basis of the downstream passes behavior.  */
1968
1969   tree stmt = *stmt_p;
1970   struct pointer_set_t *p_set = (struct pointer_set_t*) data;
1971
1972   /* If we have a direct mention of the result decl, dereference.  */
1973   if (is_byref_result (stmt))
1974     {
1975       *stmt_p = convert_from_reference (stmt);
1976       *walk_subtrees = 0;
1977       return NULL;
1978     }
1979
1980   /* Otherwise, no need to walk the same tree twice.  */
1981   if (pointer_set_contains (p_set, stmt))
1982     {
1983       *walk_subtrees = 0;
1984       return NULL_TREE;
1985     }
1986
1987   /* If we are taking the address of what now is a reference, just get the
1988      reference value.  */
1989   if (TREE_CODE (stmt) == ADDR_EXPR
1990       && is_byref_result (TREE_OPERAND (stmt, 0)))
1991     {
1992       *stmt_p = convert (TREE_TYPE (stmt), TREE_OPERAND (stmt, 0));
1993       *walk_subtrees = 0;
1994     }
1995
1996   /* Don't dereference an by-reference RESULT_DECL inside a RETURN_EXPR.  */
1997   else if (TREE_CODE (stmt) == RETURN_EXPR
1998            && TREE_OPERAND (stmt, 0)
1999            && is_byref_result (TREE_OPERAND (stmt, 0)))
2000     *walk_subtrees = 0;
2001
2002   /* Don't look inside trees that cannot embed references of interest.  */
2003   else if (IS_TYPE_OR_DECL_P (stmt))
2004     *walk_subtrees = 0;
2005
2006   pointer_set_insert (p_set, *stmt_p);
2007
2008   return NULL;
2009 }
2010
2011 /* Perform lowering of Ada trees to GENERIC. In particular:
2012
2013    o Turn a DECL_BY_REFERENCE RESULT_DECL into a real by-reference decl
2014      and adjust all the references to this decl accordingly.  */
2015
2016 static void
2017 gnat_genericize (tree fndecl)
2018 {
2019   /* Prior to GCC 4, an explicit By_Reference result mechanism for a function
2020      was handled by simply setting TREE_ADDRESSABLE on the result type.
2021      Everything required to actually pass by invisible ref using the target
2022      mechanism (e.g. extra parameter) was handled at RTL expansion time.
2023
2024      This doesn't work with GCC 4 any more for several reasons.  First, the
2025      gimplification process might need the creation of temporaries of this
2026      type, and the gimplifier ICEs on such attempts.  Second, the middle-end
2027      now relies on a different attribute for such cases (DECL_BY_REFERENCE on
2028      RESULT/PARM_DECLs), and expects the user invisible by-reference-ness to
2029      be explicitly accounted for by the front-end in the function body.
2030
2031      We achieve the complete transformation in two steps:
2032
2033      1/ create_subprog_decl performs early attribute tweaks: it clears
2034         TREE_ADDRESSABLE from the result type and sets DECL_BY_REFERENCE on
2035         the result decl.  The former ensures that the bit isn't set in the GCC
2036         tree saved for the function, so prevents ICEs on temporary creation.
2037         The latter we use here to trigger the rest of the processing.
2038
2039      2/ This function performs the type transformation on the result decl
2040         and adjusts all the references to this decl from the function body
2041         accordingly.
2042
2043      Clearing TREE_ADDRESSABLE from the type differs from the C++ front-end
2044      strategy, which escapes the gimplifier temporary creation issues by
2045      creating it's own temporaries using TARGET_EXPR nodes.  Our way relies
2046      on simple specific support code in aggregate_value_p to look at the
2047      target function result decl explicitly.  */
2048
2049   struct pointer_set_t *p_set;
2050   tree decl_result = DECL_RESULT (fndecl);
2051
2052   if (!DECL_BY_REFERENCE (decl_result))
2053     return;
2054
2055   /* Make the DECL_RESULT explicitly by-reference and adjust all the
2056      occurrences in the function body using the common tree-walking facility.
2057      We want to see every occurrence of the result decl to adjust the
2058      referencing tree, so need to use our own pointer set to control which
2059      trees should be visited again or not.  */
2060
2061   p_set = pointer_set_create ();
2062
2063   TREE_TYPE (decl_result) = build_reference_type (TREE_TYPE (decl_result));
2064   TREE_ADDRESSABLE (decl_result) = 0;
2065   relayout_decl (decl_result);
2066
2067   walk_tree (&DECL_SAVED_TREE (fndecl), gnat_genericize_r, p_set, NULL);
2068
2069   pointer_set_destroy (p_set);
2070 }
2071
2072 /* Finish the definition of the current subprogram BODY and compile it all the
2073    way to assembler language output.  ELAB_P tells if this is called for an
2074    elaboration routine, to be entirely discarded if empty.  */
2075
2076 void
2077 end_subprog_body (tree body, bool elab_p)
2078 {
2079   tree fndecl = current_function_decl;
2080
2081   /* Mark the BLOCK for this level as being for this function and pop the
2082      level.  Since the vars in it are the parameters, clear them.  */
2083   BLOCK_VARS (current_binding_level->block) = 0;
2084   BLOCK_SUPERCONTEXT (current_binding_level->block) = fndecl;
2085   DECL_INITIAL (fndecl) = current_binding_level->block;
2086   gnat_poplevel ();
2087
2088   /* We handle pending sizes via the elaboration of types, so we don't
2089      need to save them.  */
2090   get_pending_sizes ();
2091
2092   /* Mark the RESULT_DECL as being in this subprogram. */
2093   DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
2094
2095   DECL_SAVED_TREE (fndecl) = body;
2096
2097   current_function_decl = DECL_CONTEXT (fndecl);
2098   set_cfun (NULL);
2099
2100   /* We cannot track the location of errors past this point.  */
2101   error_gnat_node = Empty;
2102
2103   /* If we're only annotating types, don't actually compile this function.  */
2104   if (type_annotate_only)
2105     return;
2106
2107   /* Perform the required pre-gimplification transformations on the tree.  */
2108   gnat_genericize (fndecl);
2109
2110   /* We do different things for nested and non-nested functions.
2111      ??? This should be in cgraph.  */
2112   if (!DECL_CONTEXT (fndecl))
2113     {
2114       gnat_gimplify_function (fndecl);
2115
2116       /* If this is an empty elaboration proc, just discard the node.
2117          Otherwise, compile further.  */
2118       if (elab_p && empty_body_p (gimple_body (fndecl)))
2119         cgraph_remove_node (cgraph_node (fndecl));
2120       else
2121         cgraph_finalize_function (fndecl, false);
2122     }
2123   else
2124     /* Register this function with cgraph just far enough to get it
2125        added to our parent's nested function list.  */
2126     (void) cgraph_node (fndecl);
2127 }
2128
2129 /* Convert FNDECL's code to GIMPLE and handle any nested functions.  */
2130
2131 static void
2132 gnat_gimplify_function (tree fndecl)
2133 {
2134   struct cgraph_node *cgn;
2135
2136   dump_function (TDI_original, fndecl);
2137   gimplify_function_tree (fndecl);
2138   dump_function (TDI_generic, fndecl);
2139
2140   /* Convert all nested functions to GIMPLE now.  We do things in this order
2141      so that items like VLA sizes are expanded properly in the context of the
2142      correct function.  */
2143   cgn = cgraph_node (fndecl);
2144   for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
2145     gnat_gimplify_function (cgn->decl);
2146 }
2147
2148 tree
2149 gnat_builtin_function (tree decl)
2150 {
2151   gnat_pushdecl (decl, Empty);
2152   return decl;
2153 }
2154
2155 /* Return an integer type with the number of bits of precision given by
2156    PRECISION.  UNSIGNEDP is nonzero if the type is unsigned; otherwise
2157    it is a signed type.  */
2158
2159 tree
2160 gnat_type_for_size (unsigned precision, int unsignedp)
2161 {
2162   tree t;
2163   char type_name[20];
2164
2165   if (precision <= 2 * MAX_BITS_PER_WORD
2166       && signed_and_unsigned_types[precision][unsignedp])
2167     return signed_and_unsigned_types[precision][unsignedp];
2168
2169  if (unsignedp)
2170     t = make_unsigned_type (precision);
2171   else
2172     t = make_signed_type (precision);
2173
2174   if (precision <= 2 * MAX_BITS_PER_WORD)
2175     signed_and_unsigned_types[precision][unsignedp] = t;
2176
2177   if (!TYPE_NAME (t))
2178     {
2179       sprintf (type_name, "%sSIGNED_%d", unsignedp ? "UN" : "", precision);
2180       TYPE_NAME (t) = get_identifier (type_name);
2181     }
2182
2183   return t;
2184 }
2185
2186 /* Likewise for floating-point types.  */
2187
2188 static tree
2189 float_type_for_precision (int precision, enum machine_mode mode)
2190 {
2191   tree t;
2192   char type_name[20];
2193
2194   if (float_types[(int) mode])
2195     return float_types[(int) mode];
2196
2197   float_types[(int) mode] = t = make_node (REAL_TYPE);
2198   TYPE_PRECISION (t) = precision;
2199   layout_type (t);
2200
2201   gcc_assert (TYPE_MODE (t) == mode);
2202   if (!TYPE_NAME (t))
2203     {
2204       sprintf (type_name, "FLOAT_%d", precision);
2205       TYPE_NAME (t) = get_identifier (type_name);
2206     }
2207
2208   return t;
2209 }
2210
2211 /* Return a data type that has machine mode MODE.  UNSIGNEDP selects
2212    an unsigned type; otherwise a signed type is returned.  */
2213
2214 tree
2215 gnat_type_for_mode (enum machine_mode mode, int unsignedp)
2216 {
2217   if (mode == BLKmode)
2218     return NULL_TREE;
2219   else if (mode == VOIDmode)
2220     return void_type_node;
2221   else if (COMPLEX_MODE_P (mode))
2222     return NULL_TREE;
2223   else if (SCALAR_FLOAT_MODE_P (mode))
2224     return float_type_for_precision (GET_MODE_PRECISION (mode), mode);
2225   else if (SCALAR_INT_MODE_P (mode))
2226     return gnat_type_for_size (GET_MODE_BITSIZE (mode), unsignedp);
2227   else
2228     return NULL_TREE;
2229 }
2230
2231 /* Return the unsigned version of a TYPE_NODE, a scalar type.  */
2232
2233 tree
2234 gnat_unsigned_type (tree type_node)
2235 {
2236   tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 1);
2237
2238   if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node))
2239     {
2240       type = copy_node (type);
2241       TREE_TYPE (type) = type_node;
2242     }
2243   else if (TREE_TYPE (type_node)
2244            && TREE_CODE (TREE_TYPE (type_node)) == INTEGER_TYPE
2245            && TYPE_MODULAR_P (TREE_TYPE (type_node)))
2246     {
2247       type = copy_node (type);
2248       TREE_TYPE (type) = TREE_TYPE (type_node);
2249     }
2250
2251   return type;
2252 }
2253
2254 /* Return the signed version of a TYPE_NODE, a scalar type.  */
2255
2256 tree
2257 gnat_signed_type (tree type_node)
2258 {
2259   tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 0);
2260
2261   if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node))
2262     {
2263       type = copy_node (type);
2264       TREE_TYPE (type) = type_node;
2265     }
2266   else if (TREE_TYPE (type_node)
2267            && TREE_CODE (TREE_TYPE (type_node)) == INTEGER_TYPE
2268            && TYPE_MODULAR_P (TREE_TYPE (type_node)))
2269     {
2270       type = copy_node (type);
2271       TREE_TYPE (type) = TREE_TYPE (type_node);
2272     }
2273
2274   return type;
2275 }
2276
2277 /* Return 1 if the types T1 and T2 are compatible, i.e. if they can be
2278    transparently converted to each other.  */
2279
2280 int
2281 gnat_types_compatible_p (tree t1, tree t2)
2282 {
2283   enum tree_code code;
2284
2285   /* This is the default criterion.  */
2286   if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
2287     return 1;
2288
2289   /* We only check structural equivalence here.  */
2290   if ((code = TREE_CODE (t1)) != TREE_CODE (t2))
2291     return 0;
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_IS_PADDING_P (t1) && TYPE_IS_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_IS_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, true);
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, true);
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_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, p_bounds_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_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, p_bounds_type, 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, false);
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, false);
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_FAT_OR_THIN_POINTER_P (thin_fat_ptr_type));
3561
3562   template_type
3563     = (TYPE_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_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       for (var = TYPE_MAIN_VARIANT (ptr); var; var = TYPE_NEXT_VARIANT (var))
3697         SET_TYPE_UNCONSTRAINED_ARRAY (var, new_type);
3698
3699       /* Now handle updating the allocation record, what the thin pointer
3700          points to.  Update all pointers from the old record into the new
3701          one, update the type of the array field, and recompute the size.  */
3702       update_pointer_to (TYPE_OBJECT_RECORD_TYPE (old_type), new_obj_rec);
3703
3704       TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec)))
3705         = TREE_TYPE (TREE_TYPE (array_field));
3706
3707       /* The size recomputation needs to account for alignment constraints, so
3708          we let layout_type work it out.  This will reset the field offsets to
3709          what they would be in a regular record, so we shift them back to what
3710          we want them to be for a thin pointer designated type afterwards.  */
3711       DECL_SIZE (TYPE_FIELDS (new_obj_rec)) = 0;
3712       DECL_SIZE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec))) = 0;
3713       TYPE_SIZE (new_obj_rec) = 0;
3714       layout_type (new_obj_rec);
3715
3716       shift_unc_components_for_thin_pointers (new_obj_rec);
3717
3718       /* We are done, at last.  */
3719       rest_of_record_type_compilation (ptr);
3720     }
3721 }
3722 \f
3723 /* Convert EXPR, a pointer to a constrained array, into a pointer to an
3724    unconstrained one.  This involves making or finding a template.  */
3725
3726 static tree
3727 convert_to_fat_pointer (tree type, tree expr)
3728 {
3729   tree template_type = TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type))));
3730   tree p_array_type = TREE_TYPE (TYPE_FIELDS (type));
3731   tree etype = TREE_TYPE (expr);
3732   tree template_tree;
3733
3734   /* If EXPR is null, make a fat pointer that contains null pointers to the
3735      template and array.  */
3736   if (integer_zerop (expr))
3737     return
3738       gnat_build_constructor
3739         (type,
3740          tree_cons (TYPE_FIELDS (type),
3741                     convert (p_array_type, expr),
3742                     tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3743                                convert (build_pointer_type (template_type),
3744                                         expr),
3745                                NULL_TREE)));
3746
3747   /* If EXPR is a thin pointer, make template and data from the record..  */
3748   else if (TYPE_THIN_POINTER_P (etype))
3749     {
3750       tree fields = TYPE_FIELDS (TREE_TYPE (etype));
3751
3752       expr = save_expr (expr);
3753       if (TREE_CODE (expr) == ADDR_EXPR)
3754         expr = TREE_OPERAND (expr, 0);
3755       else
3756         expr = build1 (INDIRECT_REF, TREE_TYPE (etype), expr);
3757
3758       template_tree = build_component_ref (expr, NULL_TREE, fields, false);
3759       expr = build_unary_op (ADDR_EXPR, NULL_TREE,
3760                              build_component_ref (expr, NULL_TREE,
3761                                                   TREE_CHAIN (fields), false));
3762     }
3763
3764   /* Otherwise, build the constructor for the template.  */
3765   else
3766     template_tree = build_template (template_type, TREE_TYPE (etype), expr);
3767
3768   /* The final result is a constructor for the fat pointer.
3769
3770      If EXPR is an argument of a foreign convention subprogram, the type it
3771      points to is directly the component type.  In this case, the expression
3772      type may not match the corresponding FIELD_DECL type at this point, so we
3773      call "convert" here to fix that up if necessary.  This type consistency is
3774      required, for instance because it ensures that possible later folding of
3775      COMPONENT_REFs against this constructor always yields something of the
3776      same type as the initial reference.
3777
3778      Note that the call to "build_template" above is still fine because it
3779      will only refer to the provided TEMPLATE_TYPE in this case.  */
3780   return
3781     gnat_build_constructor
3782       (type,
3783        tree_cons (TYPE_FIELDS (type),
3784                   convert (p_array_type, expr),
3785                   tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3786                              build_unary_op (ADDR_EXPR, NULL_TREE,
3787                                              template_tree),
3788                              NULL_TREE)));
3789 }
3790 \f
3791 /* Convert to a thin pointer type, TYPE.  The only thing we know how to convert
3792    is something that is a fat pointer, so convert to it first if it EXPR
3793    is not already a fat pointer.  */
3794
3795 static tree
3796 convert_to_thin_pointer (tree type, tree expr)
3797 {
3798   if (!TYPE_FAT_POINTER_P (TREE_TYPE (expr)))
3799     expr
3800       = convert_to_fat_pointer
3801         (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type))), expr);
3802
3803   /* We get the pointer to the data and use a NOP_EXPR to make it the
3804      proper GCC type.  */
3805   expr = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (TREE_TYPE (expr)),
3806                               false);
3807   expr = build1 (NOP_EXPR, type, expr);
3808
3809   return expr;
3810 }
3811 \f
3812 /* Create an expression whose value is that of EXPR,
3813    converted to type TYPE.  The TREE_TYPE of the value
3814    is always TYPE.  This function implements all reasonable
3815    conversions; callers should filter out those that are
3816    not permitted by the language being compiled.  */
3817
3818 tree
3819 convert (tree type, tree expr)
3820 {
3821   enum tree_code code = TREE_CODE (type);
3822   tree etype = TREE_TYPE (expr);
3823   enum tree_code ecode = TREE_CODE (etype);
3824
3825   /* If EXPR is already the right type, we are done.  */
3826   if (type == etype)
3827     return expr;
3828
3829   /* If both input and output have padding and are of variable size, do this
3830      as an unchecked conversion.  Likewise if one is a mere variant of the
3831      other, so we avoid a pointless unpad/repad sequence.  */
3832   else if (code == RECORD_TYPE && ecode == RECORD_TYPE
3833            && TYPE_IS_PADDING_P (type) && TYPE_IS_PADDING_P (etype)
3834            && (!TREE_CONSTANT (TYPE_SIZE (type))
3835                || !TREE_CONSTANT (TYPE_SIZE (etype))
3836                || gnat_types_compatible_p (type, etype)
3837                || TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type)))
3838                   == TYPE_NAME (TREE_TYPE (TYPE_FIELDS (etype)))))
3839     ;
3840
3841   /* If the output type has padding, convert to the inner type and
3842      make a constructor to build the record.  */
3843   else if (code == RECORD_TYPE && TYPE_IS_PADDING_P (type))
3844     {
3845       /* If we previously converted from another type and our type is
3846          of variable size, remove the conversion to avoid the need for
3847          variable-size temporaries.  Likewise for a conversion between
3848          original and packable version.  */
3849       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
3850           && (!TREE_CONSTANT (TYPE_SIZE (type))
3851               || (ecode == RECORD_TYPE
3852                   && TYPE_NAME (etype)
3853                      == TYPE_NAME (TREE_TYPE (TREE_OPERAND (expr, 0))))))
3854         expr = TREE_OPERAND (expr, 0);
3855
3856       /* If we are just removing the padding from expr, convert the original
3857          object if we have variable size in order to avoid the need for some
3858          variable-size temporaries.  Likewise if the padding is a mere variant
3859          of the other, so we avoid a pointless unpad/repad sequence.  */
3860       if (TREE_CODE (expr) == COMPONENT_REF
3861           && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE
3862           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (expr, 0)))
3863           && (!TREE_CONSTANT (TYPE_SIZE (type))
3864               || gnat_types_compatible_p (type,
3865                                           TREE_TYPE (TREE_OPERAND (expr, 0)))
3866               || (ecode == RECORD_TYPE
3867                   && TYPE_NAME (etype)
3868                      == TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type))))))
3869         return convert (type, TREE_OPERAND (expr, 0));
3870
3871       /* If the result type is a padded type with a self-referentially-sized
3872          field and the expression type is a record, do this as an
3873          unchecked conversion.  */
3874       else if (TREE_CODE (etype) == RECORD_TYPE
3875                && CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type))))
3876         return unchecked_convert (type, expr, false);
3877
3878       else
3879         return
3880           gnat_build_constructor (type,
3881                              tree_cons (TYPE_FIELDS (type),
3882                                         convert (TREE_TYPE
3883                                                  (TYPE_FIELDS (type)),
3884                                                  expr),
3885                                         NULL_TREE));
3886     }
3887
3888   /* If the input type has padding, remove it and convert to the output type.
3889      The conditions ordering is arranged to ensure that the output type is not
3890      a padding type here, as it is not clear whether the conversion would
3891      always be correct if this was to happen.  */
3892   else if (ecode == RECORD_TYPE && TYPE_IS_PADDING_P (etype))
3893     {
3894       tree unpadded;
3895
3896       /* If we have just converted to this padded type, just get the
3897          inner expression.  */
3898       if (TREE_CODE (expr) == CONSTRUCTOR
3899           && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (expr))
3900           && VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->index
3901              == TYPE_FIELDS (etype))
3902         unpadded
3903           = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->value;
3904
3905       /* Otherwise, build an explicit component reference.  */
3906       else
3907         unpadded
3908           = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (etype), false);
3909
3910       return convert (type, unpadded);
3911     }
3912
3913   /* If the input is a biased type, adjust first.  */
3914   if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype))
3915     return convert (type, fold_build2 (PLUS_EXPR, TREE_TYPE (etype),
3916                                        fold_convert (TREE_TYPE (etype),
3917                                                      expr),
3918                                        TYPE_MIN_VALUE (etype)));
3919
3920   /* If the input is a justified modular type, we need to extract the actual
3921      object before converting it to any other type with the exceptions of an
3922      unconstrained array or of a mere type variant.  It is useful to avoid the
3923      extraction and conversion in the type variant case because it could end
3924      up replacing a VAR_DECL expr by a constructor and we might be about the
3925      take the address of the result.  */
3926   if (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)
3927       && code != UNCONSTRAINED_ARRAY_TYPE
3928       && TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (etype))
3929     return convert (type, build_component_ref (expr, NULL_TREE,
3930                                                TYPE_FIELDS (etype), false));
3931
3932   /* If converting to a type that contains a template, convert to the data
3933      type and then build the template. */
3934   if (code == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (type))
3935     {
3936       tree obj_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type)));
3937
3938       /* If the source already has a template, get a reference to the
3939          associated array only, as we are going to rebuild a template
3940          for the target type anyway.  */
3941       expr = maybe_unconstrained_array (expr);
3942
3943       return
3944         gnat_build_constructor
3945           (type,
3946            tree_cons (TYPE_FIELDS (type),
3947                       build_template (TREE_TYPE (TYPE_FIELDS (type)),
3948                                       obj_type, NULL_TREE),
3949                       tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3950                                  convert (obj_type, expr), NULL_TREE)));
3951     }
3952
3953   /* There are some special cases of expressions that we process
3954      specially.  */
3955   switch (TREE_CODE (expr))
3956     {
3957     case ERROR_MARK:
3958       return expr;
3959
3960     case NULL_EXPR:
3961       /* Just set its type here.  For TRANSFORM_EXPR, we will do the actual
3962          conversion in gnat_expand_expr.  NULL_EXPR does not represent
3963          and actual value, so no conversion is needed.  */
3964       expr = copy_node (expr);
3965       TREE_TYPE (expr) = type;
3966       return expr;
3967
3968     case STRING_CST:
3969       /* If we are converting a STRING_CST to another constrained array type,
3970          just make a new one in the proper type.  */
3971       if (code == ecode && AGGREGATE_TYPE_P (etype)
3972           && !(TREE_CODE (TYPE_SIZE (etype)) == INTEGER_CST
3973                && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
3974         {
3975           expr = copy_node (expr);
3976           TREE_TYPE (expr) = type;
3977           return expr;
3978         }
3979       break;
3980
3981     case CONSTRUCTOR:
3982       /* If we are converting a CONSTRUCTOR to a mere variant type, just make
3983          a new one in the proper type.  */
3984       if (code == ecode && gnat_types_compatible_p (type, etype))
3985         {
3986           expr = copy_node (expr);
3987           TREE_TYPE (expr) = type;
3988           return expr;
3989         }
3990
3991       /* Likewise for a conversion between original and packable version, but
3992          we have to work harder in order to preserve type consistency.  */
3993       if (code == ecode
3994           && code == RECORD_TYPE
3995           && TYPE_NAME (type) == TYPE_NAME (etype))
3996         {
3997           VEC(constructor_elt,gc) *e = CONSTRUCTOR_ELTS (expr);
3998           unsigned HOST_WIDE_INT len = VEC_length (constructor_elt, e);
3999           VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, len);
4000           tree efield = TYPE_FIELDS (etype), field = TYPE_FIELDS (type);
4001           unsigned HOST_WIDE_INT idx;
4002           tree index, value;
4003
4004           /* Whether we need to clear TREE_CONSTANT et al. on the output
4005              constructor when we convert in place.  */
4006           bool clear_constant = false;
4007
4008           FOR_EACH_CONSTRUCTOR_ELT(e, idx, index, value)
4009             {
4010               constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
4011               /* We expect only simple constructors.  Otherwise, punt.  */
4012               if (!(index == efield || index == DECL_ORIGINAL_FIELD (efield)))
4013                 break;
4014               elt->index = field;
4015               elt->value = convert (TREE_TYPE (field), value);
4016
4017               /* If packing has made this field a bitfield and the input
4018                  value couldn't be emitted statically any more, we need to
4019                  clear TREE_CONSTANT on our output.  */
4020               if (!clear_constant && TREE_CONSTANT (expr)
4021                   && !CONSTRUCTOR_BITFIELD_P (efield)
4022                   && CONSTRUCTOR_BITFIELD_P (field)
4023                   && !initializer_constant_valid_for_bitfield_p (value))
4024                 clear_constant = true;
4025
4026               efield = TREE_CHAIN (efield);
4027               field = TREE_CHAIN (field);
4028             }
4029
4030           /* If we have been able to match and convert all the input fields
4031              to their output type, convert in place now.  We'll fallback to a
4032              view conversion downstream otherwise.  */
4033           if (idx == len)
4034             {
4035               expr = copy_node (expr);
4036               TREE_TYPE (expr) = type;
4037               CONSTRUCTOR_ELTS (expr) = v;
4038               if (clear_constant)
4039                 TREE_CONSTANT (expr) = TREE_STATIC (expr) = false;
4040               return expr;
4041             }
4042         }
4043       break;
4044
4045     case UNCONSTRAINED_ARRAY_REF:
4046       /* Convert this to the type of the inner array by getting the address of
4047          the array from the template.  */
4048       expr = build_unary_op (INDIRECT_REF, NULL_TREE,
4049                              build_component_ref (TREE_OPERAND (expr, 0),
4050                                                   get_identifier ("P_ARRAY"),
4051                                                   NULL_TREE, false));
4052       etype = TREE_TYPE (expr);
4053       ecode = TREE_CODE (etype);
4054       break;
4055
4056     case VIEW_CONVERT_EXPR:
4057       {
4058         /* GCC 4.x is very sensitive to type consistency overall, and view
4059            conversions thus are very frequent.  Even though just "convert"ing
4060            the inner operand to the output type is fine in most cases, it
4061            might expose unexpected input/output type mismatches in special
4062            circumstances so we avoid such recursive calls when we can.  */
4063         tree op0 = TREE_OPERAND (expr, 0);
4064
4065         /* If we are converting back to the original type, we can just
4066            lift the input conversion.  This is a common occurrence with
4067            switches back-and-forth amongst type variants.  */
4068         if (type == TREE_TYPE (op0))
4069           return op0;
4070
4071         /* Otherwise, if we're converting between two aggregate types, we
4072            might be allowed to substitute the VIEW_CONVERT_EXPR target type
4073            in place or to just convert the inner expression.  */
4074         if (AGGREGATE_TYPE_P (type) && AGGREGATE_TYPE_P (etype))
4075           {
4076             /* If we are converting between mere variants, we can just
4077                substitute the VIEW_CONVERT_EXPR in place.  */
4078             if (gnat_types_compatible_p (type, etype))
4079               return build1 (VIEW_CONVERT_EXPR, type, op0);
4080
4081             /* Otherwise, we may just bypass the input view conversion unless
4082                one of the types is a fat pointer,  which is handled by
4083                specialized code below which relies on exact type matching.  */
4084             else if (!TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
4085               return convert (type, op0);
4086           }
4087       }
4088       break;
4089
4090     case INDIRECT_REF:
4091       /* If both types are record types, just convert the pointer and
4092          make a new INDIRECT_REF.
4093
4094          ??? Disable this for now since it causes problems with the
4095          code in build_binary_op for MODIFY_EXPR which wants to
4096          strip off conversions.  But that code really is a mess and
4097          we need to do this a much better way some time.  */
4098       if (0
4099           && (TREE_CODE (type) == RECORD_TYPE
4100               || TREE_CODE (type) == UNION_TYPE)
4101           && (TREE_CODE (etype) == RECORD_TYPE
4102               || TREE_CODE (etype) == UNION_TYPE)
4103           && !TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
4104         return build_unary_op (INDIRECT_REF, NULL_TREE,
4105                                convert (build_pointer_type (type),
4106                                         TREE_OPERAND (expr, 0)));
4107       break;
4108
4109     default:
4110       break;
4111     }
4112
4113   /* Check for converting to a pointer to an unconstrained array.  */
4114   if (TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
4115     return convert_to_fat_pointer (type, expr);
4116
4117   /* If we are converting between two aggregate types that are mere
4118      variants, just make a VIEW_CONVERT_EXPR.  */
4119   else if (code == ecode
4120            && AGGREGATE_TYPE_P (type)
4121            && gnat_types_compatible_p (type, etype))
4122     return build1 (VIEW_CONVERT_EXPR, type, expr);
4123
4124   /* In all other cases of related types, make a NOP_EXPR.  */
4125   else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype)
4126            || (code == INTEGER_CST && ecode == INTEGER_CST
4127                && (type == TREE_TYPE (etype) || etype == TREE_TYPE (type))))
4128     return fold_convert (type, expr);
4129
4130   switch (code)
4131     {
4132     case VOID_TYPE:
4133       return fold_build1 (CONVERT_EXPR, type, expr);
4134
4135     case INTEGER_TYPE:
4136       if (TYPE_HAS_ACTUAL_BOUNDS_P (type)
4137           && (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE
4138               || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))))
4139         return unchecked_convert (type, expr, false);
4140       else if (TYPE_BIASED_REPRESENTATION_P (type))
4141         return fold_convert (type,
4142                              fold_build2 (MINUS_EXPR, TREE_TYPE (type),
4143                                           convert (TREE_TYPE (type), expr),
4144                                           TYPE_MIN_VALUE (type)));
4145
4146       /* ... fall through ... */
4147
4148     case ENUMERAL_TYPE:
4149     case BOOLEAN_TYPE:
4150       /* If we are converting an additive expression to an integer type
4151          with lower precision, be wary of the optimization that can be
4152          applied by convert_to_integer.  There are 2 problematic cases:
4153            - if the first operand was originally of a biased type,
4154              because we could be recursively called to convert it
4155              to an intermediate type and thus rematerialize the
4156              additive operator endlessly,
4157            - if the expression contains a placeholder, because an
4158              intermediate conversion that changes the sign could
4159              be inserted and thus introduce an artificial overflow
4160              at compile time when the placeholder is substituted.  */
4161       if (code == INTEGER_TYPE
4162           && ecode == INTEGER_TYPE
4163           && TYPE_PRECISION (type) < TYPE_PRECISION (etype)
4164           && (TREE_CODE (expr) == PLUS_EXPR || TREE_CODE (expr) == MINUS_EXPR))
4165         {
4166           tree op0 = get_unwidened (TREE_OPERAND (expr, 0), type);
4167
4168           if ((TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
4169                && TYPE_BIASED_REPRESENTATION_P (TREE_TYPE (op0)))
4170               || CONTAINS_PLACEHOLDER_P (expr))
4171             return build1 (NOP_EXPR, type, expr);
4172         }
4173
4174       return fold (convert_to_integer (type, expr));
4175
4176     case POINTER_TYPE:
4177     case REFERENCE_TYPE:
4178       /* If converting between two pointers to records denoting
4179          both a template and type, adjust if needed to account
4180          for any differing offsets, since one might be negative.  */
4181       if (TYPE_THIN_POINTER_P (etype) && TYPE_THIN_POINTER_P (type))
4182         {
4183           tree bit_diff
4184             = size_diffop (bit_position (TYPE_FIELDS (TREE_TYPE (etype))),
4185                            bit_position (TYPE_FIELDS (TREE_TYPE (type))));
4186           tree byte_diff = size_binop (CEIL_DIV_EXPR, bit_diff,
4187                                        sbitsize_int (BITS_PER_UNIT));
4188
4189           expr = build1 (NOP_EXPR, type, expr);
4190           TREE_CONSTANT (expr) = TREE_CONSTANT (TREE_OPERAND (expr, 0));
4191           if (integer_zerop (byte_diff))
4192             return expr;
4193
4194           return build_binary_op (POINTER_PLUS_EXPR, type, expr,
4195                                   fold (convert (sizetype, byte_diff)));
4196         }
4197
4198       /* If converting to a thin pointer, handle specially.  */
4199       if (TYPE_THIN_POINTER_P (type)
4200           && TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)))
4201         return convert_to_thin_pointer (type, expr);
4202
4203       /* If converting fat pointer to normal pointer, get the pointer to the
4204          array and then convert it.  */
4205       else if (TYPE_FAT_POINTER_P (etype))
4206         expr = build_component_ref (expr, get_identifier ("P_ARRAY"),
4207                                     NULL_TREE, false);
4208
4209       return fold (convert_to_pointer (type, expr));
4210
4211     case REAL_TYPE:
4212       return fold (convert_to_real (type, expr));
4213
4214     case RECORD_TYPE:
4215       if (TYPE_JUSTIFIED_MODULAR_P (type) && !AGGREGATE_TYPE_P (etype))
4216         return
4217           gnat_build_constructor
4218             (type, tree_cons (TYPE_FIELDS (type),
4219                               convert (TREE_TYPE (TYPE_FIELDS (type)), expr),
4220                               NULL_TREE));
4221
4222       /* ... fall through ... */
4223
4224     case ARRAY_TYPE:
4225       /* In these cases, assume the front-end has validated the conversion.
4226          If the conversion is valid, it will be a bit-wise conversion, so
4227          it can be viewed as an unchecked conversion.  */
4228       return unchecked_convert (type, expr, false);
4229
4230     case UNION_TYPE:
4231       /* This is a either a conversion between a tagged type and some
4232          subtype, which we have to mark as a UNION_TYPE because of
4233          overlapping fields or a conversion of an Unchecked_Union.  */
4234       return unchecked_convert (type, expr, false);
4235
4236     case UNCONSTRAINED_ARRAY_TYPE:
4237       /* If EXPR is a constrained array, take its address, convert it to a
4238          fat pointer, and then dereference it.  Likewise if EXPR is a
4239          record containing both a template and a constrained array.
4240          Note that a record representing a justified modular type
4241          always represents a packed constrained array.  */
4242       if (ecode == ARRAY_TYPE
4243           || (ecode == INTEGER_TYPE && TYPE_HAS_ACTUAL_BOUNDS_P (etype))
4244           || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))
4245           || (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)))
4246         return
4247           build_unary_op
4248             (INDIRECT_REF, NULL_TREE,
4249              convert_to_fat_pointer (TREE_TYPE (type),
4250                                      build_unary_op (ADDR_EXPR,
4251                                                      NULL_TREE, expr)));
4252
4253       /* Do something very similar for converting one unconstrained
4254          array to another.  */
4255       else if (ecode == UNCONSTRAINED_ARRAY_TYPE)
4256         return
4257           build_unary_op (INDIRECT_REF, NULL_TREE,
4258                           convert (TREE_TYPE (type),
4259                                    build_unary_op (ADDR_EXPR,
4260                                                    NULL_TREE, expr)));
4261       else
4262         gcc_unreachable ();
4263
4264     case COMPLEX_TYPE:
4265       return fold (convert_to_complex (type, expr));
4266
4267     default:
4268       gcc_unreachable ();
4269     }
4270 }
4271 \f
4272 /* Remove all conversions that are done in EXP.  This includes converting
4273    from a padded type or to a justified modular type.  If TRUE_ADDRESS
4274    is true, always return the address of the containing object even if
4275    the address is not bit-aligned.  */
4276
4277 tree
4278 remove_conversions (tree exp, bool true_address)
4279 {
4280   switch (TREE_CODE (exp))
4281     {
4282     case CONSTRUCTOR:
4283       if (true_address
4284           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
4285           && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (exp)))
4286         return
4287           remove_conversions (VEC_index (constructor_elt,
4288                                          CONSTRUCTOR_ELTS (exp), 0)->value,
4289                               true);
4290       break;
4291
4292     case COMPONENT_REF:
4293       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == RECORD_TYPE
4294           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
4295         return remove_conversions (TREE_OPERAND (exp, 0), true_address);
4296       break;
4297
4298     case VIEW_CONVERT_EXPR:  case NON_LVALUE_EXPR:
4299     CASE_CONVERT:
4300       return remove_conversions (TREE_OPERAND (exp, 0), true_address);
4301
4302     default:
4303       break;
4304     }
4305
4306   return exp;
4307 }
4308 \f
4309 /* If EXP's type is an UNCONSTRAINED_ARRAY_TYPE, return an expression that
4310    refers to the underlying array.  If its type has TYPE_CONTAINS_TEMPLATE_P,
4311    likewise return an expression pointing to the underlying array.  */
4312
4313 tree
4314 maybe_unconstrained_array (tree exp)
4315 {
4316   enum tree_code code = TREE_CODE (exp);
4317   tree new_exp;
4318
4319   switch (TREE_CODE (TREE_TYPE (exp)))
4320     {
4321     case UNCONSTRAINED_ARRAY_TYPE:
4322       if (code == UNCONSTRAINED_ARRAY_REF)
4323         {
4324           new_exp
4325             = build_unary_op (INDIRECT_REF, NULL_TREE,
4326                               build_component_ref (TREE_OPERAND (exp, 0),
4327                                                    get_identifier ("P_ARRAY"),
4328                                                    NULL_TREE, false));
4329           TREE_READONLY (new_exp) = TREE_STATIC (new_exp)
4330             = TREE_READONLY (exp);
4331           return new_exp;
4332         }
4333
4334       else if (code == NULL_EXPR)
4335         return build1 (NULL_EXPR,
4336                        TREE_TYPE (TREE_TYPE (TYPE_FIELDS
4337                                              (TREE_TYPE (TREE_TYPE (exp))))),
4338                        TREE_OPERAND (exp, 0));
4339
4340     case RECORD_TYPE:
4341       /* If this is a padded type, convert to the unpadded type and see if
4342          it contains a template.  */
4343       if (TYPE_IS_PADDING_P (TREE_TYPE (exp)))
4344         {
4345           new_exp = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
4346           if (TREE_CODE (TREE_TYPE (new_exp)) == RECORD_TYPE
4347               && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new_exp)))
4348             return
4349               build_component_ref (new_exp, NULL_TREE,
4350                                    TREE_CHAIN
4351                                    (TYPE_FIELDS (TREE_TYPE (new_exp))),
4352                                    0);
4353         }
4354       else if (TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (exp)))
4355         return
4356           build_component_ref (exp, NULL_TREE,
4357                                TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (exp))), 0);
4358       break;
4359
4360     default:
4361       break;
4362     }
4363
4364   return exp;
4365 }
4366 \f
4367 /* Return true if EXPR is an expression that can be folded as an operand
4368    of a VIEW_CONVERT_EXPR.  See ada-tree.h for a complete rationale.  */
4369
4370 static bool
4371 can_fold_for_view_convert_p (tree expr)
4372 {
4373   tree t1, t2;
4374
4375   /* The folder will fold NOP_EXPRs between integral types with the same
4376      precision (in the middle-end's sense).  We cannot allow it if the
4377      types don't have the same precision in the Ada sense as well.  */
4378   if (TREE_CODE (expr) != NOP_EXPR)
4379     return true;
4380
4381   t1 = TREE_TYPE (expr);
4382   t2 = TREE_TYPE (TREE_OPERAND (expr, 0));
4383
4384   /* Defer to the folder for non-integral conversions.  */
4385   if (!(INTEGRAL_TYPE_P (t1) && INTEGRAL_TYPE_P (t2)))
4386     return true;
4387
4388   /* Only fold conversions that preserve both precisions.  */
4389   if (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
4390       && operand_equal_p (rm_size (t1), rm_size (t2), 0))
4391     return true;
4392
4393   return false;
4394 }
4395
4396 /* Return an expression that does an unchecked conversion of EXPR to TYPE.
4397    If NOTRUNC_P is true, truncation operations should be suppressed.
4398
4399    Special care is required with (source or target) integral types whose
4400    precision is not equal to their size, to make sure we fetch or assign
4401    the value bits whose location might depend on the endianness, e.g.
4402
4403      Rmsize : constant := 8;
4404      subtype Int is Integer range 0 .. 2 ** Rmsize - 1;
4405
4406      type Bit_Array is array (1 .. Rmsize) of Boolean;
4407      pragma Pack (Bit_Array);
4408
4409      function To_Bit_Array is new Unchecked_Conversion (Int, Bit_Array);
4410
4411      Value : Int := 2#1000_0001#;
4412      Vbits : Bit_Array := To_Bit_Array (Value);
4413
4414    we expect the 8 bits at Vbits'Address to always contain Value, while
4415    their original location depends on the endianness, at Value'Address
4416    on a little-endian architecture but not on a big-endian one.  */
4417
4418 tree
4419 unchecked_convert (tree type, tree expr, bool notrunc_p)
4420 {
4421   tree etype = TREE_TYPE (expr);
4422
4423   /* If the expression is already the right type, we are done.  */
4424   if (etype == type)
4425     return expr;
4426
4427   /* If both types types are integral just do a normal conversion.
4428      Likewise for a conversion to an unconstrained array.  */
4429   if ((((INTEGRAL_TYPE_P (type)
4430          && !(TREE_CODE (type) == INTEGER_TYPE
4431               && TYPE_VAX_FLOATING_POINT_P (type)))
4432         || (POINTER_TYPE_P (type) && ! TYPE_THIN_POINTER_P (type))
4433         || (TREE_CODE (type) == RECORD_TYPE
4434             && TYPE_JUSTIFIED_MODULAR_P (type)))
4435        && ((INTEGRAL_TYPE_P (etype)
4436             && !(TREE_CODE (etype) == INTEGER_TYPE
4437                  && TYPE_VAX_FLOATING_POINT_P (etype)))
4438            || (POINTER_TYPE_P (etype) && !TYPE_THIN_POINTER_P (etype))
4439            || (TREE_CODE (etype) == RECORD_TYPE
4440                && TYPE_JUSTIFIED_MODULAR_P (etype))))
4441       || TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
4442     {
4443       if (TREE_CODE (etype) == INTEGER_TYPE
4444           && TYPE_BIASED_REPRESENTATION_P (etype))
4445         {
4446           tree ntype = copy_type (etype);
4447           TYPE_BIASED_REPRESENTATION_P (ntype) = 0;
4448           TYPE_MAIN_VARIANT (ntype) = ntype;
4449           expr = build1 (NOP_EXPR, ntype, expr);
4450         }
4451
4452       if (TREE_CODE (type) == INTEGER_TYPE
4453           && TYPE_BIASED_REPRESENTATION_P (type))
4454         {
4455           tree rtype = copy_type (type);
4456           TYPE_BIASED_REPRESENTATION_P (rtype) = 0;
4457           TYPE_MAIN_VARIANT (rtype) = rtype;
4458           expr = convert (rtype, expr);
4459           expr = build1 (NOP_EXPR, type, expr);
4460         }
4461       else
4462         expr = convert (type, expr);
4463     }
4464
4465   /* If we are converting to an integral type whose precision is not equal
4466      to its size, first unchecked convert to a record that contains an
4467      object of the output type.  Then extract the field. */
4468   else if (INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
4469            && 0 != compare_tree_int (TYPE_RM_SIZE (type),
4470                                      GET_MODE_BITSIZE (TYPE_MODE (type))))
4471     {
4472       tree rec_type = make_node (RECORD_TYPE);
4473       tree field = create_field_decl (get_identifier ("OBJ"), type,
4474                                       rec_type, 1, 0, 0, 0);
4475
4476       TYPE_FIELDS (rec_type) = field;
4477       layout_type (rec_type);
4478
4479       expr = unchecked_convert (rec_type, expr, notrunc_p);
4480       expr = build_component_ref (expr, NULL_TREE, field, 0);
4481     }
4482
4483   /* Similarly if we are converting from an integral type whose precision
4484      is not equal to its size.  */
4485   else if (INTEGRAL_TYPE_P (etype) && TYPE_RM_SIZE (etype)
4486       && 0 != compare_tree_int (TYPE_RM_SIZE (etype),
4487                                 GET_MODE_BITSIZE (TYPE_MODE (etype))))
4488     {
4489       tree rec_type = make_node (RECORD_TYPE);
4490       tree field
4491         = create_field_decl (get_identifier ("OBJ"), etype, rec_type,
4492                              1, 0, 0, 0);
4493
4494       TYPE_FIELDS (rec_type) = field;
4495       layout_type (rec_type);
4496
4497       expr = gnat_build_constructor (rec_type, build_tree_list (field, expr));
4498       expr = unchecked_convert (type, expr, notrunc_p);
4499     }
4500
4501   /* We have a special case when we are converting between two
4502      unconstrained array types.  In that case, take the address,
4503      convert the fat pointer types, and dereference.  */
4504   else if (TREE_CODE (etype) == UNCONSTRAINED_ARRAY_TYPE
4505            && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
4506     expr = build_unary_op (INDIRECT_REF, NULL_TREE,
4507                            build1 (VIEW_CONVERT_EXPR, TREE_TYPE (type),
4508                                    build_unary_op (ADDR_EXPR, NULL_TREE,
4509                                                    expr)));
4510   else
4511     {
4512       expr = maybe_unconstrained_array (expr);
4513       etype = TREE_TYPE (expr);
4514       if (can_fold_for_view_convert_p (expr))
4515         expr = fold_build1 (VIEW_CONVERT_EXPR, type, expr);
4516       else
4517         expr = build1 (VIEW_CONVERT_EXPR, type, expr);
4518     }
4519
4520   /* If the result is an integral type whose precision is not equal to its
4521      size, sign- or zero-extend the result.  We need not do this if the input
4522      is an integral type of the same precision and signedness or if the output
4523      is a biased type or if both the input and output are unsigned.  */
4524   if (!notrunc_p
4525       && INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
4526       && !(TREE_CODE (type) == INTEGER_TYPE
4527            && TYPE_BIASED_REPRESENTATION_P (type))
4528       && 0 != compare_tree_int (TYPE_RM_SIZE (type),
4529                                 GET_MODE_BITSIZE (TYPE_MODE (type)))
4530       && !(INTEGRAL_TYPE_P (etype)
4531            && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (etype)
4532            && operand_equal_p (TYPE_RM_SIZE (type),
4533                                (TYPE_RM_SIZE (etype) != 0
4534                                 ? TYPE_RM_SIZE (etype) : TYPE_SIZE (etype)),
4535                                0))
4536       && !(TYPE_UNSIGNED (type) && TYPE_UNSIGNED (etype)))
4537     {
4538       tree base_type = gnat_type_for_mode (TYPE_MODE (type),
4539                                            TYPE_UNSIGNED (type));
4540       tree shift_expr
4541         = convert (base_type,
4542                    size_binop (MINUS_EXPR,
4543                                bitsize_int
4544                                (GET_MODE_BITSIZE (TYPE_MODE (type))),
4545                                TYPE_RM_SIZE (type)));
4546       expr
4547         = convert (type,
4548                    build_binary_op (RSHIFT_EXPR, base_type,
4549                                     build_binary_op (LSHIFT_EXPR, base_type,
4550                                                      convert (base_type, expr),
4551                                                      shift_expr),
4552                                     shift_expr));
4553     }
4554
4555   /* An unchecked conversion should never raise Constraint_Error.  The code
4556      below assumes that GCC's conversion routines overflow the same way that
4557      the underlying hardware does.  This is probably true.  In the rare case
4558      when it is false, we can rely on the fact that such conversions are
4559      erroneous anyway.  */
4560   if (TREE_CODE (expr) == INTEGER_CST)
4561     TREE_OVERFLOW (expr) = 0;
4562
4563   /* If the sizes of the types differ and this is an VIEW_CONVERT_EXPR,
4564      show no longer constant.  */
4565   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
4566       && !operand_equal_p (TYPE_SIZE_UNIT (type), TYPE_SIZE_UNIT (etype),
4567                            OEP_ONLY_CONST))
4568     TREE_CONSTANT (expr) = 0;
4569
4570   return expr;
4571 }
4572 \f
4573 /* Return the appropriate GCC tree code for the specified GNAT_TYPE,
4574    the latter being a record type as predicated by Is_Record_Type.  */
4575
4576 enum tree_code
4577 tree_code_for_record_type (Entity_Id gnat_type)
4578 {
4579   Node_Id component_list
4580     = Component_List (Type_Definition
4581                       (Declaration_Node
4582                        (Implementation_Base_Type (gnat_type))));
4583   Node_Id component;
4584
4585  /* Make this a UNION_TYPE unless it's either not an Unchecked_Union or
4586     we have a non-discriminant field outside a variant.  In either case,
4587     it's a RECORD_TYPE.  */
4588
4589   if (!Is_Unchecked_Union (gnat_type))
4590     return RECORD_TYPE;
4591
4592   for (component = First_Non_Pragma (Component_Items (component_list));
4593        Present (component);
4594        component = Next_Non_Pragma (component))
4595     if (Ekind (Defining_Entity (component)) == E_Component)
4596       return RECORD_TYPE;
4597
4598   return UNION_TYPE;
4599 }
4600
4601 /* Return true if GNAT_TYPE is a "double" floating-point type, i.e. whose
4602    size is equal to 64 bits, or an array of such a type.  Set ALIGN_CLAUSE
4603    according to the presence of an alignment clause on the type or, if it
4604    is an array, on the component type.  */
4605
4606 bool
4607 is_double_float_or_array (Entity_Id gnat_type, bool *align_clause)
4608 {
4609   gnat_type = Underlying_Type (gnat_type);
4610
4611   *align_clause = Present (Alignment_Clause (gnat_type));
4612
4613   if (Is_Array_Type (gnat_type))
4614     {
4615       gnat_type = Underlying_Type (Component_Type (gnat_type));
4616       if (Present (Alignment_Clause (gnat_type)))
4617         *align_clause = true;
4618     }
4619
4620   if (!Is_Floating_Point_Type (gnat_type))
4621     return false;
4622
4623   if (UI_To_Int (Esize (gnat_type)) != 64)
4624     return false;
4625
4626   return true;
4627 }
4628
4629 /* Return true if GNAT_TYPE is a "double" or larger scalar type, i.e. whose
4630    size is greater or equal to 64 bits, or an array of such a type.  Set
4631    ALIGN_CLAUSE according to the presence of an alignment clause on the
4632    type or, if it is an array, on the component type.  */
4633
4634 bool
4635 is_double_scalar_or_array (Entity_Id gnat_type, bool *align_clause)
4636 {
4637   gnat_type = Underlying_Type (gnat_type);
4638
4639   *align_clause = Present (Alignment_Clause (gnat_type));
4640
4641   if (Is_Array_Type (gnat_type))
4642     {
4643       gnat_type = Underlying_Type (Component_Type (gnat_type));
4644       if (Present (Alignment_Clause (gnat_type)))
4645         *align_clause = true;
4646     }
4647
4648   if (!Is_Scalar_Type (gnat_type))
4649     return false;
4650
4651   if (UI_To_Int (Esize (gnat_type)) < 64)
4652     return false;
4653
4654   return true;
4655 }
4656
4657 /* Return true if GNU_TYPE is suitable as the type of a non-aliased
4658    component of an aggregate type.  */
4659
4660 bool
4661 type_for_nonaliased_component_p (tree gnu_type)
4662 {
4663   /* If the type is passed by reference, we may have pointers to the
4664      component so it cannot be made non-aliased. */
4665   if (must_pass_by_ref (gnu_type) || default_pass_by_ref (gnu_type))
4666     return false;
4667
4668   /* We used to say that any component of aggregate type is aliased
4669      because the front-end may take 'Reference of it.  The front-end
4670      has been enhanced in the meantime so as to use a renaming instead
4671      in most cases, but the back-end can probably take the address of
4672      such a component too so we go for the conservative stance.
4673
4674      For instance, we might need the address of any array type, even
4675      if normally passed by copy, to construct a fat pointer if the
4676      component is used as an actual for an unconstrained formal.
4677
4678      Likewise for record types: even if a specific record subtype is
4679      passed by copy, the parent type might be passed by ref (e.g. if
4680      it's of variable size) and we might take the address of a child
4681      component to pass to a parent formal.  We have no way to check
4682      for such conditions here.  */
4683   if (AGGREGATE_TYPE_P (gnu_type))
4684     return false;
4685
4686   return true;
4687 }
4688
4689 /* Perform final processing on global variables.  */
4690
4691 void
4692 gnat_write_global_declarations (void)
4693 {
4694   /* Proceed to optimize and emit assembly.
4695      FIXME: shouldn't be the front end's responsibility to call this.  */
4696   cgraph_optimize ();
4697
4698   /* Emit debug info for all global declarations.  */
4699   emit_debug_global_declarations (VEC_address (tree, global_decls),
4700                                   VEC_length (tree, global_decls));
4701 }
4702
4703 /* ************************************************************************
4704  * *                           GCC builtins support                       *
4705  * ************************************************************************ */
4706
4707 /* The general scheme is fairly simple:
4708
4709    For each builtin function/type to be declared, gnat_install_builtins calls
4710    internal facilities which eventually get to gnat_push_decl, which in turn
4711    tracks the so declared builtin function decls in the 'builtin_decls' global
4712    datastructure. When an Intrinsic subprogram declaration is processed, we
4713    search this global datastructure to retrieve the associated BUILT_IN DECL
4714    node.  */
4715
4716 /* Search the chain of currently available builtin declarations for a node
4717    corresponding to function NAME (an IDENTIFIER_NODE).  Return the first node
4718    found, if any, or NULL_TREE otherwise.  */
4719 tree
4720 builtin_decl_for (tree name)
4721 {
4722   unsigned i;
4723   tree decl;
4724
4725   for (i = 0; VEC_iterate(tree, builtin_decls, i, decl); i++)
4726     if (DECL_NAME (decl) == name)
4727       return decl;
4728
4729   return NULL_TREE;
4730 }
4731
4732 /* The code below eventually exposes gnat_install_builtins, which declares
4733    the builtin types and functions we might need, either internally or as
4734    user accessible facilities.
4735
4736    ??? This is a first implementation shot, still in rough shape.  It is
4737    heavily inspired from the "C" family implementation, with chunks copied
4738    verbatim from there.
4739
4740    Two obvious TODO candidates are
4741    o Use a more efficient name/decl mapping scheme
4742    o Devise a middle-end infrastructure to avoid having to copy
4743      pieces between front-ends.  */
4744
4745 /* ----------------------------------------------------------------------- *
4746  *                         BUILTIN ELEMENTARY TYPES                        *
4747  * ----------------------------------------------------------------------- */
4748
4749 /* Standard data types to be used in builtin argument declarations.  */
4750
4751 enum c_tree_index
4752 {
4753     CTI_SIGNED_SIZE_TYPE, /* For format checking only.  */
4754     CTI_STRING_TYPE,
4755     CTI_CONST_STRING_TYPE,
4756
4757     CTI_MAX
4758 };
4759
4760 static tree c_global_trees[CTI_MAX];
4761
4762 #define signed_size_type_node   c_global_trees[CTI_SIGNED_SIZE_TYPE]
4763 #define string_type_node        c_global_trees[CTI_STRING_TYPE]
4764 #define const_string_type_node  c_global_trees[CTI_CONST_STRING_TYPE]
4765
4766 /* ??? In addition some attribute handlers, we currently don't support a
4767    (small) number of builtin-types, which in turns inhibits support for a
4768    number of builtin functions.  */
4769 #define wint_type_node    void_type_node
4770 #define intmax_type_node  void_type_node
4771 #define uintmax_type_node void_type_node
4772
4773 /* Build the void_list_node (void_type_node having been created).  */
4774
4775 static tree
4776 build_void_list_node (void)
4777 {
4778   tree t = build_tree_list (NULL_TREE, void_type_node);
4779   return t;
4780 }
4781
4782 /* Used to help initialize the builtin-types.def table.  When a type of
4783    the correct size doesn't exist, use error_mark_node instead of NULL.
4784    The later results in segfaults even when a decl using the type doesn't
4785    get invoked.  */
4786
4787 static tree
4788 builtin_type_for_size (int size, bool unsignedp)
4789 {
4790   tree type = lang_hooks.types.type_for_size (size, unsignedp);
4791   return type ? type : error_mark_node;
4792 }
4793
4794 /* Build/push the elementary type decls that builtin functions/types
4795    will need.  */
4796
4797 static void
4798 install_builtin_elementary_types (void)
4799 {
4800   signed_size_type_node = size_type_node;
4801   pid_type_node = integer_type_node;
4802   void_list_node = build_void_list_node ();
4803
4804   string_type_node = build_pointer_type (char_type_node);
4805   const_string_type_node
4806     = build_pointer_type (build_qualified_type
4807                           (char_type_node, TYPE_QUAL_CONST));
4808 }
4809
4810 /* ----------------------------------------------------------------------- *
4811  *                          BUILTIN FUNCTION TYPES                         *
4812  * ----------------------------------------------------------------------- */
4813
4814 /* Now, builtin function types per se.  */
4815
4816 enum c_builtin_type
4817 {
4818 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
4819 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
4820 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
4821 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
4822 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4823 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4824 #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
4825 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME,
4826 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME,
4827 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
4828 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
4829 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
4830 #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4831 #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4832 #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG6) \
4833   NAME,
4834 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
4835 #include "builtin-types.def"
4836 #undef DEF_PRIMITIVE_TYPE
4837 #undef DEF_FUNCTION_TYPE_0
4838 #undef DEF_FUNCTION_TYPE_1
4839 #undef DEF_FUNCTION_TYPE_2
4840 #undef DEF_FUNCTION_TYPE_3
4841 #undef DEF_FUNCTION_TYPE_4
4842 #undef DEF_FUNCTION_TYPE_5
4843 #undef DEF_FUNCTION_TYPE_6
4844 #undef DEF_FUNCTION_TYPE_7
4845 #undef DEF_FUNCTION_TYPE_VAR_0
4846 #undef DEF_FUNCTION_TYPE_VAR_1
4847 #undef DEF_FUNCTION_TYPE_VAR_2
4848 #undef DEF_FUNCTION_TYPE_VAR_3
4849 #undef DEF_FUNCTION_TYPE_VAR_4
4850 #undef DEF_FUNCTION_TYPE_VAR_5
4851 #undef DEF_POINTER_TYPE
4852   BT_LAST
4853 };
4854
4855 typedef enum c_builtin_type builtin_type;
4856
4857 /* A temporary array used in communication with def_fn_type.  */
4858 static GTY(()) tree builtin_types[(int) BT_LAST + 1];
4859
4860 /* A helper function for install_builtin_types.  Build function type
4861    for DEF with return type RET and N arguments.  If VAR is true, then the
4862    function should be variadic after those N arguments.
4863
4864    Takes special care not to ICE if any of the types involved are
4865    error_mark_node, which indicates that said type is not in fact available
4866    (see builtin_type_for_size).  In which case the function type as a whole
4867    should be error_mark_node.  */
4868
4869 static void
4870 def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
4871 {
4872   tree args = NULL, t;
4873   va_list list;
4874   int i;
4875
4876   va_start (list, n);
4877   for (i = 0; i < n; ++i)
4878     {
4879       builtin_type a = (builtin_type) va_arg (list, int);
4880       t = builtin_types[a];
4881       if (t == error_mark_node)
4882         goto egress;
4883       args = tree_cons (NULL_TREE, t, args);
4884     }
4885   va_end (list);
4886
4887   args = nreverse (args);
4888   if (!var)
4889     args = chainon (args, void_list_node);
4890
4891   t = builtin_types[ret];
4892   if (t == error_mark_node)
4893     goto egress;
4894   t = build_function_type (t, args);
4895
4896  egress:
4897   builtin_types[def] = t;
4898 }
4899
4900 /* Build the builtin function types and install them in the builtin_types
4901    array for later use in builtin function decls.  */
4902
4903 static void
4904 install_builtin_function_types (void)
4905 {
4906   tree va_list_ref_type_node;
4907   tree va_list_arg_type_node;
4908
4909   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
4910     {
4911       va_list_arg_type_node = va_list_ref_type_node =
4912         build_pointer_type (TREE_TYPE (va_list_type_node));
4913     }
4914   else
4915     {
4916       va_list_arg_type_node = va_list_type_node;
4917       va_list_ref_type_node = build_reference_type (va_list_type_node);
4918     }
4919
4920 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
4921   builtin_types[ENUM] = VALUE;
4922 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
4923   def_fn_type (ENUM, RETURN, 0, 0);
4924 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
4925   def_fn_type (ENUM, RETURN, 0, 1, ARG1);
4926 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
4927   def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
4928 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
4929   def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
4930 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
4931   def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4);
4932 #define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
4933   def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
4934 #define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
4935                             ARG6)                                       \
4936   def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
4937 #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
4938                             ARG6, ARG7)                                 \
4939   def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
4940 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
4941   def_fn_type (ENUM, RETURN, 1, 0);
4942 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
4943   def_fn_type (ENUM, RETURN, 1, 1, ARG1);
4944 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
4945   def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
4946 #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
4947   def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
4948 #define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
4949   def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4);
4950 #define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
4951   def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
4952 #define DEF_POINTER_TYPE(ENUM, TYPE) \
4953   builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]);
4954
4955 #include "builtin-types.def"
4956
4957 #undef DEF_PRIMITIVE_TYPE
4958 #undef DEF_FUNCTION_TYPE_1
4959 #undef DEF_FUNCTION_TYPE_2
4960 #undef DEF_FUNCTION_TYPE_3
4961 #undef DEF_FUNCTION_TYPE_4
4962 #undef DEF_FUNCTION_TYPE_5
4963 #undef DEF_FUNCTION_TYPE_6
4964 #undef DEF_FUNCTION_TYPE_VAR_0
4965 #undef DEF_FUNCTION_TYPE_VAR_1
4966 #undef DEF_FUNCTION_TYPE_VAR_2
4967 #undef DEF_FUNCTION_TYPE_VAR_3
4968 #undef DEF_FUNCTION_TYPE_VAR_4
4969 #undef DEF_FUNCTION_TYPE_VAR_5
4970 #undef DEF_POINTER_TYPE
4971   builtin_types[(int) BT_LAST] = NULL_TREE;
4972 }
4973
4974 /* ----------------------------------------------------------------------- *
4975  *                            BUILTIN ATTRIBUTES                           *
4976  * ----------------------------------------------------------------------- */
4977
4978 enum built_in_attribute
4979 {
4980 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
4981 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
4982 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
4983 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
4984 #include "builtin-attrs.def"
4985 #undef DEF_ATTR_NULL_TREE
4986 #undef DEF_ATTR_INT
4987 #undef DEF_ATTR_IDENT
4988 #undef DEF_ATTR_TREE_LIST
4989   ATTR_LAST
4990 };
4991
4992 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
4993
4994 static void
4995 install_builtin_attributes (void)
4996 {
4997   /* Fill in the built_in_attributes array.  */
4998 #define DEF_ATTR_NULL_TREE(ENUM)                                \
4999   built_in_attributes[(int) ENUM] = NULL_TREE;
5000 #define DEF_ATTR_INT(ENUM, VALUE)                               \
5001   built_in_attributes[(int) ENUM] = build_int_cst (NULL_TREE, VALUE);
5002 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
5003   built_in_attributes[(int) ENUM] = get_identifier (STRING);
5004 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
5005   built_in_attributes[(int) ENUM]                       \
5006     = tree_cons (built_in_attributes[(int) PURPOSE],    \
5007                  built_in_attributes[(int) VALUE],      \
5008                  built_in_attributes[(int) CHAIN]);
5009 #include "builtin-attrs.def"
5010 #undef DEF_ATTR_NULL_TREE
5011 #undef DEF_ATTR_INT
5012 #undef DEF_ATTR_IDENT
5013 #undef DEF_ATTR_TREE_LIST
5014 }
5015
5016 /* Handle a "const" attribute; arguments as in
5017    struct attribute_spec.handler.  */
5018
5019 static tree
5020 handle_const_attribute (tree *node, tree ARG_UNUSED (name),
5021                         tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5022                         bool *no_add_attrs)
5023 {
5024   if (TREE_CODE (*node) == FUNCTION_DECL)
5025     TREE_READONLY (*node) = 1;
5026   else
5027     *no_add_attrs = true;
5028
5029   return NULL_TREE;
5030 }
5031
5032 /* Handle a "nothrow" attribute; arguments as in
5033    struct attribute_spec.handler.  */
5034
5035 static tree
5036 handle_nothrow_attribute (tree *node, tree ARG_UNUSED (name),
5037                           tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5038                           bool *no_add_attrs)
5039 {
5040   if (TREE_CODE (*node) == FUNCTION_DECL)
5041     TREE_NOTHROW (*node) = 1;
5042   else
5043     *no_add_attrs = true;
5044
5045   return NULL_TREE;
5046 }
5047
5048 /* Handle a "pure" attribute; arguments as in
5049    struct attribute_spec.handler.  */
5050
5051 static tree
5052 handle_pure_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5053                        int ARG_UNUSED (flags), bool *no_add_attrs)
5054 {
5055   if (TREE_CODE (*node) == FUNCTION_DECL)
5056     DECL_PURE_P (*node) = 1;
5057   /* ??? TODO: Support types.  */
5058   else
5059     {
5060       warning (OPT_Wattributes, "%qE attribute ignored", name);
5061       *no_add_attrs = true;
5062     }
5063
5064   return NULL_TREE;
5065 }
5066
5067 /* Handle a "no vops" attribute; arguments as in
5068    struct attribute_spec.handler.  */
5069
5070 static tree
5071 handle_novops_attribute (tree *node, tree ARG_UNUSED (name),
5072                          tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5073                          bool *ARG_UNUSED (no_add_attrs))
5074 {
5075   gcc_assert (TREE_CODE (*node) == FUNCTION_DECL);
5076   DECL_IS_NOVOPS (*node) = 1;
5077   return NULL_TREE;
5078 }
5079
5080 /* Helper for nonnull attribute handling; fetch the operand number
5081    from the attribute argument list.  */
5082
5083 static bool
5084 get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp)
5085 {
5086   /* Verify the arg number is a constant.  */
5087   if (TREE_CODE (arg_num_expr) != INTEGER_CST
5088       || TREE_INT_CST_HIGH (arg_num_expr) != 0)
5089     return false;
5090
5091   *valp = TREE_INT_CST_LOW (arg_num_expr);
5092   return true;
5093 }
5094
5095 /* Handle the "nonnull" attribute.  */
5096 static tree
5097 handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
5098                           tree args, int ARG_UNUSED (flags),
5099                           bool *no_add_attrs)
5100 {
5101   tree type = *node;
5102   unsigned HOST_WIDE_INT attr_arg_num;
5103
5104   /* If no arguments are specified, all pointer arguments should be
5105      non-null.  Verify a full prototype is given so that the arguments
5106      will have the correct types when we actually check them later.  */
5107   if (!args)
5108     {
5109       if (!TYPE_ARG_TYPES (type))
5110         {
5111           error ("nonnull attribute without arguments on a non-prototype");
5112           *no_add_attrs = true;
5113         }
5114       return NULL_TREE;
5115     }
5116
5117   /* Argument list specified.  Verify that each argument number references
5118      a pointer argument.  */
5119   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
5120     {
5121       tree argument;
5122       unsigned HOST_WIDE_INT arg_num = 0, ck_num;
5123
5124       if (!get_nonnull_operand (TREE_VALUE (args), &arg_num))
5125         {
5126           error ("nonnull argument has invalid operand number (argument %lu)",
5127                  (unsigned long) attr_arg_num);
5128           *no_add_attrs = true;
5129           return NULL_TREE;
5130         }
5131
5132       argument = TYPE_ARG_TYPES (type);
5133       if (argument)
5134         {
5135           for (ck_num = 1; ; ck_num++)
5136             {
5137               if (!argument || ck_num == arg_num)
5138                 break;
5139               argument = TREE_CHAIN (argument);
5140             }
5141
5142           if (!argument
5143               || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
5144             {
5145               error ("nonnull argument with out-of-range operand number (argument %lu, operand %lu)",
5146                      (unsigned long) attr_arg_num, (unsigned long) arg_num);
5147               *no_add_attrs = true;
5148               return NULL_TREE;
5149             }
5150
5151           if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
5152             {
5153               error ("nonnull argument references non-pointer operand (argument %lu, operand %lu)",
5154                    (unsigned long) attr_arg_num, (unsigned long) arg_num);
5155               *no_add_attrs = true;
5156               return NULL_TREE;
5157             }
5158         }
5159     }
5160
5161   return NULL_TREE;
5162 }
5163
5164 /* Handle a "sentinel" attribute.  */
5165
5166 static tree
5167 handle_sentinel_attribute (tree *node, tree name, tree args,
5168                            int ARG_UNUSED (flags), bool *no_add_attrs)
5169 {
5170   tree params = TYPE_ARG_TYPES (*node);
5171
5172   if (!params)
5173     {
5174       warning (OPT_Wattributes,
5175                "%qE attribute requires prototypes with named arguments", name);
5176       *no_add_attrs = true;
5177     }
5178   else
5179     {
5180       while (TREE_CHAIN (params))
5181         params = TREE_CHAIN (params);
5182
5183       if (VOID_TYPE_P (TREE_VALUE (params)))
5184         {
5185           warning (OPT_Wattributes,
5186                    "%qE attribute only applies to variadic functions", name);
5187           *no_add_attrs = true;
5188         }
5189     }
5190
5191   if (args)
5192     {
5193       tree position = TREE_VALUE (args);
5194
5195       if (TREE_CODE (position) != INTEGER_CST)
5196         {
5197           warning (0, "requested position is not an integer constant");
5198           *no_add_attrs = true;
5199         }
5200       else
5201         {
5202           if (tree_int_cst_lt (position, integer_zero_node))
5203             {
5204               warning (0, "requested position is less than zero");
5205               *no_add_attrs = true;
5206             }
5207         }
5208     }
5209
5210   return NULL_TREE;
5211 }
5212
5213 /* Handle a "noreturn" attribute; arguments as in
5214    struct attribute_spec.handler.  */
5215
5216 static tree
5217 handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5218                            int ARG_UNUSED (flags), bool *no_add_attrs)
5219 {
5220   tree type = TREE_TYPE (*node);
5221
5222   /* See FIXME comment in c_common_attribute_table.  */
5223   if (TREE_CODE (*node) == FUNCTION_DECL)
5224     TREE_THIS_VOLATILE (*node) = 1;
5225   else if (TREE_CODE (type) == POINTER_TYPE
5226            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5227     TREE_TYPE (*node)
5228       = build_pointer_type
5229         (build_type_variant (TREE_TYPE (type),
5230                              TYPE_READONLY (TREE_TYPE (type)), 1));
5231   else
5232     {
5233       warning (OPT_Wattributes, "%qE attribute ignored", name);
5234       *no_add_attrs = true;
5235     }
5236
5237   return NULL_TREE;
5238 }
5239
5240 /* Handle a "malloc" attribute; arguments as in
5241    struct attribute_spec.handler.  */
5242
5243 static tree
5244 handle_malloc_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5245                          int ARG_UNUSED (flags), bool *no_add_attrs)
5246 {
5247   if (TREE_CODE (*node) == FUNCTION_DECL
5248       && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node))))
5249     DECL_IS_MALLOC (*node) = 1;
5250   else
5251     {
5252       warning (OPT_Wattributes, "%qE attribute ignored", name);
5253       *no_add_attrs = true;
5254     }
5255
5256   return NULL_TREE;
5257 }
5258
5259 /* Fake handler for attributes we don't properly support.  */
5260
5261 tree
5262 fake_attribute_handler (tree * ARG_UNUSED (node),
5263                         tree ARG_UNUSED (name),
5264                         tree ARG_UNUSED (args),
5265                         int  ARG_UNUSED (flags),
5266                         bool * ARG_UNUSED (no_add_attrs))
5267 {
5268   return NULL_TREE;
5269 }
5270
5271 /* Handle a "type_generic" attribute.  */
5272
5273 static tree
5274 handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name),
5275                                tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5276                                bool * ARG_UNUSED (no_add_attrs))
5277 {
5278   tree params;
5279
5280   /* Ensure we have a function type.  */
5281   gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
5282
5283   params = TYPE_ARG_TYPES (*node);
5284   while (params && ! VOID_TYPE_P (TREE_VALUE (params)))
5285     params = TREE_CHAIN (params);
5286
5287   /* Ensure we have a variadic function.  */
5288   gcc_assert (!params);
5289
5290   return NULL_TREE;
5291 }
5292
5293 /* Handle a "vector_size" attribute; arguments as in
5294    struct attribute_spec.handler.  */
5295
5296 static tree
5297 handle_vector_size_attribute (tree *node, tree name, tree args,
5298                               int ARG_UNUSED (flags),
5299                               bool *no_add_attrs)
5300 {
5301   unsigned HOST_WIDE_INT vecsize, nunits;
5302   enum machine_mode orig_mode;
5303   tree type = *node, new_type, size;
5304
5305   *no_add_attrs = true;
5306
5307   size = TREE_VALUE (args);
5308
5309   if (!host_integerp (size, 1))
5310     {
5311       warning (OPT_Wattributes, "%qE attribute ignored", name);
5312       return NULL_TREE;
5313     }
5314
5315   /* Get the vector size (in bytes).  */
5316   vecsize = tree_low_cst (size, 1);
5317
5318   /* We need to provide for vector pointers, vector arrays, and
5319      functions returning vectors.  For example:
5320
5321        __attribute__((vector_size(16))) short *foo;
5322
5323      In this case, the mode is SI, but the type being modified is
5324      HI, so we need to look further.  */
5325
5326   while (POINTER_TYPE_P (type)
5327          || TREE_CODE (type) == FUNCTION_TYPE
5328          || TREE_CODE (type) == METHOD_TYPE
5329          || TREE_CODE (type) == ARRAY_TYPE
5330          || TREE_CODE (type) == OFFSET_TYPE)
5331     type = TREE_TYPE (type);
5332
5333   /* Get the mode of the type being modified.  */
5334   orig_mode = TYPE_MODE (type);
5335
5336   if ((!INTEGRAL_TYPE_P (type)
5337        && !SCALAR_FLOAT_TYPE_P (type)
5338        && !FIXED_POINT_TYPE_P (type))
5339       || (!SCALAR_FLOAT_MODE_P (orig_mode)
5340           && GET_MODE_CLASS (orig_mode) != MODE_INT
5341           && !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))
5342       || !host_integerp (TYPE_SIZE_UNIT (type), 1)
5343       || TREE_CODE (type) == BOOLEAN_TYPE)
5344     {
5345       error ("invalid vector type for attribute %qE", name);
5346       return NULL_TREE;
5347     }
5348
5349   if (vecsize % tree_low_cst (TYPE_SIZE_UNIT (type), 1))
5350     {
5351       error ("vector size not an integral multiple of component size");
5352       return NULL;
5353     }
5354
5355   if (vecsize == 0)
5356     {
5357       error ("zero vector size");
5358       return NULL;
5359     }
5360
5361   /* Calculate how many units fit in the vector.  */
5362   nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5363   if (nunits & (nunits - 1))
5364     {
5365       error ("number of components of the vector not a power of two");
5366       return NULL_TREE;
5367     }
5368
5369   new_type = build_vector_type (type, nunits);
5370
5371   /* Build back pointers if needed.  */
5372   *node = lang_hooks.types.reconstruct_complex_type (*node, new_type);
5373
5374   return NULL_TREE;
5375 }
5376
5377 /* ----------------------------------------------------------------------- *
5378  *                              BUILTIN FUNCTIONS                          *
5379  * ----------------------------------------------------------------------- */
5380
5381 /* Worker for DEF_BUILTIN.  Possibly define a builtin function with one or two
5382    names.  Does not declare a non-__builtin_ function if flag_no_builtin, or
5383    if nonansi_p and flag_no_nonansi_builtin.  */
5384
5385 static void
5386 def_builtin_1 (enum built_in_function fncode,
5387                const char *name,
5388                enum built_in_class fnclass,
5389                tree fntype, tree libtype,
5390                bool both_p, bool fallback_p,
5391                bool nonansi_p ATTRIBUTE_UNUSED,
5392                tree fnattrs, bool implicit_p)
5393 {
5394   tree decl;
5395   const char *libname;
5396
5397   /* Preserve an already installed decl.  It most likely was setup in advance
5398      (e.g. as part of the internal builtins) for specific reasons.  */
5399   if (built_in_decls[(int) fncode] != NULL_TREE)
5400     return;
5401
5402   gcc_assert ((!both_p && !fallback_p)
5403               || !strncmp (name, "__builtin_",
5404                            strlen ("__builtin_")));
5405
5406   libname = name + strlen ("__builtin_");
5407   decl = add_builtin_function (name, fntype, fncode, fnclass,
5408                                (fallback_p ? libname : NULL),
5409                                fnattrs);
5410   if (both_p)
5411     /* ??? This is normally further controlled by command-line options
5412        like -fno-builtin, but we don't have them for Ada.  */
5413     add_builtin_function (libname, libtype, fncode, fnclass,
5414                           NULL, fnattrs);
5415
5416   built_in_decls[(int) fncode] = decl;
5417   if (implicit_p)
5418     implicit_built_in_decls[(int) fncode] = decl;
5419 }
5420
5421 static int flag_isoc94 = 0;
5422 static int flag_isoc99 = 0;
5423
5424 /* Install what the common builtins.def offers.  */
5425
5426 static void
5427 install_builtin_functions (void)
5428 {
5429 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P, \
5430                     NONANSI_P, ATTRS, IMPLICIT, COND)                   \
5431   if (NAME && COND)                                                     \
5432     def_builtin_1 (ENUM, NAME, CLASS,                                   \
5433                    builtin_types[(int) TYPE],                           \
5434                    builtin_types[(int) LIBTYPE],                        \
5435                    BOTH_P, FALLBACK_P, NONANSI_P,                       \
5436                    built_in_attributes[(int) ATTRS], IMPLICIT);
5437 #include "builtins.def"
5438 #undef DEF_BUILTIN
5439 }
5440
5441 /* ----------------------------------------------------------------------- *
5442  *                              BUILTIN FUNCTIONS                          *
5443  * ----------------------------------------------------------------------- */
5444
5445 /* Install the builtin functions we might need.  */
5446
5447 void
5448 gnat_install_builtins (void)
5449 {
5450   install_builtin_elementary_types ();
5451   install_builtin_function_types ();
5452   install_builtin_attributes ();
5453
5454   /* Install builtins used by generic middle-end pieces first.  Some of these
5455      know about internal specificities and control attributes accordingly, for
5456      instance __builtin_alloca vs no-throw and -fstack-check.  We will ignore
5457      the generic definition from builtins.def.  */
5458   build_common_builtin_nodes ();
5459
5460   /* Now, install the target specific builtins, such as the AltiVec family on
5461      ppc, and the common set as exposed by builtins.def.  */
5462   targetm.init_builtins ();
5463   install_builtin_functions ();
5464 }
5465
5466 #include "gt-ada-utils.h"
5467 #include "gtype-ada.h"