OSDN Git Service

* gcc-interface/utils.c (handle_vector_size_attribute): Import from
[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 ()
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 ()
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 ()
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;
1021
1022   if (!special || TREE_CODE (size) != COND_EXPR)
1023     {
1024       new = size_binop (PLUS_EXPR, first_bit, size);
1025       if (has_rep)
1026         new = size_binop (MAX_EXPR, last_size, new);
1027     }
1028
1029   else
1030     new = 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) == NON_LVALUE_EXPR)
1044     new = TREE_OPERAND (new, 0);
1045
1046   return new;
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 = 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_STUB_DECL (type);
1171
1172   TYPE_POINTER_TO (new) = 0;
1173   TYPE_REFERENCE_TO (new) = 0;
1174   TYPE_MAIN_VARIANT (new) = new;
1175   TYPE_NEXT_VARIANT (new) = 0;
1176
1177   return new;
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 *argarray;
2337           int i, n = call_expr_nargs (exp);
2338           gcc_assert (n > 0);
2339
2340           argarray = (tree *) alloca (n * sizeof (tree));
2341           for (i = 0; i < n; i++)
2342             argarray[i] = max_size (CALL_EXPR_ARG (exp, i), max_p);
2343           return build_call_array (type, CALL_EXPR_FN (exp), n, argarray);
2344         }
2345       break;
2346
2347     case tcc_reference:
2348       /* If this contains a PLACEHOLDER_EXPR, it is the thing we want to
2349          modify.  Otherwise, we treat it like a variable.  */
2350       if (!CONTAINS_PLACEHOLDER_P (exp))
2351         return exp;
2352
2353       type = TREE_TYPE (TREE_OPERAND (exp, 1));
2354       return
2355         max_size (max_p ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type), true);
2356
2357     case tcc_comparison:
2358       return max_p ? size_one_node : size_zero_node;
2359
2360     case tcc_unary:
2361     case tcc_binary:
2362     case tcc_expression:
2363       switch (TREE_CODE_LENGTH (code))
2364         {
2365         case 1:
2366           if (code == NON_LVALUE_EXPR)
2367             return max_size (TREE_OPERAND (exp, 0), max_p);
2368           else
2369             return
2370               fold_build1 (code, type,
2371                            max_size (TREE_OPERAND (exp, 0),
2372                                      code == NEGATE_EXPR ? !max_p : max_p));
2373
2374         case 2:
2375           if (code == COMPOUND_EXPR)
2376             return max_size (TREE_OPERAND (exp, 1), max_p);
2377
2378           /* Calculate "(A ? B : C) - D" as "A ? B - D : C - D" which
2379              may provide a tighter bound on max_size.  */
2380           if (code == MINUS_EXPR
2381               && TREE_CODE (TREE_OPERAND (exp, 0)) == COND_EXPR)
2382             {
2383               tree lhs = fold_build2 (MINUS_EXPR, type,
2384                                       TREE_OPERAND (TREE_OPERAND (exp, 0), 1),
2385                                       TREE_OPERAND (exp, 1));
2386               tree rhs = fold_build2 (MINUS_EXPR, type,
2387                                       TREE_OPERAND (TREE_OPERAND (exp, 0), 2),
2388                                       TREE_OPERAND (exp, 1));
2389               return fold_build2 (max_p ? MAX_EXPR : MIN_EXPR, type,
2390                                   max_size (lhs, max_p),
2391                                   max_size (rhs, max_p));
2392             }
2393
2394           {
2395             tree lhs = max_size (TREE_OPERAND (exp, 0), max_p);
2396             tree rhs = max_size (TREE_OPERAND (exp, 1),
2397                                  code == MINUS_EXPR ? !max_p : max_p);
2398
2399             /* Special-case wanting the maximum value of a MIN_EXPR.
2400                In that case, if one side overflows, return the other.
2401                sizetype is signed, but we know sizes are non-negative.
2402                Likewise, handle a MINUS_EXPR or PLUS_EXPR with the LHS
2403                overflowing or the maximum possible value and the RHS
2404                a variable.  */
2405             if (max_p
2406                 && code == MIN_EXPR
2407                 && TREE_CODE (rhs) == INTEGER_CST
2408                 && TREE_OVERFLOW (rhs))
2409               return lhs;
2410             else if (max_p
2411                      && code == MIN_EXPR
2412                      && TREE_CODE (lhs) == INTEGER_CST
2413                      && TREE_OVERFLOW (lhs))
2414               return rhs;
2415             else if ((code == MINUS_EXPR || code == PLUS_EXPR)
2416                      && ((TREE_CODE (lhs) == INTEGER_CST
2417                           && TREE_OVERFLOW (lhs))
2418                          || operand_equal_p (lhs, TYPE_MAX_VALUE (type), 0))
2419                      && !TREE_CONSTANT (rhs))
2420               return lhs;
2421             else
2422               return fold_build2 (code, type, lhs, rhs);
2423           }
2424
2425         case 3:
2426           if (code == SAVE_EXPR)
2427             return exp;
2428           else if (code == COND_EXPR)
2429             return fold_build2 (max_p ? MAX_EXPR : MIN_EXPR, type,
2430                                 max_size (TREE_OPERAND (exp, 1), max_p),
2431                                 max_size (TREE_OPERAND (exp, 2), max_p));
2432         }
2433
2434       /* Other tree classes cannot happen.  */
2435     default:
2436       break;
2437     }
2438
2439   gcc_unreachable ();
2440 }
2441 \f
2442 /* Build a template of type TEMPLATE_TYPE from the array bounds of ARRAY_TYPE.
2443    EXPR is an expression that we can use to locate any PLACEHOLDER_EXPRs.
2444    Return a constructor for the template.  */
2445
2446 tree
2447 build_template (tree template_type, tree array_type, tree expr)
2448 {
2449   tree template_elts = NULL_TREE;
2450   tree bound_list = NULL_TREE;
2451   tree field;
2452
2453   while (TREE_CODE (array_type) == RECORD_TYPE
2454          && (TYPE_IS_PADDING_P (array_type)
2455              || TYPE_JUSTIFIED_MODULAR_P (array_type)))
2456     array_type = TREE_TYPE (TYPE_FIELDS (array_type));
2457
2458   if (TREE_CODE (array_type) == ARRAY_TYPE
2459       || (TREE_CODE (array_type) == INTEGER_TYPE
2460           && TYPE_HAS_ACTUAL_BOUNDS_P (array_type)))
2461     bound_list = TYPE_ACTUAL_BOUNDS (array_type);
2462
2463   /* First make the list for a CONSTRUCTOR for the template.  Go down the
2464      field list of the template instead of the type chain because this
2465      array might be an Ada array of arrays and we can't tell where the
2466      nested arrays stop being the underlying object.  */
2467
2468   for (field = TYPE_FIELDS (template_type); field;
2469        (bound_list
2470         ? (bound_list = TREE_CHAIN (bound_list))
2471         : (array_type = TREE_TYPE (array_type))),
2472        field = TREE_CHAIN (TREE_CHAIN (field)))
2473     {
2474       tree bounds, min, max;
2475
2476       /* If we have a bound list, get the bounds from there.  Likewise
2477          for an ARRAY_TYPE.  Otherwise, if expr is a PARM_DECL with
2478          DECL_BY_COMPONENT_PTR_P, use the bounds of the field in the template.
2479          This will give us a maximum range.  */
2480       if (bound_list)
2481         bounds = TREE_VALUE (bound_list);
2482       else if (TREE_CODE (array_type) == ARRAY_TYPE)
2483         bounds = TYPE_INDEX_TYPE (TYPE_DOMAIN (array_type));
2484       else if (expr && TREE_CODE (expr) == PARM_DECL
2485                && DECL_BY_COMPONENT_PTR_P (expr))
2486         bounds = TREE_TYPE (field);
2487       else
2488         gcc_unreachable ();
2489
2490       min = convert (TREE_TYPE (field), TYPE_MIN_VALUE (bounds));
2491       max = convert (TREE_TYPE (TREE_CHAIN (field)), TYPE_MAX_VALUE (bounds));
2492
2493       /* If either MIN or MAX involve a PLACEHOLDER_EXPR, we must
2494          substitute it from OBJECT.  */
2495       min = SUBSTITUTE_PLACEHOLDER_IN_EXPR (min, expr);
2496       max = SUBSTITUTE_PLACEHOLDER_IN_EXPR (max, expr);
2497
2498       template_elts = tree_cons (TREE_CHAIN (field), max,
2499                                  tree_cons (field, min, template_elts));
2500     }
2501
2502   return gnat_build_constructor (template_type, nreverse (template_elts));
2503 }
2504 \f
2505 /* Build a 32bit VMS descriptor from a Mechanism_Type, which must specify
2506    a descriptor type, and the GCC type of an object.  Each FIELD_DECL
2507    in the type contains in its DECL_INITIAL the expression to use when
2508    a constructor is made for the type.  GNAT_ENTITY is an entity used
2509    to print out an error message if the mechanism cannot be applied to
2510    an object of that type and also for the name.  */
2511
2512 tree
2513 build_vms_descriptor32 (tree type, Mechanism_Type mech, Entity_Id gnat_entity)
2514 {
2515   tree record_type = make_node (RECORD_TYPE);
2516   tree pointer32_type;
2517   tree field_list = 0;
2518   int class;
2519   int dtype = 0;
2520   tree inner_type;
2521   int ndim;
2522   int i;
2523   tree *idx_arr;
2524   tree tem;
2525
2526   /* If TYPE is an unconstrained array, use the underlying array type.  */
2527   if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
2528     type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type))));
2529
2530   /* If this is an array, compute the number of dimensions in the array,
2531      get the index types, and point to the inner type.  */
2532   if (TREE_CODE (type) != ARRAY_TYPE)
2533     ndim = 0;
2534   else
2535     for (ndim = 1, inner_type = type;
2536          TREE_CODE (TREE_TYPE (inner_type)) == ARRAY_TYPE
2537          && TYPE_MULTI_ARRAY_P (TREE_TYPE (inner_type));
2538          ndim++, inner_type = TREE_TYPE (inner_type))
2539       ;
2540
2541   idx_arr = (tree *) alloca (ndim * sizeof (tree));
2542
2543   if (mech != By_Descriptor_NCA && mech != By_Short_Descriptor_NCA
2544       && TREE_CODE (type) == ARRAY_TYPE && TYPE_CONVENTION_FORTRAN_P (type))
2545     for (i = ndim - 1, inner_type = type;
2546          i >= 0;
2547          i--, inner_type = TREE_TYPE (inner_type))
2548       idx_arr[i] = TYPE_DOMAIN (inner_type);
2549   else
2550     for (i = 0, inner_type = type;
2551          i < ndim;
2552          i++, inner_type = TREE_TYPE (inner_type))
2553       idx_arr[i] = TYPE_DOMAIN (inner_type);
2554
2555   /* Now get the DTYPE value.  */
2556   switch (TREE_CODE (type))
2557     {
2558     case INTEGER_TYPE:
2559     case ENUMERAL_TYPE:
2560     case BOOLEAN_TYPE:
2561       if (TYPE_VAX_FLOATING_POINT_P (type))
2562         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2563           {
2564           case 6:
2565             dtype = 10;
2566             break;
2567           case 9:
2568             dtype = 11;
2569             break;
2570           case 15:
2571             dtype = 27;
2572             break;
2573           }
2574       else
2575         switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
2576           {
2577           case 8:
2578             dtype = TYPE_UNSIGNED (type) ? 2 : 6;
2579             break;
2580           case 16:
2581             dtype = TYPE_UNSIGNED (type) ? 3 : 7;
2582             break;
2583           case 32:
2584             dtype = TYPE_UNSIGNED (type) ? 4 : 8;
2585             break;
2586           case 64:
2587             dtype = TYPE_UNSIGNED (type) ? 5 : 9;
2588             break;
2589           case 128:
2590             dtype = TYPE_UNSIGNED (type) ? 25 : 26;
2591             break;
2592           }
2593       break;
2594
2595     case REAL_TYPE:
2596       dtype = GET_MODE_BITSIZE (TYPE_MODE (type)) == 32 ? 52 : 53;
2597       break;
2598
2599     case COMPLEX_TYPE:
2600       if (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE
2601           && TYPE_VAX_FLOATING_POINT_P (type))
2602         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2603           {
2604           case 6:
2605             dtype = 12;
2606             break;
2607           case 9:
2608             dtype = 13;
2609             break;
2610           case 15:
2611             dtype = 29;
2612           }
2613       else
2614         dtype = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) == 32 ? 54: 55;
2615       break;
2616
2617     case ARRAY_TYPE:
2618       dtype = 14;
2619       break;
2620
2621     default:
2622       break;
2623     }
2624
2625   /* Get the CLASS value.  */
2626   switch (mech)
2627     {
2628     case By_Descriptor_A:
2629     case By_Short_Descriptor_A:
2630       class = 4;
2631       break;
2632     case By_Descriptor_NCA:
2633     case By_Short_Descriptor_NCA:
2634       class = 10;
2635       break;
2636     case By_Descriptor_SB:
2637     case By_Short_Descriptor_SB:
2638       class = 15;
2639       break;
2640     case By_Descriptor:
2641     case By_Short_Descriptor:
2642     case By_Descriptor_S:
2643     case By_Short_Descriptor_S:
2644     default:
2645       class = 1;
2646       break;
2647     }
2648
2649   /* Make the type for a descriptor for VMS.  The first four fields
2650      are the same for all types.  */
2651
2652   field_list
2653     = chainon (field_list,
2654                make_descriptor_field
2655                ("LENGTH", gnat_type_for_size (16, 1), record_type,
2656                 size_in_bytes ((mech == By_Descriptor_A ||
2657                                 mech == By_Short_Descriptor_A)
2658                                ? inner_type : type)));
2659
2660   field_list = chainon (field_list,
2661                         make_descriptor_field ("DTYPE",
2662                                                gnat_type_for_size (8, 1),
2663                                                record_type, size_int (dtype)));
2664   field_list = chainon (field_list,
2665                         make_descriptor_field ("CLASS",
2666                                                gnat_type_for_size (8, 1),
2667                                                record_type, size_int (class)));
2668
2669   /* Of course this will crash at run-time if the address space is not
2670      within the low 32 bits, but there is nothing else we can do.  */
2671   pointer32_type = build_pointer_type_for_mode (type, SImode, false);
2672
2673   field_list
2674     = chainon (field_list,
2675                make_descriptor_field
2676                ("POINTER", pointer32_type, record_type,
2677                 build_unary_op (ADDR_EXPR,
2678                                 pointer32_type,
2679                                 build0 (PLACEHOLDER_EXPR, type))));
2680
2681   switch (mech)
2682     {
2683     case By_Descriptor:
2684     case By_Short_Descriptor:
2685     case By_Descriptor_S:
2686     case By_Short_Descriptor_S:
2687       break;
2688
2689     case By_Descriptor_SB:
2690     case By_Short_Descriptor_SB:
2691       field_list
2692         = chainon (field_list,
2693                    make_descriptor_field
2694                    ("SB_L1", gnat_type_for_size (32, 1), record_type,
2695                     TREE_CODE (type) == ARRAY_TYPE
2696                     ? TYPE_MIN_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
2697       field_list
2698         = chainon (field_list,
2699                    make_descriptor_field
2700                    ("SB_U1", gnat_type_for_size (32, 1), record_type,
2701                     TREE_CODE (type) == ARRAY_TYPE
2702                     ? TYPE_MAX_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
2703       break;
2704
2705     case By_Descriptor_A:
2706     case By_Short_Descriptor_A:
2707     case By_Descriptor_NCA:
2708     case By_Short_Descriptor_NCA:
2709       field_list = chainon (field_list,
2710                             make_descriptor_field ("SCALE",
2711                                                    gnat_type_for_size (8, 1),
2712                                                    record_type,
2713                                                    size_zero_node));
2714
2715       field_list = chainon (field_list,
2716                             make_descriptor_field ("DIGITS",
2717                                                    gnat_type_for_size (8, 1),
2718                                                    record_type,
2719                                                    size_zero_node));
2720
2721       field_list
2722         = chainon (field_list,
2723                    make_descriptor_field
2724                    ("AFLAGS", gnat_type_for_size (8, 1), record_type,
2725                     size_int ((mech == By_Descriptor_NCA ||
2726                               mech == By_Short_Descriptor_NCA)
2727                               ? 0
2728                               /* Set FL_COLUMN, FL_COEFF, and FL_BOUNDS.  */
2729                               : (TREE_CODE (type) == ARRAY_TYPE
2730                                  && TYPE_CONVENTION_FORTRAN_P (type)
2731                                  ? 224 : 192))));
2732
2733       field_list = chainon (field_list,
2734                             make_descriptor_field ("DIMCT",
2735                                                    gnat_type_for_size (8, 1),
2736                                                    record_type,
2737                                                    size_int (ndim)));
2738
2739       field_list = chainon (field_list,
2740                             make_descriptor_field ("ARSIZE",
2741                                                    gnat_type_for_size (32, 1),
2742                                                    record_type,
2743                                                    size_in_bytes (type)));
2744
2745       /* Now build a pointer to the 0,0,0... element.  */
2746       tem = build0 (PLACEHOLDER_EXPR, type);
2747       for (i = 0, inner_type = type; i < ndim;
2748            i++, inner_type = TREE_TYPE (inner_type))
2749         tem = build4 (ARRAY_REF, TREE_TYPE (inner_type), tem,
2750                       convert (TYPE_DOMAIN (inner_type), size_zero_node),
2751                       NULL_TREE, NULL_TREE);
2752
2753       field_list
2754         = chainon (field_list,
2755                    make_descriptor_field
2756                    ("A0",
2757                     build_pointer_type_for_mode (inner_type, SImode, false),
2758                     record_type,
2759                     build1 (ADDR_EXPR,
2760                             build_pointer_type_for_mode (inner_type, SImode,
2761                                                          false),
2762                             tem)));
2763
2764       /* Next come the addressing coefficients.  */
2765       tem = size_one_node;
2766       for (i = 0; i < ndim; i++)
2767         {
2768           char fname[3];
2769           tree idx_length
2770             = size_binop (MULT_EXPR, tem,
2771                           size_binop (PLUS_EXPR,
2772                                       size_binop (MINUS_EXPR,
2773                                                   TYPE_MAX_VALUE (idx_arr[i]),
2774                                                   TYPE_MIN_VALUE (idx_arr[i])),
2775                                       size_int (1)));
2776
2777           fname[0] = ((mech == By_Descriptor_NCA ||
2778                        mech == By_Short_Descriptor_NCA) ? 'S' : 'M');
2779           fname[1] = '0' + i, fname[2] = 0;
2780           field_list
2781             = chainon (field_list,
2782                        make_descriptor_field (fname,
2783                                               gnat_type_for_size (32, 1),
2784                                               record_type, idx_length));
2785
2786           if (mech == By_Descriptor_NCA || mech == By_Short_Descriptor_NCA)
2787             tem = idx_length;
2788         }
2789
2790       /* Finally here are the bounds.  */
2791       for (i = 0; i < ndim; i++)
2792         {
2793           char fname[3];
2794
2795           fname[0] = 'L', fname[1] = '0' + i, fname[2] = 0;
2796           field_list
2797             = chainon (field_list,
2798                        make_descriptor_field
2799                        (fname, gnat_type_for_size (32, 1), record_type,
2800                         TYPE_MIN_VALUE (idx_arr[i])));
2801
2802           fname[0] = 'U';
2803           field_list
2804             = chainon (field_list,
2805                        make_descriptor_field
2806                        (fname, gnat_type_for_size (32, 1), record_type,
2807                         TYPE_MAX_VALUE (idx_arr[i])));
2808         }
2809       break;
2810
2811     default:
2812       post_error ("unsupported descriptor type for &", gnat_entity);
2813     }
2814
2815   TYPE_NAME (record_type) = create_concat_name (gnat_entity, "DESC");
2816   finish_record_type (record_type, field_list, 0, true);
2817   return record_type;
2818 }
2819
2820 /* Build a 64bit VMS descriptor from a Mechanism_Type, which must specify
2821    a descriptor type, and the GCC type of an object.  Each FIELD_DECL
2822    in the type contains in its DECL_INITIAL the expression to use when
2823    a constructor is made for the type.  GNAT_ENTITY is an entity used
2824    to print out an error message if the mechanism cannot be applied to
2825    an object of that type and also for the name.  */
2826
2827 tree
2828 build_vms_descriptor (tree type, Mechanism_Type mech, Entity_Id gnat_entity)
2829 {
2830   tree record64_type = make_node (RECORD_TYPE);
2831   tree pointer64_type;
2832   tree field_list64 = 0;
2833   int class;
2834   int dtype = 0;
2835   tree inner_type;
2836   int ndim;
2837   int i;
2838   tree *idx_arr;
2839   tree tem;
2840
2841   /* If TYPE is an unconstrained array, use the underlying array type.  */
2842   if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
2843     type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (type))));
2844
2845   /* If this is an array, compute the number of dimensions in the array,
2846      get the index types, and point to the inner type.  */
2847   if (TREE_CODE (type) != ARRAY_TYPE)
2848     ndim = 0;
2849   else
2850     for (ndim = 1, inner_type = type;
2851          TREE_CODE (TREE_TYPE (inner_type)) == ARRAY_TYPE
2852          && TYPE_MULTI_ARRAY_P (TREE_TYPE (inner_type));
2853          ndim++, inner_type = TREE_TYPE (inner_type))
2854       ;
2855
2856   idx_arr = (tree *) alloca (ndim * sizeof (tree));
2857
2858   if (mech != By_Descriptor_NCA
2859       && TREE_CODE (type) == ARRAY_TYPE && TYPE_CONVENTION_FORTRAN_P (type))
2860     for (i = ndim - 1, inner_type = type;
2861          i >= 0;
2862          i--, inner_type = TREE_TYPE (inner_type))
2863       idx_arr[i] = TYPE_DOMAIN (inner_type);
2864   else
2865     for (i = 0, inner_type = type;
2866          i < ndim;
2867          i++, inner_type = TREE_TYPE (inner_type))
2868       idx_arr[i] = TYPE_DOMAIN (inner_type);
2869
2870   /* Now get the DTYPE value.  */
2871   switch (TREE_CODE (type))
2872     {
2873     case INTEGER_TYPE:
2874     case ENUMERAL_TYPE:
2875     case BOOLEAN_TYPE:
2876       if (TYPE_VAX_FLOATING_POINT_P (type))
2877         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2878           {
2879           case 6:
2880             dtype = 10;
2881             break;
2882           case 9:
2883             dtype = 11;
2884             break;
2885           case 15:
2886             dtype = 27;
2887             break;
2888           }
2889       else
2890         switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
2891           {
2892           case 8:
2893             dtype = TYPE_UNSIGNED (type) ? 2 : 6;
2894             break;
2895           case 16:
2896             dtype = TYPE_UNSIGNED (type) ? 3 : 7;
2897             break;
2898           case 32:
2899             dtype = TYPE_UNSIGNED (type) ? 4 : 8;
2900             break;
2901           case 64:
2902             dtype = TYPE_UNSIGNED (type) ? 5 : 9;
2903             break;
2904           case 128:
2905             dtype = TYPE_UNSIGNED (type) ? 25 : 26;
2906             break;
2907           }
2908       break;
2909
2910     case REAL_TYPE:
2911       dtype = GET_MODE_BITSIZE (TYPE_MODE (type)) == 32 ? 52 : 53;
2912       break;
2913
2914     case COMPLEX_TYPE:
2915       if (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE
2916           && TYPE_VAX_FLOATING_POINT_P (type))
2917         switch (tree_low_cst (TYPE_DIGITS_VALUE (type), 1))
2918           {
2919           case 6:
2920             dtype = 12;
2921             break;
2922           case 9:
2923             dtype = 13;
2924             break;
2925           case 15:
2926             dtype = 29;
2927           }
2928       else
2929         dtype = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) == 32 ? 54: 55;
2930       break;
2931
2932     case ARRAY_TYPE:
2933       dtype = 14;
2934       break;
2935
2936     default:
2937       break;
2938     }
2939
2940   /* Get the CLASS value.  */
2941   switch (mech)
2942     {
2943     case By_Descriptor_A:
2944       class = 4;
2945       break;
2946     case By_Descriptor_NCA:
2947       class = 10;
2948       break;
2949     case By_Descriptor_SB:
2950       class = 15;
2951       break;
2952     case By_Descriptor:
2953     case By_Descriptor_S:
2954     default:
2955       class = 1;
2956       break;
2957     }
2958
2959   /* Make the type for a 64bit descriptor for VMS.  The first six fields
2960      are the same for all types.  */
2961
2962   field_list64 = chainon (field_list64,
2963                         make_descriptor_field ("MBO",
2964                                                gnat_type_for_size (16, 1),
2965                                                record64_type, size_int (1)));
2966
2967   field_list64 = chainon (field_list64,
2968                         make_descriptor_field ("DTYPE",
2969                                                gnat_type_for_size (8, 1),
2970                                                record64_type, size_int (dtype)));
2971   field_list64 = chainon (field_list64,
2972                         make_descriptor_field ("CLASS",
2973                                                gnat_type_for_size (8, 1),
2974                                                record64_type, size_int (class)));
2975
2976   field_list64 = chainon (field_list64,
2977                         make_descriptor_field ("MBMO",
2978                                                gnat_type_for_size (32, 1),
2979                                                record64_type, ssize_int (-1)));
2980
2981   field_list64
2982     = chainon (field_list64,
2983                make_descriptor_field
2984                ("LENGTH", gnat_type_for_size (64, 1), record64_type,
2985                 size_in_bytes (mech == By_Descriptor_A ? inner_type : type)));
2986
2987   pointer64_type = build_pointer_type_for_mode (type, DImode, false);
2988
2989   field_list64
2990     = chainon (field_list64,
2991                make_descriptor_field
2992                ("POINTER", pointer64_type, record64_type,
2993                 build_unary_op (ADDR_EXPR,
2994                                 pointer64_type,
2995                                 build0 (PLACEHOLDER_EXPR, type))));
2996
2997   switch (mech)
2998     {
2999     case By_Descriptor:
3000     case By_Descriptor_S:
3001       break;
3002
3003     case By_Descriptor_SB:
3004       field_list64
3005         = chainon (field_list64,
3006                    make_descriptor_field
3007                    ("SB_L1", gnat_type_for_size (64, 1), record64_type,
3008                     TREE_CODE (type) == ARRAY_TYPE
3009                     ? TYPE_MIN_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
3010       field_list64
3011         = chainon (field_list64,
3012                    make_descriptor_field
3013                    ("SB_U1", gnat_type_for_size (64, 1), record64_type,
3014                     TREE_CODE (type) == ARRAY_TYPE
3015                     ? TYPE_MAX_VALUE (TYPE_DOMAIN (type)) : size_zero_node));
3016       break;
3017
3018     case By_Descriptor_A:
3019     case By_Descriptor_NCA:
3020       field_list64 = chainon (field_list64,
3021                             make_descriptor_field ("SCALE",
3022                                                    gnat_type_for_size (8, 1),
3023                                                    record64_type,
3024                                                    size_zero_node));
3025
3026       field_list64 = chainon (field_list64,
3027                             make_descriptor_field ("DIGITS",
3028                                                    gnat_type_for_size (8, 1),
3029                                                    record64_type,
3030                                                    size_zero_node));
3031
3032       field_list64
3033         = chainon (field_list64,
3034                    make_descriptor_field
3035                    ("AFLAGS", gnat_type_for_size (8, 1), record64_type,
3036                     size_int (mech == By_Descriptor_NCA
3037                               ? 0
3038                               /* Set FL_COLUMN, FL_COEFF, and FL_BOUNDS.  */
3039                               : (TREE_CODE (type) == ARRAY_TYPE
3040                                  && TYPE_CONVENTION_FORTRAN_P (type)
3041                                  ? 224 : 192))));
3042
3043       field_list64 = chainon (field_list64,
3044                             make_descriptor_field ("DIMCT",
3045                                                    gnat_type_for_size (8, 1),
3046                                                    record64_type,
3047                                                    size_int (ndim)));
3048
3049       field_list64 = chainon (field_list64,
3050                             make_descriptor_field ("MBZ",
3051                                                    gnat_type_for_size (32, 1),
3052                                                    record64_type,
3053                                                    size_int (0)));
3054       field_list64 = chainon (field_list64,
3055                             make_descriptor_field ("ARSIZE",
3056                                                    gnat_type_for_size (64, 1),
3057                                                    record64_type,
3058                                                    size_in_bytes (type)));
3059
3060       /* Now build a pointer to the 0,0,0... element.  */
3061       tem = build0 (PLACEHOLDER_EXPR, type);
3062       for (i = 0, inner_type = type; i < ndim;
3063            i++, inner_type = TREE_TYPE (inner_type))
3064         tem = build4 (ARRAY_REF, TREE_TYPE (inner_type), tem,
3065                       convert (TYPE_DOMAIN (inner_type), size_zero_node),
3066                       NULL_TREE, NULL_TREE);
3067
3068       field_list64
3069         = chainon (field_list64,
3070                    make_descriptor_field
3071                    ("A0",
3072                     build_pointer_type_for_mode (inner_type, DImode, false),
3073                     record64_type,
3074                     build1 (ADDR_EXPR,
3075                             build_pointer_type_for_mode (inner_type, DImode,
3076                                                          false),
3077                             tem)));
3078
3079       /* Next come the addressing coefficients.  */
3080       tem = size_one_node;
3081       for (i = 0; i < ndim; i++)
3082         {
3083           char fname[3];
3084           tree idx_length
3085             = size_binop (MULT_EXPR, tem,
3086                           size_binop (PLUS_EXPR,
3087                                       size_binop (MINUS_EXPR,
3088                                                   TYPE_MAX_VALUE (idx_arr[i]),
3089                                                   TYPE_MIN_VALUE (idx_arr[i])),
3090                                       size_int (1)));
3091
3092           fname[0] = (mech == By_Descriptor_NCA ? 'S' : 'M');
3093           fname[1] = '0' + i, fname[2] = 0;
3094           field_list64
3095             = chainon (field_list64,
3096                        make_descriptor_field (fname,
3097                                               gnat_type_for_size (64, 1),
3098                                               record64_type, idx_length));
3099
3100           if (mech == By_Descriptor_NCA)
3101             tem = idx_length;
3102         }
3103
3104       /* Finally here are the bounds.  */
3105       for (i = 0; i < ndim; i++)
3106         {
3107           char fname[3];
3108
3109           fname[0] = 'L', fname[1] = '0' + i, fname[2] = 0;
3110           field_list64
3111             = chainon (field_list64,
3112                        make_descriptor_field
3113                        (fname, gnat_type_for_size (64, 1), record64_type,
3114                         TYPE_MIN_VALUE (idx_arr[i])));
3115
3116           fname[0] = 'U';
3117           field_list64
3118             = chainon (field_list64,
3119                        make_descriptor_field
3120                        (fname, gnat_type_for_size (64, 1), record64_type,
3121                         TYPE_MAX_VALUE (idx_arr[i])));
3122         }
3123       break;
3124
3125     default:
3126       post_error ("unsupported descriptor type for &", gnat_entity);
3127     }
3128
3129   TYPE_NAME (record64_type) = create_concat_name (gnat_entity, "DESC64");
3130   finish_record_type (record64_type, field_list64, 0, true);
3131   return record64_type;
3132 }
3133
3134 /* Utility routine for above code to make a field.  */
3135
3136 static tree
3137 make_descriptor_field (const char *name, tree type,
3138                        tree rec_type, tree initial)
3139 {
3140   tree field
3141     = create_field_decl (get_identifier (name), type, rec_type, 0, 0, 0, 0);
3142
3143   DECL_INITIAL (field) = initial;
3144   return field;
3145 }
3146
3147 /* Convert GNU_EXPR, a pointer to a 64bit VMS descriptor, to GNU_TYPE, a
3148    regular pointer or fat pointer type.  GNAT_SUBPROG is the subprogram to
3149    which the VMS descriptor is passed.  */
3150
3151 static tree
3152 convert_vms_descriptor64 (tree gnu_type, tree gnu_expr, Entity_Id gnat_subprog)
3153 {
3154   tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr));
3155   tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr);
3156   /* The CLASS field is the 3rd field in the descriptor.  */
3157   tree class = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (desc_type)));
3158   /* The POINTER field is the 6th field in the descriptor.  */
3159   tree pointer64 = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (class)));
3160
3161   /* Retrieve the value of the POINTER field.  */
3162   tree gnu_expr64
3163     = build3 (COMPONENT_REF, TREE_TYPE (pointer64), desc, pointer64, NULL_TREE);
3164
3165   if (POINTER_TYPE_P (gnu_type))
3166     return convert (gnu_type, gnu_expr64);
3167
3168   else if (TYPE_FAT_POINTER_P (gnu_type))
3169     {
3170       tree p_array_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
3171       tree p_bounds_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
3172       tree template_type = TREE_TYPE (p_bounds_type);
3173       tree min_field = TYPE_FIELDS (template_type);
3174       tree max_field = TREE_CHAIN (TYPE_FIELDS (template_type));
3175       tree template, template_addr, aflags, dimct, t, u;
3176       /* See the head comment of build_vms_descriptor.  */
3177       int iclass = TREE_INT_CST_LOW (DECL_INITIAL (class));
3178       tree lfield, ufield;
3179
3180       /* Convert POINTER to the type of the P_ARRAY field.  */
3181       gnu_expr64 = convert (p_array_type, gnu_expr64);
3182
3183       switch (iclass)
3184         {
3185         case 1:  /* Class S  */
3186         case 15: /* Class SB */
3187           /* Build {1, LENGTH} template; LENGTH64 is the 5th field.  */
3188           t = TREE_CHAIN (TREE_CHAIN (class));
3189           t = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3190           t = tree_cons (min_field,
3191                          convert (TREE_TYPE (min_field), integer_one_node),
3192                          tree_cons (max_field,
3193                                     convert (TREE_TYPE (max_field), t),
3194                                     NULL_TREE));
3195           template = gnat_build_constructor (template_type, t);
3196           template_addr = build_unary_op (ADDR_EXPR, NULL_TREE, template);
3197
3198           /* For class S, we are done.  */
3199           if (iclass == 1)
3200             break;
3201
3202           /* Test that we really have a SB descriptor, like DEC Ada.  */
3203           t = build3 (COMPONENT_REF, TREE_TYPE (class), desc, class, NULL);
3204           u = convert (TREE_TYPE (class), DECL_INITIAL (class));
3205           u = build_binary_op (EQ_EXPR, integer_type_node, t, u);
3206           /* If so, there is already a template in the descriptor and
3207              it is located right after the POINTER field.  The fields are
3208              64bits so they must be repacked. */
3209           t = TREE_CHAIN (pointer64);
3210           lfield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3211           lfield = convert (TREE_TYPE (TYPE_FIELDS (template_type)), lfield);
3212
3213           t = TREE_CHAIN (t);
3214           ufield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3215           ufield = convert
3216            (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (template_type))), ufield);
3217
3218           /* Build the template in the form of a constructor. */
3219           t = tree_cons (TYPE_FIELDS (template_type), lfield,
3220                          tree_cons (TREE_CHAIN (TYPE_FIELDS (template_type)),
3221                                     ufield, NULL_TREE));
3222           template = gnat_build_constructor (template_type, t);
3223
3224           /* Otherwise use the {1, LENGTH} template we build above.  */
3225           template_addr = build3 (COND_EXPR, p_bounds_type, u,
3226                                   build_unary_op (ADDR_EXPR, p_bounds_type,
3227                                                  template),
3228                                   template_addr);
3229           break;
3230
3231         case 4:  /* Class A */
3232           /* The AFLAGS field is the 3rd field after the pointer in the
3233              descriptor.  */
3234           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (pointer64)));
3235           aflags = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3236           /* The DIMCT field is the next field in the descriptor after
3237              aflags.  */
3238           t = TREE_CHAIN (t);
3239           dimct = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3240           /* Raise CONSTRAINT_ERROR if either more than 1 dimension
3241              or FL_COEFF or FL_BOUNDS not set.  */
3242           u = build_int_cst (TREE_TYPE (aflags), 192);
3243           u = build_binary_op (TRUTH_OR_EXPR, integer_type_node,
3244                                build_binary_op (NE_EXPR, integer_type_node,
3245                                                 dimct,
3246                                                 convert (TREE_TYPE (dimct),
3247                                                          size_one_node)),
3248                                build_binary_op (NE_EXPR, integer_type_node,
3249                                                 build2 (BIT_AND_EXPR,
3250                                                         TREE_TYPE (aflags),
3251                                                         aflags, u),
3252                                                 u));
3253           /* There is already a template in the descriptor and it is located
3254              in block 3.  The fields are 64bits so they must be repacked. */
3255           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN
3256               (t)))));
3257           lfield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3258           lfield = convert (TREE_TYPE (TYPE_FIELDS (template_type)), lfield);
3259
3260           t = TREE_CHAIN (t);
3261           ufield = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3262           ufield = convert
3263            (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (template_type))), ufield);
3264
3265           /* Build the template in the form of a constructor. */
3266           t = tree_cons (TYPE_FIELDS (template_type), lfield,
3267                          tree_cons (TREE_CHAIN (TYPE_FIELDS (template_type)),
3268                                     ufield, NULL_TREE));
3269           template = gnat_build_constructor (template_type, t);
3270           template = build3 (COND_EXPR, p_bounds_type, u,
3271                             build_call_raise (CE_Length_Check_Failed, Empty,
3272                                               N_Raise_Constraint_Error),
3273                             template);
3274           template_addr = build_unary_op (ADDR_EXPR, p_bounds_type, template);
3275           break;
3276
3277         case 10: /* Class NCA */
3278         default:
3279           post_error ("unsupported descriptor type for &", gnat_subprog);
3280           template_addr = integer_zero_node;
3281           break;
3282         }
3283
3284       /* Build the fat pointer in the form of a constructor.  */
3285       t = tree_cons (TYPE_FIELDS (gnu_type), gnu_expr64,
3286                      tree_cons (TREE_CHAIN (TYPE_FIELDS (gnu_type)),
3287                                 template_addr, NULL_TREE));
3288       return gnat_build_constructor (gnu_type, t);
3289     }
3290
3291   else
3292     gcc_unreachable ();
3293 }
3294
3295 /* Convert GNU_EXPR, a pointer to a 32bit VMS descriptor, to GNU_TYPE, a
3296    regular pointer or fat pointer type.  GNAT_SUBPROG is the subprogram to
3297    which the VMS descriptor is passed.  */
3298
3299 static tree
3300 convert_vms_descriptor32 (tree gnu_type, tree gnu_expr, Entity_Id gnat_subprog)
3301 {
3302   tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr));
3303   tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr);
3304   /* The CLASS field is the 3rd field in the descriptor.  */
3305   tree class = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (desc_type)));
3306   /* The POINTER field is the 4th field in the descriptor.  */
3307   tree pointer = TREE_CHAIN (class);
3308
3309   /* Retrieve the value of the POINTER field.  */
3310   tree gnu_expr32
3311     = build3 (COMPONENT_REF, TREE_TYPE (pointer), desc, pointer, NULL_TREE);
3312
3313   if (POINTER_TYPE_P (gnu_type))
3314     return convert (gnu_type, gnu_expr32);
3315
3316   else if (TYPE_FAT_POINTER_P (gnu_type))
3317     {
3318       tree p_array_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
3319       tree p_bounds_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)));
3320       tree template_type = TREE_TYPE (p_bounds_type);
3321       tree min_field = TYPE_FIELDS (template_type);
3322       tree max_field = TREE_CHAIN (TYPE_FIELDS (template_type));
3323       tree template, template_addr, aflags, dimct, t, u;
3324       /* See the head comment of build_vms_descriptor.  */
3325       int iclass = TREE_INT_CST_LOW (DECL_INITIAL (class));
3326
3327       /* Convert POINTER to the type of the P_ARRAY field.  */
3328       gnu_expr32 = convert (p_array_type, gnu_expr32);
3329
3330       switch (iclass)
3331         {
3332         case 1:  /* Class S  */
3333         case 15: /* Class SB */
3334           /* Build {1, LENGTH} template; LENGTH is the 1st field.  */
3335           t = TYPE_FIELDS (desc_type);
3336           t = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3337           t = tree_cons (min_field,
3338                          convert (TREE_TYPE (min_field), integer_one_node),
3339                          tree_cons (max_field,
3340                                     convert (TREE_TYPE (max_field), t),
3341                                     NULL_TREE));
3342           template = gnat_build_constructor (template_type, t);
3343           template_addr = build_unary_op (ADDR_EXPR, NULL_TREE, template);
3344
3345           /* For class S, we are done.  */
3346           if (iclass == 1)
3347             break;
3348
3349           /* Test that we really have a SB descriptor, like DEC Ada.  */
3350           t = build3 (COMPONENT_REF, TREE_TYPE (class), desc, class, NULL);
3351           u = convert (TREE_TYPE (class), DECL_INITIAL (class));
3352           u = build_binary_op (EQ_EXPR, integer_type_node, t, u);
3353           /* If so, there is already a template in the descriptor and
3354              it is located right after the POINTER field.  */
3355           t = TREE_CHAIN (pointer);
3356           template = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3357           /* Otherwise use the {1, LENGTH} template we build above.  */
3358           template_addr = build3 (COND_EXPR, p_bounds_type, u,
3359                                   build_unary_op (ADDR_EXPR, p_bounds_type,
3360                                                  template),
3361                                   template_addr);
3362           break;
3363
3364         case 4:  /* Class A */
3365           /* The AFLAGS field is the 7th field in the descriptor.  */
3366           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (pointer)));
3367           aflags = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3368           /* The DIMCT field is the 8th field in the descriptor.  */
3369           t = TREE_CHAIN (t);
3370           dimct = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3371           /* Raise CONSTRAINT_ERROR if either more than 1 dimension
3372              or FL_COEFF or FL_BOUNDS not set.  */
3373           u = build_int_cst (TREE_TYPE (aflags), 192);
3374           u = build_binary_op (TRUTH_OR_EXPR, integer_type_node,
3375                                build_binary_op (NE_EXPR, integer_type_node,
3376                                                 dimct,
3377                                                 convert (TREE_TYPE (dimct),
3378                                                          size_one_node)),
3379                                build_binary_op (NE_EXPR, integer_type_node,
3380                                                 build2 (BIT_AND_EXPR,
3381                                                         TREE_TYPE (aflags),
3382                                                         aflags, u),
3383                                                 u));
3384           /* There is already a template in the descriptor and it is
3385              located at the start of block 3 (12th field).  */
3386           t = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (t))));
3387           template = build3 (COMPONENT_REF, TREE_TYPE (t), desc, t, NULL_TREE);
3388           template = build3 (COND_EXPR, p_bounds_type, u,
3389                             build_call_raise (CE_Length_Check_Failed, Empty,
3390                                               N_Raise_Constraint_Error),
3391                             template);
3392           template_addr = build_unary_op (ADDR_EXPR, p_bounds_type, template);
3393           break;
3394
3395         case 10: /* Class NCA */
3396         default:
3397           post_error ("unsupported descriptor type for &", gnat_subprog);
3398           template_addr = integer_zero_node;
3399           break;
3400         }
3401
3402       /* Build the fat pointer in the form of a constructor.  */
3403       t = tree_cons (TYPE_FIELDS (gnu_type), gnu_expr32,
3404                      tree_cons (TREE_CHAIN (TYPE_FIELDS (gnu_type)),
3405                                 template_addr, NULL_TREE));
3406
3407       return gnat_build_constructor (gnu_type, t);
3408     }
3409
3410   else
3411     gcc_unreachable ();
3412 }
3413
3414 /* Convert GNU_EXPR, a pointer to a VMS descriptor, to GNU_TYPE, a regular
3415    pointer or fat pointer type.  GNU_EXPR_ALT_TYPE is the alternate (32-bit)
3416    pointer type of GNU_EXPR.  GNAT_SUBPROG is the subprogram to which the
3417    VMS descriptor is passed.  */
3418
3419 static tree
3420 convert_vms_descriptor (tree gnu_type, tree gnu_expr, tree gnu_expr_alt_type,
3421                         Entity_Id gnat_subprog)
3422 {
3423   tree desc_type = TREE_TYPE (TREE_TYPE (gnu_expr));
3424   tree desc = build1 (INDIRECT_REF, desc_type, gnu_expr);
3425   tree mbo = TYPE_FIELDS (desc_type);
3426   const char *mbostr = IDENTIFIER_POINTER (DECL_NAME (mbo));
3427   tree mbmo = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (mbo)));
3428   tree is64bit, gnu_expr32, gnu_expr64;
3429
3430   /* If the field name is not MBO, it must be 32-bit and no alternate.
3431      Otherwise primary must be 64-bit and alternate 32-bit.  */
3432   if (strcmp (mbostr, "MBO") != 0)
3433     return convert_vms_descriptor32 (gnu_type, gnu_expr, gnat_subprog);
3434
3435   /* Build the test for 64-bit descriptor.  */
3436   mbo = build3 (COMPONENT_REF, TREE_TYPE (mbo), desc, mbo, NULL_TREE);
3437   mbmo = build3 (COMPONENT_REF, TREE_TYPE (mbmo), desc, mbmo, NULL_TREE);
3438   is64bit
3439     = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
3440                        build_binary_op (EQ_EXPR, integer_type_node,
3441                                         convert (integer_type_node, mbo),
3442                                         integer_one_node),
3443                        build_binary_op (EQ_EXPR, integer_type_node,
3444                                         convert (integer_type_node, mbmo),
3445                                         integer_minus_one_node));
3446
3447   /* Build the 2 possible end results.  */
3448   gnu_expr64 = convert_vms_descriptor64 (gnu_type, gnu_expr, gnat_subprog);
3449   gnu_expr = fold_convert (gnu_expr_alt_type, gnu_expr);
3450   gnu_expr32 = convert_vms_descriptor32 (gnu_type, gnu_expr, gnat_subprog);
3451
3452   return build3 (COND_EXPR, gnu_type, is64bit, gnu_expr64, gnu_expr32);
3453 }
3454
3455 /* Build a stub for the subprogram specified by the GCC tree GNU_SUBPROG
3456    and the GNAT node GNAT_SUBPROG.  */
3457
3458 void
3459 build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog)
3460 {
3461   tree gnu_subprog_type, gnu_subprog_addr, gnu_subprog_call;
3462   tree gnu_stub_param, gnu_param_list, gnu_arg_types, gnu_param;
3463   tree gnu_stub_decl = DECL_FUNCTION_STUB (gnu_subprog);
3464   tree gnu_body;
3465
3466   gnu_subprog_type = TREE_TYPE (gnu_subprog);
3467   gnu_param_list = NULL_TREE;
3468
3469   begin_subprog_body (gnu_stub_decl);
3470   gnat_pushlevel ();
3471
3472   start_stmt_group ();
3473
3474   /* Loop over the parameters of the stub and translate any of them
3475      passed by descriptor into a by reference one.  */
3476   for (gnu_stub_param = DECL_ARGUMENTS (gnu_stub_decl),
3477        gnu_arg_types = TYPE_ARG_TYPES (gnu_subprog_type);
3478        gnu_stub_param;
3479        gnu_stub_param = TREE_CHAIN (gnu_stub_param),
3480        gnu_arg_types = TREE_CHAIN (gnu_arg_types))
3481     {
3482       if (DECL_BY_DESCRIPTOR_P (gnu_stub_param))
3483         gnu_param
3484           = convert_vms_descriptor (TREE_VALUE (gnu_arg_types),
3485                                     gnu_stub_param,
3486                                     DECL_PARM_ALT_TYPE (gnu_stub_param),
3487                                     gnat_subprog);
3488       else
3489         gnu_param = gnu_stub_param;
3490
3491       gnu_param_list = tree_cons (NULL_TREE, gnu_param, gnu_param_list);
3492     }
3493
3494   gnu_body = end_stmt_group ();
3495
3496   /* Invoke the internal subprogram.  */
3497   gnu_subprog_addr = build1 (ADDR_EXPR, build_pointer_type (gnu_subprog_type),
3498                              gnu_subprog);
3499   gnu_subprog_call = build_call_list (TREE_TYPE (gnu_subprog_type),
3500                                       gnu_subprog_addr,
3501                                       nreverse (gnu_param_list));
3502
3503   /* Propagate the return value, if any.  */
3504   if (VOID_TYPE_P (TREE_TYPE (gnu_subprog_type)))
3505     append_to_statement_list (gnu_subprog_call, &gnu_body);
3506   else
3507     append_to_statement_list (build_return_expr (DECL_RESULT (gnu_stub_decl),
3508                                                  gnu_subprog_call),
3509                               &gnu_body);
3510
3511   gnat_poplevel ();
3512
3513   allocate_struct_function (gnu_stub_decl, false);
3514   end_subprog_body (gnu_body, false);
3515 }
3516 \f
3517 /* Build a type to be used to represent an aliased object whose nominal
3518    type is an unconstrained array.  This consists of a RECORD_TYPE containing
3519    a field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an
3520    ARRAY_TYPE.  If ARRAY_TYPE is that of the unconstrained array, this
3521    is used to represent an arbitrary unconstrained object.  Use NAME
3522    as the name of the record.  */
3523
3524 tree
3525 build_unc_object_type (tree template_type, tree object_type, tree name)
3526 {
3527   tree type = make_node (RECORD_TYPE);
3528   tree template_field = create_field_decl (get_identifier ("BOUNDS"),
3529                                            template_type, type, 0, 0, 0, 1);
3530   tree array_field = create_field_decl (get_identifier ("ARRAY"), object_type,
3531                                         type, 0, 0, 0, 1);
3532
3533   TYPE_NAME (type) = name;
3534   TYPE_CONTAINS_TEMPLATE_P (type) = 1;
3535   finish_record_type (type,
3536                       chainon (chainon (NULL_TREE, template_field),
3537                                array_field),
3538                       0, false);
3539
3540   return type;
3541 }
3542
3543 /* Same, taking a thin or fat pointer type instead of a template type. */
3544
3545 tree
3546 build_unc_object_type_from_ptr (tree thin_fat_ptr_type, tree object_type,
3547                                 tree name)
3548 {
3549   tree template_type;
3550
3551   gcc_assert (TYPE_FAT_OR_THIN_POINTER_P (thin_fat_ptr_type));
3552
3553   template_type
3554     = (TYPE_FAT_POINTER_P (thin_fat_ptr_type)
3555        ? TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (thin_fat_ptr_type))))
3556        : TREE_TYPE (TYPE_FIELDS (TREE_TYPE (thin_fat_ptr_type))));
3557   return build_unc_object_type (template_type, object_type, name);
3558 }
3559
3560 /* Shift the component offsets within an unconstrained object TYPE to make it
3561    suitable for use as a designated type for thin pointers.  */
3562
3563 void
3564 shift_unc_components_for_thin_pointers (tree type)
3565 {
3566   /* Thin pointer values designate the ARRAY data of an unconstrained object,
3567      allocated past the BOUNDS template.  The designated type is adjusted to
3568      have ARRAY at position zero and the template at a negative offset, so
3569      that COMPONENT_REFs on (*thin_ptr) designate the proper location.  */
3570
3571   tree bounds_field = TYPE_FIELDS (type);
3572   tree array_field  = TREE_CHAIN (TYPE_FIELDS (type));
3573
3574   DECL_FIELD_OFFSET (bounds_field)
3575     = size_binop (MINUS_EXPR, size_zero_node, byte_position (array_field));
3576
3577   DECL_FIELD_OFFSET (array_field) = size_zero_node;
3578   DECL_FIELD_BIT_OFFSET (array_field) = bitsize_zero_node;
3579 }
3580 \f
3581 /* Update anything previously pointing to OLD_TYPE to point to NEW_TYPE.
3582    In the normal case this is just two adjustments, but we have more to
3583    do if NEW_TYPE is an UNCONSTRAINED_ARRAY_TYPE.  */
3584
3585 void
3586 update_pointer_to (tree old_type, tree new_type)
3587 {
3588   tree ptr = TYPE_POINTER_TO (old_type);
3589   tree ref = TYPE_REFERENCE_TO (old_type);
3590   tree ptr1, ref1;
3591   tree type;
3592
3593   /* If this is the main variant, process all the other variants first.  */
3594   if (TYPE_MAIN_VARIANT (old_type) == old_type)
3595     for (type = TYPE_NEXT_VARIANT (old_type); type;
3596          type = TYPE_NEXT_VARIANT (type))
3597       update_pointer_to (type, new_type);
3598
3599   /* If no pointers and no references, we are done.  */
3600   if (!ptr && !ref)
3601     return;
3602
3603   /* Merge the old type qualifiers in the new type.
3604
3605      Each old variant has qualifiers for specific reasons, and the new
3606      designated type as well.  Each set of qualifiers represents useful
3607      information grabbed at some point, and merging the two simply unifies
3608      these inputs into the final type description.
3609
3610      Consider for instance a volatile type frozen after an access to constant
3611      type designating it; after the designated type's freeze, we get here with
3612      a volatile NEW_TYPE and a dummy OLD_TYPE with a readonly variant, created
3613      when the access type was processed.  We will make a volatile and readonly
3614      designated type, because that's what it really is.
3615
3616      We might also get here for a non-dummy OLD_TYPE variant with different
3617      qualifiers than those of NEW_TYPE, for instance in some cases of pointers
3618      to private record type elaboration (see the comments around the call to
3619      this routine in gnat_to_gnu_entity <E_Access_Type>).  We have to merge
3620      the qualifiers in those cases too, to avoid accidentally discarding the
3621      initial set, and will often end up with OLD_TYPE == NEW_TYPE then.  */
3622   new_type
3623     = build_qualified_type (new_type,
3624                             TYPE_QUALS (old_type) | TYPE_QUALS (new_type));
3625
3626   /* If old type and new type are identical, there is nothing to do.  */
3627   if (old_type == new_type)
3628     return;
3629
3630   /* Otherwise, first handle the simple case.  */
3631   if (TREE_CODE (new_type) != UNCONSTRAINED_ARRAY_TYPE)
3632     {
3633       TYPE_POINTER_TO (new_type) = ptr;
3634       TYPE_REFERENCE_TO (new_type) = ref;
3635
3636       for (; ptr; ptr = TYPE_NEXT_PTR_TO (ptr))
3637         for (ptr1 = TYPE_MAIN_VARIANT (ptr); ptr1;
3638              ptr1 = TYPE_NEXT_VARIANT (ptr1))
3639           TREE_TYPE (ptr1) = new_type;
3640
3641       for (; ref; ref = TYPE_NEXT_REF_TO (ref))
3642         for (ref1 = TYPE_MAIN_VARIANT (ref); ref1;
3643              ref1 = TYPE_NEXT_VARIANT (ref1))
3644           TREE_TYPE (ref1) = new_type;
3645     }
3646
3647   /* Now deal with the unconstrained array case.  In this case the "pointer"
3648      is actually a RECORD_TYPE where both fields are pointers to dummy nodes.
3649      Turn them into pointers to the correct types using update_pointer_to.  */
3650   else if (!TYPE_FAT_POINTER_P (ptr))
3651     gcc_unreachable ();
3652
3653   else
3654     {
3655       tree new_obj_rec = TYPE_OBJECT_RECORD_TYPE (new_type);
3656       tree array_field = TYPE_FIELDS (ptr);
3657       tree bounds_field = TREE_CHAIN (TYPE_FIELDS (ptr));
3658       tree new_ptr = TYPE_POINTER_TO (new_type);
3659       tree new_ref;
3660       tree var;
3661
3662       /* Make pointers to the dummy template point to the real template.  */
3663       update_pointer_to
3664         (TREE_TYPE (TREE_TYPE (bounds_field)),
3665          TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (new_ptr)))));
3666
3667       /* The references to the template bounds present in the array type
3668          are made through a PLACEHOLDER_EXPR of type NEW_PTR.  Since we
3669          are updating PTR to make it a full replacement for NEW_PTR as
3670          pointer to NEW_TYPE, we must rework the PLACEHOLDER_EXPR so as
3671          to make it of type PTR.  */
3672       new_ref = build3 (COMPONENT_REF, TREE_TYPE (bounds_field),
3673                         build0 (PLACEHOLDER_EXPR, ptr),
3674                         bounds_field, NULL_TREE);
3675
3676       /* Create the new array for the new PLACEHOLDER_EXPR and make pointers
3677          to the dummy array point to it.  */
3678       update_pointer_to
3679         (TREE_TYPE (TREE_TYPE (array_field)),
3680          substitute_in_type (TREE_TYPE (TREE_TYPE (TYPE_FIELDS (new_ptr))),
3681                              TREE_CHAIN (TYPE_FIELDS (new_ptr)), new_ref));
3682
3683       /* Make PTR the pointer to NEW_TYPE.  */
3684       TYPE_POINTER_TO (new_type) = TYPE_REFERENCE_TO (new_type)
3685         = TREE_TYPE (new_type) = ptr;
3686
3687       for (var = TYPE_MAIN_VARIANT (ptr); var; var = TYPE_NEXT_VARIANT (var))
3688         SET_TYPE_UNCONSTRAINED_ARRAY (var, new_type);
3689
3690       /* Now handle updating the allocation record, what the thin pointer
3691          points to.  Update all pointers from the old record into the new
3692          one, update the type of the array field, and recompute the size.  */
3693       update_pointer_to (TYPE_OBJECT_RECORD_TYPE (old_type), new_obj_rec);
3694
3695       TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec)))
3696         = TREE_TYPE (TREE_TYPE (array_field));
3697
3698       /* The size recomputation needs to account for alignment constraints, so
3699          we let layout_type work it out.  This will reset the field offsets to
3700          what they would be in a regular record, so we shift them back to what
3701          we want them to be for a thin pointer designated type afterwards.  */
3702       DECL_SIZE (TYPE_FIELDS (new_obj_rec)) = 0;
3703       DECL_SIZE (TREE_CHAIN (TYPE_FIELDS (new_obj_rec))) = 0;
3704       TYPE_SIZE (new_obj_rec) = 0;
3705       layout_type (new_obj_rec);
3706
3707       shift_unc_components_for_thin_pointers (new_obj_rec);
3708
3709       /* We are done, at last.  */
3710       rest_of_record_type_compilation (ptr);
3711     }
3712 }
3713 \f
3714 /* Convert EXPR, a pointer to a constrained array, into a pointer to an
3715    unconstrained one.  This involves making or finding a template.  */
3716
3717 static tree
3718 convert_to_fat_pointer (tree type, tree expr)
3719 {
3720   tree template_type = TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type))));
3721   tree p_array_type = TREE_TYPE (TYPE_FIELDS (type));
3722   tree etype = TREE_TYPE (expr);
3723   tree template;
3724
3725   /* If EXPR is null, make a fat pointer that contains null pointers to the
3726      template and array.  */
3727   if (integer_zerop (expr))
3728     return
3729       gnat_build_constructor
3730         (type,
3731          tree_cons (TYPE_FIELDS (type),
3732                     convert (p_array_type, expr),
3733                     tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3734                                convert (build_pointer_type (template_type),
3735                                         expr),
3736                                NULL_TREE)));
3737
3738   /* If EXPR is a thin pointer, make template and data from the record..  */
3739   else if (TYPE_THIN_POINTER_P (etype))
3740     {
3741       tree fields = TYPE_FIELDS (TREE_TYPE (etype));
3742
3743       expr = save_expr (expr);
3744       if (TREE_CODE (expr) == ADDR_EXPR)
3745         expr = TREE_OPERAND (expr, 0);
3746       else
3747         expr = build1 (INDIRECT_REF, TREE_TYPE (etype), expr);
3748
3749       template = build_component_ref (expr, NULL_TREE, fields, false);
3750       expr = build_unary_op (ADDR_EXPR, NULL_TREE,
3751                              build_component_ref (expr, NULL_TREE,
3752                                                   TREE_CHAIN (fields), false));
3753     }
3754
3755   /* Otherwise, build the constructor for the template.  */
3756   else
3757     template = build_template (template_type, TREE_TYPE (etype), expr);
3758
3759   /* The final result is a constructor for the fat pointer.
3760
3761      If EXPR is an argument of a foreign convention subprogram, the type it
3762      points to is directly the component type.  In this case, the expression
3763      type may not match the corresponding FIELD_DECL type at this point, so we
3764      call "convert" here to fix that up if necessary.  This type consistency is
3765      required, for instance because it ensures that possible later folding of
3766      COMPONENT_REFs against this constructor always yields something of the
3767      same type as the initial reference.
3768
3769      Note that the call to "build_template" above is still fine because it
3770      will only refer to the provided TEMPLATE_TYPE in this case.  */
3771   return
3772     gnat_build_constructor
3773       (type,
3774        tree_cons (TYPE_FIELDS (type),
3775                   convert (p_array_type, expr),
3776                   tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3777                              build_unary_op (ADDR_EXPR, NULL_TREE, template),
3778                              NULL_TREE)));
3779 }
3780 \f
3781 /* Convert to a thin pointer type, TYPE.  The only thing we know how to convert
3782    is something that is a fat pointer, so convert to it first if it EXPR
3783    is not already a fat pointer.  */
3784
3785 static tree
3786 convert_to_thin_pointer (tree type, tree expr)
3787 {
3788   if (!TYPE_FAT_POINTER_P (TREE_TYPE (expr)))
3789     expr
3790       = convert_to_fat_pointer
3791         (TREE_TYPE (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type))), expr);
3792
3793   /* We get the pointer to the data and use a NOP_EXPR to make it the
3794      proper GCC type.  */
3795   expr = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (TREE_TYPE (expr)),
3796                               false);
3797   expr = build1 (NOP_EXPR, type, expr);
3798
3799   return expr;
3800 }
3801 \f
3802 /* Create an expression whose value is that of EXPR,
3803    converted to type TYPE.  The TREE_TYPE of the value
3804    is always TYPE.  This function implements all reasonable
3805    conversions; callers should filter out those that are
3806    not permitted by the language being compiled.  */
3807
3808 tree
3809 convert (tree type, tree expr)
3810 {
3811   enum tree_code code = TREE_CODE (type);
3812   tree etype = TREE_TYPE (expr);
3813   enum tree_code ecode = TREE_CODE (etype);
3814
3815   /* If EXPR is already the right type, we are done.  */
3816   if (type == etype)
3817     return expr;
3818
3819   /* If both input and output have padding and are of variable size, do this
3820      as an unchecked conversion.  Likewise if one is a mere variant of the
3821      other, so we avoid a pointless unpad/repad sequence.  */
3822   else if (code == RECORD_TYPE && ecode == RECORD_TYPE
3823            && TYPE_IS_PADDING_P (type) && TYPE_IS_PADDING_P (etype)
3824            && (!TREE_CONSTANT (TYPE_SIZE (type))
3825                || !TREE_CONSTANT (TYPE_SIZE (etype))
3826                || gnat_types_compatible_p (type, etype)
3827                || TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type)))
3828                   == TYPE_NAME (TREE_TYPE (TYPE_FIELDS (etype)))))
3829     ;
3830
3831   /* If the output type has padding, convert to the inner type and
3832      make a constructor to build the record.  */
3833   else if (code == RECORD_TYPE && TYPE_IS_PADDING_P (type))
3834     {
3835       /* If we previously converted from another type and our type is
3836          of variable size, remove the conversion to avoid the need for
3837          variable-size temporaries.  Likewise for a conversion between
3838          original and packable version.  */
3839       if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
3840           && (!TREE_CONSTANT (TYPE_SIZE (type))
3841               || (ecode == RECORD_TYPE
3842                   && TYPE_NAME (etype)
3843                      == TYPE_NAME (TREE_TYPE (TREE_OPERAND (expr, 0))))))
3844         expr = TREE_OPERAND (expr, 0);
3845
3846       /* If we are just removing the padding from expr, convert the original
3847          object if we have variable size in order to avoid the need for some
3848          variable-size temporaries.  Likewise if the padding is a mere variant
3849          of the other, so we avoid a pointless unpad/repad sequence.  */
3850       if (TREE_CODE (expr) == COMPONENT_REF
3851           && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE
3852           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (expr, 0)))
3853           && (!TREE_CONSTANT (TYPE_SIZE (type))
3854               || gnat_types_compatible_p (type,
3855                                           TREE_TYPE (TREE_OPERAND (expr, 0)))
3856               || (ecode == RECORD_TYPE
3857                   && TYPE_NAME (etype)
3858                      == TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type))))))
3859         return convert (type, TREE_OPERAND (expr, 0));
3860
3861       /* If the result type is a padded type with a self-referentially-sized
3862          field and the expression type is a record, do this as an
3863          unchecked conversion.  */
3864       else if (TREE_CODE (etype) == RECORD_TYPE
3865                && CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type))))
3866         return unchecked_convert (type, expr, false);
3867
3868       else
3869         return
3870           gnat_build_constructor (type,
3871                              tree_cons (TYPE_FIELDS (type),
3872                                         convert (TREE_TYPE
3873                                                  (TYPE_FIELDS (type)),
3874                                                  expr),
3875                                         NULL_TREE));
3876     }
3877
3878   /* If the input type has padding, remove it and convert to the output type.
3879      The conditions ordering is arranged to ensure that the output type is not
3880      a padding type here, as it is not clear whether the conversion would
3881      always be correct if this was to happen.  */
3882   else if (ecode == RECORD_TYPE && TYPE_IS_PADDING_P (etype))
3883     {
3884       tree unpadded;
3885
3886       /* If we have just converted to this padded type, just get the
3887          inner expression.  */
3888       if (TREE_CODE (expr) == CONSTRUCTOR
3889           && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (expr))
3890           && VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->index
3891              == TYPE_FIELDS (etype))
3892         unpadded
3893           = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (expr), 0)->value;
3894
3895       /* Otherwise, build an explicit component reference.  */
3896       else
3897         unpadded
3898           = build_component_ref (expr, NULL_TREE, TYPE_FIELDS (etype), false);
3899
3900       return convert (type, unpadded);
3901     }
3902
3903   /* If the input is a biased type, adjust first.  */
3904   if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype))
3905     return convert (type, fold_build2 (PLUS_EXPR, TREE_TYPE (etype),
3906                                        fold_convert (TREE_TYPE (etype),
3907                                                      expr),
3908                                        TYPE_MIN_VALUE (etype)));
3909
3910   /* If the input is a justified modular type, we need to extract the actual
3911      object before converting it to any other type with the exceptions of an
3912      unconstrained array or of a mere type variant.  It is useful to avoid the
3913      extraction and conversion in the type variant case because it could end
3914      up replacing a VAR_DECL expr by a constructor and we might be about the
3915      take the address of the result.  */
3916   if (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)
3917       && code != UNCONSTRAINED_ARRAY_TYPE
3918       && TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (etype))
3919     return convert (type, build_component_ref (expr, NULL_TREE,
3920                                                TYPE_FIELDS (etype), false));
3921
3922   /* If converting to a type that contains a template, convert to the data
3923      type and then build the template. */
3924   if (code == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (type))
3925     {
3926       tree obj_type = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (type)));
3927
3928       /* If the source already has a template, get a reference to the
3929          associated array only, as we are going to rebuild a template
3930          for the target type anyway.  */
3931       expr = maybe_unconstrained_array (expr);
3932
3933       return
3934         gnat_build_constructor
3935           (type,
3936            tree_cons (TYPE_FIELDS (type),
3937                       build_template (TREE_TYPE (TYPE_FIELDS (type)),
3938                                       obj_type, NULL_TREE),
3939                       tree_cons (TREE_CHAIN (TYPE_FIELDS (type)),
3940                                  convert (obj_type, expr), NULL_TREE)));
3941     }
3942
3943   /* There are some special cases of expressions that we process
3944      specially.  */
3945   switch (TREE_CODE (expr))
3946     {
3947     case ERROR_MARK:
3948       return expr;
3949
3950     case NULL_EXPR:
3951       /* Just set its type here.  For TRANSFORM_EXPR, we will do the actual
3952          conversion in gnat_expand_expr.  NULL_EXPR does not represent
3953          and actual value, so no conversion is needed.  */
3954       expr = copy_node (expr);
3955       TREE_TYPE (expr) = type;
3956       return expr;
3957
3958     case STRING_CST:
3959       /* If we are converting a STRING_CST to another constrained array type,
3960          just make a new one in the proper type.  */
3961       if (code == ecode && AGGREGATE_TYPE_P (etype)
3962           && !(TREE_CODE (TYPE_SIZE (etype)) == INTEGER_CST
3963                && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
3964         {
3965           expr = copy_node (expr);
3966           TREE_TYPE (expr) = type;
3967           return expr;
3968         }
3969       break;
3970
3971     case CONSTRUCTOR:
3972       /* If we are converting a CONSTRUCTOR to a mere variant type, just make
3973          a new one in the proper type.  */
3974       if (code == ecode && gnat_types_compatible_p (type, etype))
3975         {
3976           expr = copy_node (expr);
3977           TREE_TYPE (expr) = type;
3978           return expr;
3979         }
3980
3981       /* Likewise for a conversion between original and packable version, but
3982          we have to work harder in order to preserve type consistency.  */
3983       if (code == ecode
3984           && code == RECORD_TYPE
3985           && TYPE_NAME (type) == TYPE_NAME (etype))
3986         {
3987           VEC(constructor_elt,gc) *e = CONSTRUCTOR_ELTS (expr);
3988           unsigned HOST_WIDE_INT len = VEC_length (constructor_elt, e);
3989           VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, len);
3990           tree efield = TYPE_FIELDS (etype), field = TYPE_FIELDS (type);
3991           unsigned HOST_WIDE_INT idx;
3992           tree index, value;
3993
3994           /* Whether we need to clear TREE_CONSTANT et al. on the output
3995              constructor when we convert in place.  */
3996           bool clear_constant = false;
3997
3998           FOR_EACH_CONSTRUCTOR_ELT(e, idx, index, value)
3999             {
4000               constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
4001               /* We expect only simple constructors.  Otherwise, punt.  */
4002               if (!(index == efield || index == DECL_ORIGINAL_FIELD (efield)))
4003                 break;
4004               elt->index = field;
4005               elt->value = convert (TREE_TYPE (field), value);
4006
4007               /* If packing has made this field a bitfield and the input
4008                  value couldn't be emitted statically any more, we need to
4009                  clear TREE_CONSTANT on our output.  */
4010               if (!clear_constant && TREE_CONSTANT (expr)
4011                   && !CONSTRUCTOR_BITFIELD_P (efield)
4012                   && CONSTRUCTOR_BITFIELD_P (field)
4013                   && !initializer_constant_valid_for_bitfield_p (value))
4014                 clear_constant = true;
4015
4016               efield = TREE_CHAIN (efield);
4017               field = TREE_CHAIN (field);
4018             }
4019
4020           /* If we have been able to match and convert all the input fields
4021              to their output type, convert in place now.  We'll fallback to a
4022              view conversion downstream otherwise.  */
4023           if (idx == len)
4024             {
4025               expr = copy_node (expr);
4026               TREE_TYPE (expr) = type;
4027               CONSTRUCTOR_ELTS (expr) = v;
4028               if (clear_constant)
4029                 TREE_CONSTANT (expr) = TREE_STATIC (expr) = false;
4030               return expr;
4031             }
4032         }
4033       break;
4034
4035     case UNCONSTRAINED_ARRAY_REF:
4036       /* Convert this to the type of the inner array by getting the address of
4037          the array from the template.  */
4038       expr = build_unary_op (INDIRECT_REF, NULL_TREE,
4039                              build_component_ref (TREE_OPERAND (expr, 0),
4040                                                   get_identifier ("P_ARRAY"),
4041                                                   NULL_TREE, false));
4042       etype = TREE_TYPE (expr);
4043       ecode = TREE_CODE (etype);
4044       break;
4045
4046     case VIEW_CONVERT_EXPR:
4047       {
4048         /* GCC 4.x is very sensitive to type consistency overall, and view
4049            conversions thus are very frequent.  Even though just "convert"ing
4050            the inner operand to the output type is fine in most cases, it
4051            might expose unexpected input/output type mismatches in special
4052            circumstances so we avoid such recursive calls when we can.  */
4053         tree op0 = TREE_OPERAND (expr, 0);
4054
4055         /* If we are converting back to the original type, we can just
4056            lift the input conversion.  This is a common occurrence with
4057            switches back-and-forth amongst type variants.  */
4058         if (type == TREE_TYPE (op0))
4059           return op0;
4060
4061         /* Otherwise, if we're converting between two aggregate types, we
4062            might be allowed to substitute the VIEW_CONVERT_EXPR target type
4063            in place or to just convert the inner expression.  */
4064         if (AGGREGATE_TYPE_P (type) && AGGREGATE_TYPE_P (etype))
4065           {
4066             /* If we are converting between mere variants, we can just
4067                substitute the VIEW_CONVERT_EXPR in place.  */
4068             if (gnat_types_compatible_p (type, etype))
4069               return build1 (VIEW_CONVERT_EXPR, type, op0);
4070
4071             /* Otherwise, we may just bypass the input view conversion unless
4072                one of the types is a fat pointer,  which is handled by
4073                specialized code below which relies on exact type matching.  */
4074             else if (!TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
4075               return convert (type, op0);
4076           }
4077       }
4078       break;
4079
4080     case INDIRECT_REF:
4081       /* If both types are record types, just convert the pointer and
4082          make a new INDIRECT_REF.
4083
4084          ??? Disable this for now since it causes problems with the
4085          code in build_binary_op for MODIFY_EXPR which wants to
4086          strip off conversions.  But that code really is a mess and
4087          we need to do this a much better way some time.  */
4088       if (0
4089           && (TREE_CODE (type) == RECORD_TYPE
4090               || TREE_CODE (type) == UNION_TYPE)
4091           && (TREE_CODE (etype) == RECORD_TYPE
4092               || TREE_CODE (etype) == UNION_TYPE)
4093           && !TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
4094         return build_unary_op (INDIRECT_REF, NULL_TREE,
4095                                convert (build_pointer_type (type),
4096                                         TREE_OPERAND (expr, 0)));
4097       break;
4098
4099     default:
4100       break;
4101     }
4102
4103   /* Check for converting to a pointer to an unconstrained array.  */
4104   if (TYPE_FAT_POINTER_P (type) && !TYPE_FAT_POINTER_P (etype))
4105     return convert_to_fat_pointer (type, expr);
4106
4107   /* If we are converting between two aggregate types that are mere
4108      variants, just make a VIEW_CONVERT_EXPR.  */
4109   else if (code == ecode
4110            && AGGREGATE_TYPE_P (type)
4111            && gnat_types_compatible_p (type, etype))
4112     return build1 (VIEW_CONVERT_EXPR, type, expr);
4113
4114   /* In all other cases of related types, make a NOP_EXPR.  */
4115   else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (etype)
4116            || (code == INTEGER_CST && ecode == INTEGER_CST
4117                && (type == TREE_TYPE (etype) || etype == TREE_TYPE (type))))
4118     return fold_convert (type, expr);
4119
4120   switch (code)
4121     {
4122     case VOID_TYPE:
4123       return fold_build1 (CONVERT_EXPR, type, expr);
4124
4125     case INTEGER_TYPE:
4126       if (TYPE_HAS_ACTUAL_BOUNDS_P (type)
4127           && (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE
4128               || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))))
4129         return unchecked_convert (type, expr, false);
4130       else if (TYPE_BIASED_REPRESENTATION_P (type))
4131         return fold_convert (type,
4132                              fold_build2 (MINUS_EXPR, TREE_TYPE (type),
4133                                           convert (TREE_TYPE (type), expr),
4134                                           TYPE_MIN_VALUE (type)));
4135
4136       /* ... fall through ... */
4137
4138     case ENUMERAL_TYPE:
4139     case BOOLEAN_TYPE:
4140       /* If we are converting an additive expression to an integer type
4141          with lower precision, be wary of the optimization that can be
4142          applied by convert_to_integer.  There are 2 problematic cases:
4143            - if the first operand was originally of a biased type,
4144              because we could be recursively called to convert it
4145              to an intermediate type and thus rematerialize the
4146              additive operator endlessly,
4147            - if the expression contains a placeholder, because an
4148              intermediate conversion that changes the sign could
4149              be inserted and thus introduce an artificial overflow
4150              at compile time when the placeholder is substituted.  */
4151       if (code == INTEGER_TYPE
4152           && ecode == INTEGER_TYPE
4153           && TYPE_PRECISION (type) < TYPE_PRECISION (etype)
4154           && (TREE_CODE (expr) == PLUS_EXPR || TREE_CODE (expr) == MINUS_EXPR))
4155         {
4156           tree op0 = get_unwidened (TREE_OPERAND (expr, 0), type);
4157
4158           if ((TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
4159                && TYPE_BIASED_REPRESENTATION_P (TREE_TYPE (op0)))
4160               || CONTAINS_PLACEHOLDER_P (expr))
4161             return build1 (NOP_EXPR, type, expr);
4162         }
4163
4164       return fold (convert_to_integer (type, expr));
4165
4166     case POINTER_TYPE:
4167     case REFERENCE_TYPE:
4168       /* If converting between two pointers to records denoting
4169          both a template and type, adjust if needed to account
4170          for any differing offsets, since one might be negative.  */
4171       if (TYPE_THIN_POINTER_P (etype) && TYPE_THIN_POINTER_P (type))
4172         {
4173           tree bit_diff
4174             = size_diffop (bit_position (TYPE_FIELDS (TREE_TYPE (etype))),
4175                            bit_position (TYPE_FIELDS (TREE_TYPE (type))));
4176           tree byte_diff = size_binop (CEIL_DIV_EXPR, bit_diff,
4177                                        sbitsize_int (BITS_PER_UNIT));
4178
4179           expr = build1 (NOP_EXPR, type, expr);
4180           TREE_CONSTANT (expr) = TREE_CONSTANT (TREE_OPERAND (expr, 0));
4181           if (integer_zerop (byte_diff))
4182             return expr;
4183
4184           return build_binary_op (POINTER_PLUS_EXPR, type, expr,
4185                                   fold (convert (sizetype, byte_diff)));
4186         }
4187
4188       /* If converting to a thin pointer, handle specially.  */
4189       if (TYPE_THIN_POINTER_P (type)
4190           && TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)))
4191         return convert_to_thin_pointer (type, expr);
4192
4193       /* If converting fat pointer to normal pointer, get the pointer to the
4194          array and then convert it.  */
4195       else if (TYPE_FAT_POINTER_P (etype))
4196         expr = build_component_ref (expr, get_identifier ("P_ARRAY"),
4197                                     NULL_TREE, false);
4198
4199       return fold (convert_to_pointer (type, expr));
4200
4201     case REAL_TYPE:
4202       return fold (convert_to_real (type, expr));
4203
4204     case RECORD_TYPE:
4205       if (TYPE_JUSTIFIED_MODULAR_P (type) && !AGGREGATE_TYPE_P (etype))
4206         return
4207           gnat_build_constructor
4208             (type, tree_cons (TYPE_FIELDS (type),
4209                               convert (TREE_TYPE (TYPE_FIELDS (type)), expr),
4210                               NULL_TREE));
4211
4212       /* ... fall through ... */
4213
4214     case ARRAY_TYPE:
4215       /* In these cases, assume the front-end has validated the conversion.
4216          If the conversion is valid, it will be a bit-wise conversion, so
4217          it can be viewed as an unchecked conversion.  */
4218       return unchecked_convert (type, expr, false);
4219
4220     case UNION_TYPE:
4221       /* This is a either a conversion between a tagged type and some
4222          subtype, which we have to mark as a UNION_TYPE because of
4223          overlapping fields or a conversion of an Unchecked_Union.  */
4224       return unchecked_convert (type, expr, false);
4225
4226     case UNCONSTRAINED_ARRAY_TYPE:
4227       /* If EXPR is a constrained array, take its address, convert it to a
4228          fat pointer, and then dereference it.  Likewise if EXPR is a
4229          record containing both a template and a constrained array.
4230          Note that a record representing a justified modular type
4231          always represents a packed constrained array.  */
4232       if (ecode == ARRAY_TYPE
4233           || (ecode == INTEGER_TYPE && TYPE_HAS_ACTUAL_BOUNDS_P (etype))
4234           || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))
4235           || (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)))
4236         return
4237           build_unary_op
4238             (INDIRECT_REF, NULL_TREE,
4239              convert_to_fat_pointer (TREE_TYPE (type),
4240                                      build_unary_op (ADDR_EXPR,
4241                                                      NULL_TREE, expr)));
4242
4243       /* Do something very similar for converting one unconstrained
4244          array to another.  */
4245       else if (ecode == UNCONSTRAINED_ARRAY_TYPE)
4246         return
4247           build_unary_op (INDIRECT_REF, NULL_TREE,
4248                           convert (TREE_TYPE (type),
4249                                    build_unary_op (ADDR_EXPR,
4250                                                    NULL_TREE, expr)));
4251       else
4252         gcc_unreachable ();
4253
4254     case COMPLEX_TYPE:
4255       return fold (convert_to_complex (type, expr));
4256
4257     default:
4258       gcc_unreachable ();
4259     }
4260 }
4261 \f
4262 /* Remove all conversions that are done in EXP.  This includes converting
4263    from a padded type or to a justified modular type.  If TRUE_ADDRESS
4264    is true, always return the address of the containing object even if
4265    the address is not bit-aligned.  */
4266
4267 tree
4268 remove_conversions (tree exp, bool true_address)
4269 {
4270   switch (TREE_CODE (exp))
4271     {
4272     case CONSTRUCTOR:
4273       if (true_address
4274           && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
4275           && TYPE_JUSTIFIED_MODULAR_P (TREE_TYPE (exp)))
4276         return
4277           remove_conversions (VEC_index (constructor_elt,
4278                                          CONSTRUCTOR_ELTS (exp), 0)->value,
4279                               true);
4280       break;
4281
4282     case COMPONENT_REF:
4283       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == RECORD_TYPE
4284           && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
4285         return remove_conversions (TREE_OPERAND (exp, 0), true_address);
4286       break;
4287
4288     case VIEW_CONVERT_EXPR:  case NON_LVALUE_EXPR:
4289     CASE_CONVERT:
4290       return remove_conversions (TREE_OPERAND (exp, 0), true_address);
4291
4292     default:
4293       break;
4294     }
4295
4296   return exp;
4297 }
4298 \f
4299 /* If EXP's type is an UNCONSTRAINED_ARRAY_TYPE, return an expression that
4300    refers to the underlying array.  If its type has TYPE_CONTAINS_TEMPLATE_P,
4301    likewise return an expression pointing to the underlying array.  */
4302
4303 tree
4304 maybe_unconstrained_array (tree exp)
4305 {
4306   enum tree_code code = TREE_CODE (exp);
4307   tree new;
4308
4309   switch (TREE_CODE (TREE_TYPE (exp)))
4310     {
4311     case UNCONSTRAINED_ARRAY_TYPE:
4312       if (code == UNCONSTRAINED_ARRAY_REF)
4313         {
4314           new
4315             = build_unary_op (INDIRECT_REF, NULL_TREE,
4316                               build_component_ref (TREE_OPERAND (exp, 0),
4317                                                    get_identifier ("P_ARRAY"),
4318                                                    NULL_TREE, false));
4319           TREE_READONLY (new) = TREE_STATIC (new) = TREE_READONLY (exp);
4320           return new;
4321         }
4322
4323       else if (code == NULL_EXPR)
4324         return build1 (NULL_EXPR,
4325                        TREE_TYPE (TREE_TYPE (TYPE_FIELDS
4326                                              (TREE_TYPE (TREE_TYPE (exp))))),
4327                        TREE_OPERAND (exp, 0));
4328
4329     case RECORD_TYPE:
4330       /* If this is a padded type, convert to the unpadded type and see if
4331          it contains a template.  */
4332       if (TYPE_IS_PADDING_P (TREE_TYPE (exp)))
4333         {
4334           new = convert (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (exp))), exp);
4335           if (TREE_CODE (TREE_TYPE (new)) == RECORD_TYPE
4336               && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (new)))
4337             return
4338               build_component_ref (new, NULL_TREE,
4339                                    TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new))),
4340                                    0);
4341         }
4342       else if (TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (exp)))
4343         return
4344           build_component_ref (exp, NULL_TREE,
4345                                TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (exp))), 0);
4346       break;
4347
4348     default:
4349       break;
4350     }
4351
4352   return exp;
4353 }
4354 \f
4355 /* Return true if EXPR is an expression that can be folded as an operand
4356    of a VIEW_CONVERT_EXPR.  See ada-tree.h for a complete rationale.  */
4357
4358 static bool
4359 can_fold_for_view_convert_p (tree expr)
4360 {
4361   tree t1, t2;
4362
4363   /* The folder will fold NOP_EXPRs between integral types with the same
4364      precision (in the middle-end's sense).  We cannot allow it if the
4365      types don't have the same precision in the Ada sense as well.  */
4366   if (TREE_CODE (expr) != NOP_EXPR)
4367     return true;
4368
4369   t1 = TREE_TYPE (expr);
4370   t2 = TREE_TYPE (TREE_OPERAND (expr, 0));
4371
4372   /* Defer to the folder for non-integral conversions.  */
4373   if (!(INTEGRAL_TYPE_P (t1) && INTEGRAL_TYPE_P (t2)))
4374     return true;
4375
4376   /* Only fold conversions that preserve both precisions.  */
4377   if (TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
4378       && operand_equal_p (rm_size (t1), rm_size (t2), 0))
4379     return true;
4380
4381   return false;
4382 }
4383
4384 /* Return an expression that does an unchecked conversion of EXPR to TYPE.
4385    If NOTRUNC_P is true, truncation operations should be suppressed.
4386
4387    Special care is required with (source or target) integral types whose
4388    precision is not equal to their size, to make sure we fetch or assign
4389    the value bits whose location might depend on the endianness, e.g.
4390
4391      Rmsize : constant := 8;
4392      subtype Int is Integer range 0 .. 2 ** Rmsize - 1;
4393
4394      type Bit_Array is array (1 .. Rmsize) of Boolean;
4395      pragma Pack (Bit_Array);
4396
4397      function To_Bit_Array is new Unchecked_Conversion (Int, Bit_Array);
4398
4399      Value : Int := 2#1000_0001#;
4400      Vbits : Bit_Array := To_Bit_Array (Value);
4401
4402    we expect the 8 bits at Vbits'Address to always contain Value, while
4403    their original location depends on the endianness, at Value'Address
4404    on a little-endian architecture but not on a big-endian one.  */
4405
4406 tree
4407 unchecked_convert (tree type, tree expr, bool notrunc_p)
4408 {
4409   tree etype = TREE_TYPE (expr);
4410
4411   /* If the expression is already the right type, we are done.  */
4412   if (etype == type)
4413     return expr;
4414
4415   /* If both types types are integral just do a normal conversion.
4416      Likewise for a conversion to an unconstrained array.  */
4417   if ((((INTEGRAL_TYPE_P (type)
4418          && !(TREE_CODE (type) == INTEGER_TYPE
4419               && TYPE_VAX_FLOATING_POINT_P (type)))
4420         || (POINTER_TYPE_P (type) && ! TYPE_THIN_POINTER_P (type))
4421         || (TREE_CODE (type) == RECORD_TYPE
4422             && TYPE_JUSTIFIED_MODULAR_P (type)))
4423        && ((INTEGRAL_TYPE_P (etype)
4424             && !(TREE_CODE (etype) == INTEGER_TYPE
4425                  && TYPE_VAX_FLOATING_POINT_P (etype)))
4426            || (POINTER_TYPE_P (etype) && !TYPE_THIN_POINTER_P (etype))
4427            || (TREE_CODE (etype) == RECORD_TYPE
4428                && TYPE_JUSTIFIED_MODULAR_P (etype))))
4429       || TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
4430     {
4431       if (TREE_CODE (etype) == INTEGER_TYPE
4432           && TYPE_BIASED_REPRESENTATION_P (etype))
4433         {
4434           tree ntype = copy_type (etype);
4435           TYPE_BIASED_REPRESENTATION_P (ntype) = 0;
4436           TYPE_MAIN_VARIANT (ntype) = ntype;
4437           expr = build1 (NOP_EXPR, ntype, expr);
4438         }
4439
4440       if (TREE_CODE (type) == INTEGER_TYPE
4441           && TYPE_BIASED_REPRESENTATION_P (type))
4442         {
4443           tree rtype = copy_type (type);
4444           TYPE_BIASED_REPRESENTATION_P (rtype) = 0;
4445           TYPE_MAIN_VARIANT (rtype) = rtype;
4446           expr = convert (rtype, expr);
4447           expr = build1 (NOP_EXPR, type, expr);
4448         }
4449       else
4450         expr = convert (type, expr);
4451     }
4452
4453   /* If we are converting to an integral type whose precision is not equal
4454      to its size, first unchecked convert to a record that contains an
4455      object of the output type.  Then extract the field. */
4456   else if (INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
4457            && 0 != compare_tree_int (TYPE_RM_SIZE (type),
4458                                      GET_MODE_BITSIZE (TYPE_MODE (type))))
4459     {
4460       tree rec_type = make_node (RECORD_TYPE);
4461       tree field = create_field_decl (get_identifier ("OBJ"), type,
4462                                       rec_type, 1, 0, 0, 0);
4463
4464       TYPE_FIELDS (rec_type) = field;
4465       layout_type (rec_type);
4466
4467       expr = unchecked_convert (rec_type, expr, notrunc_p);
4468       expr = build_component_ref (expr, NULL_TREE, field, 0);
4469     }
4470
4471   /* Similarly if we are converting from an integral type whose precision
4472      is not equal to its size.  */
4473   else if (INTEGRAL_TYPE_P (etype) && TYPE_RM_SIZE (etype)
4474       && 0 != compare_tree_int (TYPE_RM_SIZE (etype),
4475                                 GET_MODE_BITSIZE (TYPE_MODE (etype))))
4476     {
4477       tree rec_type = make_node (RECORD_TYPE);
4478       tree field
4479         = create_field_decl (get_identifier ("OBJ"), etype, rec_type,
4480                              1, 0, 0, 0);
4481
4482       TYPE_FIELDS (rec_type) = field;
4483       layout_type (rec_type);
4484
4485       expr = gnat_build_constructor (rec_type, build_tree_list (field, expr));
4486       expr = unchecked_convert (type, expr, notrunc_p);
4487     }
4488
4489   /* We have a special case when we are converting between two
4490      unconstrained array types.  In that case, take the address,
4491      convert the fat pointer types, and dereference.  */
4492   else if (TREE_CODE (etype) == UNCONSTRAINED_ARRAY_TYPE
4493            && TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
4494     expr = build_unary_op (INDIRECT_REF, NULL_TREE,
4495                            build1 (VIEW_CONVERT_EXPR, TREE_TYPE (type),
4496                                    build_unary_op (ADDR_EXPR, NULL_TREE,
4497                                                    expr)));
4498   else
4499     {
4500       expr = maybe_unconstrained_array (expr);
4501       etype = TREE_TYPE (expr);
4502       if (can_fold_for_view_convert_p (expr))
4503         expr = fold_build1 (VIEW_CONVERT_EXPR, type, expr);
4504       else
4505         expr = build1 (VIEW_CONVERT_EXPR, type, expr);
4506     }
4507
4508   /* If the result is an integral type whose precision is not equal to its
4509      size, sign- or zero-extend the result.  We need not do this if the input
4510      is an integral type of the same precision and signedness or if the output
4511      is a biased type or if both the input and output are unsigned.  */
4512   if (!notrunc_p
4513       && INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type)
4514       && !(TREE_CODE (type) == INTEGER_TYPE
4515            && TYPE_BIASED_REPRESENTATION_P (type))
4516       && 0 != compare_tree_int (TYPE_RM_SIZE (type),
4517                                 GET_MODE_BITSIZE (TYPE_MODE (type)))
4518       && !(INTEGRAL_TYPE_P (etype)
4519            && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (etype)
4520            && operand_equal_p (TYPE_RM_SIZE (type),
4521                                (TYPE_RM_SIZE (etype) != 0
4522                                 ? TYPE_RM_SIZE (etype) : TYPE_SIZE (etype)),
4523                                0))
4524       && !(TYPE_UNSIGNED (type) && TYPE_UNSIGNED (etype)))
4525     {
4526       tree base_type = gnat_type_for_mode (TYPE_MODE (type),
4527                                            TYPE_UNSIGNED (type));
4528       tree shift_expr
4529         = convert (base_type,
4530                    size_binop (MINUS_EXPR,
4531                                bitsize_int
4532                                (GET_MODE_BITSIZE (TYPE_MODE (type))),
4533                                TYPE_RM_SIZE (type)));
4534       expr
4535         = convert (type,
4536                    build_binary_op (RSHIFT_EXPR, base_type,
4537                                     build_binary_op (LSHIFT_EXPR, base_type,
4538                                                      convert (base_type, expr),
4539                                                      shift_expr),
4540                                     shift_expr));
4541     }
4542
4543   /* An unchecked conversion should never raise Constraint_Error.  The code
4544      below assumes that GCC's conversion routines overflow the same way that
4545      the underlying hardware does.  This is probably true.  In the rare case
4546      when it is false, we can rely on the fact that such conversions are
4547      erroneous anyway.  */
4548   if (TREE_CODE (expr) == INTEGER_CST)
4549     TREE_OVERFLOW (expr) = 0;
4550
4551   /* If the sizes of the types differ and this is an VIEW_CONVERT_EXPR,
4552      show no longer constant.  */
4553   if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
4554       && !operand_equal_p (TYPE_SIZE_UNIT (type), TYPE_SIZE_UNIT (etype),
4555                            OEP_ONLY_CONST))
4556     TREE_CONSTANT (expr) = 0;
4557
4558   return expr;
4559 }
4560 \f
4561 /* Return the appropriate GCC tree code for the specified GNAT_TYPE,
4562    the latter being a record type as predicated by Is_Record_Type.  */
4563
4564 enum tree_code
4565 tree_code_for_record_type (Entity_Id gnat_type)
4566 {
4567   Node_Id component_list
4568     = Component_List (Type_Definition
4569                       (Declaration_Node
4570                        (Implementation_Base_Type (gnat_type))));
4571   Node_Id component;
4572
4573  /* Make this a UNION_TYPE unless it's either not an Unchecked_Union or
4574     we have a non-discriminant field outside a variant.  In either case,
4575     it's a RECORD_TYPE.  */
4576
4577   if (!Is_Unchecked_Union (gnat_type))
4578     return RECORD_TYPE;
4579
4580   for (component = First_Non_Pragma (Component_Items (component_list));
4581        Present (component);
4582        component = Next_Non_Pragma (component))
4583     if (Ekind (Defining_Entity (component)) == E_Component)
4584       return RECORD_TYPE;
4585
4586   return UNION_TYPE;
4587 }
4588
4589 /* Return true if GNAT_TYPE is a "double" floating-point type, i.e. whose
4590    size is equal to 64 bits, or an array of such a type.  Set ALIGN_CLAUSE
4591    according to the presence of an alignment clause on the type or, if it
4592    is an array, on the component type.  */
4593
4594 bool
4595 is_double_float_or_array (Entity_Id gnat_type, bool *align_clause)
4596 {
4597   gnat_type = Underlying_Type (gnat_type);
4598
4599   *align_clause = Present (Alignment_Clause (gnat_type));
4600
4601   if (Is_Array_Type (gnat_type))
4602     {
4603       gnat_type = Underlying_Type (Component_Type (gnat_type));
4604       if (Present (Alignment_Clause (gnat_type)))
4605         *align_clause = true;
4606     }
4607
4608   if (!Is_Floating_Point_Type (gnat_type))
4609     return false;
4610
4611   if (UI_To_Int (Esize (gnat_type)) != 64)
4612     return false;
4613
4614   return true;
4615 }
4616
4617 /* Return true if GNAT_TYPE is a "double" or larger scalar type, i.e. whose
4618    size is greater or equal to 64 bits, or an array of such a type.  Set
4619    ALIGN_CLAUSE according to the presence of an alignment clause on the
4620    type or, if it is an array, on the component type.  */
4621
4622 bool
4623 is_double_scalar_or_array (Entity_Id gnat_type, bool *align_clause)
4624 {
4625   gnat_type = Underlying_Type (gnat_type);
4626
4627   *align_clause = Present (Alignment_Clause (gnat_type));
4628
4629   if (Is_Array_Type (gnat_type))
4630     {
4631       gnat_type = Underlying_Type (Component_Type (gnat_type));
4632       if (Present (Alignment_Clause (gnat_type)))
4633         *align_clause = true;
4634     }
4635
4636   if (!Is_Scalar_Type (gnat_type))
4637     return false;
4638
4639   if (UI_To_Int (Esize (gnat_type)) < 64)
4640     return false;
4641
4642   return true;
4643 }
4644
4645 /* Return true if GNU_TYPE is suitable as the type of a non-aliased
4646    component of an aggregate type.  */
4647
4648 bool
4649 type_for_nonaliased_component_p (tree gnu_type)
4650 {
4651   /* If the type is passed by reference, we may have pointers to the
4652      component so it cannot be made non-aliased. */
4653   if (must_pass_by_ref (gnu_type) || default_pass_by_ref (gnu_type))
4654     return false;
4655
4656   /* We used to say that any component of aggregate type is aliased
4657      because the front-end may take 'Reference of it.  The front-end
4658      has been enhanced in the meantime so as to use a renaming instead
4659      in most cases, but the back-end can probably take the address of
4660      such a component too so we go for the conservative stance.
4661
4662      For instance, we might need the address of any array type, even
4663      if normally passed by copy, to construct a fat pointer if the
4664      component is used as an actual for an unconstrained formal.
4665
4666      Likewise for record types: even if a specific record subtype is
4667      passed by copy, the parent type might be passed by ref (e.g. if
4668      it's of variable size) and we might take the address of a child
4669      component to pass to a parent formal.  We have no way to check
4670      for such conditions here.  */
4671   if (AGGREGATE_TYPE_P (gnu_type))
4672     return false;
4673
4674   return true;
4675 }
4676
4677 /* Perform final processing on global variables.  */
4678
4679 void
4680 gnat_write_global_declarations (void)
4681 {
4682   /* Proceed to optimize and emit assembly.
4683      FIXME: shouldn't be the front end's responsibility to call this.  */
4684   cgraph_optimize ();
4685
4686   /* Emit debug info for all global declarations.  */
4687   emit_debug_global_declarations (VEC_address (tree, global_decls),
4688                                   VEC_length (tree, global_decls));
4689 }
4690
4691 /* ************************************************************************
4692  * *                           GCC builtins support                       *
4693  * ************************************************************************ */
4694
4695 /* The general scheme is fairly simple:
4696
4697    For each builtin function/type to be declared, gnat_install_builtins calls
4698    internal facilities which eventually get to gnat_push_decl, which in turn
4699    tracks the so declared builtin function decls in the 'builtin_decls' global
4700    datastructure. When an Intrinsic subprogram declaration is processed, we
4701    search this global datastructure to retrieve the associated BUILT_IN DECL
4702    node.  */
4703
4704 /* Search the chain of currently available builtin declarations for a node
4705    corresponding to function NAME (an IDENTIFIER_NODE).  Return the first node
4706    found, if any, or NULL_TREE otherwise.  */
4707 tree
4708 builtin_decl_for (tree name)
4709 {
4710   unsigned i;
4711   tree decl;
4712
4713   for (i = 0; VEC_iterate(tree, builtin_decls, i, decl); i++)
4714     if (DECL_NAME (decl) == name)
4715       return decl;
4716
4717   return NULL_TREE;
4718 }
4719
4720 /* The code below eventually exposes gnat_install_builtins, which declares
4721    the builtin types and functions we might need, either internally or as
4722    user accessible facilities.
4723
4724    ??? This is a first implementation shot, still in rough shape.  It is
4725    heavily inspired from the "C" family implementation, with chunks copied
4726    verbatim from there.
4727
4728    Two obvious TODO candidates are
4729    o Use a more efficient name/decl mapping scheme
4730    o Devise a middle-end infrastructure to avoid having to copy
4731      pieces between front-ends.  */
4732
4733 /* ----------------------------------------------------------------------- *
4734  *                         BUILTIN ELEMENTARY TYPES                        *
4735  * ----------------------------------------------------------------------- */
4736
4737 /* Standard data types to be used in builtin argument declarations.  */
4738
4739 enum c_tree_index
4740 {
4741     CTI_SIGNED_SIZE_TYPE, /* For format checking only.  */
4742     CTI_STRING_TYPE,
4743     CTI_CONST_STRING_TYPE,
4744
4745     CTI_MAX
4746 };
4747
4748 static tree c_global_trees[CTI_MAX];
4749
4750 #define signed_size_type_node   c_global_trees[CTI_SIGNED_SIZE_TYPE]
4751 #define string_type_node        c_global_trees[CTI_STRING_TYPE]
4752 #define const_string_type_node  c_global_trees[CTI_CONST_STRING_TYPE]
4753
4754 /* ??? In addition some attribute handlers, we currently don't support a
4755    (small) number of builtin-types, which in turns inhibits support for a
4756    number of builtin functions.  */
4757 #define wint_type_node    void_type_node
4758 #define intmax_type_node  void_type_node
4759 #define uintmax_type_node void_type_node
4760
4761 /* Build the void_list_node (void_type_node having been created).  */
4762
4763 static tree
4764 build_void_list_node (void)
4765 {
4766   tree t = build_tree_list (NULL_TREE, void_type_node);
4767   return t;
4768 }
4769
4770 /* Used to help initialize the builtin-types.def table.  When a type of
4771    the correct size doesn't exist, use error_mark_node instead of NULL.
4772    The later results in segfaults even when a decl using the type doesn't
4773    get invoked.  */
4774
4775 static tree
4776 builtin_type_for_size (int size, bool unsignedp)
4777 {
4778   tree type = lang_hooks.types.type_for_size (size, unsignedp);
4779   return type ? type : error_mark_node;
4780 }
4781
4782 /* Build/push the elementary type decls that builtin functions/types
4783    will need.  */
4784
4785 static void
4786 install_builtin_elementary_types (void)
4787 {
4788   signed_size_type_node = size_type_node;
4789   pid_type_node = integer_type_node;
4790   void_list_node = build_void_list_node ();
4791
4792   string_type_node = build_pointer_type (char_type_node);
4793   const_string_type_node
4794     = build_pointer_type (build_qualified_type
4795                           (char_type_node, TYPE_QUAL_CONST));
4796 }
4797
4798 /* ----------------------------------------------------------------------- *
4799  *                          BUILTIN FUNCTION TYPES                         *
4800  * ----------------------------------------------------------------------- */
4801
4802 /* Now, builtin function types per se.  */
4803
4804 enum c_builtin_type
4805 {
4806 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
4807 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
4808 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
4809 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
4810 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4811 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4812 #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
4813 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME,
4814 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME,
4815 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
4816 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
4817 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
4818 #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4819 #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4820 #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG6) \
4821   NAME,
4822 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
4823 #include "builtin-types.def"
4824 #undef DEF_PRIMITIVE_TYPE
4825 #undef DEF_FUNCTION_TYPE_0
4826 #undef DEF_FUNCTION_TYPE_1
4827 #undef DEF_FUNCTION_TYPE_2
4828 #undef DEF_FUNCTION_TYPE_3
4829 #undef DEF_FUNCTION_TYPE_4
4830 #undef DEF_FUNCTION_TYPE_5
4831 #undef DEF_FUNCTION_TYPE_6
4832 #undef DEF_FUNCTION_TYPE_7
4833 #undef DEF_FUNCTION_TYPE_VAR_0
4834 #undef DEF_FUNCTION_TYPE_VAR_1
4835 #undef DEF_FUNCTION_TYPE_VAR_2
4836 #undef DEF_FUNCTION_TYPE_VAR_3
4837 #undef DEF_FUNCTION_TYPE_VAR_4
4838 #undef DEF_FUNCTION_TYPE_VAR_5
4839 #undef DEF_POINTER_TYPE
4840   BT_LAST
4841 };
4842
4843 typedef enum c_builtin_type builtin_type;
4844
4845 /* A temporary array used in communication with def_fn_type.  */
4846 static GTY(()) tree builtin_types[(int) BT_LAST + 1];
4847
4848 /* A helper function for install_builtin_types.  Build function type
4849    for DEF with return type RET and N arguments.  If VAR is true, then the
4850    function should be variadic after those N arguments.
4851
4852    Takes special care not to ICE if any of the types involved are
4853    error_mark_node, which indicates that said type is not in fact available
4854    (see builtin_type_for_size).  In which case the function type as a whole
4855    should be error_mark_node.  */
4856
4857 static void
4858 def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
4859 {
4860   tree args = NULL, t;
4861   va_list list;
4862   int i;
4863
4864   va_start (list, n);
4865   for (i = 0; i < n; ++i)
4866     {
4867       builtin_type a = va_arg (list, builtin_type);
4868       t = builtin_types[a];
4869       if (t == error_mark_node)
4870         goto egress;
4871       args = tree_cons (NULL_TREE, t, args);
4872     }
4873   va_end (list);
4874
4875   args = nreverse (args);
4876   if (!var)
4877     args = chainon (args, void_list_node);
4878
4879   t = builtin_types[ret];
4880   if (t == error_mark_node)
4881     goto egress;
4882   t = build_function_type (t, args);
4883
4884  egress:
4885   builtin_types[def] = t;
4886 }
4887
4888 /* Build the builtin function types and install them in the builtin_types
4889    array for later use in builtin function decls.  */
4890
4891 static void
4892 install_builtin_function_types (void)
4893 {
4894   tree va_list_ref_type_node;
4895   tree va_list_arg_type_node;
4896
4897   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
4898     {
4899       va_list_arg_type_node = va_list_ref_type_node =
4900         build_pointer_type (TREE_TYPE (va_list_type_node));
4901     }
4902   else
4903     {
4904       va_list_arg_type_node = va_list_type_node;
4905       va_list_ref_type_node = build_reference_type (va_list_type_node);
4906     }
4907
4908 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
4909   builtin_types[ENUM] = VALUE;
4910 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
4911   def_fn_type (ENUM, RETURN, 0, 0);
4912 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
4913   def_fn_type (ENUM, RETURN, 0, 1, ARG1);
4914 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
4915   def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
4916 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
4917   def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
4918 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
4919   def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4);
4920 #define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
4921   def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
4922 #define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
4923                             ARG6)                                       \
4924   def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
4925 #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
4926                             ARG6, ARG7)                                 \
4927   def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
4928 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
4929   def_fn_type (ENUM, RETURN, 1, 0);
4930 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
4931   def_fn_type (ENUM, RETURN, 1, 1, ARG1);
4932 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
4933   def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
4934 #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
4935   def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
4936 #define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
4937   def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4);
4938 #define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
4939   def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
4940 #define DEF_POINTER_TYPE(ENUM, TYPE) \
4941   builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]);
4942
4943 #include "builtin-types.def"
4944
4945 #undef DEF_PRIMITIVE_TYPE
4946 #undef DEF_FUNCTION_TYPE_1
4947 #undef DEF_FUNCTION_TYPE_2
4948 #undef DEF_FUNCTION_TYPE_3
4949 #undef DEF_FUNCTION_TYPE_4
4950 #undef DEF_FUNCTION_TYPE_5
4951 #undef DEF_FUNCTION_TYPE_6
4952 #undef DEF_FUNCTION_TYPE_VAR_0
4953 #undef DEF_FUNCTION_TYPE_VAR_1
4954 #undef DEF_FUNCTION_TYPE_VAR_2
4955 #undef DEF_FUNCTION_TYPE_VAR_3
4956 #undef DEF_FUNCTION_TYPE_VAR_4
4957 #undef DEF_FUNCTION_TYPE_VAR_5
4958 #undef DEF_POINTER_TYPE
4959   builtin_types[(int) BT_LAST] = NULL_TREE;
4960 }
4961
4962 /* ----------------------------------------------------------------------- *
4963  *                            BUILTIN ATTRIBUTES                           *
4964  * ----------------------------------------------------------------------- */
4965
4966 enum built_in_attribute
4967 {
4968 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
4969 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
4970 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
4971 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
4972 #include "builtin-attrs.def"
4973 #undef DEF_ATTR_NULL_TREE
4974 #undef DEF_ATTR_INT
4975 #undef DEF_ATTR_IDENT
4976 #undef DEF_ATTR_TREE_LIST
4977   ATTR_LAST
4978 };
4979
4980 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
4981
4982 static void
4983 install_builtin_attributes (void)
4984 {
4985   /* Fill in the built_in_attributes array.  */
4986 #define DEF_ATTR_NULL_TREE(ENUM)                                \
4987   built_in_attributes[(int) ENUM] = NULL_TREE;
4988 #define DEF_ATTR_INT(ENUM, VALUE)                               \
4989   built_in_attributes[(int) ENUM] = build_int_cst (NULL_TREE, VALUE);
4990 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
4991   built_in_attributes[(int) ENUM] = get_identifier (STRING);
4992 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
4993   built_in_attributes[(int) ENUM]                       \
4994     = tree_cons (built_in_attributes[(int) PURPOSE],    \
4995                  built_in_attributes[(int) VALUE],      \
4996                  built_in_attributes[(int) CHAIN]);
4997 #include "builtin-attrs.def"
4998 #undef DEF_ATTR_NULL_TREE
4999 #undef DEF_ATTR_INT
5000 #undef DEF_ATTR_IDENT
5001 #undef DEF_ATTR_TREE_LIST
5002 }
5003
5004 /* Handle a "const" attribute; arguments as in
5005    struct attribute_spec.handler.  */
5006
5007 static tree
5008 handle_const_attribute (tree *node, tree ARG_UNUSED (name),
5009                         tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5010                         bool *no_add_attrs)
5011 {
5012   if (TREE_CODE (*node) == FUNCTION_DECL)
5013     TREE_READONLY (*node) = 1;
5014   else
5015     *no_add_attrs = true;
5016
5017   return NULL_TREE;
5018 }
5019
5020 /* Handle a "nothrow" attribute; arguments as in
5021    struct attribute_spec.handler.  */
5022
5023 static tree
5024 handle_nothrow_attribute (tree *node, tree ARG_UNUSED (name),
5025                           tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5026                           bool *no_add_attrs)
5027 {
5028   if (TREE_CODE (*node) == FUNCTION_DECL)
5029     TREE_NOTHROW (*node) = 1;
5030   else
5031     *no_add_attrs = true;
5032
5033   return NULL_TREE;
5034 }
5035
5036 /* Handle a "pure" attribute; arguments as in
5037    struct attribute_spec.handler.  */
5038
5039 static tree
5040 handle_pure_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5041                        int ARG_UNUSED (flags), bool *no_add_attrs)
5042 {
5043   if (TREE_CODE (*node) == FUNCTION_DECL)
5044     DECL_PURE_P (*node) = 1;
5045   /* ??? TODO: Support types.  */
5046   else
5047     {
5048       warning (OPT_Wattributes, "%qE attribute ignored", name);
5049       *no_add_attrs = true;
5050     }
5051
5052   return NULL_TREE;
5053 }
5054
5055 /* Handle a "no vops" attribute; arguments as in
5056    struct attribute_spec.handler.  */
5057
5058 static tree
5059 handle_novops_attribute (tree *node, tree ARG_UNUSED (name),
5060                          tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5061                          bool *ARG_UNUSED (no_add_attrs))
5062 {
5063   gcc_assert (TREE_CODE (*node) == FUNCTION_DECL);
5064   DECL_IS_NOVOPS (*node) = 1;
5065   return NULL_TREE;
5066 }
5067
5068 /* Helper for nonnull attribute handling; fetch the operand number
5069    from the attribute argument list.  */
5070
5071 static bool
5072 get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp)
5073 {
5074   /* Verify the arg number is a constant.  */
5075   if (TREE_CODE (arg_num_expr) != INTEGER_CST
5076       || TREE_INT_CST_HIGH (arg_num_expr) != 0)
5077     return false;
5078
5079   *valp = TREE_INT_CST_LOW (arg_num_expr);
5080   return true;
5081 }
5082
5083 /* Handle the "nonnull" attribute.  */
5084 static tree
5085 handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
5086                           tree args, int ARG_UNUSED (flags),
5087                           bool *no_add_attrs)
5088 {
5089   tree type = *node;
5090   unsigned HOST_WIDE_INT attr_arg_num;
5091
5092   /* If no arguments are specified, all pointer arguments should be
5093      non-null.  Verify a full prototype is given so that the arguments
5094      will have the correct types when we actually check them later.  */
5095   if (!args)
5096     {
5097       if (!TYPE_ARG_TYPES (type))
5098         {
5099           error ("nonnull attribute without arguments on a non-prototype");
5100           *no_add_attrs = true;
5101         }
5102       return NULL_TREE;
5103     }
5104
5105   /* Argument list specified.  Verify that each argument number references
5106      a pointer argument.  */
5107   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
5108     {
5109       tree argument;
5110       unsigned HOST_WIDE_INT arg_num = 0, ck_num;
5111
5112       if (!get_nonnull_operand (TREE_VALUE (args), &arg_num))
5113         {
5114           error ("nonnull argument has invalid operand number (argument %lu)",
5115                  (unsigned long) attr_arg_num);
5116           *no_add_attrs = true;
5117           return NULL_TREE;
5118         }
5119
5120       argument = TYPE_ARG_TYPES (type);
5121       if (argument)
5122         {
5123           for (ck_num = 1; ; ck_num++)
5124             {
5125               if (!argument || ck_num == arg_num)
5126                 break;
5127               argument = TREE_CHAIN (argument);
5128             }
5129
5130           if (!argument
5131               || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
5132             {
5133               error ("nonnull argument with out-of-range operand number (argument %lu, operand %lu)",
5134                      (unsigned long) attr_arg_num, (unsigned long) arg_num);
5135               *no_add_attrs = true;
5136               return NULL_TREE;
5137             }
5138
5139           if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
5140             {
5141               error ("nonnull argument references non-pointer operand (argument %lu, operand %lu)",
5142                    (unsigned long) attr_arg_num, (unsigned long) arg_num);
5143               *no_add_attrs = true;
5144               return NULL_TREE;
5145             }
5146         }
5147     }
5148
5149   return NULL_TREE;
5150 }
5151
5152 /* Handle a "sentinel" attribute.  */
5153
5154 static tree
5155 handle_sentinel_attribute (tree *node, tree name, tree args,
5156                            int ARG_UNUSED (flags), bool *no_add_attrs)
5157 {
5158   tree params = TYPE_ARG_TYPES (*node);
5159
5160   if (!params)
5161     {
5162       warning (OPT_Wattributes,
5163                "%qE attribute requires prototypes with named arguments", name);
5164       *no_add_attrs = true;
5165     }
5166   else
5167     {
5168       while (TREE_CHAIN (params))
5169         params = TREE_CHAIN (params);
5170
5171       if (VOID_TYPE_P (TREE_VALUE (params)))
5172         {
5173           warning (OPT_Wattributes,
5174                    "%qE attribute only applies to variadic functions", name);
5175           *no_add_attrs = true;
5176         }
5177     }
5178
5179   if (args)
5180     {
5181       tree position = TREE_VALUE (args);
5182
5183       if (TREE_CODE (position) != INTEGER_CST)
5184         {
5185           warning (0, "requested position is not an integer constant");
5186           *no_add_attrs = true;
5187         }
5188       else
5189         {
5190           if (tree_int_cst_lt (position, integer_zero_node))
5191             {
5192               warning (0, "requested position is less than zero");
5193               *no_add_attrs = true;
5194             }
5195         }
5196     }
5197
5198   return NULL_TREE;
5199 }
5200
5201 /* Handle a "noreturn" attribute; arguments as in
5202    struct attribute_spec.handler.  */
5203
5204 static tree
5205 handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5206                            int ARG_UNUSED (flags), bool *no_add_attrs)
5207 {
5208   tree type = TREE_TYPE (*node);
5209
5210   /* See FIXME comment in c_common_attribute_table.  */
5211   if (TREE_CODE (*node) == FUNCTION_DECL)
5212     TREE_THIS_VOLATILE (*node) = 1;
5213   else if (TREE_CODE (type) == POINTER_TYPE
5214            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5215     TREE_TYPE (*node)
5216       = build_pointer_type
5217         (build_type_variant (TREE_TYPE (type),
5218                              TYPE_READONLY (TREE_TYPE (type)), 1));
5219   else
5220     {
5221       warning (OPT_Wattributes, "%qE attribute ignored", name);
5222       *no_add_attrs = true;
5223     }
5224
5225   return NULL_TREE;
5226 }
5227
5228 /* Handle a "malloc" attribute; arguments as in
5229    struct attribute_spec.handler.  */
5230
5231 static tree
5232 handle_malloc_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5233                          int ARG_UNUSED (flags), bool *no_add_attrs)
5234 {
5235   if (TREE_CODE (*node) == FUNCTION_DECL
5236       && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node))))
5237     DECL_IS_MALLOC (*node) = 1;
5238   else
5239     {
5240       warning (OPT_Wattributes, "%qE attribute ignored", name);
5241       *no_add_attrs = true;
5242     }
5243
5244   return NULL_TREE;
5245 }
5246
5247 /* Fake handler for attributes we don't properly support.  */
5248
5249 tree
5250 fake_attribute_handler (tree * ARG_UNUSED (node),
5251                         tree ARG_UNUSED (name),
5252                         tree ARG_UNUSED (args),
5253                         int  ARG_UNUSED (flags),
5254                         bool * ARG_UNUSED (no_add_attrs))
5255 {
5256   return NULL_TREE;
5257 }
5258
5259 /* Handle a "type_generic" attribute.  */
5260
5261 static tree
5262 handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name),
5263                                tree ARG_UNUSED (args), int ARG_UNUSED (flags),
5264                                bool * ARG_UNUSED (no_add_attrs))
5265 {
5266   tree params;
5267
5268   /* Ensure we have a function type.  */
5269   gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
5270
5271   params = TYPE_ARG_TYPES (*node);
5272   while (params && ! VOID_TYPE_P (TREE_VALUE (params)))
5273     params = TREE_CHAIN (params);
5274
5275   /* Ensure we have a variadic function.  */
5276   gcc_assert (!params);
5277
5278   return NULL_TREE;
5279 }
5280
5281 /* Handle a "vector_size" attribute; arguments as in
5282    struct attribute_spec.handler.  */
5283
5284 static tree
5285 handle_vector_size_attribute (tree *node, tree name, tree args,
5286                               int ARG_UNUSED (flags),
5287                               bool *no_add_attrs)
5288 {
5289   unsigned HOST_WIDE_INT vecsize, nunits;
5290   enum machine_mode orig_mode;
5291   tree type = *node, new_type, size;
5292
5293   *no_add_attrs = true;
5294
5295   size = TREE_VALUE (args);
5296
5297   if (!host_integerp (size, 1))
5298     {
5299       warning (OPT_Wattributes, "%qE attribute ignored", name);
5300       return NULL_TREE;
5301     }
5302
5303   /* Get the vector size (in bytes).  */
5304   vecsize = tree_low_cst (size, 1);
5305
5306   /* We need to provide for vector pointers, vector arrays, and
5307      functions returning vectors.  For example:
5308
5309        __attribute__((vector_size(16))) short *foo;
5310
5311      In this case, the mode is SI, but the type being modified is
5312      HI, so we need to look further.  */
5313
5314   while (POINTER_TYPE_P (type)
5315          || TREE_CODE (type) == FUNCTION_TYPE
5316          || TREE_CODE (type) == METHOD_TYPE
5317          || TREE_CODE (type) == ARRAY_TYPE
5318          || TREE_CODE (type) == OFFSET_TYPE)
5319     type = TREE_TYPE (type);
5320
5321   /* Get the mode of the type being modified.  */
5322   orig_mode = TYPE_MODE (type);
5323
5324   if ((!INTEGRAL_TYPE_P (type)
5325        && !SCALAR_FLOAT_TYPE_P (type)
5326        && !FIXED_POINT_TYPE_P (type))
5327       || (!SCALAR_FLOAT_MODE_P (orig_mode)
5328           && GET_MODE_CLASS (orig_mode) != MODE_INT
5329           && !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))
5330       || !host_integerp (TYPE_SIZE_UNIT (type), 1)
5331       || TREE_CODE (type) == BOOLEAN_TYPE)
5332     {
5333       error ("invalid vector type for attribute %qE", name);
5334       return NULL_TREE;
5335     }
5336
5337   if (vecsize % tree_low_cst (TYPE_SIZE_UNIT (type), 1))
5338     {
5339       error ("vector size not an integral multiple of component size");
5340       return NULL;
5341     }
5342
5343   if (vecsize == 0)
5344     {
5345       error ("zero vector size");
5346       return NULL;
5347     }
5348
5349   /* Calculate how many units fit in the vector.  */
5350   nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5351   if (nunits & (nunits - 1))
5352     {
5353       error ("number of components of the vector not a power of two");
5354       return NULL_TREE;
5355     }
5356
5357   new_type = build_vector_type (type, nunits);
5358
5359   /* Build back pointers if needed.  */
5360   *node = lang_hooks.types.reconstruct_complex_type (*node, new_type);
5361
5362   return NULL_TREE;
5363 }
5364
5365 /* ----------------------------------------------------------------------- *
5366  *                              BUILTIN FUNCTIONS                          *
5367  * ----------------------------------------------------------------------- */
5368
5369 /* Worker for DEF_BUILTIN.  Possibly define a builtin function with one or two
5370    names.  Does not declare a non-__builtin_ function if flag_no_builtin, or
5371    if nonansi_p and flag_no_nonansi_builtin.  */
5372
5373 static void
5374 def_builtin_1 (enum built_in_function fncode,
5375                const char *name,
5376                enum built_in_class fnclass,
5377                tree fntype, tree libtype,
5378                bool both_p, bool fallback_p,
5379                bool nonansi_p ATTRIBUTE_UNUSED,
5380                tree fnattrs, bool implicit_p)
5381 {
5382   tree decl;
5383   const char *libname;
5384
5385   /* Preserve an already installed decl.  It most likely was setup in advance
5386      (e.g. as part of the internal builtins) for specific reasons.  */
5387   if (built_in_decls[(int) fncode] != NULL_TREE)
5388     return;
5389
5390   gcc_assert ((!both_p && !fallback_p)
5391               || !strncmp (name, "__builtin_",
5392                            strlen ("__builtin_")));
5393
5394   libname = name + strlen ("__builtin_");
5395   decl = add_builtin_function (name, fntype, fncode, fnclass,
5396                                (fallback_p ? libname : NULL),
5397                                fnattrs);
5398   if (both_p)
5399     /* ??? This is normally further controlled by command-line options
5400        like -fno-builtin, but we don't have them for Ada.  */
5401     add_builtin_function (libname, libtype, fncode, fnclass,
5402                           NULL, fnattrs);
5403
5404   built_in_decls[(int) fncode] = decl;
5405   if (implicit_p)
5406     implicit_built_in_decls[(int) fncode] = decl;
5407 }
5408
5409 static int flag_isoc94 = 0;
5410 static int flag_isoc99 = 0;
5411
5412 /* Install what the common builtins.def offers.  */
5413
5414 static void
5415 install_builtin_functions (void)
5416 {
5417 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P, \
5418                     NONANSI_P, ATTRS, IMPLICIT, COND)                   \
5419   if (NAME && COND)                                                     \
5420     def_builtin_1 (ENUM, NAME, CLASS,                                   \
5421                    builtin_types[(int) TYPE],                           \
5422                    builtin_types[(int) LIBTYPE],                        \
5423                    BOTH_P, FALLBACK_P, NONANSI_P,                       \
5424                    built_in_attributes[(int) ATTRS], IMPLICIT);
5425 #include "builtins.def"
5426 #undef DEF_BUILTIN
5427 }
5428
5429 /* ----------------------------------------------------------------------- *
5430  *                              BUILTIN FUNCTIONS                          *
5431  * ----------------------------------------------------------------------- */
5432
5433 /* Install the builtin functions we might need.  */
5434
5435 void
5436 gnat_install_builtins (void)
5437 {
5438   install_builtin_elementary_types ();
5439   install_builtin_function_types ();
5440   install_builtin_attributes ();
5441
5442   /* Install builtins used by generic middle-end pieces first.  Some of these
5443      know about internal specificities and control attributes accordingly, for
5444      instance __builtin_alloca vs no-throw and -fstack-check.  We will ignore
5445      the generic definition from builtins.def.  */
5446   build_common_builtin_nodes ();
5447
5448   /* Now, install the target specific builtins, such as the AltiVec family on
5449      ppc, and the common set as exposed by builtins.def.  */
5450   targetm.init_builtins ();
5451   install_builtin_functions ();
5452 }
5453
5454 #include "gt-ada-utils.h"
5455 #include "gtype-ada.h"