OSDN Git Service

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