OSDN Git Service

* alias.c (get_alias_set): Remove handling of PLACEHOLDER_EXPR.
[pf3gnuchains/gcc-fork.git] / gcc / ada / decl.c
1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                                 D E C L                                  *
6  *                                                                          *
7  *                          C Implementation File                           *
8  *                                                                          *
9  *          Copyright (C) 1992-2004, 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 2,  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  distributed with GNAT;  see file COPYING.  If not, write *
19  * to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, *
20  * MA 02111-1307, USA.                                                      *
21  *                                                                          *
22  * GNAT was originally developed  by the GNAT team at  New York University. *
23  * Extensive contributions were provided by Ada Core Technologies Inc.      *
24  *                                                                          *
25  ****************************************************************************/
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "tree.h"
32 #include "flags.h"
33 #include "toplev.h"
34 #include "convert.h"
35 #include "ggc.h"
36 #include "obstack.h"
37 #include "target.h"
38
39 #include "ada.h"
40 #include "types.h"
41 #include "atree.h"
42 #include "elists.h"
43 #include "namet.h"
44 #include "nlists.h"
45 #include "repinfo.h"
46 #include "snames.h"
47 #include "stringt.h"
48 #include "uintp.h"
49 #include "fe.h"
50 #include "sinfo.h"
51 #include "einfo.h"
52 #include "ada-tree.h"
53 #include "gigi.h"
54
55 /* Provide default values for the macros controlling stack checking.
56    This is copied from GCC's expr.h.  */
57
58 #ifndef STACK_CHECK_BUILTIN
59 #define STACK_CHECK_BUILTIN 0
60 #endif
61 #ifndef STACK_CHECK_PROBE_INTERVAL
62 #define STACK_CHECK_PROBE_INTERVAL 4096
63 #endif
64 #ifndef STACK_CHECK_MAX_FRAME_SIZE
65 #define STACK_CHECK_MAX_FRAME_SIZE \
66   (STACK_CHECK_PROBE_INTERVAL - UNITS_PER_WORD)
67 #endif
68 #ifndef STACK_CHECK_MAX_VAR_SIZE
69 #define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100)
70 #endif
71
72 /* These two variables are used to defer recursively expanding incomplete
73    types while we are processing a record or subprogram type.  */
74
75 static int defer_incomplete_level = 0;
76 static struct incomplete
77 {
78   struct incomplete *next;
79   tree old_type;
80   Entity_Id full_type;
81 } *defer_incomplete_list = 0;
82
83 static void copy_alias_set (tree, tree);
84 static tree substitution_list (Entity_Id, Entity_Id, tree, int);
85 static int allocatable_size_p (tree, int);
86 static struct attrib *build_attr_list (Entity_Id);
87 static tree elaborate_expression (Node_Id, Entity_Id, tree, int, int, int);
88 static int is_variable_size (tree);
89 static tree elaborate_expression_1 (Node_Id, Entity_Id, tree, tree, int, int);
90 static tree make_packable_type (tree);
91 static tree maybe_pad_type (tree, tree, unsigned int, Entity_Id, const char *,
92                             int, int, int);
93 static tree gnat_to_gnu_field (Entity_Id, tree, int, int);
94 static void components_to_record (tree, Node_Id, tree, int, int, tree *,
95                                   int, int);
96 static int compare_field_bitpos (const PTR, const PTR);
97 static Uint annotate_value (tree);
98 static void annotate_rep (Entity_Id, tree);
99 static tree compute_field_positions (tree, tree, tree, tree, unsigned int);
100 static tree validate_size (Uint, tree, Entity_Id, enum tree_code, int, int);
101 static void set_rm_size (Uint, tree, Entity_Id);
102 static tree make_type_from_size (tree, tree, int);
103 static unsigned int validate_alignment (Uint, Entity_Id, unsigned int);
104 static void check_ok_for_atomic (tree, Entity_Id, int);
105 \f
106 /* Given GNAT_ENTITY, an entity in the incoming GNAT tree, return a
107    GCC type corresponding to that entity.  GNAT_ENTITY is assumed to
108    refer to an Ada type.  */
109
110 tree
111 gnat_to_gnu_type (Entity_Id gnat_entity)
112 {
113   tree gnu_decl;
114
115   /* The back end never attempts to annotate generic types */
116   if (Is_Generic_Type (gnat_entity) && type_annotate_only)
117      return void_type_node;
118
119   /* Convert the ada entity type into a GCC TYPE_DECL node.  */
120   gnu_decl = gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
121   if (TREE_CODE (gnu_decl) != TYPE_DECL)
122     gigi_abort (101);
123
124   return TREE_TYPE (gnu_decl);
125 }
126 \f
127 /* Given GNAT_ENTITY, a GNAT defining identifier node, which denotes some Ada
128    entity, this routine returns the equivalent GCC tree for that entity
129    (an ..._DECL node) and associates the ..._DECL node with the input GNAT
130    defining identifier.
131
132    If GNAT_ENTITY is a variable or a constant declaration, GNU_EXPR gives its
133    initial value (in GCC tree form). This is optional for variables.
134    For renamed entities, GNU_EXPR gives the object being renamed.
135
136    DEFINITION is nonzero if this call is intended for a definition.  This is
137    used for separate compilation where it necessary to know whether an
138    external declaration or a definition should be created if the GCC equivalent
139    was not created previously.  The value of 1 is normally used for a non-zero
140    DEFINITION, but a value of 2 is used in special circumstances, defined in
141    the code.  */
142
143 tree
144 gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
145 {
146   tree gnu_entity_id;
147   tree gnu_type = 0;
148   /* Contains the gnu XXXX_DECL tree node which is equivalent to the input
149      GNAT tree. This node will be associated with the GNAT node by calling
150      the save_gnu_tree routine at the end of the `switch' statement.  */
151   tree gnu_decl = 0;
152   /* Nonzero if we have already saved gnu_decl as a gnat association.  */
153   int saved = 0;
154   /* Nonzero if we incremented defer_incomplete_level.  */
155   int this_deferred = 0;
156   /* Nonzero if we incremented force_global.  */
157   int this_global = 0;
158   /* Nonzero if we should check to see if elaborated during processing.  */
159   int maybe_present = 0;
160   /* Nonzero if we made GNU_DECL and its type here.  */
161   int this_made_decl = 0;
162   struct attrib *attr_list = 0;
163   int debug_info_p = (Needs_Debug_Info (gnat_entity)
164                       || debug_info_level == DINFO_LEVEL_VERBOSE);
165   Entity_Kind kind = Ekind (gnat_entity);
166   Entity_Id gnat_temp;
167   unsigned int esize
168     = ((Known_Esize (gnat_entity)
169         && UI_Is_In_Int_Range (Esize (gnat_entity)))
170        ? MIN (UI_To_Int (Esize (gnat_entity)),
171               IN (kind, Float_Kind)
172               ? fp_prec_to_size (LONG_DOUBLE_TYPE_SIZE)
173               : IN (kind, Access_Kind) ? POINTER_SIZE * 2
174               : LONG_LONG_TYPE_SIZE)
175        : LONG_LONG_TYPE_SIZE);
176   tree gnu_size = 0;
177   int imported_p
178     = ((Is_Imported (gnat_entity) && No (Address_Clause (gnat_entity)))
179        || From_With_Type (gnat_entity));
180   unsigned int align = 0;
181
182   /* Since a use of an Itype is a definition, process it as such if it
183      is not in a with'ed unit. */
184
185   if (! definition && Is_Itype (gnat_entity)
186       && ! present_gnu_tree (gnat_entity)
187       && In_Extended_Main_Code_Unit (gnat_entity))
188     {
189       /* Ensure that we are in a subprogram mentioned in the Scope
190          chain of this entity, our current scope is global,
191          or that we encountered a task or entry (where we can't currently
192          accurately check scoping).  */
193       if (current_function_decl == 0
194           || DECL_ELABORATION_PROC_P (current_function_decl))
195         {
196           process_type (gnat_entity);
197           return get_gnu_tree (gnat_entity);
198         }
199
200       for (gnat_temp = Scope (gnat_entity);
201            Present (gnat_temp); gnat_temp = Scope (gnat_temp))
202         {
203           if (Is_Type (gnat_temp))
204             gnat_temp = Underlying_Type (gnat_temp);
205
206           if (Ekind (gnat_temp) == E_Subprogram_Body)
207             gnat_temp
208               = Corresponding_Spec (Parent (Declaration_Node (gnat_temp)));
209
210           if (IN (Ekind (gnat_temp), Subprogram_Kind)
211               && Present (Protected_Body_Subprogram (gnat_temp)))
212             gnat_temp = Protected_Body_Subprogram (gnat_temp);
213
214           if (Ekind (gnat_temp) == E_Entry
215               || Ekind (gnat_temp) == E_Entry_Family
216               || Ekind (gnat_temp) == E_Task_Type
217               || (IN (Ekind (gnat_temp), Subprogram_Kind)
218                   && present_gnu_tree (gnat_temp)
219                   && (current_function_decl
220                       == gnat_to_gnu_entity (gnat_temp, NULL_TREE, 0))))
221             {
222               process_type (gnat_entity);
223               return get_gnu_tree (gnat_entity);
224             }
225         }
226
227       /* gigi abort 122 means that the entity "gnat_entity" has an incorrect
228          scope, i.e. that its scope does not correspond to the subprogram
229          in which it is declared */
230       gigi_abort (122);
231     }
232
233   /* If this is entity 0, something went badly wrong.  */
234   if (gnat_entity == 0)
235     gigi_abort (102);
236
237   /* If we've already processed this entity, return what we got last time.
238      If we are defining the node, we should not have already processed it.
239      In that case, we will abort below when we try to save a new GCC tree for
240      this object.   We also need to handle the case of getting a dummy type
241      when a Full_View exists.  */
242
243   if (present_gnu_tree (gnat_entity)
244       && (! definition
245           || (Is_Type (gnat_entity) && imported_p)))
246     {
247       gnu_decl = get_gnu_tree (gnat_entity);
248
249       if (TREE_CODE (gnu_decl) == TYPE_DECL
250           && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl))
251           && IN (kind, Incomplete_Or_Private_Kind)
252           && Present (Full_View (gnat_entity)))
253         {
254           gnu_decl = gnat_to_gnu_entity (Full_View (gnat_entity),
255                                          NULL_TREE, 0);
256
257           save_gnu_tree (gnat_entity, NULL_TREE, 0);
258           save_gnu_tree (gnat_entity, gnu_decl, 0);
259         }
260
261       return gnu_decl;
262     }
263
264   /* If this is a numeric or enumeral type, or an access type, a nonzero
265      Esize must be specified unless it was specified by the programmer.  */
266   if ((IN (kind, Numeric_Kind) || IN (kind, Enumeration_Kind)
267        || (IN (kind, Access_Kind)
268            && kind != E_Access_Protected_Subprogram_Type
269            && kind != E_Access_Subtype))
270       && Unknown_Esize (gnat_entity)
271       && ! Has_Size_Clause (gnat_entity))
272     gigi_abort (109);
273
274   /* Likewise, RM_Size must be specified for all discrete and fixed-point
275      types.  */
276   if (IN (kind, Discrete_Or_Fixed_Point_Kind)
277       && Unknown_RM_Size (gnat_entity))
278     gigi_abort (123);
279
280   /* Get the name of the entity and set up the line number and filename of
281      the original definition for use in any decl we make.  */
282
283   gnu_entity_id = get_entity_name (gnat_entity);
284   set_lineno (gnat_entity, 0);
285
286   /* If we get here, it means we have not yet done anything with this
287      entity.  If we are not defining it here, it must be external,
288      otherwise we should have defined it already.  */
289   if (! definition && ! Is_Public (gnat_entity)
290       && ! type_annotate_only
291       && kind != E_Discriminant && kind != E_Component
292       && kind != E_Label
293       && ! (kind == E_Constant && Present (Full_View (gnat_entity)))
294 #if 1
295       && !IN (kind, Type_Kind)
296 #endif
297       )
298     gigi_abort (116);
299
300   /* For cases when we are not defining (i.e., we are referencing from
301      another compilation unit) Public entities, show we are at global level
302      for the purpose of computing sizes.  Don't do this for components or
303      discriminants since the relevant test is whether or not the record is
304      being defined.  */
305   if (! definition && Is_Public (gnat_entity)
306       && ! Is_Statically_Allocated (gnat_entity)
307       && kind != E_Discriminant && kind != E_Component)
308     force_global++, this_global = 1;
309
310   /* Handle any attributes.  */
311   if (Has_Gigi_Rep_Item (gnat_entity))
312     attr_list = build_attr_list (gnat_entity);
313
314   switch (kind)
315     {
316     case E_Constant:
317       /* If this is a use of a deferred constant, get its full
318          declaration.  */
319       if (! definition && Present (Full_View (gnat_entity)))
320         {
321           gnu_decl = gnat_to_gnu_entity (Full_View (gnat_entity),
322                                          gnu_expr, definition);
323           saved = 1;
324           break;
325         }
326
327       /* If we have an external constant that we are not defining,
328          get the expression that is was defined to represent.  We
329          may throw that expression away later if it is not a
330          constant.
331          Do not retrieve the expression if it is an aggregate, because
332          in complex instantiation contexts it may not be expanded  */
333
334       if (! definition
335           && Present (Expression (Declaration_Node (gnat_entity)))
336           && ! No_Initialization (Declaration_Node (gnat_entity))
337           && Nkind (Expression   (Declaration_Node (gnat_entity)))
338            != N_Aggregate)
339         gnu_expr = gnat_to_gnu (Expression (Declaration_Node (gnat_entity)));
340
341       /* Ignore deferred constant definitions; they are processed fully in the
342          front-end.  For deferred constant references, get the full
343          definition.  On the other hand, constants that are renamings are
344          handled like variable renamings.  If No_Initialization is set, this is
345          not a deferred constant but a constant whose value is built
346          manually.  */
347
348       if (definition && gnu_expr == 0
349           && ! No_Initialization (Declaration_Node (gnat_entity))
350           && No (Renamed_Object (gnat_entity)))
351         {
352           gnu_decl = error_mark_node;
353           saved = 1;
354           break;
355         }
356       else if (! definition && IN (kind, Incomplete_Or_Private_Kind)
357                && Present (Full_View (gnat_entity)))
358         {
359           gnu_decl =  gnat_to_gnu_entity (Full_View (gnat_entity),
360                                           NULL_TREE, 0);
361           saved = 1;
362           break;
363         }
364
365       goto object;
366
367     case E_Exception:
368       /* We used to special case VMS exceptions here to directly map them to
369          their associated condition code.  Since this code had to be masked
370          dynamically to strip off the severity bits, this caused trouble in
371          the GCC/ZCX case because the "type" pointers we store in the tables
372          have to be static.  We now don't special case here anymore, and let
373          the regular processing take place, which leaves us with a regular
374          exception data object for VMS exceptions too.  The condition code
375          mapping is taken care of by the front end and the bitmasking by the
376          runtime library.   */
377       goto object;
378
379     case E_Discriminant:
380     case E_Component:
381       {
382         /* The GNAT record where the component was defined. */
383         Entity_Id gnat_record = Underlying_Type (Scope (gnat_entity));
384
385         /* If the variable is an inherited record component (in the case of
386            extended record types), just return the inherited entity, which
387            must be a FIELD_DECL.  Likewise for discriminants.
388            For discriminants of untagged records which have explicit
389            stored discriminants, return the entity for the corresponding
390            stored discriminant.  Also use Original_Record_Component
391            if the record has a private extension.  */
392
393         if ((Base_Type (gnat_record) == gnat_record
394              || Ekind (Scope (gnat_entity)) == E_Private_Subtype
395              || Ekind (Scope (gnat_entity)) == E_Record_Subtype_With_Private
396              || Ekind (Scope (gnat_entity)) == E_Record_Type_With_Private)
397             && Present (Original_Record_Component (gnat_entity))
398             && Original_Record_Component (gnat_entity) != gnat_entity)
399           {
400             gnu_decl
401               = gnat_to_gnu_entity (Original_Record_Component (gnat_entity),
402                                     gnu_expr, definition);
403             saved = 1;
404             break;
405           }
406
407         /* If the enclosing record has explicit stored discriminants,
408            then it is an untagged record.  If the Corresponding_Discriminant
409            is not empty then this must be a renamed discriminant and its
410            Original_Record_Component must point to the corresponding explicit
411            stored discriminant (i.e., we should have taken the previous
412            branch).  */
413
414         else if (Present (Corresponding_Discriminant (gnat_entity))
415                  && Is_Tagged_Type (gnat_record))
416           {
417             /* A tagged record has no explicit stored discriminants. */
418
419             if (First_Discriminant (gnat_record)
420                 != First_Stored_Discriminant (gnat_record))
421               gigi_abort (119);
422
423             gnu_decl
424               = gnat_to_gnu_entity (Corresponding_Discriminant (gnat_entity),
425                                     gnu_expr, definition);
426             saved = 1;
427             break;
428           }
429
430         /* If the enclosing record has explicit stored discriminants,
431            then it is an untagged record. If the Corresponding_Discriminant
432            is not empty then this must be a renamed discriminant and its
433            Original_Record_Component must point to the corresponding explicit
434            stored discriminant (i.e., we should have taken the first
435            branch).  */
436
437         else if (Present (Corresponding_Discriminant (gnat_entity))
438                  && (First_Discriminant (gnat_record)
439                      != First_Stored_Discriminant (gnat_record)))
440           gigi_abort (120);
441
442         /* Otherwise, if we are not defining this and we have no GCC type
443            for the containing record, make one for it.  Then we should
444            have made our own equivalent.  */
445         else if (! definition && ! present_gnu_tree (gnat_record))
446           {
447             /* ??? If this is in a record whose scope is a protected
448                type and we have an Original_Record_Component, use it.
449                This is a workaround for major problems in protected type
450                handling.  */
451
452             Entity_Id Scop = Scope (Scope (gnat_entity));
453             if ((Is_Protected_Type (Scop)
454                 || (Is_Private_Type (Scop)
455                      && Present (Full_View (Scop))
456                      && Is_Protected_Type (Full_View (Scop))))
457                 && Present (Original_Record_Component (gnat_entity)))
458               {
459                 gnu_decl
460                   = gnat_to_gnu_entity (Original_Record_Component
461                                         (gnat_entity),
462                                         gnu_expr, definition);
463                 saved = 1;
464                 break;
465               }
466
467             gnat_to_gnu_entity (Scope (gnat_entity), NULL_TREE, 0);
468             gnu_decl = get_gnu_tree (gnat_entity);
469             saved = 1;
470             break;
471           }
472
473         /* Here we have no GCC type and this is a reference rather than a
474            definition. This should never happen. Most likely the cause is a
475            reference before declaration in the gnat tree for gnat_entity.  */
476         else
477           gigi_abort (103);
478       }
479
480     case E_Loop_Parameter:
481     case E_Out_Parameter:
482     case E_Variable:
483
484       /* Simple variables, loop variables, OUT parameters, and exceptions.  */
485     object:
486       {
487         int used_by_ref = 0;
488         int const_flag
489           = ((kind == E_Constant || kind == E_Variable)
490              && ! Is_Statically_Allocated (gnat_entity)
491              && Is_True_Constant (gnat_entity)
492              && (((Nkind (Declaration_Node (gnat_entity))
493                    == N_Object_Declaration)
494                   && Present (Expression (Declaration_Node (gnat_entity))))
495                  || Present (Renamed_Object (gnat_entity))));
496         int inner_const_flag = const_flag;
497         int static_p = Is_Statically_Allocated (gnat_entity);
498         tree gnu_ext_name = NULL_TREE;
499
500         if (Present (Renamed_Object (gnat_entity)) && ! definition)
501           {
502             if (kind == E_Exception)
503               gnu_expr = gnat_to_gnu_entity (Renamed_Entity (gnat_entity),
504                                              NULL_TREE, 0);
505             else
506               gnu_expr = gnat_to_gnu (Renamed_Object (gnat_entity));
507           }
508
509         /* Get the type after elaborating the renamed object.  */
510         gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
511
512         /* If this is a loop variable, its type should be the base type.
513            This is because the code for processing a loop determines whether
514            a normal loop end test can be done by comparing the bounds of the
515            loop against those of the base type, which is presumed to be the
516            size used for computation.  But this is not correct when the size
517            of the subtype is smaller than the type.  */
518         if (kind == E_Loop_Parameter)
519           gnu_type = get_base_type (gnu_type);
520
521         /* Reject non-renamed objects whose types are unconstrained arrays or
522            any object whose type is a dummy type or VOID_TYPE. */
523
524         if ((TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
525              && No (Renamed_Object (gnat_entity)))
526             || TYPE_IS_DUMMY_P (gnu_type)
527             || TREE_CODE (gnu_type) == VOID_TYPE)
528           {
529             if (type_annotate_only)
530               return error_mark_node;
531             else
532               gigi_abort (104);
533           }
534
535         /* If we are defining the object, see if it has a Size value and
536            validate it if so. If we are not defining the object and a Size
537            clause applies, simply retrieve the value. We don't want to ignore
538            the clause and it is expected to have been validated already.  Then
539            get the new type, if any.  */
540         if (definition)
541           gnu_size = validate_size (Esize (gnat_entity), gnu_type,
542                                     gnat_entity, VAR_DECL, 0,
543                                     Has_Size_Clause (gnat_entity));
544         else if (Has_Size_Clause (gnat_entity))
545           gnu_size = UI_To_gnu (Esize (gnat_entity), bitsizetype);
546
547         if (gnu_size != 0)
548           {
549             gnu_type
550               = make_type_from_size (gnu_type, gnu_size,
551                                      Has_Biased_Representation (gnat_entity));
552
553             if (operand_equal_p (TYPE_SIZE (gnu_type), gnu_size, 0))
554               gnu_size = 0;
555           }
556
557         /* If this object has self-referential size, it must be a record with
558            a default value.  We are supposed to allocate an object of the
559            maximum size in this case unless it is a constant with an
560            initializing expression, in which case we can get the size from
561            that.  Note that the resulting size may still be a variable, so
562            this may end up with an indirect allocation.  */
563
564         if (No (Renamed_Object (gnat_entity))
565             && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
566           {
567             if (gnu_expr != 0 && kind == E_Constant)
568               gnu_size
569                 = SUBSTITUTE_PLACEHOLDER_IN_EXPR
570                   (TYPE_SIZE (TREE_TYPE (gnu_expr)), gnu_expr);
571
572             /* We may have no GNU_EXPR because No_Initialization is
573                set even though there's an Expression.  */
574             else if (kind == E_Constant
575                      && (Nkind (Declaration_Node (gnat_entity))
576                          == N_Object_Declaration)
577                      && Present (Expression (Declaration_Node (gnat_entity))))
578               gnu_size
579                 = TYPE_SIZE (gnat_to_gnu_type
580                              (Etype
581                               (Expression (Declaration_Node (gnat_entity)))));
582             else
583               gnu_size = max_size (TYPE_SIZE (gnu_type), 1);
584           }
585
586         /* If the size is zero bytes, make it one byte since some linkers have
587            trouble with zero-sized objects.  If the object will have a
588            template, that will make it nonzero so don't bother.  Also avoid
589            doing that for an object renaming or an object with an address
590            clause, as we would lose useful information on the view size
591            (e.g. for null array slices) and we are not allocating the object
592            here anyway.  */
593         if (((gnu_size != 0 && integer_zerop (gnu_size))
594              || (TYPE_SIZE (gnu_type) != 0
595                  && integer_zerop (TYPE_SIZE (gnu_type))))
596             && (! Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
597                 || ! Is_Array_Type (Etype (gnat_entity)))
598             && ! Present (Renamed_Object (gnat_entity))
599             && ! Present (Address_Clause (gnat_entity)))
600           gnu_size = bitsize_unit_node;
601
602         /* If an alignment is specified, use it if valid.   Note that
603            exceptions are objects but don't have alignments.  */
604         if (kind != E_Exception && Known_Alignment (gnat_entity))
605           {
606             if (No (Alignment (gnat_entity)))
607               gigi_abort (125);
608
609             align
610               = validate_alignment (Alignment (gnat_entity), gnat_entity,
611                                     TYPE_ALIGN (gnu_type));
612           }
613
614         /* If this is an atomic object with no specified size and alignment,
615            but where the size of the type is a constant, set the alignment to
616            the lowest power of two greater than the size, or to the
617            biggest meaningful alignment, whichever is smaller.  */
618
619         if (Is_Atomic (gnat_entity) && gnu_size == 0 && align == 0
620             && TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST)
621           {
622             if (! host_integerp (TYPE_SIZE (gnu_type), 1)
623                 || 0 <= compare_tree_int (TYPE_SIZE (gnu_type),
624                                           BIGGEST_ALIGNMENT))
625               align = BIGGEST_ALIGNMENT;
626             else
627               align = ((unsigned int) 1
628                        << (floor_log2 (tree_low_cst
629                                        (TYPE_SIZE (gnu_type), 1) - 1)
630                            + 1));
631           }
632
633         /* If the object is set to have atomic components, find the component
634            type and validate it.
635
636            ??? Note that we ignore Has_Volatile_Components on objects; it's
637            not at all clear what to do in that case. */
638
639         if (Has_Atomic_Components (gnat_entity))
640           {
641             tree gnu_inner
642               = (TREE_CODE (gnu_type) == ARRAY_TYPE
643                  ? TREE_TYPE (gnu_type) : gnu_type);
644
645             while (TREE_CODE (gnu_inner) == ARRAY_TYPE
646                    && TYPE_MULTI_ARRAY_P (gnu_inner))
647               gnu_inner = TREE_TYPE (gnu_inner);
648
649             check_ok_for_atomic (gnu_inner, gnat_entity, 1);
650           }
651
652         /* Now check if the type of the object allows atomic access.  Note
653            that we must test the type, even if this object has size and
654            alignment to allow such access, because we will be going
655            inside the padded record to assign to the object.  We could fix
656            this by always copying via an intermediate value, but it's not
657            clear it's worth the effort.  */
658         if (Is_Atomic (gnat_entity))
659           check_ok_for_atomic (gnu_type, gnat_entity, 0);
660
661         /* If this is an aliased object with an unconstrained nominal subtype,
662            make a type that includes the template.  */
663         if (Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
664             && Is_Array_Type (Etype (gnat_entity))
665             && ! type_annotate_only)
666         {
667           tree gnu_fat
668             = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity))));
669           tree gnu_temp_type
670             = TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_fat))));
671
672           gnu_type
673             = build_unc_object_type (gnu_temp_type, gnu_type,
674                                      concat_id_with_name (gnu_entity_id,
675                                                           "UNC"));
676         }
677
678 #ifdef MINIMUM_ATOMIC_ALIGNMENT
679         /* If the size is a constant and no alignment is specified, force
680            the alignment to be the minimum valid atomic alignment.  The
681            restriction on constant size avoids problems with variable-size
682            temporaries; if the size is variable, there's no issue with
683            atomic access.  Also don't do this for a constant, since it isn't
684            necessary and can interfere with constant replacement.  Finally,
685            do not do it for Out parameters since that creates an
686            size inconsistency with In parameters.  */
687         if (align == 0 && MINIMUM_ATOMIC_ALIGNMENT > TYPE_ALIGN (gnu_type)
688             && ! FLOAT_TYPE_P (gnu_type)
689             && ! const_flag && No (Renamed_Object (gnat_entity))
690             && ! imported_p && No (Address_Clause (gnat_entity))
691             && kind != E_Out_Parameter
692             && (gnu_size != 0 ? TREE_CODE (gnu_size) == INTEGER_CST
693                 : TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST))
694           align = MINIMUM_ATOMIC_ALIGNMENT;
695 #endif
696
697         /* Make a new type with the desired size and alignment, if needed. */
698         gnu_type = maybe_pad_type (gnu_type, gnu_size, align,
699                                    gnat_entity, "PAD", 0, definition, 1);
700
701         /* Make a volatile version of this object's type if we are to
702            make the object volatile.  Note that 13.3(19) says that we
703            should treat other types of objects as volatile as well.  */
704         if ((Treat_As_Volatile (gnat_entity)
705              || Is_Exported (gnat_entity)
706              || Is_Imported (gnat_entity)
707              || Present (Address_Clause (gnat_entity)))
708             && ! TYPE_VOLATILE (gnu_type))
709           gnu_type = build_qualified_type (gnu_type,
710                                            (TYPE_QUALS (gnu_type)
711                                             | TYPE_QUAL_VOLATILE));
712
713         /* Convert the expression to the type of the object except in the
714            case where the object's type is unconstrained or the object's type
715            is a padded record whose field is of self-referential size.  In
716            the former case, converting will generate unnecessary evaluations
717            of the CONSTRUCTOR to compute the size and in the latter case, we
718            want to only copy the actual data.  */
719         if (gnu_expr != 0
720             && TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
721             && ! CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
722             && ! (TREE_CODE (gnu_type) == RECORD_TYPE
723                   && TYPE_IS_PADDING_P (gnu_type)
724                   && (CONTAINS_PLACEHOLDER_P
725                       (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type)))))))
726           gnu_expr = convert (gnu_type, gnu_expr);
727
728         /* See if this is a renaming.  If this is a constant renaming,
729            treat it as a normal variable whose initial value is what
730            is being renamed.  We cannot do this if the type is
731            unconstrained or class-wide.
732
733            Otherwise, if what we are renaming is a reference, we can simply
734            return a stabilized version of that reference, after forcing
735            any SAVE_EXPRs to be evaluated.  But, if this is at global level,
736            we can only do this if we know no SAVE_EXPRs will be made.
737            Otherwise, make this into a constant pointer to the object we are
738            to rename.  */
739
740         if (Present (Renamed_Object (gnat_entity)))
741           {
742             /* If the renamed object had padding, strip off the reference
743                to the inner object and reset our type.  */
744             if (TREE_CODE (gnu_expr) == COMPONENT_REF
745                 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))
746                     == RECORD_TYPE)
747                 && (TYPE_IS_PADDING_P
748                     (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))))
749               {
750                 gnu_expr = TREE_OPERAND (gnu_expr, 0);
751                 gnu_type = TREE_TYPE (gnu_expr);
752               }
753
754             if (const_flag
755                 && TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
756                 && TYPE_MODE (gnu_type) != BLKmode
757                 && Ekind (Etype (gnat_entity)) != E_Class_Wide_Type
758                 && !Is_Array_Type (Etype (gnat_entity)))
759               ;
760
761             /* If this is a declaration or reference, we can just use that
762                declaration or reference as this entity.  */
763             else if ((DECL_P (gnu_expr)
764                       || TREE_CODE_CLASS (TREE_CODE (gnu_expr)) == 'r')
765                      && ! Materialize_Entity (gnat_entity)
766                      && (! global_bindings_p ()
767                          || (staticp (gnu_expr)
768                              && ! TREE_SIDE_EFFECTS (gnu_expr))))
769               {
770                 set_lineno (gnat_entity, ! global_bindings_p ());
771                 gnu_decl = gnat_stabilize_reference (gnu_expr, 1);
772                 save_gnu_tree (gnat_entity, gnu_decl, 1);
773                 saved = 1;
774
775                 if (! global_bindings_p ())
776                   expand_expr_stmt (build1 (CONVERT_EXPR, void_type_node,
777                                             gnu_decl));
778                 break;
779               }
780             else
781               {
782                 inner_const_flag = TREE_READONLY (gnu_expr);
783                 const_flag = 1;
784                 gnu_type = build_reference_type (gnu_type);
785                 gnu_expr = build_unary_op (ADDR_EXPR, gnu_type, gnu_expr);
786                 gnu_size = 0;
787                 used_by_ref = 1;
788               }
789           }
790
791         /* If this is an aliased object whose nominal subtype is unconstrained,
792            the object is a record that contains both the template and
793            the object.  If there is an initializer, it will have already
794            been converted to the right type, but we need to create the
795            template if there is no initializer.  */
796         else if (definition && TREE_CODE (gnu_type) == RECORD_TYPE
797                  && (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
798                      /* Beware that padding might have been introduced
799                         via maybe_pad_type above.  */
800                      || (TYPE_IS_PADDING_P (gnu_type)
801                          && TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
802                             == RECORD_TYPE
803                          && TYPE_CONTAINS_TEMPLATE_P
804                             (TREE_TYPE (TYPE_FIELDS (gnu_type)))))
805                  && gnu_expr == 0)
806           {
807             tree template_field
808               = TYPE_IS_PADDING_P (gnu_type)
809                 ? TYPE_FIELDS (TREE_TYPE (TYPE_FIELDS (gnu_type)))
810                 : TYPE_FIELDS (gnu_type);
811
812             gnu_expr
813               = gnat_build_constructor
814               (gnu_type,
815                tree_cons
816                (template_field,
817                 build_template (TREE_TYPE (template_field),
818                                 TREE_TYPE (TREE_CHAIN (template_field)),
819                                 NULL_TREE),
820                 NULL_TREE));
821           }
822
823         /* If this is a pointer and it does not have an initializing
824            expression, initialize it to NULL, unless the obect is
825            imported.  */
826         if (definition
827             && (POINTER_TYPE_P (gnu_type) || TYPE_FAT_POINTER_P (gnu_type))
828             && !Is_Imported (gnat_entity)
829             && gnu_expr == 0)
830           gnu_expr = integer_zero_node;
831
832         /* If we are defining the object and it has an Address clause we must
833            get the address expression from the saved GCC tree for the
834            object if the object has a Freeze_Node.  Otherwise, we elaborate
835            the address expression here since the front-end has guaranteed
836            in that case that the elaboration has no effects.  Note that
837            only the latter mechanism is currently in use.  */
838         if (definition && Present (Address_Clause (gnat_entity)))
839           {
840             tree gnu_address
841               = (present_gnu_tree (gnat_entity) ? get_gnu_tree (gnat_entity)
842                 : gnat_to_gnu (Expression (Address_Clause (gnat_entity))));
843
844             save_gnu_tree (gnat_entity, NULL_TREE, 0);
845
846             /* Ignore the size.  It's either meaningless or was handled
847                above.  */
848             gnu_size = 0;
849             gnu_type = build_reference_type (gnu_type);
850             gnu_address = convert (gnu_type, gnu_address);
851             used_by_ref = 1;
852             const_flag = ! Is_Public (gnat_entity);
853
854             /* If we don't have an initializing expression for the underlying
855                variable, the initializing expression for the pointer is the
856                specified address.  Otherwise, we have to make a COMPOUND_EXPR
857                to assign both the address and the initial value.  */
858             if (gnu_expr == 0)
859               gnu_expr = gnu_address;
860             else
861               gnu_expr
862                 = build (COMPOUND_EXPR, gnu_type,
863                          build_binary_op
864                          (MODIFY_EXPR, NULL_TREE,
865                           build_unary_op (INDIRECT_REF, NULL_TREE,
866                                           gnu_address),
867                           gnu_expr),
868                          gnu_address);
869           }
870
871         /* If it has an address clause and we are not defining it, mark it
872            as an indirect object.  Likewise for Stdcall objects that are
873            imported.  */
874         if ((! definition && Present (Address_Clause (gnat_entity)))
875             || (Is_Imported (gnat_entity)
876                 && Convention (gnat_entity) == Convention_Stdcall))
877           {
878             gnu_type = build_reference_type (gnu_type);
879             gnu_size = 0;
880             used_by_ref = 1;
881           }
882
883         /* If we are at top level and this object is of variable size,
884            make the actual type a hidden pointer to the real type and
885            make the initializer be a memory allocation and initialization.
886            Likewise for objects we aren't defining (presumed to be
887            external references from other packages), but there we do
888            not set up an initialization.
889
890            If the object's size overflows, make an allocator too, so that
891            Storage_Error gets raised.  Note that we will never free
892            such memory, so we presume it never will get allocated.  */
893
894         if (! allocatable_size_p (TYPE_SIZE_UNIT (gnu_type),
895                                   global_bindings_p () || ! definition
896                                   || static_p)
897             || (gnu_size != 0
898                 && ! allocatable_size_p (gnu_size,
899                                          global_bindings_p () || ! definition
900                                          || static_p)))
901           {
902             gnu_type = build_reference_type (gnu_type);
903             gnu_size = 0;
904             used_by_ref = 1;
905             const_flag = 1;
906
907             /* Get the data part of GNU_EXPR in case this was a
908                aliased object whose nominal subtype is unconstrained.
909                In that case the pointer above will be a thin pointer and
910                build_allocator will automatically make the template and
911                constructor already made above.  */
912
913             if (definition)
914               {
915                 tree gnu_alloc_type = TREE_TYPE (gnu_type);
916
917                 if (TREE_CODE (gnu_alloc_type) == RECORD_TYPE
918                     && TYPE_CONTAINS_TEMPLATE_P (gnu_alloc_type))
919                   {
920                     gnu_alloc_type
921                       = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_alloc_type)));
922                     gnu_expr
923                       = build_component_ref
924                         (gnu_expr, NULL_TREE,
925                          TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))), 0);
926                   }
927
928                 if (TREE_CODE (TYPE_SIZE_UNIT (gnu_alloc_type)) == INTEGER_CST
929                     && TREE_CONSTANT_OVERFLOW (TYPE_SIZE_UNIT (gnu_alloc_type))
930                     && ! Is_Imported (gnat_entity))
931                   post_error ("Storage_Error will be raised at run-time?",
932                               gnat_entity);
933
934                 gnu_expr = build_allocator (gnu_alloc_type, gnu_expr,
935                                             gnu_type, 0, 0, gnat_entity);
936               }
937             else
938               {
939                 gnu_expr = 0;
940                 const_flag = 0;
941               }
942           }
943
944         /* If this object would go into the stack and has an alignment
945            larger than the default largest alignment, make a variable
946            to hold the "aligning type" with a modified initial value,
947            if any, then point to it and make that the value of this
948            variable, which is now indirect.  */
949
950         if (! global_bindings_p () && ! static_p && definition
951             && ! imported_p && TYPE_ALIGN (gnu_type) > BIGGEST_ALIGNMENT)
952           {
953             tree gnu_new_type
954               = make_aligning_type (gnu_type, TYPE_ALIGN (gnu_type),
955                                     TYPE_SIZE_UNIT (gnu_type));
956             tree gnu_new_var;
957
958             set_lineno (gnat_entity, 1);
959             gnu_new_var
960               = create_var_decl (create_concat_name (gnat_entity, "ALIGN"),
961                                  NULL_TREE, gnu_new_type, gnu_expr,
962                                  0, 0, 0, 0, 0);
963
964             if (gnu_expr != 0)
965               expand_expr_stmt
966                 (build_binary_op
967                  (MODIFY_EXPR, NULL_TREE,
968                   build_component_ref (gnu_new_var, NULL_TREE,
969                                        TYPE_FIELDS (gnu_new_type), 0),
970                   gnu_expr));
971
972             gnu_type = build_reference_type (gnu_type);
973             gnu_expr
974               = build_unary_op
975                 (ADDR_EXPR, gnu_type,
976                  build_component_ref (gnu_new_var, NULL_TREE,
977                                       TYPE_FIELDS (gnu_new_type), 0));
978
979             gnu_size = 0;
980             used_by_ref = 1;
981             const_flag = 1;
982           }
983
984         /* Convert the expression to the type of the object except in the
985            case where the object's type is unconstrained or the object's type
986            is a padded record whose field is of self-referential size.  In
987            the former case, converting will generate unnecessary evaluations
988            of the CONSTRUCTOR to compute the size and in the latter case, we
989            want to only copy the actual data.  */
990         if (gnu_expr != 0
991             && TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
992             && ! CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
993             && ! (TREE_CODE (gnu_type) == RECORD_TYPE
994                   && TYPE_IS_PADDING_P (gnu_type)
995                   && (CONTAINS_PLACEHOLDER_P
996                       (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type)))))))
997           gnu_expr = convert (gnu_type, gnu_expr);
998
999         /* If this name is external or there was a name specified, use it,
1000            unless this is a VMS exception object since this would conflict
1001            with the symbol we need to export in addition.  Don't use the
1002            Interface_Name if there is an address clause (see CD30005).  */
1003         if (! Is_VMS_Exception (gnat_entity)
1004             &&
1005             ((Present (Interface_Name (gnat_entity))
1006               && No (Address_Clause (gnat_entity)))
1007              ||
1008              (Is_Public (gnat_entity)
1009               && (! Is_Imported (gnat_entity) || Is_Exported (gnat_entity)))))
1010           gnu_ext_name = create_concat_name (gnat_entity, 0);
1011
1012         if (const_flag)
1013           gnu_type = build_qualified_type (gnu_type, (TYPE_QUALS (gnu_type)
1014                                                       | TYPE_QUAL_CONST));
1015
1016         /* If this is constant initialized to a static constant and the
1017            object has an aggregrate type, force it to be statically
1018            allocated. */
1019         if (const_flag && gnu_expr && TREE_CONSTANT (gnu_expr)
1020             && host_integerp (TYPE_SIZE_UNIT (gnu_type), 1)
1021             && (AGGREGATE_TYPE_P (gnu_type)
1022                 && ! (TREE_CODE (gnu_type) == RECORD_TYPE
1023                       && TYPE_IS_PADDING_P (gnu_type))))
1024           static_p = 1;
1025
1026         set_lineno (gnat_entity, ! global_bindings_p ());
1027         gnu_decl = create_var_decl (gnu_entity_id, gnu_ext_name, gnu_type,
1028                                     gnu_expr, const_flag,
1029                                     Is_Public (gnat_entity),
1030                                     imported_p || !definition,
1031                                     static_p, attr_list);
1032
1033         DECL_BY_REF_P (gnu_decl) = used_by_ref;
1034         DECL_POINTS_TO_READONLY_P (gnu_decl) = used_by_ref && inner_const_flag;
1035
1036         /* If we have an address clause and we've made this indirect, it's
1037            not enough to merely mark the type as volatile since volatile
1038            references only conflict with other volatile references while this
1039            reference must conflict with all other references.  So ensure that
1040            the dereferenced value has alias set 0.  */
1041         if (Present (Address_Clause (gnat_entity)) && used_by_ref)
1042           DECL_POINTER_ALIAS_SET (gnu_decl) = 0;
1043
1044         if (definition && DECL_SIZE (gnu_decl) != 0
1045             && gnu_block_stack != 0
1046             && TREE_VALUE (gnu_block_stack) != 0
1047             && (TREE_CODE (DECL_SIZE (gnu_decl)) != INTEGER_CST
1048                 || (flag_stack_check && ! STACK_CHECK_BUILTIN
1049                     && 0 < compare_tree_int (DECL_SIZE_UNIT (gnu_decl),
1050                                              STACK_CHECK_MAX_VAR_SIZE))))
1051           update_setjmp_buf (TREE_VALUE (gnu_block_stack));
1052
1053         /* If this is a public constant or we're not optimizing and we're not
1054            making a VAR_DECL for it, make one just for export or debugger
1055            use.  Likewise if the address is taken or if the object or type is
1056            aliased.  */
1057         if (definition && TREE_CODE (gnu_decl) == CONST_DECL
1058             && (Is_Public (gnat_entity)
1059                 || optimize == 0
1060                 || Address_Taken (gnat_entity)
1061                 || Is_Aliased (gnat_entity)
1062                 || Is_Aliased (Etype (gnat_entity))))
1063           SET_DECL_CONST_CORRESPONDING_VAR (gnu_decl,
1064               create_var_decl (gnu_entity_id, gnu_ext_name, gnu_type,
1065                                gnu_expr, 0, Is_Public (gnat_entity), 0,
1066                                static_p, 0));
1067
1068         /* If this is declared in a block that contains an block with an
1069            exception handler, we must force this variable in memory to
1070            suppress an invalid optimization.  */
1071         if (Has_Nested_Block_With_Handler (Scope (gnat_entity))
1072             && Exception_Mechanism != GCC_ZCX)
1073           {
1074             gnat_mark_addressable (gnu_decl);
1075             flush_addressof (gnu_decl);
1076           }
1077
1078         /* Back-annotate the Alignment of the object if not already in the
1079            tree.  Likewise for Esize if the object is of a constant size.
1080            But if the "object" is actually a pointer to an object, the
1081            alignment and size are the same as teh type, so don't back-annotate
1082            the values for the pointer.  */
1083         if (! used_by_ref && Unknown_Alignment (gnat_entity))
1084           Set_Alignment (gnat_entity,
1085                          UI_From_Int (DECL_ALIGN (gnu_decl) / BITS_PER_UNIT));
1086
1087         if (! used_by_ref && Unknown_Esize (gnat_entity)
1088             && DECL_SIZE (gnu_decl) != 0)
1089           {
1090             tree gnu_back_size = DECL_SIZE (gnu_decl);
1091
1092             if (TREE_CODE (TREE_TYPE (gnu_decl)) == RECORD_TYPE
1093                 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_decl)))
1094               gnu_back_size
1095                 = TYPE_SIZE (TREE_TYPE (TREE_CHAIN
1096                                         (TYPE_FIELDS (TREE_TYPE (gnu_decl)))));
1097
1098             Set_Esize (gnat_entity, annotate_value (gnu_back_size));
1099           }
1100       }
1101       break;
1102
1103     case E_Void:
1104       /* Return a TYPE_DECL for "void" that we previously made.  */
1105       gnu_decl = void_type_decl_node;
1106       break;
1107
1108     case E_Enumeration_Type:
1109       /* A special case, for the types Character and Wide_Character in
1110          Standard, we do not list all the literals. So if the literals
1111          are not specified, make this an unsigned type.  */
1112       if (No (First_Literal (gnat_entity)))
1113         {
1114           gnu_type = make_unsigned_type (esize);
1115           break;
1116         }
1117
1118       /* Normal case of non-character type, or non-Standard character type */
1119       {
1120         /* Here we have a list of enumeral constants in First_Literal.
1121            We make a CONST_DECL for each and build into GNU_LITERAL_LIST
1122            the list to be places into TYPE_FIELDS.  Each node in the list
1123            is a TREE_LIST node whose TREE_VALUE is the literal name
1124            and whose TREE_PURPOSE is the value of the literal.
1125
1126            Esize contains the number of bits needed to represent the enumeral
1127            type, Type_Low_Bound also points to the first literal and
1128            Type_High_Bound points to the last literal.  */
1129
1130         Entity_Id gnat_literal;
1131         tree gnu_literal_list = NULL_TREE;
1132
1133         if (Is_Unsigned_Type (gnat_entity))
1134           gnu_type = make_unsigned_type (esize);
1135         else
1136           gnu_type = make_signed_type (esize);
1137
1138         TREE_SET_CODE (gnu_type, ENUMERAL_TYPE);
1139
1140         for (gnat_literal = First_Literal (gnat_entity);
1141              Present (gnat_literal);
1142              gnat_literal = Next_Literal (gnat_literal))
1143           {
1144             tree gnu_value = UI_To_gnu (Enumeration_Rep (gnat_literal),
1145                                         gnu_type);
1146             tree gnu_literal
1147               = create_var_decl (get_entity_name (gnat_literal),
1148                                  0, gnu_type, gnu_value, 1, 0, 0, 0, 0);
1149
1150             save_gnu_tree (gnat_literal, gnu_literal, 0);
1151             gnu_literal_list = tree_cons (DECL_NAME (gnu_literal),
1152                                           gnu_value, gnu_literal_list);
1153           }
1154
1155         TYPE_VALUES (gnu_type) = nreverse (gnu_literal_list);
1156
1157         /* Note that the bounds are updated at the end of this function
1158            because to avoid an infinite recursion when we get the bounds of
1159            this type, since those bounds are objects of this type.    */
1160       }
1161       break;
1162
1163     case E_Signed_Integer_Type:
1164     case E_Ordinary_Fixed_Point_Type:
1165     case E_Decimal_Fixed_Point_Type:
1166       /* For integer types, just make a signed type the appropriate number
1167          of bits.  */
1168       gnu_type = make_signed_type (esize);
1169       break;
1170
1171     case E_Modular_Integer_Type:
1172       /* For modular types, make the unsigned type of the proper number of
1173          bits and then set up the modulus, if required.  */
1174       {
1175         enum machine_mode mode;
1176         tree gnu_modulus;
1177         tree gnu_high = 0;
1178
1179         if (Is_Packed_Array_Type (gnat_entity))
1180           esize = UI_To_Int (RM_Size (gnat_entity));
1181
1182         /* Find the smallest mode at least ESIZE bits wide and make a class
1183            using that mode.  */
1184
1185         for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1186              GET_MODE_BITSIZE (mode) < esize;
1187              mode = GET_MODE_WIDER_MODE (mode))
1188           ;
1189
1190         gnu_type = make_unsigned_type (GET_MODE_BITSIZE (mode));
1191         TYPE_PACKED_ARRAY_TYPE_P (gnu_type)
1192           = Is_Packed_Array_Type (gnat_entity);
1193
1194         /* Get the modulus in this type.  If it overflows, assume it is because
1195            it is equal to 2**Esize.  Note that there is no overflow checking
1196            done on unsigned type, so we detect the overflow by looking for
1197            a modulus of zero, which is otherwise invalid.  */
1198         gnu_modulus = UI_To_gnu (Modulus (gnat_entity), gnu_type);
1199
1200         if (! integer_zerop (gnu_modulus))
1201           {
1202             TYPE_MODULAR_P (gnu_type) = 1;
1203             SET_TYPE_MODULUS (gnu_type, gnu_modulus);
1204             gnu_high = fold (build (MINUS_EXPR, gnu_type, gnu_modulus,
1205                                     convert (gnu_type, integer_one_node)));
1206           }
1207
1208         /* If we have to set TYPE_PRECISION different from its natural value,
1209            make a subtype to do do.  Likewise if there is a modulus and
1210            it is not one greater than TYPE_MAX_VALUE.  */
1211         if (TYPE_PRECISION (gnu_type) != esize
1212             || (TYPE_MODULAR_P (gnu_type)
1213                 && ! tree_int_cst_equal (TYPE_MAX_VALUE (gnu_type), gnu_high)))
1214           {
1215             tree gnu_subtype = make_node (INTEGER_TYPE);
1216
1217             TYPE_NAME (gnu_type) = create_concat_name (gnat_entity, "UMT");
1218             TREE_TYPE (gnu_subtype) = gnu_type;
1219             TYPE_MIN_VALUE (gnu_subtype) = TYPE_MIN_VALUE (gnu_type);
1220             TYPE_MAX_VALUE (gnu_subtype)
1221               = TYPE_MODULAR_P (gnu_type)
1222                 ? gnu_high : TYPE_MAX_VALUE (gnu_type);
1223             TYPE_PRECISION (gnu_subtype) = esize;
1224             TREE_UNSIGNED (gnu_subtype) = 1;
1225             TYPE_EXTRA_SUBTYPE_P (gnu_subtype) = 1;
1226             TYPE_PACKED_ARRAY_TYPE_P (gnu_subtype)
1227               = Is_Packed_Array_Type (gnat_entity);
1228             layout_type (gnu_subtype);
1229
1230             gnu_type = gnu_subtype;
1231           }
1232       }
1233       break;
1234
1235     case E_Signed_Integer_Subtype:
1236     case E_Enumeration_Subtype:
1237     case E_Modular_Integer_Subtype:
1238     case E_Ordinary_Fixed_Point_Subtype:
1239     case E_Decimal_Fixed_Point_Subtype:
1240
1241       /* For integral subtypes, we make a new INTEGER_TYPE.  Note
1242          that we do not want to call build_range_type since we would
1243          like each subtype node to be distinct.  This will be important
1244          when memory aliasing is implemented.
1245
1246          The TREE_TYPE field of the INTEGER_TYPE we make points to the
1247          parent type; this fact is used by the arithmetic conversion
1248          functions.
1249
1250          We elaborate the Ancestor_Subtype if it is not in the current
1251          unit and one of our bounds is non-static.  We do this to ensure
1252          consistent naming in the case where several subtypes share the same
1253          bounds by always elaborating the first such subtype first, thus
1254          using its name. */
1255
1256       if (definition == 0
1257           && Present (Ancestor_Subtype (gnat_entity))
1258           && ! In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity))
1259           && (! Compile_Time_Known_Value (Type_Low_Bound (gnat_entity))
1260               || ! Compile_Time_Known_Value (Type_High_Bound (gnat_entity))))
1261         gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity),
1262                             gnu_expr, definition);
1263
1264       gnu_type = make_node (INTEGER_TYPE);
1265       if (Is_Packed_Array_Type (gnat_entity))
1266         {
1267           esize = UI_To_Int (RM_Size (gnat_entity));
1268           TYPE_PACKED_ARRAY_TYPE_P (gnu_type) = 1;
1269         }
1270
1271       TYPE_PRECISION (gnu_type) = esize;
1272       TREE_TYPE (gnu_type) = get_unpadded_type (Etype (gnat_entity));
1273
1274       TYPE_MIN_VALUE (gnu_type)
1275         = convert (TREE_TYPE (gnu_type),
1276                    elaborate_expression (Type_Low_Bound (gnat_entity),
1277                                          gnat_entity,
1278                                          get_identifier ("L"), definition, 1,
1279                                          Needs_Debug_Info (gnat_entity)));
1280
1281       TYPE_MAX_VALUE (gnu_type)
1282         = convert (TREE_TYPE (gnu_type),
1283                    elaborate_expression (Type_High_Bound (gnat_entity),
1284                                          gnat_entity,
1285                                          get_identifier ("U"), definition, 1,
1286                                          Needs_Debug_Info (gnat_entity)));
1287
1288       /* One of the above calls might have caused us to be elaborated,
1289          so don't blow up if so.  */
1290       if (present_gnu_tree (gnat_entity))
1291         {
1292           maybe_present = 1;
1293           break;
1294         }
1295
1296       TYPE_BIASED_REPRESENTATION_P (gnu_type)
1297         = Has_Biased_Representation (gnat_entity);
1298
1299      /* This should be an unsigned type if the lower bound is constant
1300          and non-negative or if the base type is unsigned; a signed type
1301          otherwise.    */
1302       TREE_UNSIGNED (gnu_type)
1303         = (TREE_UNSIGNED (TREE_TYPE (gnu_type))
1304            || (TREE_CODE (TYPE_MIN_VALUE (gnu_type)) == INTEGER_CST
1305                && TREE_INT_CST_HIGH (TYPE_MIN_VALUE (gnu_type)) >= 0)
1306            || TYPE_BIASED_REPRESENTATION_P (gnu_type)
1307            || Is_Unsigned_Type (gnat_entity));
1308
1309       layout_type (gnu_type);
1310
1311       /* If the type we are dealing with is to represent a packed array,
1312          we need to have the bits left justified on big-endian targets
1313          (see exp_packd.ads).  We build a record with a bitfield of the
1314          appropriate size to achieve this.  */
1315       if (Is_Packed_Array_Type (gnat_entity) && BYTES_BIG_ENDIAN)
1316         {
1317           tree gnu_field_type = gnu_type;
1318           tree gnu_field;
1319
1320           TYPE_RM_SIZE_INT (gnu_field_type)
1321             = UI_To_gnu (RM_Size (gnat_entity), bitsizetype);
1322           gnu_type = make_node (RECORD_TYPE);
1323           TYPE_NAME (gnu_type) = create_concat_name (gnat_entity, "LJM");
1324           TYPE_ALIGN (gnu_type) = TYPE_ALIGN (gnu_field_type);
1325           TYPE_PACKED (gnu_type) = 1;
1326
1327           /* Don't notify the field as "addressable", since we won't be taking
1328              it's address and it would prevent create_field_decl from making a
1329              bitfield.  */
1330           gnu_field = create_field_decl (get_identifier ("OBJECT"),
1331                                          gnu_field_type, gnu_type, 1, 0, 0, 0);
1332
1333           finish_record_type (gnu_type, gnu_field, 0, 0);
1334           TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_type) = 1;
1335           SET_TYPE_ADA_SIZE (gnu_type, bitsize_int (esize));
1336         }
1337
1338       break;
1339
1340     case E_Floating_Point_Type:
1341       /* If this is a VAX floating-point type, use an integer of the proper
1342          size.  All the operations will be handled with ASM statements.  */
1343       if (Vax_Float (gnat_entity))
1344         {
1345           gnu_type = make_signed_type (esize);
1346           TYPE_VAX_FLOATING_POINT_P (gnu_type) = 1;
1347           SET_TYPE_DIGITS_VALUE (gnu_type,
1348                                  UI_To_gnu (Digits_Value (gnat_entity),
1349                                             sizetype));
1350           break;
1351         }
1352
1353       /* The type of the Low and High bounds can be our type if this is
1354          a type from Standard, so set them at the end of the function.  */
1355       gnu_type = make_node (REAL_TYPE);
1356       TYPE_PRECISION (gnu_type) = fp_size_to_prec (esize);
1357       layout_type (gnu_type);
1358       break;
1359
1360     case E_Floating_Point_Subtype:
1361       if (Vax_Float (gnat_entity))
1362         {
1363           gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
1364           break;
1365         }
1366
1367       {
1368         if (definition == 0
1369             && Present (Ancestor_Subtype (gnat_entity))
1370             && ! In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity))
1371             && (! Compile_Time_Known_Value (Type_Low_Bound (gnat_entity))
1372                 || ! Compile_Time_Known_Value (Type_High_Bound (gnat_entity))))
1373           gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity),
1374                               gnu_expr, definition);
1375
1376         gnu_type = make_node (REAL_TYPE);
1377         TREE_TYPE (gnu_type) = get_unpadded_type (Etype (gnat_entity));
1378         TYPE_PRECISION (gnu_type) = fp_size_to_prec (esize);
1379
1380         TYPE_MIN_VALUE (gnu_type)
1381           = convert (TREE_TYPE (gnu_type),
1382                      elaborate_expression (Type_Low_Bound (gnat_entity),
1383                                            gnat_entity, get_identifier ("L"),
1384                                            definition, 1,
1385                                            Needs_Debug_Info (gnat_entity)));
1386
1387         TYPE_MAX_VALUE (gnu_type)
1388           = convert (TREE_TYPE (gnu_type),
1389                      elaborate_expression (Type_High_Bound (gnat_entity),
1390                                            gnat_entity, get_identifier ("U"),
1391                                            definition, 1,
1392                                            Needs_Debug_Info (gnat_entity)));
1393
1394         /* One of the above calls might have caused us to be elaborated,
1395            so don't blow up if so.  */
1396         if (present_gnu_tree (gnat_entity))
1397           {
1398             maybe_present = 1;
1399             break;
1400           }
1401
1402         layout_type (gnu_type);
1403       }
1404     break;
1405
1406       /* Array and String Types and Subtypes
1407
1408          Unconstrained array types are represented by E_Array_Type and
1409          constrained array types are represented by E_Array_Subtype.  There
1410          are no actual objects of an unconstrained array type; all we have
1411          are pointers to that type.
1412
1413          The following fields are defined on array types and subtypes:
1414
1415                 Component_Type     Component type of the array.
1416                 Number_Dimensions  Number of dimensions (an int).
1417                 First_Index        Type of first index.  */
1418
1419     case E_String_Type:
1420     case E_Array_Type:
1421       {
1422         tree gnu_template_fields = NULL_TREE;
1423         tree gnu_template_type = make_node (RECORD_TYPE);
1424         tree gnu_ptr_template = build_pointer_type (gnu_template_type);
1425         tree gnu_fat_type = make_node (RECORD_TYPE);
1426         int ndim = Number_Dimensions (gnat_entity);
1427         int firstdim
1428           = (Convention (gnat_entity) == Convention_Fortran) ? ndim - 1 : 0;
1429         int nextdim
1430           = (Convention (gnat_entity) == Convention_Fortran) ? - 1 : 1;
1431         tree *gnu_index_types = (tree *) alloca (ndim * sizeof (tree *));
1432         tree *gnu_temp_fields = (tree *) alloca (ndim * sizeof (tree *));
1433         tree gnu_comp_size = 0;
1434         tree gnu_max_size = size_one_node;
1435         tree gnu_max_size_unit;
1436         int index;
1437         Entity_Id gnat_ind_subtype;
1438         Entity_Id gnat_ind_base_subtype;
1439         tree gnu_template_reference;
1440         tree tem;
1441
1442         TYPE_NAME (gnu_template_type)
1443           = create_concat_name (gnat_entity, "XUB");
1444         TYPE_NAME (gnu_fat_type) = create_concat_name (gnat_entity, "XUP");
1445         TYPE_IS_FAT_POINTER_P (gnu_fat_type) = 1;
1446         TREE_READONLY (gnu_template_type) = 1;
1447
1448         /* Make a node for the array.  If we are not defining the array
1449            suppress expanding incomplete types and save the node as the type
1450            for GNAT_ENTITY.  */
1451         gnu_type = make_node (UNCONSTRAINED_ARRAY_TYPE);
1452         if (! definition)
1453           {
1454             defer_incomplete_level++;
1455             this_deferred = this_made_decl = 1;
1456             gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
1457                                          ! Comes_From_Source (gnat_entity),
1458                                          debug_info_p);
1459             save_gnu_tree (gnat_entity, gnu_decl, 0);
1460             saved = 1;
1461           }
1462
1463         /* Build the fat pointer type.  Use a "void *" object instead of
1464            a pointer to the array type since we don't have the array type
1465            yet (it will reference the fat pointer via the bounds).  */
1466         tem = chainon (chainon (NULL_TREE,
1467                                 create_field_decl (get_identifier ("P_ARRAY"),
1468                                                    ptr_void_type_node,
1469                                                    gnu_fat_type, 0, 0, 0, 0)),
1470                        create_field_decl (get_identifier ("P_BOUNDS"),
1471                                           gnu_ptr_template,
1472                                           gnu_fat_type, 0, 0, 0, 0));
1473
1474         /* Make sure we can put this into a register.  */
1475         TYPE_ALIGN (gnu_fat_type) = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
1476         finish_record_type (gnu_fat_type, tem, 0, 1);
1477
1478         /* Build a reference to the template from a PLACEHOLDER_EXPR that
1479            is the fat pointer.  This will be used to access the individual
1480            fields once we build them.  */
1481         tem = build (COMPONENT_REF, gnu_ptr_template,
1482                      build (PLACEHOLDER_EXPR, gnu_fat_type),
1483                      TREE_CHAIN (TYPE_FIELDS (gnu_fat_type)));
1484         gnu_template_reference
1485           = build_unary_op (INDIRECT_REF, gnu_template_type, tem);
1486         TREE_READONLY (gnu_template_reference) = 1;
1487
1488         /* Now create the GCC type for each index and add the fields for
1489            that index to the template.  */
1490         for (index = firstdim, gnat_ind_subtype = First_Index (gnat_entity),
1491              gnat_ind_base_subtype
1492                = First_Index (Implementation_Base_Type (gnat_entity));
1493              index < ndim && index >= 0;
1494              index += nextdim,
1495              gnat_ind_subtype = Next_Index (gnat_ind_subtype),
1496              gnat_ind_base_subtype = Next_Index (gnat_ind_base_subtype))
1497           {
1498             char field_name[10];
1499             tree gnu_ind_subtype
1500               = get_unpadded_type (Base_Type (Etype (gnat_ind_subtype)));
1501             tree gnu_base_subtype
1502               = get_unpadded_type (Etype (gnat_ind_base_subtype));
1503             tree gnu_base_min
1504               = convert (sizetype, TYPE_MIN_VALUE (gnu_base_subtype));
1505             tree gnu_base_max
1506               = convert (sizetype, TYPE_MAX_VALUE (gnu_base_subtype));
1507             tree gnu_min_field, gnu_max_field, gnu_min, gnu_max;
1508
1509             /* Make the FIELD_DECLs for the minimum and maximum of this
1510                type and then make extractions of that field from the
1511                template.  */
1512             set_lineno (gnat_entity, 0);
1513             sprintf (field_name, "LB%d", index);
1514             gnu_min_field = create_field_decl (get_identifier (field_name),
1515                                                gnu_ind_subtype,
1516                                                gnu_template_type, 0, 0, 0, 0);
1517             field_name[0] = 'U';
1518             gnu_max_field = create_field_decl (get_identifier (field_name),
1519                                                gnu_ind_subtype,
1520                                                gnu_template_type, 0, 0, 0, 0);
1521
1522             gnu_temp_fields[index] = chainon (gnu_min_field, gnu_max_field);
1523
1524             /* We can't use build_component_ref here since the template
1525                type isn't complete yet.  */
1526             gnu_min = build (COMPONENT_REF, gnu_ind_subtype,
1527                              gnu_template_reference, gnu_min_field);
1528             gnu_max = build (COMPONENT_REF, gnu_ind_subtype,
1529                              gnu_template_reference, gnu_max_field);
1530             TREE_READONLY (gnu_min) = TREE_READONLY (gnu_max) = 1;
1531
1532             /* Make a range type with the new ranges, but using
1533                the Ada subtype.  Then we convert to sizetype.  */
1534             gnu_index_types[index]
1535               = create_index_type (convert (sizetype, gnu_min),
1536                                    convert (sizetype, gnu_max),
1537                                    build_range_type (gnu_ind_subtype,
1538                                                      gnu_min, gnu_max));
1539             /* Update the maximum size of the array, in elements. */
1540             gnu_max_size
1541               = size_binop (MULT_EXPR, gnu_max_size,
1542                             size_binop (PLUS_EXPR, size_one_node,
1543                                         size_binop (MINUS_EXPR, gnu_base_max,
1544                                                     gnu_base_min)));
1545
1546             TYPE_NAME (gnu_index_types[index])
1547               = create_concat_name (gnat_entity, field_name);
1548           }
1549
1550         for (index = 0; index < ndim; index++)
1551           gnu_template_fields
1552             = chainon (gnu_template_fields, gnu_temp_fields[index]);
1553
1554         /* Install all the fields into the template.  */
1555         finish_record_type (gnu_template_type, gnu_template_fields, 0, 0);
1556         TREE_READONLY (gnu_template_type) = 1;
1557
1558         /* Now make the array of arrays and update the pointer to the array
1559            in the fat pointer.  Note that it is the first field.  */
1560
1561         tem = gnat_to_gnu_type (Component_Type (gnat_entity));
1562
1563         /* Get and validate any specified Component_Size, but if Packed,
1564            ignore it since the front end will have taken care of it. */
1565         gnu_comp_size
1566           = validate_size (Component_Size (gnat_entity), tem,
1567                            gnat_entity,
1568                            (Is_Bit_Packed_Array (gnat_entity)
1569                             ? TYPE_DECL : VAR_DECL), 1,
1570                            Has_Component_Size_Clause (gnat_entity));
1571
1572         if (Has_Atomic_Components (gnat_entity))
1573           check_ok_for_atomic (tem, gnat_entity, 1);
1574
1575         /* If the component type is a RECORD_TYPE that has a self-referential
1576            size, use the maxium size.  */
1577         if (gnu_comp_size == 0 && TREE_CODE (tem) == RECORD_TYPE
1578             && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (tem)))
1579           gnu_comp_size = max_size (TYPE_SIZE (tem), 1);
1580
1581         if (! Is_Bit_Packed_Array (gnat_entity) && gnu_comp_size != 0)
1582           {
1583             tem = make_type_from_size (tem, gnu_comp_size, 0);
1584             tem = maybe_pad_type (tem, gnu_comp_size, 0, gnat_entity,
1585                                   "C_PAD", 0, definition, 1);
1586           }
1587
1588         if (Has_Volatile_Components (gnat_entity))
1589           tem = build_qualified_type (tem,
1590                                       TYPE_QUALS (tem) | TYPE_QUAL_VOLATILE);
1591
1592         /* If Component_Size is not already specified, annotate it with the
1593            size of the component.  */
1594         if (Unknown_Component_Size (gnat_entity))
1595           Set_Component_Size (gnat_entity, annotate_value (TYPE_SIZE (tem)));
1596
1597         gnu_max_size_unit = size_binop (MAX_EXPR, size_zero_node,
1598                                         size_binop (MULT_EXPR, gnu_max_size,
1599                                                     TYPE_SIZE_UNIT (tem)));
1600         gnu_max_size = size_binop (MAX_EXPR, bitsize_zero_node,
1601                                    size_binop (MULT_EXPR,
1602                                                convert (bitsizetype,
1603                                                         gnu_max_size),
1604                                                TYPE_SIZE (tem)));
1605
1606         for (index = ndim - 1; index >= 0; index--)
1607           {
1608             tem = build_array_type (tem, gnu_index_types[index]);
1609             TYPE_MULTI_ARRAY_P (tem) = (index > 0);
1610
1611             /* If the type below this an multi-array type, then this
1612                does not not have aliased components.
1613
1614                ??? Otherwise, for now, we say that any component of aggregate
1615                type is addressable because the front end may take 'Reference
1616                of it. But we have to make it addressable if it must be passed
1617                by reference or it that is the default.  */
1618             TYPE_NONALIASED_COMPONENT (tem)
1619               = ((TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE
1620                   && TYPE_MULTI_ARRAY_P (TREE_TYPE (tem))) ? 1
1621                  : (! Has_Aliased_Components (gnat_entity)
1622                     && ! AGGREGATE_TYPE_P (TREE_TYPE (tem))));
1623           }
1624
1625         /* If an alignment is specified, use it if valid.  But ignore it for
1626            types that represent the unpacked base type for packed arrays.  */
1627         if (No (Packed_Array_Type (gnat_entity))
1628             && Known_Alignment (gnat_entity))
1629           {
1630             if (No (Alignment (gnat_entity)))
1631               gigi_abort (124);
1632
1633             TYPE_ALIGN (tem)
1634               = validate_alignment (Alignment (gnat_entity), gnat_entity,
1635                                     TYPE_ALIGN (tem));
1636           }
1637
1638         TYPE_CONVENTION_FORTRAN_P (tem)
1639           = (Convention (gnat_entity) == Convention_Fortran);
1640         TREE_TYPE (TYPE_FIELDS (gnu_fat_type)) = build_pointer_type (tem);
1641
1642         /* The result type is an UNCONSTRAINED_ARRAY_TYPE that indicates the
1643            corresponding fat pointer.  */
1644         TREE_TYPE (gnu_type) = TYPE_POINTER_TO (gnu_type)
1645           = TYPE_REFERENCE_TO (gnu_type) = gnu_fat_type;
1646         TYPE_MODE (gnu_type) = BLKmode;
1647         TYPE_ALIGN (gnu_type) = TYPE_ALIGN (tem);
1648         SET_TYPE_UNCONSTRAINED_ARRAY (gnu_fat_type, gnu_type);
1649
1650         /* If the maximum size doesn't overflow, use it.  */
1651         if (TREE_CODE (gnu_max_size) == INTEGER_CST
1652             && ! TREE_OVERFLOW (gnu_max_size))
1653           TYPE_SIZE (tem)
1654             = size_binop (MIN_EXPR, gnu_max_size, TYPE_SIZE (tem));
1655         if (TREE_CODE (gnu_max_size_unit) == INTEGER_CST
1656             && ! TREE_OVERFLOW (gnu_max_size_unit))
1657           TYPE_SIZE_UNIT (tem)
1658             = size_binop (MIN_EXPR, gnu_max_size_unit,
1659                           TYPE_SIZE_UNIT (tem));
1660
1661         create_type_decl (create_concat_name (gnat_entity, "XUA"),
1662                           tem, 0, ! Comes_From_Source (gnat_entity),
1663                           debug_info_p);
1664         rest_of_type_compilation (gnu_fat_type, global_bindings_p ());
1665
1666         /* Create a record type for the object and its template and
1667            set the template at a negative offset.  */
1668         tem = build_unc_object_type (gnu_template_type, tem,
1669                                      create_concat_name (gnat_entity, "XUT"));
1670         DECL_FIELD_OFFSET (TYPE_FIELDS (tem))
1671           = size_binop (MINUS_EXPR, size_zero_node,
1672                         byte_position (TREE_CHAIN (TYPE_FIELDS (tem))));
1673         DECL_FIELD_OFFSET (TREE_CHAIN (TYPE_FIELDS (tem))) = size_zero_node;
1674         DECL_FIELD_BIT_OFFSET (TREE_CHAIN (TYPE_FIELDS (tem)))
1675           = bitsize_zero_node;
1676         SET_TYPE_UNCONSTRAINED_ARRAY (tem, gnu_type);
1677         TYPE_OBJECT_RECORD_TYPE (gnu_type) = tem;
1678
1679         /* Give the thin pointer type a name.  */
1680         create_type_decl (create_concat_name (gnat_entity, "XUX"),
1681                           build_pointer_type (tem), 0,
1682                           ! Comes_From_Source (gnat_entity), debug_info_p);
1683       }
1684       break;
1685
1686     case E_String_Subtype:
1687     case E_Array_Subtype:
1688
1689       /* This is the actual data type for array variables.  Multidimensional
1690          arrays are implemented in the gnu tree as arrays of arrays.  Note
1691          that for the moment arrays which have sparse enumeration subtypes as
1692          index components create sparse arrays, which is obviously space
1693          inefficient but so much easier to code for now.
1694
1695          Also note that the subtype never refers to the unconstrained
1696          array type, which is somewhat at variance with Ada semantics.
1697
1698          First check to see if this is simply a renaming of the array
1699          type.  If so, the result is the array type.  */
1700
1701       gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
1702       if (! Is_Constrained (gnat_entity))
1703         break;
1704       else
1705         {
1706           int index;
1707           int array_dim = Number_Dimensions (gnat_entity);
1708           int first_dim
1709             = ((Convention (gnat_entity) == Convention_Fortran)
1710                ? array_dim - 1 : 0);
1711           int next_dim
1712             = (Convention (gnat_entity) == Convention_Fortran) ? -1 : 1;
1713           Entity_Id gnat_ind_subtype;
1714           Entity_Id gnat_ind_base_subtype;
1715           tree gnu_base_type = gnu_type;
1716           tree *gnu_index_type = (tree *) alloca (array_dim * sizeof (tree *));
1717           tree gnu_comp_size = 0;
1718           tree gnu_max_size = size_one_node;
1719           tree gnu_max_size_unit;
1720           int need_index_type_struct = 0;
1721           int max_overflow = 0;
1722
1723           /* First create the gnu types for each index.  Create types for
1724              debugging information to point to the index types if the
1725              are not integer types, have variable bounds, or are
1726              wider than sizetype.  */
1727
1728           for (index = first_dim, gnat_ind_subtype = First_Index (gnat_entity),
1729                gnat_ind_base_subtype
1730                  = First_Index (Implementation_Base_Type (gnat_entity));
1731                index < array_dim && index >= 0;
1732                index += next_dim,
1733                gnat_ind_subtype = Next_Index (gnat_ind_subtype),
1734                gnat_ind_base_subtype = Next_Index (gnat_ind_base_subtype))
1735             {
1736               tree gnu_index_subtype
1737                 = get_unpadded_type (Etype (gnat_ind_subtype));
1738               tree gnu_min
1739                 = convert (sizetype, TYPE_MIN_VALUE (gnu_index_subtype));
1740               tree gnu_max
1741                 = convert (sizetype, TYPE_MAX_VALUE (gnu_index_subtype));
1742               tree gnu_base_subtype
1743                 = get_unpadded_type (Etype (gnat_ind_base_subtype));
1744               tree gnu_base_min
1745                 = convert (sizetype, TYPE_MIN_VALUE (gnu_base_subtype));
1746               tree gnu_base_max
1747                 = convert (sizetype, TYPE_MAX_VALUE (gnu_base_subtype));
1748               tree gnu_base_type = get_base_type (gnu_base_subtype);
1749               tree gnu_base_base_min
1750                 = convert (sizetype, TYPE_MIN_VALUE (gnu_base_type));
1751               tree gnu_base_base_max
1752                 = convert (sizetype, TYPE_MAX_VALUE (gnu_base_type));
1753               tree gnu_high;
1754               tree gnu_this_max;
1755
1756               /* If the minimum and maximum values both overflow in
1757                  SIZETYPE, but the difference in the original type
1758                  does not overflow in SIZETYPE, ignore the overflow
1759                  indications.  */
1760               if ((TYPE_PRECISION (gnu_index_subtype)
1761                    > TYPE_PRECISION (sizetype))
1762                   && TREE_CODE (gnu_min) == INTEGER_CST
1763                   && TREE_CODE (gnu_max) == INTEGER_CST
1764                   && TREE_OVERFLOW (gnu_min) && TREE_OVERFLOW (gnu_max)
1765                   && (! TREE_OVERFLOW
1766                       (fold (build (MINUS_EXPR, gnu_index_subtype,
1767                                     TYPE_MAX_VALUE (gnu_index_subtype),
1768                                     TYPE_MIN_VALUE (gnu_index_subtype))))))
1769                 TREE_OVERFLOW (gnu_min) = TREE_OVERFLOW (gnu_max)
1770                   = TREE_CONSTANT_OVERFLOW (gnu_min)
1771                   = TREE_CONSTANT_OVERFLOW (gnu_max) = 0;
1772
1773               /* Similarly, if the range is null, use bounds of 1..0 for
1774                  the sizetype bounds.  */
1775               else if ((TYPE_PRECISION (gnu_index_subtype)
1776                         > TYPE_PRECISION (sizetype))
1777                        && TREE_CODE (gnu_min) == INTEGER_CST
1778                        && TREE_CODE (gnu_max) == INTEGER_CST
1779                        && (TREE_OVERFLOW (gnu_min) || TREE_OVERFLOW (gnu_max))
1780                        && tree_int_cst_lt (TYPE_MAX_VALUE (gnu_index_subtype),
1781                                            TYPE_MIN_VALUE (gnu_index_subtype)))
1782                 gnu_min = size_one_node, gnu_max = size_zero_node;
1783
1784               /* Now compute the size of this bound.  We need to provide
1785                  GCC with an upper bound to use but have to deal with the
1786                  "superflat" case.  There are three ways to do this.  If we
1787                  can prove that the array can never be superflat, we can
1788                  just use the high bound of the index subtype.  If we can
1789                  prove that the low bound minus one can't overflow, we
1790                  can do this as MAX (hb, lb - 1).  Otherwise, we have to use
1791                  the expression hb >= lb ? hb : lb - 1.  */
1792               gnu_high = size_binop (MINUS_EXPR, gnu_min, size_one_node);
1793
1794               /* See if the base array type is already flat.  If it is, we
1795                  are probably compiling an ACVC test, but it will cause the
1796                  code below to malfunction if we don't handle it specially.  */
1797               if (TREE_CODE (gnu_base_min) == INTEGER_CST
1798                   && TREE_CODE (gnu_base_max) == INTEGER_CST
1799                   && ! TREE_CONSTANT_OVERFLOW (gnu_base_min)
1800                   && ! TREE_CONSTANT_OVERFLOW (gnu_base_max)
1801                   && tree_int_cst_lt (gnu_base_max, gnu_base_min))
1802                 gnu_high = size_zero_node, gnu_min = size_one_node;
1803
1804               /* If gnu_high is now an integer which overflowed, the array
1805                  cannot be superflat.  */
1806               else if (TREE_CODE (gnu_high) == INTEGER_CST
1807                        && TREE_OVERFLOW (gnu_high))
1808                 gnu_high = gnu_max;
1809               else if (TREE_UNSIGNED (gnu_base_subtype)
1810                        || TREE_CODE (gnu_high) == INTEGER_CST)
1811                 gnu_high = size_binop (MAX_EXPR, gnu_max, gnu_high);
1812               else
1813                 gnu_high
1814                   = build_cond_expr
1815                     (sizetype, build_binary_op (GE_EXPR, integer_type_node,
1816                                                 gnu_max, gnu_min),
1817                      gnu_max, gnu_high);
1818
1819               gnu_index_type[index]
1820                 = create_index_type (gnu_min, gnu_high, gnu_index_subtype);
1821
1822               /* Also compute the maximum size of the array.  Here we
1823                  see if any constraint on the index type of the base type
1824                  can be used in the case of self-referential bound on
1825                  the index type of the subtype.  We look for a non-"infinite"
1826                  and non-self-referential bound from any type involved and
1827                  handle each bound separately.  */
1828
1829               if ((TREE_CODE (gnu_min) == INTEGER_CST
1830                    && ! TREE_OVERFLOW (gnu_min)
1831                    && ! operand_equal_p (gnu_min, gnu_base_base_min, 0))
1832                   || ! CONTAINS_PLACEHOLDER_P (gnu_min))
1833                 gnu_base_min = gnu_min;
1834
1835               if ((TREE_CODE (gnu_max) == INTEGER_CST
1836                    && ! TREE_OVERFLOW (gnu_max)
1837                    && ! operand_equal_p (gnu_max, gnu_base_base_max, 0))
1838                   || ! CONTAINS_PLACEHOLDER_P (gnu_max))
1839                 gnu_base_max = gnu_max;
1840
1841               if ((TREE_CODE (gnu_base_min) == INTEGER_CST
1842                    && TREE_CONSTANT_OVERFLOW (gnu_base_min))
1843                   || operand_equal_p (gnu_base_min, gnu_base_base_min, 0)
1844                   || (TREE_CODE (gnu_base_max) == INTEGER_CST
1845                       && TREE_CONSTANT_OVERFLOW (gnu_base_max))
1846                   || operand_equal_p (gnu_base_max, gnu_base_base_max, 0))
1847                 max_overflow = 1;
1848
1849               gnu_base_min = size_binop (MAX_EXPR, gnu_base_min, gnu_min);
1850               gnu_base_max = size_binop (MIN_EXPR, gnu_base_max, gnu_max);
1851
1852               gnu_this_max
1853                 = size_binop (MAX_EXPR,
1854                               size_binop (PLUS_EXPR, size_one_node,
1855                                           size_binop (MINUS_EXPR, gnu_base_max,
1856                                                       gnu_base_min)),
1857                               size_zero_node);
1858
1859               if (TREE_CODE (gnu_this_max) == INTEGER_CST
1860                   && TREE_CONSTANT_OVERFLOW (gnu_this_max))
1861                 max_overflow = 1;
1862
1863               gnu_max_size
1864                 = size_binop (MULT_EXPR, gnu_max_size, gnu_this_max);
1865
1866               if (! integer_onep (TYPE_MIN_VALUE (gnu_index_subtype))
1867                   || (TREE_CODE (TYPE_MAX_VALUE (gnu_index_subtype))
1868                       != INTEGER_CST)
1869                   || TREE_CODE (gnu_index_subtype) != INTEGER_TYPE
1870                   || (TREE_TYPE (gnu_index_subtype) != 0
1871                       && (TREE_CODE (TREE_TYPE (gnu_index_subtype))
1872                           != INTEGER_TYPE))
1873                   || TYPE_BIASED_REPRESENTATION_P (gnu_index_subtype)
1874                   || (TYPE_PRECISION (gnu_index_subtype)
1875                       > TYPE_PRECISION (sizetype)))
1876                 need_index_type_struct = 1;
1877             }
1878
1879           /* Then flatten: create the array of arrays.  */
1880
1881           gnu_type = gnat_to_gnu_type (Component_Type (gnat_entity));
1882
1883           /* One of the above calls might have caused us to be elaborated,
1884              so don't blow up if so.  */
1885           if (present_gnu_tree (gnat_entity))
1886             {
1887               maybe_present = 1;
1888               break;
1889             }
1890
1891           /* Get and validate any specified Component_Size, but if Packed,
1892              ignore it since the front end will have taken care of it. */
1893           gnu_comp_size
1894             = validate_size (Component_Size (gnat_entity), gnu_type,
1895                              gnat_entity,
1896                              (Is_Bit_Packed_Array (gnat_entity)
1897                               ? TYPE_DECL : VAR_DECL),
1898                              1, Has_Component_Size_Clause (gnat_entity));
1899
1900           /* If the component type is a RECORD_TYPE that has a self-referential
1901              size, use the maxium size.  */
1902           if (gnu_comp_size == 0 && TREE_CODE (gnu_type) == RECORD_TYPE
1903               && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
1904             gnu_comp_size = max_size (TYPE_SIZE (gnu_type), 1);
1905
1906           if (! Is_Bit_Packed_Array (gnat_entity) && gnu_comp_size != 0)
1907             {
1908               gnu_type = make_type_from_size (gnu_type, gnu_comp_size, 0);
1909               gnu_type = maybe_pad_type (gnu_type, gnu_comp_size, 0,
1910                                          gnat_entity, "C_PAD", 0,
1911                                          definition, 1);
1912             }
1913
1914           if (Has_Volatile_Components (Base_Type (gnat_entity)))
1915             gnu_type = build_qualified_type (gnu_type,
1916                                              (TYPE_QUALS (gnu_type)
1917                                               | TYPE_QUAL_VOLATILE));
1918
1919           gnu_max_size_unit = size_binop (MULT_EXPR, gnu_max_size,
1920                                           TYPE_SIZE_UNIT (gnu_type));
1921           gnu_max_size = size_binop (MULT_EXPR,
1922                                      convert (bitsizetype, gnu_max_size),
1923                                      TYPE_SIZE (gnu_type));
1924
1925           for (index = array_dim - 1; index >= 0; index --)
1926             {
1927               gnu_type = build_array_type (gnu_type, gnu_index_type[index]);
1928               TYPE_MULTI_ARRAY_P (gnu_type) = (index > 0);
1929             /* If the type below this an multi-array type, then this
1930                does not not have aliased components.
1931
1932                ??? Otherwise, for now, we say that any component of aggregate
1933                type is addressable because the front end may take 'Reference
1934                of it. But we have to make it addressable if it must be passed
1935                by reference or it that is the default.  */
1936               TYPE_NONALIASED_COMPONENT (gnu_type)
1937               = ((TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
1938                   && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type))) ? 1
1939                  : (! Has_Aliased_Components (gnat_entity)
1940                     && ! AGGREGATE_TYPE_P (TREE_TYPE (gnu_type))));
1941             }
1942
1943           /* If we are at file level and this is a multi-dimensional array, we
1944              need to make a variable corresponding to the stride of the
1945              inner dimensions.   */
1946           if (global_bindings_p () && array_dim > 1)
1947             {
1948               tree gnu_str_name = get_identifier ("ST");
1949               tree gnu_arr_type;
1950
1951               for (gnu_arr_type = TREE_TYPE (gnu_type);
1952                    TREE_CODE (gnu_arr_type) == ARRAY_TYPE;
1953                    gnu_arr_type = TREE_TYPE (gnu_arr_type),
1954                    gnu_str_name = concat_id_with_name (gnu_str_name, "ST"))
1955                 {
1956                   TYPE_SIZE (gnu_arr_type)
1957                     = elaborate_expression_1 (gnat_entity, gnat_entity,
1958                                               TYPE_SIZE (gnu_arr_type),
1959                                               gnu_str_name, definition, 0);
1960                   TYPE_SIZE_UNIT (gnu_arr_type)
1961                     = elaborate_expression_1
1962                       (gnat_entity, gnat_entity, TYPE_SIZE_UNIT (gnu_arr_type),
1963                        concat_id_with_name (gnu_str_name, "U"), definition, 0);
1964                 }
1965             }
1966
1967           /* If we need to write out a record type giving the names of
1968              the bounds, do it now.  */
1969           if (need_index_type_struct && debug_info_p)
1970             {
1971               tree gnu_bound_rec_type = make_node (RECORD_TYPE);
1972               tree gnu_field_list = 0;
1973               tree gnu_field;
1974
1975               TYPE_NAME (gnu_bound_rec_type)
1976                 = create_concat_name (gnat_entity, "XA");
1977
1978               for (index = array_dim - 1; index >= 0; index--)
1979                 {
1980                   tree gnu_type_name
1981                     = TYPE_NAME (TYPE_INDEX_TYPE (gnu_index_type[index]));
1982
1983                   if (TREE_CODE (gnu_type_name) == TYPE_DECL)
1984                     gnu_type_name = DECL_NAME (gnu_type_name);
1985
1986                   gnu_field = create_field_decl (gnu_type_name,
1987                                                  integer_type_node,
1988                                                  gnu_bound_rec_type,
1989                                                  0, NULL_TREE, NULL_TREE, 0);
1990                   TREE_CHAIN (gnu_field) = gnu_field_list;
1991                   gnu_field_list = gnu_field;
1992                 }
1993
1994               finish_record_type (gnu_bound_rec_type, gnu_field_list, 0, 0);
1995             }
1996
1997           TYPE_CONVENTION_FORTRAN_P (gnu_type)
1998             = (Convention (gnat_entity) == Convention_Fortran);
1999           TYPE_PACKED_ARRAY_TYPE_P (gnu_type)
2000             = Is_Packed_Array_Type (gnat_entity);
2001
2002           /* If our size depends on a placeholder and the maximum size doesn't
2003              overflow, use it.  */
2004           if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
2005               && ! (TREE_CODE (gnu_max_size) == INTEGER_CST
2006                     && TREE_OVERFLOW (gnu_max_size))
2007               && ! (TREE_CODE (gnu_max_size_unit) == INTEGER_CST
2008                     && TREE_OVERFLOW (gnu_max_size_unit))
2009               && ! max_overflow)
2010             {
2011               TYPE_SIZE (gnu_type) = size_binop (MIN_EXPR, gnu_max_size,
2012                                                  TYPE_SIZE (gnu_type));
2013               TYPE_SIZE_UNIT (gnu_type)
2014                 = size_binop (MIN_EXPR, gnu_max_size_unit,
2015                               TYPE_SIZE_UNIT (gnu_type));
2016             }
2017
2018           /* Set our alias set to that of our base type.  This gives all
2019              array subtypes the same alias set.  */
2020           copy_alias_set (gnu_type, gnu_base_type);
2021         }
2022
2023       /* If this is a packed type, make this type the same as the packed
2024          array type, but do some adjusting in the type first.   */
2025
2026       if (Present (Packed_Array_Type (gnat_entity)))
2027         {
2028           Entity_Id gnat_index;
2029           tree gnu_inner_type;
2030
2031           /* First finish the type we had been making so that we output
2032              debugging information for it  */
2033           gnu_type = build_qualified_type (gnu_type,
2034                                            (TYPE_QUALS (gnu_type)
2035                                             | (TYPE_QUAL_VOLATILE
2036                                                * Treat_As_Volatile (gnat_entity))));
2037           set_lineno (gnat_entity, 0);
2038           gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
2039                                        ! Comes_From_Source (gnat_entity),
2040                                        debug_info_p);
2041           if (! Comes_From_Source (gnat_entity))
2042             DECL_ARTIFICIAL (gnu_decl) = 1;
2043
2044           /* Save it as our equivalent in case the call below elaborates
2045              this type again.  */
2046           save_gnu_tree (gnat_entity, gnu_decl, 0);
2047
2048           gnu_decl = gnat_to_gnu_entity (Packed_Array_Type (gnat_entity),
2049                                          NULL_TREE, 0);
2050           this_made_decl = 1;
2051           gnu_inner_type = gnu_type = TREE_TYPE (gnu_decl);
2052           save_gnu_tree (gnat_entity, NULL_TREE, 0);
2053
2054           while (TREE_CODE (gnu_inner_type) == RECORD_TYPE
2055                  && (TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_inner_type)
2056                      || TYPE_IS_PADDING_P (gnu_inner_type)))
2057             gnu_inner_type = TREE_TYPE (TYPE_FIELDS (gnu_inner_type));
2058
2059           /* We need to point the type we just made to our index type so
2060              the actual bounds can be put into a template.  */
2061
2062           if ((TREE_CODE (gnu_inner_type) == ARRAY_TYPE
2063                && TYPE_ACTUAL_BOUNDS (gnu_inner_type) == 0)
2064               || (TREE_CODE (gnu_inner_type) == INTEGER_TYPE
2065                   && ! TYPE_HAS_ACTUAL_BOUNDS_P (gnu_inner_type)))
2066             {
2067               if (TREE_CODE (gnu_inner_type) == INTEGER_TYPE)
2068                 {
2069                   /* The TYPE_ACTUAL_BOUNDS field is also used for the modulus.
2070                      If it is, we need to make another type.  */
2071                   if (TYPE_MODULAR_P (gnu_inner_type))
2072                     {
2073                       tree gnu_subtype;
2074
2075                       gnu_subtype = make_node (INTEGER_TYPE);
2076
2077                       TREE_TYPE (gnu_subtype) = gnu_inner_type;
2078                       TYPE_MIN_VALUE (gnu_subtype)
2079                         = TYPE_MIN_VALUE (gnu_inner_type);
2080                       TYPE_MAX_VALUE (gnu_subtype)
2081                         = TYPE_MAX_VALUE (gnu_inner_type);
2082                       TYPE_PRECISION (gnu_subtype)
2083                         = TYPE_PRECISION (gnu_inner_type);
2084                       TREE_UNSIGNED (gnu_subtype)
2085                         = TREE_UNSIGNED (gnu_inner_type);
2086                       TYPE_EXTRA_SUBTYPE_P (gnu_subtype) = 1;
2087                       layout_type (gnu_subtype);
2088
2089                       gnu_inner_type = gnu_subtype;
2090                     }
2091
2092                   TYPE_HAS_ACTUAL_BOUNDS_P (gnu_inner_type) = 1;
2093                 }
2094
2095               SET_TYPE_ACTUAL_BOUNDS (gnu_inner_type, NULL_TREE);
2096
2097               for (gnat_index = First_Index (gnat_entity);
2098                    Present (gnat_index); gnat_index = Next_Index (gnat_index))
2099                 SET_TYPE_ACTUAL_BOUNDS (gnu_inner_type,
2100                     tree_cons (NULL_TREE,
2101                                get_unpadded_type (Etype (gnat_index)),
2102                                TYPE_ACTUAL_BOUNDS (gnu_inner_type)));
2103
2104               if (Convention (gnat_entity) != Convention_Fortran)
2105                 SET_TYPE_ACTUAL_BOUNDS (gnu_inner_type,
2106                     nreverse (TYPE_ACTUAL_BOUNDS (gnu_inner_type)));
2107
2108               if (TREE_CODE (gnu_type) == RECORD_TYPE
2109                   && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_type))
2110                 TREE_TYPE (TYPE_FIELDS (gnu_type)) = gnu_inner_type;
2111             }
2112         }
2113
2114       /* Abort if packed array with no packed array type field set. */
2115       else if (Is_Packed (gnat_entity))
2116         gigi_abort (107);
2117
2118       break;
2119
2120     case E_String_Literal_Subtype:
2121       /* Create the type for a string literal. */
2122       {
2123         Entity_Id gnat_full_type
2124           = (IN (Ekind (Etype (gnat_entity)), Private_Kind)
2125              && Present (Full_View (Etype (gnat_entity)))
2126              ? Full_View (Etype (gnat_entity)) : Etype (gnat_entity));
2127         tree gnu_string_type = get_unpadded_type (gnat_full_type);
2128         tree gnu_string_array_type
2129           = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_string_type))));
2130         tree gnu_string_index_type
2131           = get_base_type (TREE_TYPE (TYPE_INDEX_TYPE
2132                                       (TYPE_DOMAIN (gnu_string_array_type))));
2133         tree gnu_lower_bound
2134           = convert (gnu_string_index_type,
2135                      gnat_to_gnu (String_Literal_Low_Bound (gnat_entity)));
2136         int length = UI_To_Int (String_Literal_Length (gnat_entity));
2137         tree gnu_length = ssize_int (length - 1);
2138         tree gnu_upper_bound
2139           = build_binary_op (PLUS_EXPR, gnu_string_index_type,
2140                              gnu_lower_bound,
2141                              convert (gnu_string_index_type, gnu_length));
2142         tree gnu_range_type
2143           = build_range_type (gnu_string_index_type,
2144                               gnu_lower_bound, gnu_upper_bound);
2145         tree gnu_index_type
2146           = create_index_type (convert (sizetype,
2147                                         TYPE_MIN_VALUE (gnu_range_type)),
2148                                convert (sizetype,
2149                                         TYPE_MAX_VALUE (gnu_range_type)),
2150                                gnu_range_type);
2151
2152         gnu_type
2153           = build_array_type (gnat_to_gnu_type (Component_Type (gnat_entity)),
2154                               gnu_index_type);
2155       }
2156       break;
2157
2158     /* Record Types and Subtypes
2159
2160        The following fields are defined on record types:
2161
2162                 Has_Discriminants       True if the record has discriminants
2163                 First_Discriminant      Points to head of list of discriminants
2164                 First_Entity            Points to head of list of fields
2165                 Is_Tagged_Type          True if the record is tagged
2166
2167        Implementation of Ada records and discriminated records:
2168
2169        A record type definition is transformed into the equivalent of a C
2170        struct definition.  The fields that are the discriminants which are
2171        found in the Full_Type_Declaration node and the elements of the
2172        Component_List found in the Record_Type_Definition node.  The
2173        Component_List can be a recursive structure since each Variant of
2174        the Variant_Part of the Component_List has a Component_List.
2175
2176        Processing of a record type definition comprises starting the list of
2177        field declarations here from the discriminants and the calling the
2178        function components_to_record to add the rest of the fields from the
2179        component list and return the gnu type node. The function
2180        components_to_record will call itself recursively as it traverses
2181        the tree.  */
2182
2183     case E_Record_Type:
2184       if (Has_Complex_Representation (gnat_entity))
2185         {
2186           gnu_type
2187             = build_complex_type
2188               (get_unpadded_type
2189                (Etype (Defining_Entity
2190                        (First (Component_Items
2191                                (Component_List
2192                                 (Type_Definition
2193                                  (Declaration_Node (gnat_entity)))))))));
2194
2195           break;
2196         }
2197
2198       {
2199         Node_Id full_definition = Declaration_Node (gnat_entity);
2200         Node_Id record_definition = Type_Definition (full_definition);
2201         Entity_Id gnat_field;
2202         tree gnu_field;
2203         tree gnu_field_list = NULL_TREE;
2204         tree gnu_get_parent;
2205         int packed = (Is_Packed (gnat_entity) ? 1
2206                       : (Component_Alignment (gnat_entity)
2207                          == Calign_Storage_Unit) ? -1
2208                       : 0);
2209         int has_rep = Has_Specified_Layout (gnat_entity);
2210         int all_rep = has_rep;
2211         int is_extension
2212           = (Is_Tagged_Type (gnat_entity)
2213              && Nkind (record_definition) == N_Derived_Type_Definition);
2214
2215         /* See if all fields have a rep clause.  Stop when we find one
2216            that doesn't.  */
2217         for (gnat_field = First_Entity (gnat_entity);
2218              Present (gnat_field) && all_rep;
2219              gnat_field = Next_Entity (gnat_field))
2220           if ((Ekind (gnat_field) == E_Component
2221                || Ekind (gnat_field) == E_Discriminant)
2222               && No (Component_Clause (gnat_field)))
2223             all_rep = 0;
2224
2225         /* If this is a record extension, go a level further to find the
2226            record definition.  Also, verify we have a Parent_Subtype.  */
2227         if (is_extension)
2228           {
2229             if (! type_annotate_only
2230                 || Present (Record_Extension_Part (record_definition)))
2231               record_definition = Record_Extension_Part (record_definition);
2232
2233             if (! type_annotate_only && No (Parent_Subtype (gnat_entity)))
2234               gigi_abort (121);
2235           }
2236
2237         /* Make a node for the record.  If we are not defining the record,
2238            suppress expanding incomplete types and save the node as the type
2239            for GNAT_ENTITY.  We use the same RECORD_TYPE as for a dummy type
2240            and reset TYPE_DUMMY_P to show it's no longer a dummy.
2241
2242            It is very tempting to delay resetting this bit until we are done
2243            with completing the type, e.g. to let possible intermediate
2244            elaboration of access types designating the record know it is not
2245            complete and arrange for update_pointer_to to fix things up later.
2246
2247            It would be wrong, however, because dummy types are expected only
2248            to be created for Ada incomplete or private types, which is not
2249            what we have here.  Doing so would make other parts of gigi think
2250            we are dealing with a really incomplete or private type, and have
2251            nasty side effects, typically on the generation of the associated
2252            debugging information.  */
2253         gnu_type = make_dummy_type (gnat_entity);
2254         TYPE_DUMMY_P (gnu_type) = 0;
2255
2256         if (TREE_CODE (TYPE_NAME (gnu_type)) == TYPE_DECL && debug_info_p)
2257           DECL_IGNORED_P (TYPE_NAME (gnu_type)) = 0;
2258
2259         TYPE_ALIGN (gnu_type) = 0;
2260         TYPE_PACKED (gnu_type) = packed != 0 || has_rep;
2261
2262         if (! definition)
2263           {
2264             defer_incomplete_level++;
2265             this_deferred = 1;
2266             set_lineno (gnat_entity, 0);
2267             gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
2268                                          ! Comes_From_Source (gnat_entity),
2269                                          debug_info_p);
2270             save_gnu_tree (gnat_entity, gnu_decl, 0);
2271             this_made_decl = saved = 1;
2272           }
2273
2274         /* If both a size and rep clause was specified, put the size in
2275            the record type now so that it can get the proper mode.  */
2276         if (has_rep && Known_Esize (gnat_entity))
2277           TYPE_SIZE (gnu_type) = UI_To_gnu (Esize (gnat_entity), sizetype);
2278
2279         /* Always set the alignment here so that it can be used to
2280            set the mode, if it is making the alignment stricter.  If
2281            it is invalid, it will be checked again below.  If this is to
2282            be Atomic, choose a default alignment of a word unless we know
2283            the size and it's smaller.  */
2284         if (Known_Alignment (gnat_entity))
2285           TYPE_ALIGN (gnu_type)
2286             = validate_alignment (Alignment (gnat_entity), gnat_entity, 0);
2287         else if (Is_Atomic (gnat_entity))
2288           TYPE_ALIGN (gnu_type)
2289             = (esize >= BITS_PER_WORD ? BITS_PER_WORD
2290                : 1 << ((floor_log2 (esize) - 1) + 1));
2291
2292         /* If we have a Parent_Subtype, make a field for the parent.  If
2293            this record has rep clauses, force the position to zero.  */
2294         if (Present (Parent_Subtype (gnat_entity)))
2295           {
2296             tree gnu_parent;
2297
2298             /* A major complexity here is that the parent subtype will
2299                reference our discriminants.  But those must reference
2300                the parent component of this record.  So here we will
2301                initialize each of those components to a COMPONENT_REF.
2302                The first operand of that COMPONENT_REF is another
2303                COMPONENT_REF which will be filled in below, once
2304                the parent type can be safely built.  */
2305
2306             gnu_get_parent = build (COMPONENT_REF, void_type_node,
2307                                     build (PLACEHOLDER_EXPR, gnu_type),
2308                                     build_decl (FIELD_DECL, NULL_TREE,
2309                                                 NULL_TREE));
2310
2311             if (Has_Discriminants (gnat_entity))
2312               for (gnat_field = First_Stored_Discriminant (gnat_entity);
2313                    Present (gnat_field);
2314                    gnat_field = Next_Stored_Discriminant (gnat_field))
2315                 if (Present (Corresponding_Discriminant (gnat_field)))
2316                   save_gnu_tree
2317                     (gnat_field,
2318                      build (COMPONENT_REF,
2319                             get_unpadded_type (Etype (gnat_field)),
2320                             gnu_get_parent,
2321                             gnat_to_gnu_entity (Corresponding_Discriminant
2322                                                 (gnat_field),
2323                                                 NULL_TREE, 0)),
2324                      1);
2325
2326             gnu_parent = gnat_to_gnu_type (Parent_Subtype (gnat_entity));
2327
2328             gnu_field_list
2329               = create_field_decl (get_identifier
2330                                    (Get_Name_String (Name_uParent)),
2331                                    gnu_parent, gnu_type, 0,
2332                                    has_rep ? TYPE_SIZE (gnu_parent) : 0,
2333                                    has_rep ? bitsize_zero_node : 0, 1);
2334             DECL_INTERNAL_P (gnu_field_list) = 1;
2335
2336             TREE_TYPE (gnu_get_parent) = gnu_parent;
2337             TREE_OPERAND (gnu_get_parent, 1) = gnu_field_list;
2338           }
2339
2340         /* Add the fields for the discriminants into the record.  */
2341         if (! Is_Unchecked_Union (gnat_entity)
2342             && Has_Discriminants (gnat_entity))
2343           for (gnat_field = First_Stored_Discriminant (gnat_entity);
2344                Present (gnat_field);
2345                gnat_field = Next_Stored_Discriminant (gnat_field))
2346             {
2347               /* If this is a record extension and this discriminant
2348                  is the renaming of another discriminant, we've already
2349                  handled the discriminant above.  */
2350               if (Present (Parent_Subtype (gnat_entity))
2351                   && Present (Corresponding_Discriminant (gnat_field)))
2352                 continue;
2353
2354               gnu_field
2355                 = gnat_to_gnu_field (gnat_field, gnu_type, packed, definition);
2356
2357               /* Make an expression using a PLACEHOLDER_EXPR from the
2358                  FIELD_DECL node just created and link that with the
2359                  corresponding GNAT defining identifier.  Then add to the
2360                  list of fields.  */
2361               save_gnu_tree (gnat_field,
2362                              build (COMPONENT_REF, TREE_TYPE (gnu_field),
2363                                     build (PLACEHOLDER_EXPR,
2364                                            DECL_CONTEXT (gnu_field)),
2365                                     gnu_field),
2366                              1);
2367
2368               TREE_CHAIN (gnu_field) = gnu_field_list;
2369               gnu_field_list = gnu_field;
2370             }
2371
2372         /* Put the discriminants into the record (backwards), so we can
2373            know the appropriate discriminant to use for the names of the
2374            variants.  */
2375         TYPE_FIELDS (gnu_type) = gnu_field_list;
2376
2377         /* Add the listed fields into the record and finish up.  */
2378         components_to_record (gnu_type, Component_List (record_definition),
2379                               gnu_field_list, packed, definition, 0,
2380                               0, all_rep);
2381
2382         TYPE_VOLATILE (gnu_type) = Treat_As_Volatile (gnat_entity);
2383         TYPE_BY_REFERENCE_P (gnu_type) = Is_By_Reference_Type (gnat_entity);
2384
2385         /* If this is an extension type, reset the tree for any
2386            inherited discriminants.  Also remove the PLACEHOLDER_EXPR
2387            for non-inherited discriminants.  */
2388         if (! Is_Unchecked_Union (gnat_entity)
2389             && Has_Discriminants (gnat_entity))
2390           for (gnat_field = First_Stored_Discriminant (gnat_entity);
2391                Present (gnat_field);
2392                gnat_field = Next_Stored_Discriminant (gnat_field))
2393             {
2394               if (Present (Parent_Subtype (gnat_entity))
2395                   && Present (Corresponding_Discriminant (gnat_field)))
2396                 save_gnu_tree (gnat_field, NULL_TREE, 0);
2397               else
2398                 {
2399                   gnu_field = get_gnu_tree (gnat_field);
2400                   save_gnu_tree (gnat_field, NULL_TREE, 0);
2401                   save_gnu_tree (gnat_field, TREE_OPERAND (gnu_field, 1), 0);
2402                 }
2403             }
2404
2405         /* If it is a tagged record force the type to BLKmode to insure
2406            that these objects will always be placed in memory. Do the
2407            same thing for limited record types. */
2408         if (Is_Tagged_Type (gnat_entity) || Is_Limited_Record (gnat_entity))
2409           TYPE_MODE (gnu_type) = BLKmode;
2410
2411         /* If this is a derived type, we must make the alias set of this type
2412            the same as that of the type we are derived from.  We assume here
2413            that the other type is already frozen. */
2414         if (Etype (gnat_entity) != gnat_entity
2415             && ! (Is_Private_Type (Etype (gnat_entity))
2416                   && Full_View (Etype (gnat_entity)) == gnat_entity))
2417           copy_alias_set (gnu_type, gnat_to_gnu_type (Etype (gnat_entity)));
2418
2419         /* Fill in locations of fields.  */
2420         annotate_rep (gnat_entity, gnu_type);
2421
2422         /* If there are any entities in the chain corresponding to
2423            components that we did not elaborate, ensure we elaborate their
2424            types if they are Itypes.  */
2425         for (gnat_temp = First_Entity (gnat_entity);
2426              Present (gnat_temp); gnat_temp = Next_Entity (gnat_temp))
2427           if ((Ekind (gnat_temp) == E_Component
2428                || Ekind (gnat_temp) == E_Discriminant)
2429               && Is_Itype (Etype (gnat_temp))
2430               && ! present_gnu_tree (gnat_temp))
2431             gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
2432       }
2433       break;
2434
2435     case E_Class_Wide_Subtype:
2436       /* If an equivalent type is present, that is what we should use.
2437          Otherwise, fall through to handle this like a record subtype
2438          since it may have constraints.  */
2439
2440       if (Present (Equivalent_Type (gnat_entity)))
2441         {
2442           gnu_decl = gnat_to_gnu_entity (Equivalent_Type (gnat_entity),
2443                                          NULL_TREE, 0);
2444           maybe_present = 1;
2445           break;
2446         }
2447
2448       /* ... fall through ... */
2449
2450     case E_Record_Subtype:
2451
2452       /* If Cloned_Subtype is Present it means this record subtype has
2453          identical layout to that type or subtype and we should use
2454          that GCC type for this one.  The front end guarantees that
2455          the component list is shared.  */
2456       if (Present (Cloned_Subtype (gnat_entity)))
2457         {
2458           gnu_decl = gnat_to_gnu_entity (Cloned_Subtype (gnat_entity),
2459                                          NULL_TREE, 0);
2460           maybe_present = 1;
2461         }
2462
2463       /* Otherwise, first ensure the base type is elaborated.  Then, if we are
2464          changing the type, make a new type with each field having the
2465          type of the field in the new subtype but having the position
2466          computed by transforming every discriminant reference according
2467          to the constraints.  We don't see any difference between
2468          private and nonprivate type here since derivations from types should
2469          have been deferred until the completion of the private type.  */
2470       else
2471         {
2472           Entity_Id gnat_base_type = Implementation_Base_Type (gnat_entity);
2473           tree gnu_base_type;
2474           tree gnu_orig_type;
2475
2476           if (! definition)
2477             defer_incomplete_level++, this_deferred = 1;
2478
2479           /* Get the base type initially for its alignment and sizes.  But
2480              if it is a padded type, we do all the other work with the
2481              unpadded type.  */
2482           gnu_type = gnu_orig_type = gnu_base_type
2483             = gnat_to_gnu_type (gnat_base_type);
2484
2485           if (TREE_CODE (gnu_type) == RECORD_TYPE
2486               && TYPE_IS_PADDING_P (gnu_type))
2487             gnu_type = gnu_orig_type = TREE_TYPE (TYPE_FIELDS (gnu_type));
2488
2489           if (present_gnu_tree (gnat_entity))
2490             {
2491               maybe_present = 1;
2492               break;
2493             }
2494
2495           /* When the type has discriminants, and these discriminants
2496              affect the shape of what it built, factor them in.
2497
2498              If we are making a subtype of an Unchecked_Union (must be an
2499              Itype), just return the type.
2500
2501              We can't just use Is_Constrained because private subtypes without
2502              discriminants of full types with discriminants with default
2503              expressions are Is_Constrained but aren't constrained!  */
2504
2505           if (IN (Ekind (gnat_base_type), Record_Kind)
2506               && ! Is_For_Access_Subtype (gnat_entity)
2507               && ! Is_Unchecked_Union (gnat_base_type)
2508               && Is_Constrained (gnat_entity)
2509               && Stored_Constraint (gnat_entity) != No_Elist
2510               && Present (Discriminant_Constraint (gnat_entity)))
2511             {
2512               Entity_Id gnat_field;
2513               Entity_Id gnat_root_type;
2514               tree gnu_field_list = 0;
2515               tree gnu_pos_list
2516                 = compute_field_positions (gnu_orig_type, NULL_TREE,
2517                                            size_zero_node, bitsize_zero_node,
2518                                            BIGGEST_ALIGNMENT);
2519               tree gnu_subst_list
2520                 = substitution_list (gnat_entity, gnat_base_type, NULL_TREE,
2521                                      definition);
2522               tree gnu_temp;
2523
2524               /* If this is a derived type, we may be seeing fields from any
2525                  original records, so add those positions and discriminant
2526                  substitutions to our lists.  */
2527               for (gnat_root_type = gnat_base_type;
2528                    Underlying_Type (Etype (gnat_root_type)) != gnat_root_type;
2529                    gnat_root_type = Underlying_Type (Etype (gnat_root_type)))
2530                 {
2531                   gnu_pos_list
2532                     = compute_field_positions
2533                       (gnat_to_gnu_type (Etype (gnat_root_type)),
2534                        gnu_pos_list, size_zero_node, bitsize_zero_node,
2535                        BIGGEST_ALIGNMENT);
2536
2537                   if (Present (Parent_Subtype (gnat_root_type)))
2538                     gnu_subst_list
2539                       = substitution_list (Parent_Subtype (gnat_root_type),
2540                                            Empty, gnu_subst_list, definition);
2541                 }
2542
2543               gnu_type = make_node (RECORD_TYPE);
2544               TYPE_NAME (gnu_type) = gnu_entity_id;
2545               TYPE_STUB_DECL (gnu_type)
2546                 = pushdecl (build_decl (TYPE_DECL, NULL_TREE, gnu_type));
2547               TYPE_ALIGN (gnu_type) = TYPE_ALIGN (gnu_base_type);
2548
2549               for (gnat_field = First_Entity (gnat_entity);
2550                    Present (gnat_field); gnat_field = Next_Entity (gnat_field))
2551                 if (Ekind (gnat_field) == E_Component
2552                     || Ekind (gnat_field) == E_Discriminant)
2553                   {
2554                     tree gnu_old_field
2555                       = gnat_to_gnu_entity
2556                         (Original_Record_Component (gnat_field), NULL_TREE, 0);
2557                     tree gnu_offset
2558                       = TREE_VALUE (purpose_member (gnu_old_field,
2559                                                     gnu_pos_list));
2560                     tree gnu_pos = TREE_PURPOSE (gnu_offset);
2561                     tree gnu_bitpos = TREE_VALUE (TREE_VALUE (gnu_offset));
2562                     tree gnu_field_type
2563                       = gnat_to_gnu_type (Etype (gnat_field));
2564                     tree gnu_size = TYPE_SIZE (gnu_field_type);
2565                     tree gnu_new_pos = 0;
2566                     unsigned int offset_align
2567                       = tree_low_cst (TREE_PURPOSE (TREE_VALUE (gnu_offset)),
2568                                       1);
2569                     tree gnu_field;
2570
2571                     /* If there was a component clause, the field types must be
2572                        the same for the type and subtype, so copy the data from
2573                        the old field to avoid recomputation here.  */
2574                     if (Present (Component_Clause
2575                                  (Original_Record_Component (gnat_field))))
2576                       {
2577                         gnu_size = DECL_SIZE (gnu_old_field);
2578                         gnu_field_type = TREE_TYPE (gnu_old_field);
2579                       }
2580
2581                     /* If this was a bitfield, get the size from the old field.
2582                        Also ensure the type can be placed into a bitfield.  */
2583                     else if (DECL_BIT_FIELD (gnu_old_field))
2584                       {
2585                         gnu_size = DECL_SIZE (gnu_old_field);
2586                         if (TYPE_MODE (gnu_field_type) == BLKmode
2587                             && TREE_CODE (gnu_field_type) == RECORD_TYPE
2588                             && host_integerp (TYPE_SIZE (gnu_field_type), 1))
2589                           gnu_field_type = make_packable_type (gnu_field_type);
2590                       }
2591
2592                     if (CONTAINS_PLACEHOLDER_P (gnu_pos))
2593                       for (gnu_temp = gnu_subst_list;
2594                            gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
2595                         gnu_pos = substitute_in_expr (gnu_pos,
2596                                                       TREE_PURPOSE (gnu_temp),
2597                                                       TREE_VALUE (gnu_temp));
2598
2599                     /* If the size is now a constant, we can set it as the
2600                        size of the field when we make it.  Otherwise, we need
2601                        to deal with it specially.  */
2602                     if (TREE_CONSTANT (gnu_pos))
2603                       gnu_new_pos = bit_from_pos (gnu_pos, gnu_bitpos);
2604
2605                     gnu_field
2606                       = create_field_decl
2607                         (DECL_NAME (gnu_old_field), gnu_field_type, gnu_type,
2608                          0, gnu_size, gnu_new_pos,
2609                          ! DECL_NONADDRESSABLE_P (gnu_old_field));
2610
2611                     if (! TREE_CONSTANT (gnu_pos))
2612                       {
2613                         normalize_offset (&gnu_pos, &gnu_bitpos, offset_align);
2614                         DECL_FIELD_OFFSET (gnu_field) = gnu_pos;
2615                         DECL_FIELD_BIT_OFFSET (gnu_field) = gnu_bitpos;
2616                         SET_DECL_OFFSET_ALIGN (gnu_field, offset_align);
2617                         DECL_SIZE (gnu_field) = gnu_size;
2618                         DECL_SIZE_UNIT (gnu_field)
2619                           = convert (sizetype,
2620                                      size_binop (CEIL_DIV_EXPR, gnu_size,
2621                                                  bitsize_unit_node));
2622                         layout_decl (gnu_field, DECL_OFFSET_ALIGN (gnu_field));
2623                       }
2624
2625                     DECL_INTERNAL_P (gnu_field)
2626                       = DECL_INTERNAL_P (gnu_old_field);
2627                     SET_DECL_ORIGINAL_FIELD (gnu_field,
2628                         (DECL_ORIGINAL_FIELD (gnu_old_field) != 0
2629                          ? DECL_ORIGINAL_FIELD (gnu_old_field)
2630                          : gnu_old_field));
2631                     DECL_DISCRIMINANT_NUMBER (gnu_field)
2632                       = DECL_DISCRIMINANT_NUMBER (gnu_old_field);
2633                     TREE_THIS_VOLATILE (gnu_field)
2634                       = TREE_THIS_VOLATILE (gnu_old_field);
2635                     TREE_CHAIN (gnu_field) = gnu_field_list;
2636                     gnu_field_list = gnu_field;
2637                     save_gnu_tree (gnat_field, gnu_field, 0);
2638                   }
2639
2640               finish_record_type (gnu_type, nreverse (gnu_field_list), 1, 0);
2641
2642               /* Now set the size, alignment and alias set of the new type to
2643                  match that of the old one, doing any substitutions, as
2644                  above.  */
2645               TYPE_ALIGN (gnu_type) = TYPE_ALIGN (gnu_base_type);
2646               TYPE_SIZE (gnu_type) = TYPE_SIZE (gnu_base_type);
2647               TYPE_SIZE_UNIT (gnu_type) = TYPE_SIZE_UNIT (gnu_base_type);
2648               SET_TYPE_ADA_SIZE (gnu_type, TYPE_ADA_SIZE (gnu_base_type));
2649               copy_alias_set (gnu_type, gnu_base_type);
2650
2651               if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
2652                 for (gnu_temp = gnu_subst_list;
2653                      gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
2654                   TYPE_SIZE (gnu_type)
2655                     = substitute_in_expr (TYPE_SIZE (gnu_type),
2656                                           TREE_PURPOSE (gnu_temp),
2657                                           TREE_VALUE (gnu_temp));
2658
2659               if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE_UNIT (gnu_type)))
2660                 for (gnu_temp = gnu_subst_list;
2661                      gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
2662                   TYPE_SIZE_UNIT (gnu_type)
2663                     = substitute_in_expr (TYPE_SIZE_UNIT (gnu_type),
2664                                           TREE_PURPOSE (gnu_temp),
2665                                           TREE_VALUE (gnu_temp));
2666
2667               if (TYPE_ADA_SIZE (gnu_type) != 0
2668                   && CONTAINS_PLACEHOLDER_P (TYPE_ADA_SIZE (gnu_type)))
2669                 for (gnu_temp = gnu_subst_list;
2670                      gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
2671                   SET_TYPE_ADA_SIZE (gnu_type,
2672                       substitute_in_expr (TYPE_ADA_SIZE (gnu_type),
2673                                           TREE_PURPOSE (gnu_temp),
2674                                           TREE_VALUE (gnu_temp)));
2675
2676               /* Recompute the mode of this record type now that we know its
2677                  actual size.  */
2678               compute_record_mode (gnu_type);
2679
2680               /* Fill in locations of fields.  */
2681               annotate_rep (gnat_entity, gnu_type);
2682             }
2683
2684           /* If we've made a new type, record it and make an XVS type to show
2685              what this is a subtype of.  Some debuggers require the  XVS
2686              type to be output first, so do it in that order.  */
2687           if (gnu_type != gnu_orig_type)
2688             {
2689               if (debug_info_p)
2690                 {
2691                   tree gnu_subtype_marker = make_node (RECORD_TYPE);
2692                   tree gnu_orig_name = TYPE_NAME (gnu_orig_type);
2693
2694                   if (TREE_CODE (gnu_orig_name) == TYPE_DECL)
2695                     gnu_orig_name = DECL_NAME (gnu_orig_name);
2696
2697                   TYPE_NAME (gnu_subtype_marker)
2698                     = create_concat_name (gnat_entity, "XVS");
2699                   finish_record_type (gnu_subtype_marker,
2700                                       create_field_decl (gnu_orig_name,
2701                                                          integer_type_node,
2702                                                          gnu_subtype_marker,
2703                                                          0, NULL_TREE,
2704                                                          NULL_TREE, 0),
2705                                       0, 0);
2706                 }
2707
2708               TYPE_VOLATILE (gnu_type) = Treat_As_Volatile (gnat_entity);
2709               TYPE_NAME (gnu_type) = gnu_entity_id;
2710               TYPE_STUB_DECL (gnu_type)
2711                 = pushdecl (build_decl (TYPE_DECL, TYPE_NAME (gnu_type),
2712                                       gnu_type));
2713               DECL_ARTIFICIAL (TYPE_STUB_DECL (gnu_type)) = 1;
2714               DECL_IGNORED_P (TYPE_STUB_DECL (gnu_type)) = ! debug_info_p;
2715               rest_of_type_compilation (gnu_type, global_bindings_p ());
2716             }
2717
2718           /* Otherwise, go down all the components in the new type and
2719              make them equivalent to those in the base type.  */
2720           else
2721             for (gnat_temp = First_Entity (gnat_entity); Present (gnat_temp);
2722                  gnat_temp = Next_Entity (gnat_temp))
2723               if ((Ekind (gnat_temp) == E_Discriminant
2724                    && ! Is_Unchecked_Union (gnat_base_type))
2725                   || Ekind (gnat_temp) == E_Component)
2726                 save_gnu_tree (gnat_temp,
2727                                get_gnu_tree
2728                                (Original_Record_Component (gnat_temp)), 0);
2729         }
2730       break;
2731
2732     case E_Access_Subprogram_Type:
2733       /* If we are not defining this entity, and we have incomplete
2734          entities being processed above us, make a dummy type and
2735          fill it in later.  */
2736       if (! definition && defer_incomplete_level != 0)
2737         {
2738           struct incomplete *p
2739             = (struct incomplete *) xmalloc (sizeof (struct incomplete));
2740
2741           gnu_type
2742             = build_pointer_type
2743               (make_dummy_type (Directly_Designated_Type (gnat_entity)));
2744           gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
2745                                        ! Comes_From_Source (gnat_entity),
2746                                        debug_info_p);
2747           save_gnu_tree (gnat_entity, gnu_decl, 0);
2748           this_made_decl = saved = 1;
2749
2750           p->old_type = TREE_TYPE (gnu_type);
2751           p->full_type = Directly_Designated_Type (gnat_entity);
2752           p->next = defer_incomplete_list;
2753           defer_incomplete_list = p;
2754           break;
2755         }
2756
2757       /* ... fall through ... */
2758
2759     case E_Allocator_Type:
2760     case E_Access_Type:
2761     case E_Access_Attribute_Type:
2762     case E_Anonymous_Access_Type:
2763     case E_General_Access_Type:
2764       {
2765         Entity_Id gnat_desig_type = Directly_Designated_Type (gnat_entity);
2766         Entity_Id gnat_desig_full
2767           = ((IN (Ekind (Etype (gnat_desig_type)),
2768                   Incomplete_Or_Private_Kind))
2769              ? Full_View (gnat_desig_type) : 0);
2770         /* We want to know if we'll be seeing the freeze node for any
2771            incomplete type we may be pointing to.  */
2772         int in_main_unit
2773           = (Present (gnat_desig_full)
2774              ? In_Extended_Main_Code_Unit (gnat_desig_full)
2775              : In_Extended_Main_Code_Unit (gnat_desig_type));
2776         int got_fat_p = 0;
2777         int made_dummy = 0;
2778         tree gnu_desig_type = 0;
2779         enum machine_mode p_mode = mode_for_size (esize, MODE_INT, 0);
2780
2781         if (!targetm.valid_pointer_mode (p_mode))
2782           p_mode = ptr_mode;
2783
2784         if (No (gnat_desig_full)
2785             && (Ekind (gnat_desig_type) == E_Class_Wide_Type
2786                 || (Ekind (gnat_desig_type) == E_Class_Wide_Subtype
2787                     && Present (Equivalent_Type (gnat_desig_type)))))
2788           {
2789             if (Present (Equivalent_Type (gnat_desig_type)))
2790               {
2791                 gnat_desig_full = Equivalent_Type (gnat_desig_type);
2792                 if (IN (Ekind (gnat_desig_full), Incomplete_Or_Private_Kind))
2793                   gnat_desig_full = Full_View (gnat_desig_full);
2794               }
2795             else if (IN (Ekind (Root_Type (gnat_desig_type)),
2796                          Incomplete_Or_Private_Kind))
2797               gnat_desig_full = Full_View (Root_Type (gnat_desig_type));
2798           }
2799
2800         if (Present (gnat_desig_full) && Is_Concurrent_Type (gnat_desig_full))
2801           gnat_desig_full = Corresponding_Record_Type (gnat_desig_full);
2802
2803         /* If either the designated type or its full view is an
2804            unconstrained array subtype, replace it with the type it's a
2805            subtype of.  This avoids problems with multiple copies of
2806            unconstrained array types.  */
2807         if (Ekind (gnat_desig_type) == E_Array_Subtype
2808             && ! Is_Constrained (gnat_desig_type))
2809           gnat_desig_type = Etype (gnat_desig_type);
2810         if (Present (gnat_desig_full)
2811             && Ekind (gnat_desig_full) == E_Array_Subtype
2812             && ! Is_Constrained (gnat_desig_full))
2813           gnat_desig_full = Etype (gnat_desig_full);
2814
2815         /* If the designated type is a subtype of an incomplete record type,
2816            use the parent type to avoid order of elaboration issues.  This
2817            can lose some code efficiency, but there is no alternative.  */
2818         if (Present (gnat_desig_full)
2819              && Ekind (gnat_desig_full) == E_Record_Subtype
2820              && Ekind (Etype (gnat_desig_full)) == E_Record_Type)
2821           gnat_desig_full = Etype (gnat_desig_full);
2822
2823         /* If we are pointing to an incomplete type whose completion is an
2824            unconstrained array, make a fat pointer type instead of a pointer
2825            to VOID.  The two types in our fields will be pointers to VOID and
2826            will be replaced in update_pointer_to.  Similiarly, if the type
2827            itself is a dummy type or an unconstrained array.  Also make
2828            a dummy TYPE_OBJECT_RECORD_TYPE in case we have any thin
2829            pointers to it.  */
2830
2831         if ((Present (gnat_desig_full)
2832              && Is_Array_Type (gnat_desig_full)
2833              && ! Is_Constrained (gnat_desig_full))
2834             || (present_gnu_tree (gnat_desig_type)
2835                 && TYPE_IS_DUMMY_P (TREE_TYPE
2836                                      (get_gnu_tree (gnat_desig_type)))
2837                 && Is_Array_Type (gnat_desig_type)
2838                 && ! Is_Constrained (gnat_desig_type))
2839             || (present_gnu_tree (gnat_desig_type)
2840                 && (TREE_CODE (TREE_TYPE (get_gnu_tree (gnat_desig_type)))
2841                     == UNCONSTRAINED_ARRAY_TYPE)
2842                 && (TYPE_POINTER_TO (TREE_TYPE
2843                                      (get_gnu_tree (gnat_desig_type)))
2844                     == 0))
2845             || (No (gnat_desig_full) && ! in_main_unit
2846                 && defer_incomplete_level != 0
2847                 && ! present_gnu_tree (gnat_desig_type)
2848                 && Is_Array_Type (gnat_desig_type)
2849                 && ! Is_Constrained (gnat_desig_type)))
2850           {
2851             tree gnu_old
2852               = (present_gnu_tree (gnat_desig_type)
2853                  ? gnat_to_gnu_type (gnat_desig_type)
2854                  : make_dummy_type (gnat_desig_type));
2855             tree fields;
2856
2857             /* Show the dummy we get will be a fat pointer.  */
2858             got_fat_p = made_dummy = 1;
2859
2860             /* If the call above got something that has a pointer, that
2861                pointer is our type.  This could have happened either
2862                because the type was elaborated or because somebody
2863                else executed the code below.  */
2864             gnu_type = TYPE_POINTER_TO (gnu_old);
2865             if (gnu_type == 0)
2866               {
2867                 gnu_type = make_node (RECORD_TYPE);
2868                 SET_TYPE_UNCONSTRAINED_ARRAY (gnu_type, gnu_old);
2869                 TYPE_POINTER_TO (gnu_old) = gnu_type;
2870
2871                 set_lineno (gnat_entity, 0);
2872                 fields
2873                   = chainon (chainon (NULL_TREE,
2874                                       create_field_decl
2875                                       (get_identifier ("P_ARRAY"),
2876                                        ptr_void_type_node, gnu_type,
2877                                        0, 0, 0, 0)),
2878                              create_field_decl (get_identifier ("P_BOUNDS"),
2879                                                 ptr_void_type_node,
2880                                                 gnu_type, 0, 0, 0, 0));
2881
2882                 /* Make sure we can place this into a register.  */
2883                 TYPE_ALIGN (gnu_type)
2884                   = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
2885                 TYPE_IS_FAT_POINTER_P (gnu_type) = 1;
2886                 finish_record_type (gnu_type, fields, 0, 1);
2887
2888                 TYPE_OBJECT_RECORD_TYPE (gnu_old) = make_node (RECORD_TYPE);
2889                 TYPE_NAME (TYPE_OBJECT_RECORD_TYPE (gnu_old))
2890                   = concat_id_with_name (get_entity_name (gnat_desig_type),
2891                                          "XUT");
2892                 TYPE_DUMMY_P (TYPE_OBJECT_RECORD_TYPE (gnu_old)) = 1;
2893               }
2894           }
2895
2896         /* If we already know what the full type is, use it.  */
2897         else if (Present (gnat_desig_full)
2898                  && present_gnu_tree (gnat_desig_full))
2899           gnu_desig_type = TREE_TYPE (get_gnu_tree (gnat_desig_full));
2900
2901         /* Get the type of the thing we are to point to and build a pointer
2902            to it.  If it is a reference to an incomplete or private type with a
2903            full view that is a record, make a dummy type node and get the
2904            actual type later when we have verified it is safe.  */
2905         else if (! in_main_unit
2906                  && ! present_gnu_tree (gnat_desig_type)
2907                  && Present (gnat_desig_full)
2908                  && ! present_gnu_tree (gnat_desig_full)
2909                  && Is_Record_Type (gnat_desig_full))
2910           {
2911             gnu_desig_type = make_dummy_type (gnat_desig_type);
2912             made_dummy = 1;
2913           }
2914
2915         /* Likewise if we are pointing to a record or array and we are to defer
2916            elaborating incomplete types.  We do this since this access type
2917            may be the full view of some private type.  Note that the
2918            unconstrained array case is handled above. */
2919         else if ((! in_main_unit || imported_p) && defer_incomplete_level != 0
2920                  && ! present_gnu_tree (gnat_desig_type)
2921                  && ((Is_Record_Type (gnat_desig_type)
2922                       || Is_Array_Type (gnat_desig_type))
2923                      || (Present (gnat_desig_full)
2924                          && (Is_Record_Type (gnat_desig_full)
2925                              || Is_Array_Type (gnat_desig_full)))))
2926           {
2927             gnu_desig_type = make_dummy_type (gnat_desig_type);
2928             made_dummy = 1;
2929           }
2930         else if (gnat_desig_type == gnat_entity)
2931           {
2932             gnu_type = build_pointer_type_for_mode (make_node (VOID_TYPE),
2933                                                     p_mode);
2934             TREE_TYPE (gnu_type) = TYPE_POINTER_TO (gnu_type) = gnu_type;
2935           }
2936         else
2937           gnu_desig_type = gnat_to_gnu_type (gnat_desig_type);
2938
2939         /* It is possible that the above call to gnat_to_gnu_type resolved our
2940            type.  If so, just return it.  */
2941         if (present_gnu_tree (gnat_entity))
2942           {
2943             maybe_present = 1;
2944             break;
2945           }
2946
2947         /* If we have a GCC type for the designated type, possibly modify it
2948            if we are pointing only to constant objects and then make a pointer
2949            to it.  Don't do this for unconstrained arrays.  */
2950         if (gnu_type == 0 && gnu_desig_type != 0)
2951           {
2952             if (Is_Access_Constant (gnat_entity)
2953                 && TREE_CODE (gnu_desig_type) != UNCONSTRAINED_ARRAY_TYPE)
2954               {
2955                 gnu_desig_type
2956                   = build_qualified_type
2957                     (gnu_desig_type,
2958                      TYPE_QUALS (gnu_desig_type) | TYPE_QUAL_CONST);
2959
2960                 /* Some extra processing is required if we are building a
2961                    pointer to an incomplete type (in the GCC sense). We might
2962                    have such a type if we just made a dummy, or directly out
2963                    of the call to gnat_to_gnu_type above if we are processing
2964                    an access type for a record component designating the
2965                    record type itself.  */
2966                 if (! COMPLETE_TYPE_P (gnu_desig_type))
2967                   {
2968                     /* We must ensure that the pointer to variant we make will
2969                        be processed by update_pointer_to when the initial type
2970                        is completed. Pretend we made a dummy and let further
2971                        processing act as usual.  */
2972                     made_dummy = 1;
2973
2974                     /* We must ensure that update_pointer_to will not retrieve
2975                        the dummy variant when building a properly qualified
2976                        version of the complete type. We take advantage of the
2977                        fact that get_qualified_type is requiring TYPE_NAMEs to
2978                        match to influence build_qualified_type and then also
2979                        update_pointer_to here. */
2980                     TYPE_NAME (gnu_desig_type)
2981                       = create_concat_name (gnat_desig_type, "INCOMPLETE_CST");
2982                   }
2983               }
2984
2985             gnu_type = build_pointer_type_for_mode (gnu_desig_type, p_mode);
2986           }
2987
2988         /* If we are not defining this object and we made a dummy pointer,
2989            save our current definition, evaluate the actual type, and replace
2990            the tentative type we made with the actual one.  If we are to defer
2991            actually looking up the actual type, make an entry in the
2992            deferred list.  */
2993
2994         if (! in_main_unit && made_dummy)
2995           {
2996             tree gnu_old_type
2997               = TYPE_FAT_POINTER_P (gnu_type)
2998                 ? TYPE_UNCONSTRAINED_ARRAY (gnu_type) : TREE_TYPE (gnu_type);
2999
3000             if (esize == POINTER_SIZE
3001                 && (got_fat_p || TYPE_FAT_POINTER_P (gnu_type)))
3002               gnu_type
3003                 = build_pointer_type
3004                   (TYPE_OBJECT_RECORD_TYPE
3005                    (TYPE_UNCONSTRAINED_ARRAY (gnu_type)));
3006
3007             gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3008                                          ! Comes_From_Source (gnat_entity),
3009                                          debug_info_p);
3010             save_gnu_tree (gnat_entity, gnu_decl, 0);
3011             this_made_decl = saved = 1;
3012
3013             if (defer_incomplete_level == 0)
3014               {
3015                 update_pointer_to (TYPE_MAIN_VARIANT (gnu_old_type),
3016                                    gnat_to_gnu_type (gnat_desig_type));
3017                 /* Note that the call to gnat_to_gnu_type here might have
3018                    updated gnu_old_type directly, in which case it is not a
3019                    dummy type any more when we get into update_pointer_to.
3020
3021                    This may happen for instance when the designated type is a
3022                    record type, because their elaboration starts with an
3023                    initial node from make_dummy_type, which may yield the same
3024                    node as the one we got.
3025
3026                    Besides, variants of this non-dummy type might have been
3027                    created along the way. update_pointer_to is expected to
3028                    properly take care of those situations.  */
3029               }
3030             else
3031               {
3032                 struct incomplete *p
3033                   = (struct incomplete *) xmalloc (sizeof (struct incomplete));
3034
3035                 p->old_type = gnu_old_type;
3036                 p->full_type = gnat_desig_type;
3037                 p->next = defer_incomplete_list;
3038                 defer_incomplete_list = p;
3039               }
3040           }
3041       }
3042       break;
3043
3044     case E_Access_Protected_Subprogram_Type:
3045       if (type_annotate_only && No (Equivalent_Type (gnat_entity)))
3046         gnu_type = build_pointer_type (void_type_node);
3047       else
3048         /* The runtime representation is the equivalent type. */
3049         gnu_type = gnat_to_gnu_type (Equivalent_Type (gnat_entity));
3050
3051       if (Is_Itype (Directly_Designated_Type (gnat_entity))
3052           && ! present_gnu_tree (Directly_Designated_Type (gnat_entity))
3053           && No (Freeze_Node (Directly_Designated_Type (gnat_entity)))
3054           && ! Is_Record_Type (Scope (Directly_Designated_Type (gnat_entity))))
3055         gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity),
3056                             NULL_TREE, 0);
3057
3058       break;
3059
3060     case E_Access_Subtype:
3061
3062       /* We treat this as identical to its base type; any constraint is
3063          meaningful only to the front end.
3064
3065          The designated type must be elaborated as well, if it does
3066          not have its own freeze node. Designated (sub)types created
3067          for constrained components of records with discriminants are
3068          not frozen by the front end and thus not elaborated by gigi,
3069          because their use may appear before the base type is frozen,
3070          and because it is not clear that they are needed anywhere in
3071          Gigi. With the current model, there is no correct place where
3072          they could be elaborated.  */
3073
3074       gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
3075       if (Is_Itype (Directly_Designated_Type (gnat_entity))
3076           && ! present_gnu_tree (Directly_Designated_Type (gnat_entity))
3077           && Is_Frozen (Directly_Designated_Type (gnat_entity))
3078           && No (Freeze_Node (Directly_Designated_Type (gnat_entity))))
3079         {
3080           /* If we are not defining this entity, and we have incomplete
3081              entities being processed above us, make a dummy type and
3082              elaborate it later.  */
3083           if (! definition && defer_incomplete_level != 0)
3084             {
3085               struct incomplete *p
3086                 = (struct incomplete *) xmalloc (sizeof (struct incomplete));
3087               tree gnu_ptr_type
3088                 = build_pointer_type
3089                   (make_dummy_type (Directly_Designated_Type (gnat_entity)));
3090
3091               p->old_type = TREE_TYPE (gnu_ptr_type);
3092               p->full_type = Directly_Designated_Type (gnat_entity);
3093               p->next = defer_incomplete_list;
3094               defer_incomplete_list = p;
3095             }
3096           else if
3097             (IN (Ekind (Base_Type (Directly_Designated_Type (gnat_entity))),
3098               Incomplete_Or_Private_Kind))
3099             { ;}
3100           else
3101             gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity),
3102                                 NULL_TREE, 0);
3103         }
3104
3105       maybe_present = 1;
3106       break;
3107
3108     /* Subprogram Entities
3109
3110        The following access functions are defined for subprograms (functions
3111        or procedures):
3112
3113                 First_Formal    The first formal parameter.
3114                 Is_Imported     Indicates that the subprogram has appeared in
3115                                 an INTERFACE or IMPORT pragma. For now we
3116                                 assume that the external language is C.
3117                 Is_Inlined      True if the subprogram is to be inlined.
3118
3119        In addition for function subprograms we have:
3120
3121                 Etype           Return type of the function.
3122
3123        Each parameter is first checked by calling must_pass_by_ref on its
3124        type to determine if it is passed by reference.  For parameters which
3125        are copied in, if they are Ada IN OUT or OUT parameters, their return
3126        value becomes part of a record which becomes the return type of the
3127        function (C function - note that this applies only to Ada procedures
3128        so there is no Ada return type). Additional code to store back the
3129        parameters will be generated on the caller side.  This transformation
3130        is done here, not in the front-end.
3131
3132        The intended result of the transformation can be seen from the
3133        equivalent source rewritings that follow:
3134
3135                                                    struct temp {int a,b};
3136        procedure P (A,B: IN OUT ...) is            temp P (int A,B) {
3137         ..                                            ..
3138        end P;                                        return {A,B};
3139                                                    }
3140                               procedure call
3141
3142                                               {
3143                                                   temp t;
3144        P(X,Y);                                    t = P(X,Y);
3145                                                   X = t.a , Y = t.b;
3146                                               }
3147
3148        For subprogram types we need to perform mainly the same conversions to
3149        GCC form that are needed for procedures and function declarations.  The
3150        only difference is that at the end, we make a type declaration instead
3151        of a function declaration.  */
3152
3153     case E_Subprogram_Type:
3154     case E_Function:
3155     case E_Procedure:
3156       {
3157         /* The first GCC parameter declaration (a PARM_DECL node).  The
3158            PARM_DECL nodes are chained through the TREE_CHAIN field, so this
3159            actually is the head of this parameter list.  */
3160         tree gnu_param_list = NULL_TREE;
3161         /* The type returned by a function. If the subprogram is a procedure
3162            this type should be void_type_node.  */
3163         tree gnu_return_type = void_type_node;
3164         /* List of fields in return type of procedure with copy in copy out
3165            parameters.  */
3166         tree gnu_field_list = NULL_TREE;
3167         /* Non-null for subprograms containing  parameters passed by copy in
3168            copy out (Ada IN OUT or OUT parameters not passed by reference),
3169            in which case it is the list of nodes used to specify the values of
3170            the in out/out parameters that are returned as a record upon
3171            procedure return.  The TREE_PURPOSE of an element of this list is
3172            a field of the record and the TREE_VALUE is the PARM_DECL
3173            corresponding to that field.  This list will be saved in the
3174            TYPE_CI_CO_LIST field of the FUNCTION_TYPE node we create.  */
3175         tree gnu_return_list = NULL_TREE;
3176         Entity_Id gnat_param;
3177         int inline_flag = Is_Inlined (gnat_entity);
3178         int public_flag = Is_Public (gnat_entity);
3179         int extern_flag
3180           = (Is_Public (gnat_entity) && !definition) || imported_p;
3181         int pure_flag = Is_Pure (gnat_entity);
3182         int volatile_flag = No_Return (gnat_entity);
3183         int returns_by_ref = 0;
3184         int returns_unconstrained = 0;
3185         tree gnu_ext_name = create_concat_name (gnat_entity, 0);
3186         int has_copy_in_out = 0;
3187         int parmnum;
3188
3189         if (kind == E_Subprogram_Type && ! definition)
3190           /* A parameter may refer to this type, so defer completion
3191              of any incomplete types.  */
3192           defer_incomplete_level++, this_deferred = 1;
3193
3194         /* If the subprogram has an alias, it is probably inherited, so
3195            we can use the original one.  If the original "subprogram"
3196            is actually an enumeration literal, it may be the first use
3197            of its type, so we must elaborate that type now.  */
3198         if (Present (Alias (gnat_entity)))
3199           {
3200             if (Ekind (Alias (gnat_entity)) == E_Enumeration_Literal)
3201               gnat_to_gnu_entity (Etype (Alias (gnat_entity)), NULL_TREE, 0);
3202
3203             gnu_decl = gnat_to_gnu_entity (Alias (gnat_entity),
3204                                            gnu_expr, 0);
3205
3206             /* Elaborate any Itypes in the parameters of this entity.  */
3207             for (gnat_temp = First_Formal (gnat_entity);
3208                  Present (gnat_temp);
3209                  gnat_temp = Next_Formal_With_Extras (gnat_temp))
3210               if (Is_Itype (Etype (gnat_temp)))
3211                 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
3212
3213             break;
3214           }
3215
3216         if (kind == E_Function || kind == E_Subprogram_Type)
3217           gnu_return_type = gnat_to_gnu_type (Etype (gnat_entity));
3218
3219         /* If this function returns by reference, make the actual
3220            return type of this function the pointer and mark the decl.  */
3221         if (Returns_By_Ref (gnat_entity))
3222           {
3223             returns_by_ref = 1;
3224             gnu_return_type = build_pointer_type (gnu_return_type);
3225           }
3226
3227         /* If the Mechanism is By_Reference, ensure the return type uses
3228            the machine's by-reference mechanism, which may not the same
3229            as above (e.g., it might be by passing a fake parameter).  */
3230         else if (kind == E_Function
3231                  && Mechanism (gnat_entity) == By_Reference)
3232           {
3233             gnu_return_type = copy_type (gnu_return_type);
3234             TREE_ADDRESSABLE (gnu_return_type) = 1;
3235           }
3236
3237         /* If we are supposed to return an unconstrained array,
3238            actually return a fat pointer and make a note of that.  Return
3239            a pointer to an unconstrained record of variable size.  */
3240         else if (TREE_CODE (gnu_return_type) == UNCONSTRAINED_ARRAY_TYPE)
3241           {
3242             gnu_return_type = TREE_TYPE (gnu_return_type);
3243             returns_unconstrained = 1;
3244           }
3245
3246         /* If the type requires a transient scope, the result is allocated
3247            on the secondary stack, so the result type of the function is
3248            just a pointer.  */
3249         else if (Requires_Transient_Scope (Etype (gnat_entity)))
3250           {
3251             gnu_return_type = build_pointer_type (gnu_return_type);
3252             returns_unconstrained = 1;
3253           }
3254
3255         /* If the type is a padded type and the underlying type would not
3256            be passed by reference or this function has a foreign convention,
3257            return the underlying type.  */
3258         else if (TREE_CODE (gnu_return_type) == RECORD_TYPE
3259                  && TYPE_IS_PADDING_P (gnu_return_type)
3260                  && (! default_pass_by_ref (TREE_TYPE
3261                                             (TYPE_FIELDS (gnu_return_type)))
3262                      || Has_Foreign_Convention (gnat_entity)))
3263           gnu_return_type = TREE_TYPE (TYPE_FIELDS (gnu_return_type));
3264
3265         /* Look at all our parameters and get the type of
3266            each.  While doing this, build a copy-out structure if
3267            we need one.  */
3268
3269         /* If the return type has a size that overflows, we cannot have
3270            a function that returns that type.  This usage doesn't make
3271            sense anyway, so give an error here.  */
3272         if (TYPE_SIZE_UNIT (gnu_return_type)
3273             && TREE_OVERFLOW (TYPE_SIZE_UNIT (gnu_return_type)))
3274           {
3275             post_error ("cannot return type whose size overflows",
3276                         gnat_entity);
3277             gnu_return_type = copy_node (gnu_return_type);
3278             TYPE_SIZE (gnu_return_type) = bitsize_zero_node;
3279             TYPE_SIZE_UNIT (gnu_return_type) = size_zero_node;
3280             TYPE_MAIN_VARIANT (gnu_return_type) = gnu_return_type;
3281             TYPE_NEXT_VARIANT (gnu_return_type) = 0;
3282           }
3283
3284         for (gnat_param = First_Formal (gnat_entity), parmnum = 0;
3285              Present (gnat_param);
3286              gnat_param = Next_Formal_With_Extras (gnat_param), parmnum++)
3287           {
3288             tree gnu_param_name = get_entity_name (gnat_param);
3289             tree gnu_param_type = gnat_to_gnu_type (Etype (gnat_param));
3290             tree gnu_param, gnu_field;
3291             int by_ref_p = 0;
3292             int by_descr_p = 0;
3293             int by_component_ptr_p = 0;
3294             int copy_in_copy_out_flag = 0;
3295             int req_by_copy = 0, req_by_ref = 0;
3296
3297             /* See if a Mechanism was supplied that forced this
3298                parameter to be passed one way or another.  */
3299             if (Is_Valued_Procedure (gnat_entity) && parmnum == 0)
3300               req_by_copy = 1;
3301             else if (Mechanism (gnat_param) == Default)
3302               ;
3303             else if (Mechanism (gnat_param) == By_Copy)
3304               req_by_copy = 1;
3305             else if (Mechanism (gnat_param) == By_Reference)
3306               req_by_ref = 1;
3307             else if (Mechanism (gnat_param) <= By_Descriptor)
3308               by_descr_p = 1;
3309             else if (Mechanism (gnat_param) > 0)
3310               {
3311                 if (TREE_CODE (gnu_param_type) == UNCONSTRAINED_ARRAY_TYPE
3312                     || TREE_CODE (TYPE_SIZE (gnu_param_type)) != INTEGER_CST
3313                     || 0 < compare_tree_int (TYPE_SIZE (gnu_param_type),
3314                                              Mechanism (gnat_param)))
3315                   req_by_ref = 1;
3316                 else
3317                   req_by_copy = 1;
3318               }
3319             else
3320               post_error ("unsupported mechanism for&", gnat_param);
3321
3322             /* If this is either a foreign function or if the
3323                underlying type won't be passed by refererence, strip off
3324                possible padding type.  */
3325             if (TREE_CODE (gnu_param_type) == RECORD_TYPE
3326                 && TYPE_IS_PADDING_P (gnu_param_type)
3327                 && (req_by_ref || Has_Foreign_Convention (gnat_entity)
3328                     || ! must_pass_by_ref (TREE_TYPE (TYPE_FIELDS
3329                                                       (gnu_param_type)))))
3330               gnu_param_type = TREE_TYPE (TYPE_FIELDS (gnu_param_type));
3331
3332             /* If this is an IN parameter it is read-only, so make a variant
3333                of the type that is read-only.
3334
3335                ??? However, if this is an unconstrained array, that type can
3336                be very complex.  So skip it for now.  Likewise for any other
3337                self-referential type.  */
3338             if (Ekind (gnat_param) == E_In_Parameter
3339                 && TREE_CODE (gnu_param_type) != UNCONSTRAINED_ARRAY_TYPE
3340                 && ! (TYPE_SIZE (gnu_param_type) != 0
3341                       && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_param_type))))
3342               gnu_param_type
3343                 = build_qualified_type (gnu_param_type,
3344                                         (TYPE_QUALS (gnu_param_type)
3345                                          | TYPE_QUAL_CONST));
3346
3347             /* For foreign conventions, pass arrays as a pointer to the
3348                underlying type.  First check for unconstrained array and get
3349                the underlying array.  Then get the component type and build
3350                a pointer to it.  */
3351             if (Has_Foreign_Convention (gnat_entity)
3352                 && TREE_CODE (gnu_param_type) == UNCONSTRAINED_ARRAY_TYPE)
3353               gnu_param_type
3354                 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS
3355                                         (TREE_TYPE (gnu_param_type))));
3356
3357             if (by_descr_p)
3358               gnu_param_type
3359                 = build_pointer_type
3360                   (build_vms_descriptor (gnu_param_type,
3361                                          Mechanism (gnat_param),
3362                                          gnat_entity));
3363
3364             else if (Has_Foreign_Convention (gnat_entity)
3365                      && ! req_by_copy
3366                      && TREE_CODE (gnu_param_type) == ARRAY_TYPE)
3367               {
3368                 /* Strip off any multi-dimensional entries, then strip
3369                    off the last array to get the component type.  */
3370                 while (TREE_CODE (TREE_TYPE (gnu_param_type)) == ARRAY_TYPE
3371                        && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_param_type)))
3372                   gnu_param_type = TREE_TYPE (gnu_param_type);
3373
3374                 by_component_ptr_p = 1;
3375                 gnu_param_type = TREE_TYPE (gnu_param_type);
3376
3377                 if (Ekind (gnat_param) == E_In_Parameter)
3378                   gnu_param_type
3379                     = build_qualified_type (gnu_param_type,
3380                                             (TYPE_QUALS (gnu_param_type)
3381                                              | TYPE_QUAL_CONST));
3382
3383                 gnu_param_type = build_pointer_type (gnu_param_type);
3384               }
3385
3386             /* Fat pointers are passed as thin pointers for foreign
3387                conventions.  */
3388             else if (Has_Foreign_Convention (gnat_entity)
3389                      && TYPE_FAT_POINTER_P (gnu_param_type))
3390               gnu_param_type
3391                 = make_type_from_size (gnu_param_type,
3392                                        size_int (POINTER_SIZE), 0);
3393
3394             /* If we must pass or were requested to pass by reference, do so.
3395                If we were requested to pass by copy, do so.
3396                Otherwise, for foreign conventions, pass all in out parameters
3397                or aggregates by reference.  For COBOL and Fortran, pass
3398                all integer and FP types that way too.  For Convention Ada,
3399                use the standard Ada default.  */
3400             else if (must_pass_by_ref (gnu_param_type) || req_by_ref
3401                      || (! req_by_copy
3402                          && ((Has_Foreign_Convention (gnat_entity)
3403                               && (Ekind (gnat_param) != E_In_Parameter
3404                                   || AGGREGATE_TYPE_P (gnu_param_type)))
3405                              || (((Convention (gnat_entity)
3406                                    == Convention_Fortran)
3407                                   || (Convention (gnat_entity)
3408                                       == Convention_COBOL))
3409                                  && (INTEGRAL_TYPE_P (gnu_param_type)
3410                                      || FLOAT_TYPE_P (gnu_param_type)))
3411                              /* For convention Ada, see if we pass by reference
3412                                 by default.  */
3413                              || (! Has_Foreign_Convention (gnat_entity)
3414                                  && default_pass_by_ref (gnu_param_type)))))
3415               {
3416                 gnu_param_type = build_reference_type (gnu_param_type);
3417                 by_ref_p = 1;
3418               }
3419
3420             else if (Ekind (gnat_param) != E_In_Parameter)
3421               copy_in_copy_out_flag = 1;
3422
3423             if (req_by_copy && (by_ref_p || by_component_ptr_p))
3424               post_error ("?cannot pass & by copy", gnat_param);
3425
3426             /* If this is an OUT parameter that isn't passed by reference
3427                and isn't a pointer or aggregate, we don't make a PARM_DECL
3428                for it.  Instead, it will be a VAR_DECL created when we process
3429                the procedure.  For the special parameter of Valued_Procedure,
3430                never pass it in.
3431
3432                An exception is made to cover the RM-6.4.1 rule requiring "by
3433                copy" out parameters with discriminants or implicit initial
3434                values to be handled like in out parameters. These type are
3435                normally built as aggregates, and hence passed by reference,
3436                except for some packed arrays which end up encoded in special
3437                integer types.
3438
3439                The exception we need to make is then for packed arrays of
3440                records with discriminants or implicit initial values. We have
3441                no light/easy way to check for the latter case, so we merely
3442                check for packed arrays of records. This may lead to useless
3443                copy-in operations, but in very rare cases only, as these would
3444                be exceptions in a set of already exceptional situations.  */
3445             if (Ekind (gnat_param) == E_Out_Parameter && ! by_ref_p
3446                 && ((Is_Valued_Procedure (gnat_entity) && parmnum == 0)
3447                     || (! by_descr_p
3448                         && ! POINTER_TYPE_P (gnu_param_type)
3449                         && ! AGGREGATE_TYPE_P (gnu_param_type)))
3450                 && ! (Is_Array_Type (Etype (gnat_param))
3451                       && Is_Packed (Etype (gnat_param))
3452                       && Is_Composite_Type (Component_Type
3453                                             (Etype (gnat_param)))))
3454               gnu_param = 0;
3455             else
3456               {
3457                 set_lineno (gnat_param, 0);
3458                 gnu_param
3459                   = create_param_decl
3460                     (gnu_param_name, gnu_param_type,
3461                      by_ref_p || by_component_ptr_p
3462                      || Ekind (gnat_param) == E_In_Parameter);
3463
3464                 DECL_BY_REF_P (gnu_param) = by_ref_p;
3465                 DECL_BY_COMPONENT_PTR_P (gnu_param) = by_component_ptr_p;
3466                 DECL_BY_DESCRIPTOR_P (gnu_param) = by_descr_p;
3467                 DECL_POINTS_TO_READONLY_P (gnu_param)
3468                   = (Ekind (gnat_param) == E_In_Parameter
3469                      && (by_ref_p || by_component_ptr_p));
3470                 save_gnu_tree (gnat_param, gnu_param, 0);
3471                 gnu_param_list = chainon (gnu_param, gnu_param_list);
3472
3473                 /* If a parameter is a pointer, this function may modify
3474                    memory through it and thus shouldn't be considered
3475                    a pure function.  Also, the memory may be modified
3476                    between two calls, so they can't be CSE'ed.  The latter
3477                    case also handles by-ref parameters.  */
3478                 if (POINTER_TYPE_P (gnu_param_type)
3479                     ||  TYPE_FAT_POINTER_P (gnu_param_type))
3480                   pure_flag = 0;
3481               }
3482
3483             if (copy_in_copy_out_flag)
3484               {
3485                 if (! has_copy_in_out)
3486                   {
3487                     if (TREE_CODE (gnu_return_type) != VOID_TYPE)
3488                       gigi_abort (111);
3489
3490                     gnu_return_type = make_node (RECORD_TYPE);
3491                     TYPE_NAME (gnu_return_type) = get_identifier ("RETURN");
3492                     has_copy_in_out = 1;
3493                   }
3494
3495                 set_lineno (gnat_param, 0);
3496                 gnu_field = create_field_decl (gnu_param_name, gnu_param_type,
3497                                                gnu_return_type, 0, 0, 0, 0);
3498                 TREE_CHAIN (gnu_field) = gnu_field_list;
3499                 gnu_field_list = gnu_field;
3500                 gnu_return_list = tree_cons (gnu_field, gnu_param,
3501                                              gnu_return_list);
3502               }
3503           }
3504
3505         /* Do not compute record for out parameters if subprogram is
3506            stubbed since structures are incomplete for the back-end.  */
3507         if (gnu_field_list != 0
3508             && Convention (gnat_entity) != Convention_Stubbed)
3509           finish_record_type (gnu_return_type, nreverse (gnu_field_list),
3510                               0, 0);
3511
3512         /* If we have a CICO list but it has only one entry, we convert
3513            this function into a function that simply returns that one
3514            object.  */
3515         if (list_length (gnu_return_list) == 1)
3516           gnu_return_type = TREE_TYPE (TREE_PURPOSE (gnu_return_list));
3517
3518 #ifdef _WIN32
3519         if (Convention (gnat_entity) == Convention_Stdcall)
3520           {
3521             struct attrib *attr
3522               = (struct attrib *) xmalloc (sizeof (struct attrib));
3523
3524             attr->next = attr_list;
3525             attr->type = ATTR_MACHINE_ATTRIBUTE;
3526             attr->name = get_identifier ("stdcall");
3527             attr->arg = NULL_TREE;
3528             attr->error_point = gnat_entity;
3529             attr_list = attr;
3530           }
3531 #endif
3532
3533         /* Both lists ware built in reverse.  */
3534         gnu_param_list = nreverse (gnu_param_list);
3535         gnu_return_list = nreverse (gnu_return_list);
3536
3537         gnu_type
3538           = create_subprog_type (gnu_return_type, gnu_param_list,
3539                                  gnu_return_list, returns_unconstrained,
3540                                  returns_by_ref,
3541                                  Function_Returns_With_DSP (gnat_entity));
3542
3543         /* ??? For now, don't consider nested functions pure.  */
3544         if (! global_bindings_p ())
3545           pure_flag = 0;
3546
3547         /* A subprogram (something that doesn't return anything) shouldn't
3548            be considered Pure since there would be no reason for such a
3549            subprogram.  Note that procedures with Out (or In Out) parameters
3550            have already been converted into a function with a return type. */
3551         if (TREE_CODE (gnu_return_type) == VOID_TYPE)
3552           pure_flag = 0;
3553
3554         gnu_type
3555           = build_qualified_type (gnu_type,
3556                                   (TYPE_QUALS (gnu_type)
3557                                    | (TYPE_QUAL_CONST * pure_flag)
3558                                    | (TYPE_QUAL_VOLATILE * volatile_flag)));
3559
3560         set_lineno (gnat_entity, 0);
3561
3562         /* If there was no specified Interface_Name and the external and
3563            internal names of the subprogram are the same, only use the
3564            internal name to allow disambiguation of nested subprograms.  */
3565         if (No (Interface_Name (gnat_entity)) && gnu_ext_name == gnu_entity_id)
3566           gnu_ext_name = 0;
3567
3568         /* If we are defining the subprogram and it has an Address clause
3569            we must get the address expression from the saved GCC tree for the
3570            subprogram if it has a Freeze_Node.  Otherwise, we elaborate
3571            the address expression here since the front-end has guaranteed
3572            in that case that the elaboration has no effects.  If there is
3573            an Address clause and we are not defining the object, just
3574            make it a constant.  */
3575         if (Present (Address_Clause (gnat_entity)))
3576           {
3577             tree gnu_address = 0;
3578
3579             if (definition)
3580               gnu_address
3581                 = (present_gnu_tree (gnat_entity)
3582                    ? get_gnu_tree (gnat_entity)
3583                    : gnat_to_gnu (Expression (Address_Clause (gnat_entity))));
3584
3585             save_gnu_tree (gnat_entity, NULL_TREE, 0);
3586
3587             gnu_type = build_reference_type (gnu_type);
3588             if (gnu_address != 0)
3589               gnu_address = convert (gnu_type, gnu_address);
3590
3591             gnu_decl
3592               = create_var_decl (gnu_entity_id, gnu_ext_name, gnu_type,
3593                                  gnu_address, 0, Is_Public (gnat_entity),
3594                                  extern_flag, 0, 0);
3595             DECL_BY_REF_P (gnu_decl) = 1;
3596           }
3597
3598         else if (kind == E_Subprogram_Type)
3599           gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3600                                        ! Comes_From_Source (gnat_entity),
3601                                        debug_info_p);
3602         else
3603           {
3604             gnu_decl = create_subprog_decl (gnu_entity_id, gnu_ext_name,
3605                                             gnu_type, gnu_param_list,
3606                                             inline_flag, public_flag,
3607                                             extern_flag, attr_list);
3608             DECL_STUBBED_P (gnu_decl)
3609               = Convention (gnat_entity) == Convention_Stubbed;
3610           }
3611       }
3612       break;
3613
3614     case E_Incomplete_Type:
3615     case E_Private_Type:
3616     case E_Limited_Private_Type:
3617     case E_Record_Type_With_Private:
3618     case E_Private_Subtype:
3619     case E_Limited_Private_Subtype:
3620     case E_Record_Subtype_With_Private:
3621
3622       /* If this type does not have a full view in the unit we are
3623          compiling, then just get the type from its Etype.  */
3624       if (No (Full_View (gnat_entity)))
3625         {
3626           /* If this is an incomplete type with no full view, it must
3627              be a Taft Amendement type, so just return a dummy type.  */
3628           if (kind == E_Incomplete_Type)
3629             gnu_type = make_dummy_type (gnat_entity);
3630
3631           else if (Present (Underlying_Full_View (gnat_entity)))
3632              gnu_decl = gnat_to_gnu_entity (Underlying_Full_View (gnat_entity),
3633                                             NULL_TREE, 0);
3634           else
3635             {
3636               gnu_decl = gnat_to_gnu_entity (Etype (gnat_entity),
3637                                              NULL_TREE, 0);
3638               maybe_present = 1;
3639             }
3640
3641           break;
3642         }
3643
3644       /* Otherwise, if we are not defining the type now, get the
3645          type from the full view. But always get the type from the full
3646          view for define on use types, since otherwise we won't see them! */
3647
3648       else if (! definition
3649                || (Is_Itype (Full_View (gnat_entity))
3650                    && No (Freeze_Node (gnat_entity)))
3651                || (Is_Itype (gnat_entity)
3652                    && No (Freeze_Node (Full_View (gnat_entity)))))
3653         {
3654           gnu_decl = gnat_to_gnu_entity (Full_View (gnat_entity),
3655                                          NULL_TREE, 0);
3656           maybe_present = 1;
3657           break;
3658         }
3659
3660       /* For incomplete types, make a dummy type entry which will be
3661          replaced later.  */
3662       gnu_type = make_dummy_type (gnat_entity);
3663
3664       /* Save this type as the full declaration's type so we can do any needed
3665          updates when we see it.  */
3666       set_lineno (gnat_entity, 0);
3667       gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3668                                    ! Comes_From_Source (gnat_entity),
3669                                    debug_info_p);
3670       save_gnu_tree (Full_View (gnat_entity), gnu_decl, 0);
3671       break;
3672
3673       /* Simple class_wide types are always viewed as their root_type
3674          by Gigi unless an Equivalent_Type is specified.  */
3675     case E_Class_Wide_Type:
3676       if (Present (Equivalent_Type (gnat_entity)))
3677         gnu_type = gnat_to_gnu_type (Equivalent_Type (gnat_entity));
3678       else
3679         gnu_type = gnat_to_gnu_type (Root_Type (gnat_entity));
3680
3681       maybe_present = 1;
3682       break;
3683
3684     case E_Task_Type:
3685     case E_Task_Subtype:
3686     case E_Protected_Type:
3687     case E_Protected_Subtype:
3688       if (type_annotate_only && No (Corresponding_Record_Type (gnat_entity)))
3689         gnu_type = void_type_node;
3690       else
3691         gnu_type = gnat_to_gnu_type (Corresponding_Record_Type (gnat_entity));
3692
3693       maybe_present = 1;
3694       break;
3695
3696     case E_Label:
3697       gnu_decl = create_label_decl (gnu_entity_id);
3698       break;
3699
3700     case E_Block:
3701     case E_Loop:
3702       /* Nothing at all to do here, so just return an ERROR_MARK and claim
3703          we've already saved it, so we don't try to.  */
3704       gnu_decl = error_mark_node;
3705       saved = 1;
3706       break;
3707
3708     default:
3709       gigi_abort (113);
3710     }
3711
3712   /* If we had a case where we evaluated another type and it might have
3713      defined this one, handle it here.  */
3714   if (maybe_present && present_gnu_tree (gnat_entity))
3715     {
3716       gnu_decl = get_gnu_tree (gnat_entity);
3717       saved = 1;
3718     }
3719
3720   /* If we are processing a type and there is either no decl for it or
3721      we just made one, do some common processing for the type, such as
3722      handling alignment and possible padding.  */
3723
3724   if ((gnu_decl == 0 || this_made_decl) && IN (kind, Type_Kind))
3725     {
3726       if (Is_Tagged_Type (gnat_entity)
3727           || Is_Class_Wide_Equivalent_Type (gnat_entity))
3728         TYPE_ALIGN_OK (gnu_type) = 1;
3729
3730       if (AGGREGATE_TYPE_P (gnu_type) && Is_By_Reference_Type (gnat_entity))
3731         TYPE_BY_REFERENCE_P (gnu_type) = 1;
3732
3733       /* ??? Don't set the size for a String_Literal since it is either
3734          confirming or we don't handle it properly (if the low bound is
3735          non-constant).  */
3736       if (gnu_size == 0 && kind != E_String_Literal_Subtype)
3737         gnu_size = validate_size (Esize (gnat_entity), gnu_type, gnat_entity,
3738                                   TYPE_DECL, 0, Has_Size_Clause (gnat_entity));
3739
3740       /* If a size was specified, see if we can make a new type of that size
3741          by rearranging the type, for example from a fat to a thin pointer.  */
3742       if (gnu_size != 0)
3743         {
3744           gnu_type
3745             = make_type_from_size (gnu_type, gnu_size,
3746                                    Has_Biased_Representation (gnat_entity));
3747
3748           if (operand_equal_p (TYPE_SIZE (gnu_type), gnu_size, 0)
3749               && operand_equal_p (rm_size (gnu_type), gnu_size, 0))
3750             gnu_size = 0;
3751         }
3752
3753       /* If the alignment hasn't already been processed and this is
3754          not an unconstrained array, see if an alignment is specified.
3755          If not, we pick a default alignment for atomic objects.  */
3756       if (align != 0 || TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
3757         ;
3758       else if (Known_Alignment (gnat_entity))
3759         align = validate_alignment (Alignment (gnat_entity), gnat_entity,
3760                                     TYPE_ALIGN (gnu_type));
3761       else if (Is_Atomic (gnat_entity) && gnu_size == 0
3762                && host_integerp (TYPE_SIZE (gnu_type), 1)
3763                && integer_pow2p (TYPE_SIZE (gnu_type)))
3764         align = MIN (BIGGEST_ALIGNMENT,
3765                      tree_low_cst (TYPE_SIZE (gnu_type), 1));
3766       else if (Is_Atomic (gnat_entity) && gnu_size != 0
3767                && host_integerp (gnu_size, 1)
3768                && integer_pow2p (gnu_size))
3769         align = MIN (BIGGEST_ALIGNMENT, tree_low_cst (gnu_size, 1));
3770
3771       /* See if we need to pad the type.  If we did, and made a record,
3772          the name of the new type may be changed.  So get it back for
3773          us when we make the new TYPE_DECL below.  */
3774       gnu_type = maybe_pad_type (gnu_type, gnu_size, align,
3775                                  gnat_entity, "PAD", 1, definition, 0);
3776       if (TREE_CODE (gnu_type) == RECORD_TYPE
3777           && TYPE_IS_PADDING_P (gnu_type))
3778         {
3779           gnu_entity_id = TYPE_NAME (gnu_type);
3780           if (TREE_CODE (gnu_entity_id) == TYPE_DECL)
3781             gnu_entity_id = DECL_NAME (gnu_entity_id);
3782         }
3783
3784       set_rm_size (RM_Size (gnat_entity), gnu_type, gnat_entity);
3785
3786       /* If we are at global level, GCC will have applied variable_size to
3787          the type, but that won't have done anything.  So, if it's not
3788          a constant or self-referential, call elaborate_expression_1 to
3789          make a variable for the size rather than calculating it each time.
3790          Handle both the RM size and the actual size.  */
3791       if (global_bindings_p ()
3792           && TYPE_SIZE (gnu_type) != 0
3793           && ! TREE_CONSTANT (TYPE_SIZE (gnu_type))
3794           && ! CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
3795         {
3796           if (TREE_CODE (gnu_type) == RECORD_TYPE
3797               && operand_equal_p (TYPE_ADA_SIZE (gnu_type),
3798                                   TYPE_SIZE (gnu_type), 0))
3799             {
3800               TYPE_SIZE (gnu_type)
3801                 = elaborate_expression_1 (gnat_entity, gnat_entity,
3802                                           TYPE_SIZE (gnu_type),
3803                                           get_identifier ("SIZE"),
3804                                           definition, 0);
3805               SET_TYPE_ADA_SIZE (gnu_type, TYPE_SIZE (gnu_type));
3806             }
3807           else
3808             {
3809               TYPE_SIZE (gnu_type)
3810                 = elaborate_expression_1 (gnat_entity, gnat_entity,
3811                                           TYPE_SIZE (gnu_type),
3812                                           get_identifier ("SIZE"),
3813                                           definition, 0);
3814
3815               /* ??? For now, store the size as a multiple of the alignment
3816                  in bytes so that we can see the alignment from the tree.  */
3817               TYPE_SIZE_UNIT (gnu_type)
3818                 = build_binary_op
3819                   (MULT_EXPR, sizetype,
3820                    elaborate_expression_1
3821                    (gnat_entity, gnat_entity,
3822                     build_binary_op (EXACT_DIV_EXPR, sizetype,
3823                                      TYPE_SIZE_UNIT (gnu_type),
3824                                      size_int (TYPE_ALIGN (gnu_type)
3825                                                / BITS_PER_UNIT)),
3826                     get_identifier ("SIZE_A_UNIT"),
3827                     definition, 0),
3828                    size_int (TYPE_ALIGN (gnu_type) / BITS_PER_UNIT));
3829
3830               if (TREE_CODE (gnu_type) == RECORD_TYPE)
3831                 SET_TYPE_ADA_SIZE (gnu_type,
3832                     elaborate_expression_1 (gnat_entity, gnat_entity,
3833                                             TYPE_ADA_SIZE (gnu_type),
3834                                             get_identifier ("RM_SIZE"),
3835                                             definition, 0));
3836             }
3837         }
3838
3839       /* If this is a record type or subtype, call elaborate_expression_1 on
3840          any field position.  Do this for both global and local types.
3841          Skip any fields that we haven't made trees for to avoid problems with
3842          class wide types.  */
3843       if (IN (kind, Record_Kind))
3844         for (gnat_temp = First_Entity (gnat_entity); Present (gnat_temp);
3845              gnat_temp = Next_Entity (gnat_temp))
3846           if (Ekind (gnat_temp) == E_Component && present_gnu_tree (gnat_temp))
3847             {
3848               tree gnu_field = get_gnu_tree (gnat_temp);
3849
3850               /* ??? Unfortunately, GCC needs to be able to prove the
3851                  alignment of this offset and if it's a variable, it can't.
3852                  In GCC 3.4, we'll use DECL_OFFSET_ALIGN in some way, but
3853                  right now, we have to put in an explicit multiply and
3854                  divide by that value.  */
3855               if (! CONTAINS_PLACEHOLDER_P (DECL_FIELD_OFFSET (gnu_field)))
3856                 DECL_FIELD_OFFSET (gnu_field)
3857                   = build_binary_op
3858                     (MULT_EXPR, sizetype,
3859                      elaborate_expression_1
3860                      (gnat_temp, gnat_temp,
3861                       build_binary_op (EXACT_DIV_EXPR, sizetype,
3862                                        DECL_FIELD_OFFSET (gnu_field),
3863                                        size_int (DECL_OFFSET_ALIGN (gnu_field)
3864                                                  / BITS_PER_UNIT)),
3865                       get_identifier ("OFFSET"),
3866                       definition, 0),
3867                      size_int (DECL_OFFSET_ALIGN (gnu_field) / BITS_PER_UNIT));
3868             }
3869
3870       gnu_type = build_qualified_type (gnu_type,
3871                                        (TYPE_QUALS (gnu_type)
3872                                         | (TYPE_QUAL_VOLATILE
3873                                            * Treat_As_Volatile (gnat_entity))));
3874
3875       if (Is_Atomic (gnat_entity))
3876         check_ok_for_atomic (gnu_type, gnat_entity, 0);
3877
3878       if (Known_Alignment (gnat_entity))
3879         TYPE_USER_ALIGN (gnu_type) = 1;
3880
3881       if (gnu_decl == 0)
3882         {
3883           set_lineno (gnat_entity, 0);
3884           gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3885                                        ! Comes_From_Source (gnat_entity),
3886                                        debug_info_p);
3887         }
3888       else
3889         TREE_TYPE (gnu_decl) = gnu_type;
3890     }
3891
3892   if (IN (kind, Type_Kind) && ! TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl)))
3893     {
3894       gnu_type = TREE_TYPE (gnu_decl);
3895
3896       /* Back-annotate the Alignment of the type if not already in the
3897          tree.  Likewise for sizes.  */
3898       if (Unknown_Alignment (gnat_entity))
3899         Set_Alignment (gnat_entity,
3900                        UI_From_Int (TYPE_ALIGN (gnu_type) / BITS_PER_UNIT));
3901
3902       if (Unknown_Esize (gnat_entity) && TYPE_SIZE (gnu_type) != 0)
3903         {
3904           /* If the size is self-referential, we annotate the maximum
3905              value of that size.  */
3906           tree gnu_size = TYPE_SIZE (gnu_type);
3907
3908           if (CONTAINS_PLACEHOLDER_P (gnu_size))
3909             gnu_size = max_size (gnu_size, 1);
3910
3911           Set_Esize (gnat_entity, annotate_value (gnu_size));
3912
3913           if (type_annotate_only && Is_Tagged_Type (gnat_entity))
3914             {
3915               /* In this mode the tag and the parent components are not
3916                  generated by the front-end, so the sizes must be adjusted
3917                  explicitly now. */
3918
3919              int size_offset;
3920              int new_size;
3921
3922              if (Is_Derived_Type (gnat_entity))
3923                {
3924                  size_offset
3925                    = UI_To_Int (Esize (Etype (Base_Type (gnat_entity))));
3926                  Set_Alignment (gnat_entity,
3927                                 Alignment (Etype (Base_Type (gnat_entity))));
3928                }
3929              else
3930                size_offset = POINTER_SIZE;
3931
3932              new_size = UI_To_Int (Esize (gnat_entity)) + size_offset;
3933              Set_Esize (gnat_entity,
3934                         UI_From_Int (((new_size + (POINTER_SIZE - 1))
3935                                       / POINTER_SIZE) * POINTER_SIZE));
3936              Set_RM_Size (gnat_entity, Esize (gnat_entity));
3937            }
3938         }
3939
3940       if (Unknown_RM_Size (gnat_entity) && rm_size (gnu_type) != 0)
3941         Set_RM_Size (gnat_entity, annotate_value (rm_size (gnu_type)));
3942     }
3943
3944   if (! Comes_From_Source (gnat_entity) && DECL_P (gnu_decl))
3945     DECL_ARTIFICIAL (gnu_decl) = 1;
3946
3947   if (! debug_info_p && DECL_P (gnu_decl)
3948       && TREE_CODE (gnu_decl) != FUNCTION_DECL)
3949     DECL_IGNORED_P (gnu_decl) = 1;
3950
3951   /* If this decl is really indirect, adjust it.  */
3952   if (TREE_CODE (gnu_decl) == VAR_DECL)
3953     adjust_decl_rtl (gnu_decl);
3954
3955   /* If we haven't already, associate the ..._DECL node that we just made with
3956      the input GNAT entity node. */
3957   if (! saved)
3958     save_gnu_tree (gnat_entity, gnu_decl, 0);
3959
3960   /* If this is an enumeral or floating-point type, we were not able to set
3961      the bounds since they refer to the type.  These bounds are always static.
3962
3963      For enumeration types, also write debugging information and declare the
3964      enumeration literal  table, if needed.  */
3965
3966   if ((kind == E_Enumeration_Type && Present (First_Literal (gnat_entity)))
3967       || (kind == E_Floating_Point_Type && ! Vax_Float (gnat_entity)))
3968     {
3969       tree gnu_scalar_type = gnu_type;
3970
3971       /* If this is a padded type, we need to use the underlying type.  */
3972       if (TREE_CODE (gnu_scalar_type) == RECORD_TYPE
3973           && TYPE_IS_PADDING_P (gnu_scalar_type))
3974         gnu_scalar_type = TREE_TYPE (TYPE_FIELDS (gnu_scalar_type));
3975
3976       /* If this is a floating point type and we haven't set a floating
3977          point type yet, use this in the evaluation of the bounds.  */
3978       if (longest_float_type_node == 0 && kind == E_Floating_Point_Type)
3979         longest_float_type_node = gnu_type;
3980
3981       TYPE_MIN_VALUE (gnu_scalar_type)
3982         = gnat_to_gnu (Type_Low_Bound (gnat_entity));
3983       TYPE_MAX_VALUE (gnu_scalar_type)
3984         = gnat_to_gnu (Type_High_Bound (gnat_entity));
3985
3986       if (kind == E_Enumeration_Type)
3987         {
3988           TYPE_STUB_DECL (gnu_scalar_type) = gnu_decl;
3989
3990           /* Since this has both a typedef and a tag, avoid outputting
3991              the name twice.  */
3992           DECL_ARTIFICIAL (gnu_decl) = 1;
3993           rest_of_type_compilation (gnu_scalar_type, global_bindings_p ());
3994         }
3995     }
3996
3997   /* If we deferred processing of incomplete types, re-enable it.  If there
3998      were no other disables and we have some to process, do so.  */
3999   if (this_deferred && --defer_incomplete_level == 0
4000       && defer_incomplete_list != 0)
4001     {
4002       struct incomplete *incp = defer_incomplete_list;
4003       struct incomplete *next;
4004
4005       defer_incomplete_list = 0;
4006       for (; incp; incp = next)
4007         {
4008           next = incp->next;
4009
4010           if (incp->old_type != 0)
4011             update_pointer_to (TYPE_MAIN_VARIANT (incp->old_type),
4012                                gnat_to_gnu_type (incp->full_type));
4013           free (incp);
4014         }
4015     }
4016
4017   /* If we are not defining this type, see if it's in the incomplete list.
4018      If so, handle that list entry now.  */
4019   else if (! definition)
4020     {
4021       struct incomplete *incp;
4022
4023       for (incp = defer_incomplete_list; incp; incp = incp->next)
4024         if (incp->old_type != 0 && incp->full_type == gnat_entity)
4025           {
4026             update_pointer_to (TYPE_MAIN_VARIANT (incp->old_type),
4027                                TREE_TYPE (gnu_decl));
4028             incp->old_type = 0;
4029           }
4030     }
4031
4032   if (this_global)
4033     force_global--;
4034
4035   if (Is_Packed_Array_Type (gnat_entity)
4036       && Is_Itype (Associated_Node_For_Itype (gnat_entity))
4037       && No (Freeze_Node (Associated_Node_For_Itype (gnat_entity)))
4038       && ! present_gnu_tree (Associated_Node_For_Itype (gnat_entity)))
4039     gnat_to_gnu_entity (Associated_Node_For_Itype (gnat_entity), NULL_TREE, 0);
4040
4041   return gnu_decl;
4042 }
4043 \f
4044 /* Given GNAT_ENTITY, elaborate all expressions that are required to
4045    be elaborated at the point of its definition, but do nothing else.  */
4046
4047 void
4048 elaborate_entity (Entity_Id gnat_entity)
4049 {
4050   switch (Ekind (gnat_entity))
4051     {
4052     case E_Signed_Integer_Subtype:
4053     case E_Modular_Integer_Subtype:
4054     case E_Enumeration_Subtype:
4055     case E_Ordinary_Fixed_Point_Subtype:
4056     case E_Decimal_Fixed_Point_Subtype:
4057     case E_Floating_Point_Subtype:
4058       {
4059         Node_Id gnat_lb = Type_Low_Bound (gnat_entity);
4060         Node_Id gnat_hb = Type_High_Bound (gnat_entity);
4061
4062         /* ??? Tests for avoiding static constaint error expression
4063            is needed until the front stops generating bogus conversions
4064            on bounds of real types. */
4065
4066         if (! Raises_Constraint_Error (gnat_lb))
4067           elaborate_expression (gnat_lb, gnat_entity, get_identifier ("L"),
4068                                 1, 0, Needs_Debug_Info (gnat_entity));
4069         if (! Raises_Constraint_Error (gnat_hb))
4070           elaborate_expression (gnat_hb, gnat_entity, get_identifier ("U"),
4071                                 1, 0, Needs_Debug_Info (gnat_entity));
4072       break;
4073       }
4074
4075     case E_Record_Type:
4076       {
4077         Node_Id full_definition = Declaration_Node (gnat_entity);
4078         Node_Id record_definition = Type_Definition (full_definition);
4079
4080         /* If this is a record extension, go a level further to find the
4081            record definition.  */
4082         if (Nkind (record_definition) == N_Derived_Type_Definition)
4083           record_definition = Record_Extension_Part (record_definition);
4084       }
4085       break;
4086
4087     case E_Record_Subtype:
4088     case E_Private_Subtype:
4089     case E_Limited_Private_Subtype:
4090     case E_Record_Subtype_With_Private:
4091       if (Is_Constrained (gnat_entity)
4092           && Has_Discriminants (Base_Type (gnat_entity))
4093           && Present (Discriminant_Constraint (gnat_entity)))
4094         {
4095           Node_Id gnat_discriminant_expr;
4096           Entity_Id gnat_field;
4097
4098           for (gnat_field = First_Discriminant (Base_Type (gnat_entity)),
4099                gnat_discriminant_expr
4100                = First_Elmt (Discriminant_Constraint (gnat_entity));
4101                Present (gnat_field);
4102                gnat_field = Next_Discriminant (gnat_field),
4103                gnat_discriminant_expr = Next_Elmt (gnat_discriminant_expr))
4104             /* ??? For now, ignore access discriminants.  */
4105             if (! Is_Access_Type (Etype (Node (gnat_discriminant_expr))))
4106               elaborate_expression (Node (gnat_discriminant_expr),
4107                                     gnat_entity,
4108                                     get_entity_name (gnat_field), 1, 0, 0);
4109         }
4110       break;
4111
4112     }
4113 }
4114 \f
4115 /* Mark GNAT_ENTITY as going out of scope at this point.  Recursively mark
4116    any entities on its entity chain similarly.  */
4117
4118 void
4119 mark_out_of_scope (Entity_Id gnat_entity)
4120 {
4121   Entity_Id gnat_sub_entity;
4122   unsigned int kind = Ekind (gnat_entity);
4123
4124   /* If this has an entity list, process all in the list.  */
4125   if (IN (kind, Class_Wide_Kind) || IN (kind, Concurrent_Kind)
4126       || IN (kind, Private_Kind)
4127       || kind == E_Block || kind == E_Entry || kind == E_Entry_Family
4128       || kind == E_Function || kind == E_Generic_Function
4129       || kind == E_Generic_Package || kind == E_Generic_Procedure
4130       || kind == E_Loop || kind == E_Operator || kind == E_Package
4131       || kind == E_Package_Body || kind == E_Procedure
4132       || kind == E_Record_Type || kind == E_Record_Subtype
4133       || kind == E_Subprogram_Body || kind == E_Subprogram_Type)
4134     for (gnat_sub_entity = First_Entity (gnat_entity);
4135          Present (gnat_sub_entity);
4136          gnat_sub_entity = Next_Entity (gnat_sub_entity))
4137             if (Scope (gnat_sub_entity) == gnat_entity
4138                 && gnat_sub_entity != gnat_entity)
4139         mark_out_of_scope (gnat_sub_entity);
4140
4141   /* Now clear this if it has been defined, but only do so if it isn't
4142      a subprogram or parameter.  We could refine this, but it isn't
4143      worth it.  If this is statically allocated, it is supposed to
4144      hang around out of cope.  */
4145   if (present_gnu_tree (gnat_entity) && ! Is_Statically_Allocated (gnat_entity)
4146       && kind != E_Procedure && kind != E_Function && ! IN (kind, Formal_Kind))
4147     {
4148       save_gnu_tree (gnat_entity, NULL_TREE, 1);
4149       save_gnu_tree (gnat_entity, error_mark_node, 1);
4150     }
4151 }
4152 \f
4153 /* Set the alias set of GNU_NEW_TYPE to be that of GNU_OLD_TYPE.  If this
4154    is a multi-dimensional array type, do this recursively.  */
4155
4156 static void
4157 copy_alias_set (tree gnu_new_type, tree gnu_old_type)
4158 {
4159   if (TREE_CODE (gnu_new_type) == ARRAY_TYPE
4160       && TREE_CODE (TREE_TYPE (gnu_new_type)) == ARRAY_TYPE
4161       && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_new_type)))
4162     {
4163       /* We need to be careful here in case GNU_OLD_TYPE is an unconstrained
4164          array.  In that case, it doesn't have the same shape as GNU_NEW_TYPE,
4165          so we need to go down to what does.  */
4166       if (TREE_CODE (gnu_old_type) == UNCONSTRAINED_ARRAY_TYPE)
4167         gnu_old_type
4168           = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_old_type))));
4169
4170       copy_alias_set (TREE_TYPE (gnu_new_type), TREE_TYPE (gnu_old_type));
4171     }
4172
4173   TYPE_ALIAS_SET (gnu_new_type) = get_alias_set (gnu_old_type);
4174   record_component_aliases (gnu_new_type);
4175 }
4176 \f
4177 /* Return a TREE_LIST describing the substitutions needed to reflect
4178    discriminant substitutions from GNAT_SUBTYPE to GNAT_TYPE and add
4179    them to GNU_LIST.  If GNAT_TYPE is not specified, use the base type
4180    of GNAT_SUBTYPE. The substitions can be in any order.  TREE_PURPOSE
4181    gives the tree for the discriminant and TREE_VALUES is the replacement
4182    value.  They are in the form of operands to substitute_in_expr.
4183    DEFINITION is as in gnat_to_gnu_entity.  */
4184
4185 static tree
4186 substitution_list (Entity_Id gnat_subtype,
4187                    Entity_Id gnat_type,
4188                    tree gnu_list,
4189                    int definition)
4190 {
4191   Entity_Id gnat_discrim;
4192   Node_Id gnat_value;
4193
4194   if (No (gnat_type))
4195     gnat_type = Implementation_Base_Type (gnat_subtype);
4196
4197   if (Has_Discriminants (gnat_type))
4198     for (gnat_discrim = First_Stored_Discriminant (gnat_type),
4199          gnat_value = First_Elmt (Stored_Constraint (gnat_subtype));
4200          Present (gnat_discrim);
4201          gnat_discrim = Next_Stored_Discriminant (gnat_discrim),
4202          gnat_value = Next_Elmt (gnat_value))
4203       /* Ignore access discriminants.  */
4204       if (! Is_Access_Type (Etype (Node (gnat_value))))
4205         gnu_list = tree_cons (gnat_to_gnu_entity (gnat_discrim, NULL_TREE, 0),
4206                             elaborate_expression
4207                               (Node (gnat_value), gnat_subtype,
4208                                get_entity_name (gnat_discrim), definition,
4209                                1, 0),
4210                               gnu_list);
4211
4212   return gnu_list;
4213 }
4214 \f
4215 /* For the following two functions: for each GNAT entity, the GCC
4216    tree node used as a dummy for that entity, if any.  */
4217
4218 static GTY((length ("max_gnat_nodes"))) tree * dummy_node_table;
4219
4220 /* Initialize the above table.  */
4221
4222 void
4223 init_dummy_type (void)
4224 {
4225   Node_Id gnat_node;
4226
4227   dummy_node_table = (tree *) ggc_alloc (max_gnat_nodes * sizeof (tree));
4228
4229   for (gnat_node = 0; gnat_node < max_gnat_nodes; gnat_node++)
4230     dummy_node_table[gnat_node] = NULL_TREE;
4231
4232   dummy_node_table -= First_Node_Id;
4233 }
4234
4235 /* Make a dummy type corresponding to GNAT_TYPE.  */
4236
4237 tree
4238 make_dummy_type (Entity_Id gnat_type)
4239 {
4240   Entity_Id gnat_underlying;
4241   tree gnu_type;
4242
4243   /* Find a full type for GNAT_TYPE, taking into account any class wide
4244      types.  */
4245   if (Is_Class_Wide_Type (gnat_type) && Present (Equivalent_Type (gnat_type)))
4246     gnat_type = Equivalent_Type (gnat_type);
4247   else if (Ekind (gnat_type) == E_Class_Wide_Type)
4248     gnat_type = Root_Type (gnat_type);
4249
4250   for (gnat_underlying = gnat_type;
4251        (IN (Ekind (gnat_underlying), Incomplete_Or_Private_Kind)
4252         && Present (Full_View (gnat_underlying)));
4253        gnat_underlying = Full_View (gnat_underlying))
4254     ;
4255
4256   /* If it there already a dummy type, use that one.  Else make one.  */
4257   if (dummy_node_table[gnat_underlying])
4258     return dummy_node_table[gnat_underlying];
4259
4260   /* If this is a record, make this a RECORD_TYPE or UNION_TYPE; else make
4261      it a VOID_TYPE.  */
4262   if (Is_Record_Type (gnat_underlying))
4263     gnu_type = make_node (Is_Unchecked_Union (gnat_underlying)
4264                           ? UNION_TYPE : RECORD_TYPE);
4265   else
4266     gnu_type = make_node (ENUMERAL_TYPE);
4267
4268   TYPE_NAME (gnu_type) = get_entity_name (gnat_type);
4269   if (AGGREGATE_TYPE_P (gnu_type))
4270     TYPE_STUB_DECL (gnu_type)
4271       = pushdecl (build_decl (TYPE_DECL, NULL_TREE, gnu_type));
4272
4273   TYPE_DUMMY_P (gnu_type) = 1;
4274   dummy_node_table[gnat_underlying] = gnu_type;
4275
4276   return gnu_type;
4277 }
4278 \f
4279 /* Return 1 if the size represented by GNU_SIZE can be handled by an
4280    allocation.  If STATIC_P is non-zero, consider only what can be
4281    done with a static allocation.  */
4282
4283 static int
4284 allocatable_size_p (tree gnu_size, int static_p)
4285 {
4286   HOST_WIDE_INT our_size;
4287
4288   /* If this is not a static allocation, the only case we want to forbid
4289      is an overflowing size.  That will be converted into a raise a
4290      Storage_Error.  */
4291   if (! static_p)
4292     return ! (TREE_CODE (gnu_size) == INTEGER_CST
4293               && TREE_CONSTANT_OVERFLOW (gnu_size));
4294
4295   /* Otherwise, we need to deal with both variable sizes and constant
4296      sizes that won't fit in a host int.  We use int instead of HOST_WIDE_INT
4297      since assemblers may not like very large sizes.  */
4298   if (!host_integerp (gnu_size, 1))
4299     return 0;
4300
4301   our_size = tree_low_cst (gnu_size, 1);
4302   return (int) our_size == our_size;
4303 }
4304 \f
4305 /* Return a list of attributes for GNAT_ENTITY, if any.  */
4306
4307 static struct attrib *
4308 build_attr_list (Entity_Id gnat_entity)
4309 {
4310   struct attrib *attr_list = 0;
4311   Node_Id gnat_temp;
4312
4313   for (gnat_temp = First_Rep_Item (gnat_entity); Present (gnat_temp);
4314        gnat_temp = Next_Rep_Item (gnat_temp))
4315     if (Nkind (gnat_temp) == N_Pragma)
4316       {
4317         struct attrib *attr;
4318         tree gnu_arg0 = 0, gnu_arg1 = 0;
4319         Node_Id gnat_assoc = Pragma_Argument_Associations (gnat_temp);
4320         enum attr_type etype;
4321
4322         if (Present (gnat_assoc) && Present (First (gnat_assoc))
4323             && Present (Next (First (gnat_assoc)))
4324             && (Nkind (Expression (Next (First (gnat_assoc))))
4325                 == N_String_Literal))
4326           {
4327             gnu_arg0 = get_identifier (TREE_STRING_POINTER
4328                                        (gnat_to_gnu
4329                                         (Expression (Next
4330                                                      (First (gnat_assoc))))));
4331             if (Present (Next (Next (First (gnat_assoc))))
4332                 && (Nkind (Expression (Next (Next (First (gnat_assoc)))))
4333                     == N_String_Literal))
4334               gnu_arg1 = get_identifier (TREE_STRING_POINTER
4335                                          (gnat_to_gnu
4336                                           (Expression
4337                                            (Next (Next
4338                                                   (First (gnat_assoc)))))));
4339           }
4340
4341         switch (Get_Pragma_Id (Chars (gnat_temp)))
4342           {
4343           case Pragma_Machine_Attribute:
4344             etype = ATTR_MACHINE_ATTRIBUTE;
4345             break;
4346
4347           case Pragma_Linker_Alias:
4348             etype = ATTR_LINK_ALIAS;
4349             break;
4350
4351           case Pragma_Linker_Section:
4352             etype = ATTR_LINK_SECTION;
4353             break;
4354
4355           case Pragma_Weak_External:
4356             etype = ATTR_WEAK_EXTERNAL;
4357             break;
4358
4359           default:
4360             continue;
4361           }
4362
4363         attr = (struct attrib *) xmalloc (sizeof (struct attrib));
4364         attr->next = attr_list;
4365         attr->type = etype;
4366         attr->name = gnu_arg0;
4367         attr->arg = gnu_arg1;
4368         attr->error_point
4369           = Present (Next (First (gnat_assoc)))
4370             ? Expression (Next (First (gnat_assoc))) : gnat_temp;
4371         attr_list = attr;
4372       }
4373
4374   return attr_list;
4375 }
4376 \f
4377 /* Get the unpadded version of a GNAT type.  */
4378
4379 tree
4380 get_unpadded_type (Entity_Id gnat_entity)
4381 {
4382   tree type = gnat_to_gnu_type (gnat_entity);
4383
4384   if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
4385     type = TREE_TYPE (TYPE_FIELDS (type));
4386
4387   return type;
4388 }
4389 \f
4390 /* Called when we need to protect a variable object using a save_expr.  */
4391
4392 tree
4393 maybe_variable (tree gnu_operand, Node_Id gnat_node)
4394 {
4395   if (TREE_CONSTANT (gnu_operand) || TREE_READONLY (gnu_operand)
4396       || TREE_CODE (gnu_operand) == SAVE_EXPR
4397       || TREE_CODE (gnu_operand) == NULL_EXPR)
4398     return gnu_operand;
4399
4400   /* If we will be generating code, make sure we are at the proper
4401      line number.  */
4402   if (! global_bindings_p () && ! CONTAINS_PLACEHOLDER_P (gnu_operand))
4403   set_lineno (gnat_node, 1);
4404
4405   if (TREE_CODE (gnu_operand) == UNCONSTRAINED_ARRAY_REF)
4406     return build1 (UNCONSTRAINED_ARRAY_REF, TREE_TYPE (gnu_operand),
4407                    variable_size (TREE_OPERAND (gnu_operand, 0)));
4408   else
4409     return variable_size (gnu_operand);
4410 }
4411 \f
4412 /* Given a GNAT tree GNAT_EXPR, for an expression which is a value within a
4413    type definition (either a bound or a discriminant value) for GNAT_ENTITY,
4414    return the GCC tree to use for that expression.  GNU_NAME is the
4415    qualification to use if an external name is appropriate and DEFINITION is
4416    nonzero if this is a definition of GNAT_ENTITY.  If NEED_VALUE is nonzero,
4417    we need a result.  Otherwise, we are just elaborating this for
4418    side-effects.  If NEED_DEBUG is nonzero we need the symbol for debugging
4419    purposes even if it isn't needed for code generation.  */
4420
4421 static tree
4422 elaborate_expression (Node_Id gnat_expr,
4423                       Entity_Id gnat_entity,
4424                       tree gnu_name,
4425                       int definition,
4426                       int need_value,
4427                       int need_debug)
4428 {
4429   tree gnu_expr;
4430
4431   /* If we already elaborated this expression (e.g., it was involved
4432      in the definition of a private type), use the old value.  */
4433   if (present_gnu_tree (gnat_expr))
4434     return get_gnu_tree (gnat_expr);
4435
4436   /* If we don't need a value and this is static or a discriment, we
4437      don't need to do anything.  */
4438   else if (! need_value
4439            && (Is_OK_Static_Expression (gnat_expr)
4440                || (Nkind (gnat_expr) == N_Identifier
4441                    && Ekind (Entity (gnat_expr)) == E_Discriminant)))
4442     return 0;
4443
4444   /* Otherwise, convert this tree to its GCC equivalant.  */
4445   gnu_expr
4446     = elaborate_expression_1 (gnat_expr, gnat_entity, gnat_to_gnu (gnat_expr),
4447                               gnu_name, definition, need_debug);
4448
4449   /* Save the expression in case we try to elaborate this entity again.
4450      Since this is not a DECL, don't check it.  If this is a constant,
4451      don't save it since GNAT_EXPR might be used more than once.  Also,
4452      don't save if it's a discriminant.  */
4453   if (! CONTAINS_PLACEHOLDER_P (gnu_expr))
4454     save_gnu_tree (gnat_expr, gnu_expr, 1);
4455
4456   return need_value ? gnu_expr : error_mark_node;
4457 }
4458
4459 /* Similar, but take a GNU expression.  */
4460
4461 static tree
4462 elaborate_expression_1 (Node_Id gnat_expr,
4463                         Entity_Id gnat_entity,
4464                         tree gnu_expr,
4465                         tree gnu_name,
4466                         int definition,
4467                         int need_debug)
4468 {
4469   tree gnu_decl = 0;
4470   /* Strip any conversions to see if the expression is a readonly variable.
4471      ??? This really should remain readonly, but we have to think about
4472      the typing of the tree here.  */
4473   tree gnu_inner_expr = remove_conversions (gnu_expr, 1);
4474   int expr_global = Is_Public (gnat_entity) || global_bindings_p ();
4475   int expr_variable;
4476
4477   /* In most cases, we won't see a naked FIELD_DECL here because a
4478      discriminant reference will have been replaced with a COMPONENT_REF
4479      when the type is being elaborated.  However, there are some cases
4480      involving child types where we will.  So convert it to a COMPONENT_REF
4481      here.  We have to hope it will be at the highest level of the
4482      expression in these cases.  */
4483   if (TREE_CODE (gnu_expr) == FIELD_DECL)
4484     gnu_expr = build (COMPONENT_REF, TREE_TYPE (gnu_expr),
4485                       build (PLACEHOLDER_EXPR, DECL_CONTEXT (gnu_expr)),
4486                       gnu_expr);
4487
4488   /* If GNU_EXPR is neither a placeholder nor a constant, nor a variable
4489      that is a constant, make a variable that is initialized to contain the
4490      bound when the package containing the definition is elaborated.  If
4491      this entity is defined at top level and a bound or discriminant value
4492      isn't a constant or a reference to a discriminant, replace the bound
4493      by the variable; otherwise use a SAVE_EXPR if needed.  Note that we
4494      rely here on the fact that an expression cannot contain both the
4495      discriminant and some other variable.  */
4496
4497   expr_variable = (TREE_CODE_CLASS (TREE_CODE (gnu_expr)) != 'c'
4498                    && ! (TREE_CODE (gnu_inner_expr) == VAR_DECL
4499                          && TREE_READONLY (gnu_inner_expr))
4500                    && ! CONTAINS_PLACEHOLDER_P (gnu_expr));
4501
4502   /* If this is a static expression or contains a discriminant, we don't
4503      need the variable for debugging (and can't elaborate anyway if a
4504      discriminant).  */
4505   if (need_debug
4506       && (Is_OK_Static_Expression (gnat_expr)
4507           || CONTAINS_PLACEHOLDER_P (gnu_expr)))
4508     need_debug = 0;
4509
4510   /* Now create the variable if we need it.  */
4511   if (need_debug || (expr_variable && expr_global))
4512     {
4513       set_lineno (gnat_entity, ! global_bindings_p ());
4514       gnu_decl
4515         = create_var_decl (create_concat_name (gnat_entity,
4516                                                IDENTIFIER_POINTER (gnu_name)),
4517                            NULL_TREE, TREE_TYPE (gnu_expr), gnu_expr, 1,
4518                            Is_Public (gnat_entity), ! definition, 0, 0);
4519     }
4520
4521   /* We only need to use this variable if we are in global context since GCC
4522      can do the right thing in the local case.  */
4523   if (expr_global && expr_variable)
4524     return gnu_decl;
4525   else if (! expr_variable)
4526     return gnu_expr;
4527   else
4528     return maybe_variable (gnu_expr, gnat_expr);
4529 }
4530 \f
4531 /* Create a record type that contains a field of TYPE with a starting bit
4532    position so that it is aligned to ALIGN bits and is SIZE bytes long.  */
4533
4534 tree
4535 make_aligning_type (tree type, int align, tree size)
4536 {
4537   tree record_type = make_node (RECORD_TYPE);
4538   tree place = build (PLACEHOLDER_EXPR, record_type);
4539   tree size_addr_place = convert (sizetype,
4540                                   build_unary_op (ADDR_EXPR, NULL_TREE,
4541                                                   place));
4542   tree name = TYPE_NAME (type);
4543   tree pos, field;
4544
4545   if (TREE_CODE (name) == TYPE_DECL)
4546     name = DECL_NAME (name);
4547
4548   TYPE_NAME (record_type) = concat_id_with_name (name, "_ALIGN");
4549
4550   /* The bit position is obtained by "and"ing the alignment minus 1
4551      with the two's complement of the address and  multiplying
4552      by the number of bits per unit.  Do all this in sizetype.  */
4553
4554   pos = size_binop (MULT_EXPR,
4555                     convert (bitsizetype,
4556                              size_binop (BIT_AND_EXPR,
4557                                          size_diffop (size_zero_node,
4558                                                       size_addr_place),
4559                                          ssize_int ((align / BITS_PER_UNIT)
4560                                                     - 1))),
4561                     bitsize_unit_node);
4562
4563   field = create_field_decl (get_identifier ("F"), type, record_type,
4564                              1, size, pos, 1);
4565   DECL_BIT_FIELD (field) = 0;
4566
4567   finish_record_type (record_type, field, 1, 0);
4568   TYPE_ALIGN (record_type) = BIGGEST_ALIGNMENT;
4569   TYPE_SIZE (record_type)
4570     = size_binop (PLUS_EXPR,
4571                   size_binop (MULT_EXPR, convert (bitsizetype, size),
4572                               bitsize_unit_node),
4573                   bitsize_int (align));
4574   TYPE_SIZE_UNIT (record_type)
4575     = size_binop (PLUS_EXPR, size, size_int (align / BITS_PER_UNIT));
4576   copy_alias_set (record_type, type);
4577   return record_type;
4578 }
4579 \f
4580 /* TYPE is a RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE, with BLKmode that's
4581    being used as the field type of a packed record.  See if we can rewrite it
4582    as a record that has a non-BLKmode type, which we can pack tighter.  If so,
4583    return the new type.  If not, return the original type.  */
4584
4585 static tree
4586 make_packable_type (tree type)
4587 {
4588   tree new_type = make_node (TREE_CODE (type));
4589   tree field_list = NULL_TREE;
4590   tree old_field;
4591
4592   /* Copy the name and flags from the old type to that of the new and set
4593      the alignment to try for an integral type.  For QUAL_UNION_TYPE,
4594      also copy the size.  */
4595   TYPE_NAME (new_type) = TYPE_NAME (type);
4596   TYPE_LEFT_JUSTIFIED_MODULAR_P (new_type)
4597     = TYPE_LEFT_JUSTIFIED_MODULAR_P (type);
4598   TYPE_CONTAINS_TEMPLATE_P (new_type) = TYPE_CONTAINS_TEMPLATE_P (type);
4599   TYPE_IS_PADDING_P (new_type) = TYPE_IS_PADDING_P (type);
4600   if (TREE_CODE (type) == QUAL_UNION_TYPE)
4601     {
4602       TYPE_SIZE (new_type) = TYPE_SIZE (type);
4603       TYPE_SIZE_UNIT (new_type) = TYPE_SIZE_UNIT (type);
4604     }
4605
4606   TYPE_ALIGN (new_type)
4607     = ((HOST_WIDE_INT) 1
4608        << (floor_log2 (tree_low_cst (TYPE_SIZE (type), 1) - 1) + 1));
4609
4610   /* Now copy the fields, keeping the position and size.  */
4611   for (old_field = TYPE_FIELDS (type); old_field != 0;
4612        old_field = TREE_CHAIN (old_field))
4613     {
4614       tree new_field_type = TREE_TYPE (old_field);
4615       tree new_field;
4616
4617       if (TYPE_MODE (new_field_type) == BLKmode
4618           && (TREE_CODE (new_field_type) == RECORD_TYPE
4619               || TREE_CODE (new_field_type) == UNION_TYPE
4620               || TREE_CODE (new_field_type) == QUAL_UNION_TYPE)
4621           && host_integerp (TYPE_SIZE (new_field_type), 1))
4622         new_field_type = make_packable_type (new_field_type);
4623
4624       new_field = create_field_decl (DECL_NAME (old_field), new_field_type,
4625                                      new_type, TYPE_PACKED (type),
4626                                      DECL_SIZE (old_field),
4627                                      bit_position (old_field),
4628                                      ! DECL_NONADDRESSABLE_P (old_field));
4629
4630       DECL_INTERNAL_P (new_field) = DECL_INTERNAL_P (old_field);
4631       SET_DECL_ORIGINAL_FIELD (new_field,
4632           (DECL_ORIGINAL_FIELD (old_field) != 0
4633            ? DECL_ORIGINAL_FIELD (old_field) : old_field));
4634
4635       if (TREE_CODE (new_type) == QUAL_UNION_TYPE)
4636         DECL_QUALIFIER (new_field) = DECL_QUALIFIER (old_field);
4637
4638       TREE_CHAIN (new_field) = field_list;
4639       field_list = new_field;
4640     }
4641
4642   finish_record_type (new_type, nreverse (field_list), 1, 1);
4643   copy_alias_set (new_type, type);
4644   return TYPE_MODE (new_type) == BLKmode ? type : new_type;
4645 }
4646 \f
4647 /* Ensure that TYPE has SIZE and ALIGN.  Make and return a new padded type
4648    if needed.  We have already verified that SIZE and TYPE are large enough.
4649
4650    GNAT_ENTITY and NAME_TRAILER are used to name the resulting record and
4651    to issue a warning.
4652
4653    IS_USER_TYPE is nonzero if we must be sure we complete the original type.
4654
4655    DEFINITION is nonzero if this type is being defined.
4656
4657    SAME_RM_SIZE is nonzero if the RM_Size of the resulting type is to be
4658    set to its TYPE_SIZE; otherwise, it's set to the RM_Size of the original
4659    type.  */
4660
4661 static tree
4662 maybe_pad_type (tree type,
4663                 tree size,
4664                 unsigned int align,
4665                 Entity_Id gnat_entity,
4666                 const char *name_trailer,
4667                 int is_user_type,
4668                 int definition,
4669                 int same_rm_size)
4670 {
4671   tree orig_size = TYPE_SIZE (type);
4672   tree record;
4673   tree field;
4674
4675   /* If TYPE is a padded type, see if it agrees with any size and alignment
4676      we were given.  If so, return the original type.  Otherwise, strip
4677      off the padding, since we will either be returning the inner type
4678      or repadding it.  If no size or alignment is specified, use that of
4679      the original padded type.  */
4680
4681   if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
4682     {
4683       if ((size == 0
4684            || operand_equal_p (round_up (size,
4685                                          MAX (align, TYPE_ALIGN (type))),
4686                                round_up (TYPE_SIZE (type),
4687                                          MAX (align, TYPE_ALIGN (type))),
4688                                0))
4689           && (align == 0 || align == TYPE_ALIGN (type)))
4690         return type;
4691
4692       if (size == 0)
4693         size = TYPE_SIZE (type);
4694       if (align == 0)
4695         align = TYPE_ALIGN (type);
4696
4697       type = TREE_TYPE (TYPE_FIELDS (type));
4698       orig_size = TYPE_SIZE (type);
4699     }
4700
4701   /* If the size is either not being changed or is being made smaller (which
4702      is not done here (and is only valid for bitfields anyway), show the size
4703      isn't changing.  Likewise, clear the alignment if it isn't being
4704      changed.  Then return if we aren't doing anything.  */
4705
4706   if (size != 0
4707       && (operand_equal_p (size, orig_size, 0)
4708           || (TREE_CODE (orig_size) == INTEGER_CST
4709               && tree_int_cst_lt (size, orig_size))))
4710     size = 0;
4711
4712   if (align == TYPE_ALIGN (type))
4713     align = 0;
4714
4715   if (align == 0 && size == 0)
4716     return type;
4717
4718   /* We used to modify the record in place in some cases, but that could
4719      generate incorrect debugging information.  So make a new record
4720      type and name.  */
4721   record = make_node (RECORD_TYPE);
4722
4723   if (Present (gnat_entity))
4724     TYPE_NAME (record) = create_concat_name (gnat_entity, name_trailer);
4725
4726   /* If we were making a type, complete the original type and give it a
4727      name.  */
4728   if (is_user_type)
4729     create_type_decl (get_entity_name (gnat_entity), type,
4730                       0, ! Comes_From_Source (gnat_entity),
4731                       ! (TYPE_NAME (type) != 0
4732                          && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
4733                          && DECL_IGNORED_P (TYPE_NAME (type))));
4734
4735   /* If we are changing the alignment and the input type is a record with
4736      BLKmode and a small constant size, try to make a form that has an
4737      integral mode.  That might allow this record to have an integral mode,
4738      which will be much more efficient.  There is no point in doing this if a
4739      size is specified unless it is also smaller than the biggest alignment
4740      and it is incorrect to do this if the size of the original type is not a
4741      multiple of the alignment.  */
4742   if (align != 0
4743       && TREE_CODE (type) == RECORD_TYPE
4744       && TYPE_MODE (type) == BLKmode
4745       && host_integerp (orig_size, 1)
4746       && compare_tree_int (orig_size, BIGGEST_ALIGNMENT) <= 0
4747       && (size == 0
4748           || (TREE_CODE (size) == INTEGER_CST
4749               && compare_tree_int (size, BIGGEST_ALIGNMENT) <= 0))
4750       && tree_low_cst (orig_size, 1) % align == 0)
4751     type = make_packable_type (type);
4752
4753   field  = create_field_decl (get_identifier ("F"), type, record, 0,
4754                               NULL_TREE, bitsize_zero_node, 1);
4755
4756   DECL_INTERNAL_P (field) = 1;
4757   TYPE_SIZE (record) = size != 0 ? size : orig_size;
4758   TYPE_SIZE_UNIT (record)
4759     = convert (sizetype,
4760                size_binop (CEIL_DIV_EXPR, TYPE_SIZE (record),
4761                            bitsize_unit_node));
4762   TYPE_ALIGN (record) = align;
4763   TYPE_IS_PADDING_P (record) = 1;
4764   TYPE_VOLATILE (record)
4765     = Present (gnat_entity) && Treat_As_Volatile (gnat_entity);
4766   finish_record_type (record, field, 1, 0);
4767
4768   /* Keep the RM_Size of the padded record as that of the old record
4769      if requested.  */
4770   SET_TYPE_ADA_SIZE (record, same_rm_size ? size : rm_size (type));
4771
4772   /* Unless debugging information isn't being written for the input type,
4773      write a record that shows what we are a subtype of and also make a
4774      variable that indicates our size, if variable. */
4775   if (TYPE_NAME (record) != 0
4776       && AGGREGATE_TYPE_P (type)
4777       && (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL
4778           || ! DECL_IGNORED_P (TYPE_NAME (type))))
4779     {
4780       tree marker = make_node (RECORD_TYPE);
4781       tree name = DECL_NAME (TYPE_NAME (record));
4782       tree orig_name = TYPE_NAME (type);
4783
4784       if (TREE_CODE (orig_name) == TYPE_DECL)
4785         orig_name = DECL_NAME (orig_name);
4786
4787       TYPE_NAME (marker) = concat_id_with_name (name, "XVS");
4788       finish_record_type (marker,
4789                           create_field_decl (orig_name, integer_type_node,
4790                                              marker, 0, NULL_TREE, NULL_TREE,
4791                                              0),
4792                           0, 0);
4793
4794       if (size != 0 && TREE_CODE (size) != INTEGER_CST && definition)
4795         create_var_decl (concat_id_with_name (name, "XVZ"), NULL_TREE,
4796                          sizetype, TYPE_SIZE (record), 0, 0, 0, 0,
4797                          0);
4798     }
4799
4800   type = record;
4801
4802   if (CONTAINS_PLACEHOLDER_P (orig_size))
4803     orig_size = max_size (orig_size, 1);
4804
4805   /* If the size was widened explicitly, maybe give a warning.  */
4806   if (size != 0 && Present (gnat_entity)
4807       && ! operand_equal_p (size, orig_size, 0)
4808       && ! (TREE_CODE (size) == INTEGER_CST
4809             && TREE_CODE (orig_size) == INTEGER_CST
4810             && tree_int_cst_lt (size, orig_size)))
4811     {
4812       Node_Id gnat_error_node = Empty;
4813
4814       if (Is_Packed_Array_Type (gnat_entity))
4815         gnat_entity = Associated_Node_For_Itype (gnat_entity);
4816
4817       if ((Ekind (gnat_entity) == E_Component
4818            || Ekind (gnat_entity) == E_Discriminant)
4819           && Present (Component_Clause (gnat_entity)))
4820         gnat_error_node = Last_Bit (Component_Clause (gnat_entity));
4821       else if (Present (Size_Clause (gnat_entity)))
4822         gnat_error_node = Expression (Size_Clause (gnat_entity));
4823
4824       /* Generate message only for entities that come from source, since
4825          if we have an entity created by expansion, the message will be
4826          generated for some other corresponding source entity.  */
4827       if (Comes_From_Source (gnat_entity) && Present (gnat_error_node))
4828         post_error_ne_tree ("{^ }bits of & unused?", gnat_error_node,
4829                             gnat_entity,
4830                             size_diffop (size, orig_size));
4831
4832       else if (*name_trailer == 'C' && ! Is_Internal (gnat_entity))
4833         post_error_ne_tree ("component of& padded{ by ^ bits}?",
4834                             gnat_entity, gnat_entity,
4835                             size_diffop (size, orig_size));
4836     }
4837
4838   return type;
4839 }
4840 \f
4841 /* Given a GNU tree and a GNAT list of choices, generate an expression to test
4842    the value passed against the list of choices.  */
4843
4844 tree
4845 choices_to_gnu (tree operand, Node_Id choices)
4846 {
4847   Node_Id choice;
4848   Node_Id gnat_temp;
4849   tree result = integer_zero_node;
4850   tree this_test, low = 0, high = 0, single = 0;
4851
4852   for (choice = First (choices); Present (choice); choice = Next (choice))
4853     {
4854       switch (Nkind (choice))
4855         {
4856         case N_Range:
4857           low = gnat_to_gnu (Low_Bound (choice));
4858           high = gnat_to_gnu (High_Bound (choice));
4859
4860           /* There's no good type to use here, so we might as well use
4861              integer_type_node.  */
4862           this_test
4863             = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
4864                                build_binary_op (GE_EXPR, integer_type_node,
4865                                                 operand, low),
4866                                build_binary_op (LE_EXPR, integer_type_node,
4867                                                 operand, high));
4868
4869           break;
4870
4871         case N_Subtype_Indication:
4872           gnat_temp = Range_Expression (Constraint (choice));
4873           low = gnat_to_gnu (Low_Bound (gnat_temp));
4874           high = gnat_to_gnu (High_Bound (gnat_temp));
4875
4876           this_test
4877             = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
4878                                build_binary_op (GE_EXPR, integer_type_node,
4879                                                 operand, low),
4880                                build_binary_op (LE_EXPR, integer_type_node,
4881                                                 operand, high));
4882           break;
4883
4884         case N_Identifier:
4885         case N_Expanded_Name:
4886           /* This represents either a subtype range, an enumeration
4887              literal, or a constant  Ekind says which.  If an enumeration
4888              literal or constant, fall through to the next case.  */
4889           if (Ekind (Entity (choice)) != E_Enumeration_Literal
4890               && Ekind (Entity (choice)) != E_Constant)
4891             {
4892               tree type = gnat_to_gnu_type (Entity (choice));
4893
4894               low = TYPE_MIN_VALUE (type);
4895               high = TYPE_MAX_VALUE (type);
4896
4897               this_test
4898                 = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
4899                                    build_binary_op (GE_EXPR, integer_type_node,
4900                                                     operand, low),
4901                                    build_binary_op (LE_EXPR, integer_type_node,
4902                                                     operand, high));
4903               break;
4904             }
4905           /* ... fall through ... */
4906         case N_Character_Literal:
4907         case N_Integer_Literal:
4908           single = gnat_to_gnu (choice);
4909           this_test = build_binary_op (EQ_EXPR, integer_type_node, operand,
4910                                        single);
4911           break;
4912
4913         case N_Others_Choice:
4914           this_test = integer_one_node;
4915           break;
4916
4917         default:
4918           gigi_abort (114);
4919         }
4920
4921       result = build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
4922                                 result, this_test);
4923     }
4924
4925   return result;
4926 }
4927 \f
4928 /* Return a GCC tree for a field corresponding to GNAT_FIELD to be
4929    placed in GNU_RECORD_TYPE.
4930
4931    PACKED is 1 if the enclosing record is packed and -1 if the enclosing
4932    record has a Component_Alignment of Storage_Unit.
4933
4934    DEFINITION is nonzero if this field is for a record being defined.  */
4935
4936 static tree
4937 gnat_to_gnu_field (Entity_Id gnat_field,
4938                    tree gnu_record_type,
4939                    int packed,
4940                    int definition)
4941 {
4942   tree gnu_field_id = get_entity_name (gnat_field);
4943   tree gnu_field_type = gnat_to_gnu_type (Etype (gnat_field));
4944   tree gnu_orig_field_type = gnu_field_type;
4945   tree gnu_pos = 0;
4946   tree gnu_size = 0;
4947   tree gnu_field;
4948   int needs_strict_alignment
4949     = (Is_Aliased (gnat_field) || Strict_Alignment (Etype (gnat_field))
4950        || Treat_As_Volatile (gnat_field));
4951
4952   /* If this field requires strict alignment or contains an item of
4953      variable sized, pretend it isn't packed.  */
4954   if (needs_strict_alignment || is_variable_size (gnu_field_type))
4955     packed = 0;
4956
4957   /* For packed records, this is one of the few occasions on which we use
4958      the official RM size for discrete or fixed-point components, instead
4959      of the normal GNAT size stored in Esize. See description in Einfo:
4960      "Handling of Type'Size Values" for further details.  */
4961
4962   if (packed == 1)
4963     gnu_size = validate_size (RM_Size (Etype (gnat_field)), gnu_field_type,
4964                               gnat_field, FIELD_DECL, 0, 1);
4965
4966   if (Known_Static_Esize (gnat_field))
4967     gnu_size = validate_size (Esize (gnat_field), gnu_field_type,
4968                               gnat_field, FIELD_DECL, 0, 1);
4969
4970   /* If the field's type is left-justified modular, the wrapper can prevent
4971      packing so we make the field the type of the inner object unless the
4972      situation forbids it. We may not do that when the field is addressable_p,
4973      typically because in that case this field may later be passed by-ref for
4974      a formal argument expecting the left justification.  The condition below
4975      is then matching the addressable_p code for COMPONENT_REF.  */
4976   if (! Is_Aliased (gnat_field) && flag_strict_aliasing
4977       && TREE_CODE (gnu_field_type) == RECORD_TYPE
4978       && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_field_type))
4979     gnu_field_type = TREE_TYPE (TYPE_FIELDS (gnu_field_type));
4980
4981   /* If we are packing this record or we have a specified size that's
4982      smaller than that of the field type and the field type is also a record
4983      that's BLKmode and with a small constant size, see if we can get a
4984      better form of the type that allows more packing.  If we can, show
4985      a size was specified for it if there wasn't one so we know to
4986      make this a bitfield and avoid making things wider.  */
4987   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
4988       && TYPE_MODE (gnu_field_type) == BLKmode
4989       && host_integerp (TYPE_SIZE (gnu_field_type), 1)
4990       && compare_tree_int (TYPE_SIZE (gnu_field_type), BIGGEST_ALIGNMENT) <= 0
4991       && (packed
4992           || (gnu_size != 0 && tree_int_cst_lt (gnu_size,
4993                                                 TYPE_SIZE (gnu_field_type)))))
4994     {
4995       gnu_field_type = make_packable_type (gnu_field_type);
4996
4997       if (gnu_field_type != gnu_orig_field_type && gnu_size == 0)
4998         gnu_size = rm_size (gnu_field_type);
4999     }
5000
5001   /* If we are packing the record and the field is BLKmode, round the
5002      size up to a byte boundary.  */
5003   if (packed && TYPE_MODE (gnu_field_type) == BLKmode && gnu_size != 0)
5004     gnu_size = round_up (gnu_size, BITS_PER_UNIT);
5005
5006   if (Present (Component_Clause (gnat_field)))
5007     {
5008       gnu_pos = UI_To_gnu (Component_Bit_Offset (gnat_field), bitsizetype);
5009       gnu_size = validate_size (Esize (gnat_field), gnu_field_type,
5010                                 gnat_field, FIELD_DECL, 0, 1);
5011
5012       /* Ensure the position does not overlap with the parent subtype,
5013          if there is one.  */
5014       if (Present (Parent_Subtype (Underlying_Type (Scope (gnat_field)))))
5015         {
5016           tree gnu_parent
5017             = gnat_to_gnu_type (Parent_Subtype
5018                                 (Underlying_Type (Scope (gnat_field))));
5019
5020           if (TREE_CODE (TYPE_SIZE (gnu_parent)) == INTEGER_CST
5021               && tree_int_cst_lt (gnu_pos, TYPE_SIZE (gnu_parent)))
5022             {
5023               post_error_ne_tree
5024                 ("offset of& must be beyond parent{, minimum allowed is ^}",
5025                  First_Bit (Component_Clause (gnat_field)), gnat_field,
5026                  TYPE_SIZE_UNIT (gnu_parent));
5027             }
5028         }
5029
5030       /* If this field needs strict alignment, ensure the record is
5031          sufficiently aligned and that that position and size are
5032          consistent with the alignment.  */
5033       if (needs_strict_alignment)
5034         {
5035           tree gnu_min_size = round_up (rm_size (gnu_field_type),
5036                                         TYPE_ALIGN (gnu_field_type));
5037
5038           TYPE_ALIGN (gnu_record_type)
5039             = MAX (TYPE_ALIGN (gnu_record_type), TYPE_ALIGN (gnu_field_type));
5040
5041           /* If Atomic, the size must match exactly and if aliased, the size
5042              must not be less than the rounded size.  */
5043           if ((Is_Atomic (gnat_field) || Is_Atomic (Etype (gnat_field)))
5044               && ! operand_equal_p (gnu_size, TYPE_SIZE (gnu_field_type), 0))
5045             {
5046               post_error_ne_tree
5047                 ("atomic field& must be natural size of type{ (^)}",
5048                  Last_Bit (Component_Clause (gnat_field)), gnat_field,
5049                  TYPE_SIZE (gnu_field_type));
5050
5051               gnu_size = 0;
5052             }
5053
5054           else if (Is_Aliased (gnat_field)
5055                    && gnu_size != 0
5056                    && tree_int_cst_lt (gnu_size, gnu_min_size))
5057             {
5058               post_error_ne_tree
5059                 ("size of aliased field& too small{, minimum required is ^}",
5060                  Last_Bit (Component_Clause (gnat_field)), gnat_field,
5061                  gnu_min_size);
5062               gnu_size = 0;
5063             }
5064
5065           if (! integer_zerop (size_binop
5066                                (TRUNC_MOD_EXPR, gnu_pos,
5067                                 bitsize_int (TYPE_ALIGN (gnu_field_type)))))
5068             {
5069               if (Is_Aliased (gnat_field))
5070                 post_error_ne_num
5071                   ("position of aliased field& must be multiple of ^ bits",
5072                    First_Bit (Component_Clause (gnat_field)), gnat_field,
5073                    TYPE_ALIGN (gnu_field_type));
5074
5075               else if (Treat_As_Volatile (gnat_field))
5076                 post_error_ne_num
5077                   ("position of volatile field& must be multiple of ^ bits",
5078                    First_Bit (Component_Clause (gnat_field)), gnat_field,
5079                    TYPE_ALIGN (gnu_field_type));
5080
5081               else if (Strict_Alignment (Etype (gnat_field)))
5082                 post_error_ne_num
5083   ("position of & with aliased or tagged components not multiple of ^ bits",
5084                    First_Bit (Component_Clause (gnat_field)), gnat_field,
5085                    TYPE_ALIGN (gnu_field_type));
5086               else
5087                 gigi_abort (124);
5088
5089               gnu_pos = 0;
5090             }
5091
5092           /* If an error set the size to zero, show we have no position
5093              either.  */
5094           if (gnu_size == 0)
5095             gnu_pos = 0;
5096         }
5097
5098       if (Is_Atomic (gnat_field))
5099         check_ok_for_atomic (gnu_field_type, gnat_field, 0);
5100     }
5101
5102   /* If the record has rep clauses and this is the tag field, make a rep
5103      clause for it as well.  */
5104   else if (Has_Specified_Layout (Scope (gnat_field))
5105            && Chars (gnat_field) == Name_uTag)
5106     {
5107       gnu_pos = bitsize_zero_node;
5108       gnu_size = TYPE_SIZE (gnu_field_type);
5109     }
5110
5111   /* We need to make the size the maximum for the type if it is
5112      self-referential and an unconstrained type.  In that case, we can't
5113      pack the field since we can't make a copy to align it.  */
5114   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
5115       && gnu_size == 0
5116       && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_field_type))
5117       && ! Is_Constrained (Underlying_Type (Etype (gnat_field))))
5118     {
5119       gnu_size = max_size (TYPE_SIZE (gnu_field_type), 1);
5120       packed = 0;
5121     }
5122
5123   /* If no size is specified (or if there was an error), don't specify a
5124      position.  */
5125   if (gnu_size == 0)
5126     gnu_pos = 0;
5127   else
5128     {
5129       /* Unless this field is aliased, we can remove any left-justified
5130          modular type since it's only needed in the unchecked conversion
5131          case, which doesn't apply here.  */
5132       if (! needs_strict_alignment
5133           && TREE_CODE (gnu_field_type) == RECORD_TYPE
5134           && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_field_type))
5135         gnu_field_type = TREE_TYPE (TYPE_FIELDS (gnu_field_type));
5136
5137       gnu_field_type
5138         = make_type_from_size (gnu_field_type, gnu_size,
5139                                Has_Biased_Representation (gnat_field));
5140       gnu_field_type = maybe_pad_type (gnu_field_type, gnu_size, 0,
5141                                        gnat_field, "PAD", 0, definition, 1);
5142     }
5143
5144   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
5145       && TYPE_CONTAINS_TEMPLATE_P (gnu_field_type))
5146     gigi_abort (118);
5147
5148   /* Now create the decl for the field.  */
5149   set_lineno (gnat_field, 0);
5150   gnu_field = create_field_decl (gnu_field_id, gnu_field_type, gnu_record_type,
5151                                  packed, gnu_size, gnu_pos,
5152                                  Is_Aliased (gnat_field));
5153
5154   TREE_THIS_VOLATILE (gnu_field) = Treat_As_Volatile (gnat_field);
5155
5156   if (Ekind (gnat_field) == E_Discriminant)
5157     DECL_DISCRIMINANT_NUMBER (gnu_field)
5158       = UI_To_gnu (Discriminant_Number (gnat_field), sizetype);
5159
5160   return gnu_field;
5161 }
5162 \f
5163 /* Return 1 if TYPE is a type with variable size, a padding type with a field
5164    of variable size or is a record that has a field such a field.  */
5165
5166 static int
5167 is_variable_size (tree type)
5168 {
5169   tree field;
5170
5171   /* We need not be concerned about this at all if we don't have
5172      strict alignment.  */
5173   if (! STRICT_ALIGNMENT)
5174     return 0;
5175   else if (! TREE_CONSTANT (TYPE_SIZE (type)))
5176     return 1;
5177   else if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type)
5178            && ! TREE_CONSTANT (DECL_SIZE (TYPE_FIELDS (type))))
5179     return 1;
5180   else if (TREE_CODE (type) != RECORD_TYPE
5181            && TREE_CODE (type) != UNION_TYPE
5182            && TREE_CODE (type) != QUAL_UNION_TYPE)
5183     return 0;
5184
5185   for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
5186     if (is_variable_size (TREE_TYPE (field)))
5187       return 1;
5188
5189   return 0;
5190 }
5191 \f
5192 /* Return a GCC tree for a record type given a GNAT Component_List and a chain
5193    of GCC trees for fields that are in the record and have already been
5194    processed.  When called from gnat_to_gnu_entity during the processing of a
5195    record type definition, the GCC nodes for the discriminants will be on
5196    the chain.  The other calls to this function are recursive calls from
5197    itself for the Component_List of a variant and the chain is empty.
5198
5199    PACKED is 1 if this is for a record with "pragma pack" and -1 is this is
5200    for a record type with "pragma component_alignment (storage_unit)".
5201
5202    FINISH_RECORD is nonzero if this call will supply all of the remaining
5203    fields of the record.
5204
5205    P_GNU_REP_LIST, if nonzero, is a pointer to a list to which each field
5206    with a rep clause is to be added.  If it is nonzero, that is all that
5207    should be done with such fields.
5208
5209    CANCEL_ALIGNMENT, if nonzero, means the alignment should be zeroed
5210    before laying out the record.  This means the alignment only serves
5211    to force fields to be bitfields, but not require the record to be
5212    that aligned.  This is used for variants.
5213
5214    ALL_REP, if nonzero, means that a rep clause was found for all the
5215    fields.  This simplifies the logic since we know we're not in the mixed
5216    case.
5217
5218    The processing of the component list fills in the chain with all of the
5219    fields of the record and then the record type is finished.  */
5220
5221 static void
5222 components_to_record (tree gnu_record_type,
5223                       Node_Id component_list,
5224                       tree gnu_field_list,
5225                       int packed,
5226                       int definition,
5227                       tree *p_gnu_rep_list,
5228                       int cancel_alignment,
5229                       int all_rep)
5230 {
5231   Node_Id component_decl;
5232   Entity_Id gnat_field;
5233   Node_Id variant_part;
5234   Node_Id variant;
5235   tree gnu_our_rep_list = NULL_TREE;
5236   tree gnu_field, gnu_last;
5237   int layout_with_rep = 0;
5238   int all_rep_and_size = all_rep && TYPE_SIZE (gnu_record_type) != 0;
5239
5240   /* For each variable within each component declaration create a GCC field
5241      and add it to the list, skipping any pragmas in the list.  */
5242
5243   if (Present (Component_Items (component_list)))
5244     for (component_decl = First_Non_Pragma (Component_Items (component_list));
5245          Present (component_decl);
5246          component_decl = Next_Non_Pragma (component_decl))
5247       {
5248         gnat_field = Defining_Entity (component_decl);
5249
5250         if (Chars (gnat_field) == Name_uParent)
5251           gnu_field = tree_last (TYPE_FIELDS (gnu_record_type));
5252         else
5253           {
5254             gnu_field = gnat_to_gnu_field (gnat_field, gnu_record_type,
5255                                            packed, definition);
5256
5257             /* If this is the _Tag field, put it before any discriminants,
5258                instead of after them as is the case for all other fields.
5259                Ignore field of void type if only annotating.  */
5260             if (Chars (gnat_field) == Name_uTag)
5261               gnu_field_list = chainon (gnu_field_list, gnu_field);
5262             else
5263               {
5264                 TREE_CHAIN (gnu_field) = gnu_field_list;
5265                 gnu_field_list = gnu_field;
5266               }
5267           }
5268
5269           save_gnu_tree (gnat_field, gnu_field, 0);
5270         }
5271
5272   /* At the end of the component list there may be a variant part.  */
5273   variant_part = Variant_Part (component_list);
5274
5275   /* If this is an unchecked union, each variant must have exactly one
5276      component, each of which becomes one component of this union.  */
5277   if (TREE_CODE (gnu_record_type) == UNION_TYPE && Present (variant_part))
5278     for (variant = First_Non_Pragma (Variants (variant_part));
5279          Present (variant);
5280          variant = Next_Non_Pragma (variant))
5281       {
5282         component_decl
5283           = First_Non_Pragma (Component_Items (Component_List (variant)));
5284         gnat_field = Defining_Entity (component_decl);
5285         gnu_field = gnat_to_gnu_field (gnat_field, gnu_record_type, packed,
5286                                        definition);
5287         TREE_CHAIN (gnu_field) = gnu_field_list;
5288         gnu_field_list = gnu_field;
5289         save_gnu_tree (gnat_field, gnu_field, 0);
5290       }
5291
5292   /* We create a QUAL_UNION_TYPE for the variant part since the variants are
5293      mutually exclusive and should go in the same memory.  To do this we need
5294      to treat each variant as a record whose elements are created from the
5295      component list for the variant.  So here we create the records from the
5296      lists for the variants and put them all into the QUAL_UNION_TYPE.  */
5297   else if (Present (variant_part))
5298     {
5299       tree gnu_discriminant = gnat_to_gnu (Name (variant_part));
5300       Node_Id variant;
5301       tree gnu_union_type = make_node (QUAL_UNION_TYPE);
5302       tree gnu_union_field;
5303       tree gnu_variant_list = NULL_TREE;
5304       tree gnu_name = TYPE_NAME (gnu_record_type);
5305       tree gnu_var_name
5306         = concat_id_with_name
5307           (get_identifier (Get_Name_String (Chars (Name (variant_part)))),
5308            "XVN");
5309
5310       if (TREE_CODE (gnu_name) == TYPE_DECL)
5311         gnu_name = DECL_NAME (gnu_name);
5312
5313       TYPE_NAME (gnu_union_type)
5314         = concat_id_with_name (gnu_name, IDENTIFIER_POINTER (gnu_var_name));
5315       TYPE_PACKED (gnu_union_type) = TYPE_PACKED (gnu_record_type);
5316
5317       for (variant = First_Non_Pragma (Variants (variant_part));
5318            Present (variant);
5319            variant = Next_Non_Pragma (variant))
5320         {
5321           tree gnu_variant_type = make_node (RECORD_TYPE);
5322           tree gnu_inner_name;
5323           tree gnu_qual;
5324
5325           Get_Variant_Encoding (variant);
5326           gnu_inner_name = get_identifier (Name_Buffer);
5327           TYPE_NAME (gnu_variant_type)
5328             = concat_id_with_name (TYPE_NAME (gnu_union_type),
5329                                    IDENTIFIER_POINTER (gnu_inner_name));
5330
5331           /* Set the alignment of the inner type in case we need to make
5332              inner objects into bitfields, but then clear it out
5333              so the record actually gets only the alignment required.  */
5334           TYPE_ALIGN (gnu_variant_type) = TYPE_ALIGN (gnu_record_type);
5335           TYPE_PACKED (gnu_variant_type) = TYPE_PACKED (gnu_record_type);
5336
5337           /* Similarly, if the outer record has a size specified and all fields
5338              have record rep clauses, we can propagate the size into the
5339              variant part.  */
5340           if (all_rep_and_size)
5341             {
5342               TYPE_SIZE (gnu_variant_type) = TYPE_SIZE (gnu_record_type);
5343               TYPE_SIZE_UNIT (gnu_variant_type)
5344                 = TYPE_SIZE_UNIT (gnu_record_type);
5345             }
5346
5347           components_to_record (gnu_variant_type, Component_List (variant),
5348                                 NULL_TREE, packed, definition,
5349                                 &gnu_our_rep_list, !all_rep_and_size, all_rep);
5350
5351           gnu_qual = choices_to_gnu (gnu_discriminant,
5352                                      Discrete_Choices (variant));
5353
5354           Set_Present_Expr (variant, annotate_value (gnu_qual));
5355           gnu_field = create_field_decl (gnu_inner_name, gnu_variant_type,
5356                                          gnu_union_type, 0,
5357                                          (all_rep_and_size
5358                                           ? TYPE_SIZE (gnu_record_type) : 0),
5359                                          (all_rep_and_size
5360                                           ? bitsize_zero_node : 0),
5361                                          0);
5362
5363           DECL_INTERNAL_P (gnu_field) = 1;
5364           DECL_QUALIFIER (gnu_field) = gnu_qual;
5365           TREE_CHAIN (gnu_field) = gnu_variant_list;
5366           gnu_variant_list = gnu_field;
5367         }
5368
5369       /* We use to delete the empty variants from the end. However,
5370          we no longer do that because we need them to generate complete
5371          debugging information for the variant record.  Otherwise,
5372          the union type definition will be missing the fields associated
5373          to these empty variants.  */
5374
5375       /* Only make the QUAL_UNION_TYPE if there are any non-empty variants.  */
5376       if (gnu_variant_list != 0)
5377         {
5378           if (all_rep_and_size)
5379             {
5380               TYPE_SIZE (gnu_union_type) = TYPE_SIZE (gnu_record_type);
5381               TYPE_SIZE_UNIT (gnu_union_type)
5382                 = TYPE_SIZE_UNIT (gnu_record_type);
5383             }
5384
5385           finish_record_type (gnu_union_type, nreverse (gnu_variant_list),
5386                               all_rep_and_size, 0);
5387
5388           gnu_union_field
5389             = create_field_decl (gnu_var_name, gnu_union_type, gnu_record_type,
5390                                  packed,
5391                                  all_rep ? TYPE_SIZE (gnu_union_type) : 0,
5392                                  all_rep ? bitsize_zero_node : 0, 0);
5393
5394           DECL_INTERNAL_P (gnu_union_field) = 1;
5395           TREE_CHAIN (gnu_union_field) = gnu_field_list;
5396           gnu_field_list = gnu_union_field;
5397         }
5398     }
5399
5400   /* Scan GNU_FIELD_LIST and see if any fields have rep clauses.  If they
5401      do, pull them out and put them into GNU_OUR_REP_LIST.  We have to do this
5402      in a separate pass since we want to handle the discriminants but can't
5403      play with them until we've used them in debugging data above.
5404
5405      ??? Note: if we then reorder them, debugging information will be wrong,
5406      but there's nothing that can be done about this at the moment.  */
5407
5408   for (gnu_field = gnu_field_list, gnu_last = 0; gnu_field; )
5409     {
5410       if (DECL_FIELD_OFFSET (gnu_field) != 0)
5411         {
5412           tree gnu_next = TREE_CHAIN (gnu_field);
5413
5414           if (gnu_last == 0)
5415             gnu_field_list = gnu_next;
5416           else
5417             TREE_CHAIN (gnu_last) = gnu_next;
5418
5419           TREE_CHAIN (gnu_field) = gnu_our_rep_list;
5420           gnu_our_rep_list = gnu_field;
5421           gnu_field = gnu_next;
5422         }
5423       else
5424         {
5425           gnu_last = gnu_field;
5426           gnu_field = TREE_CHAIN (gnu_field);
5427         }
5428     }
5429
5430   /* If we have any items in our rep'ed field list, it is not the case that all
5431      the fields in the record have rep clauses, and P_REP_LIST is nonzero,
5432      set it and ignore the items.  Otherwise, sort the fields by bit position
5433      and put them into their own record if we have any fields without
5434      rep clauses. */
5435   if (gnu_our_rep_list != 0 && p_gnu_rep_list != 0 && ! all_rep)
5436     *p_gnu_rep_list = chainon (*p_gnu_rep_list, gnu_our_rep_list);
5437   else if (gnu_our_rep_list != 0)
5438     {
5439       tree gnu_rep_type
5440         = gnu_field_list == 0 ? gnu_record_type : make_node (RECORD_TYPE);
5441       int len = list_length (gnu_our_rep_list);
5442       tree *gnu_arr = (tree *) alloca (sizeof (tree) * len);
5443       int i;
5444
5445       /* Set DECL_SECTION_NAME to increasing integers so we have a
5446          stable sort.  */
5447       for (i = 0, gnu_field = gnu_our_rep_list; gnu_field;
5448            gnu_field = TREE_CHAIN (gnu_field), i++)
5449         {
5450           gnu_arr[i] = gnu_field;
5451           DECL_SECTION_NAME (gnu_field) = size_int (i);
5452         }
5453
5454       qsort (gnu_arr, len, sizeof (tree), compare_field_bitpos);
5455
5456       /* Put the fields in the list in order of increasing position, which
5457          means we start from the end.  */
5458       gnu_our_rep_list = NULL_TREE;
5459       for (i = len - 1; i >= 0; i--)
5460         {
5461           TREE_CHAIN (gnu_arr[i]) = gnu_our_rep_list;
5462           gnu_our_rep_list = gnu_arr[i];
5463           DECL_CONTEXT (gnu_arr[i]) = gnu_rep_type;
5464           DECL_SECTION_NAME (gnu_arr[i]) = 0;
5465         }
5466
5467       if (gnu_field_list != 0)
5468         {
5469           finish_record_type (gnu_rep_type, gnu_our_rep_list, 1, 0);
5470           gnu_field = create_field_decl (get_identifier ("REP"), gnu_rep_type,
5471                                          gnu_record_type, 0, 0, 0, 1);
5472           DECL_INTERNAL_P (gnu_field) = 1;
5473           gnu_field_list = chainon (gnu_field_list, gnu_field);
5474         }
5475       else
5476         {
5477           layout_with_rep = 1;
5478           gnu_field_list = nreverse (gnu_our_rep_list);
5479         }
5480     }
5481
5482   if (cancel_alignment)
5483     TYPE_ALIGN (gnu_record_type) = 0;
5484
5485   finish_record_type (gnu_record_type, nreverse (gnu_field_list),
5486                       layout_with_rep, 0);
5487 }
5488 \f
5489 /* Called via qsort from the above.  Returns -1, 1, depending on the
5490    bit positions and ordinals of the two fields.  */
5491
5492 static int
5493 compare_field_bitpos (const PTR rt1, const PTR rt2)
5494 {
5495   tree *t1 = (tree *) rt1;
5496   tree *t2 = (tree *) rt2;
5497
5498   if (tree_int_cst_equal (bit_position (*t1), bit_position (*t2)))
5499     return
5500       (tree_int_cst_lt (DECL_SECTION_NAME (*t1), DECL_SECTION_NAME (*t2))
5501        ? -1 : 1);
5502   else if (tree_int_cst_lt (bit_position (*t1), bit_position (*t2)))
5503     return -1;
5504   else
5505     return 1;
5506 }
5507 \f
5508 /* Given GNU_SIZE, a GCC tree representing a size, return a Uint to be
5509    placed into an Esize, Component_Bit_Offset, or Component_Size value
5510    in the GNAT tree.  */
5511
5512 static Uint
5513 annotate_value (tree gnu_size)
5514 {
5515   int len = TREE_CODE_LENGTH (TREE_CODE (gnu_size));
5516   TCode tcode;
5517   Node_Ref_Or_Val ops[3], ret;
5518   int i;
5519   int size;
5520
5521   /* If back annotation is suppressed by the front end, return No_Uint */
5522   if (!Back_Annotate_Rep_Info)
5523     return No_Uint;
5524
5525   /* See if we've already saved the value for this node.  */
5526   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (gnu_size)))
5527       && TREE_COMPLEXITY (gnu_size) != 0)
5528     return (Node_Ref_Or_Val) TREE_COMPLEXITY (gnu_size);
5529
5530   /* If we do not return inside this switch, TCODE will be set to the
5531      code to use for a Create_Node operand and LEN (set above) will be
5532      the number of recursive calls for us to make.  */
5533
5534   switch (TREE_CODE (gnu_size))
5535     {
5536     case INTEGER_CST:
5537       if (TREE_OVERFLOW (gnu_size))
5538         return No_Uint;
5539
5540       /* This may have come from a conversion from some smaller type,
5541          so ensure this is in bitsizetype.  */
5542       gnu_size = convert (bitsizetype, gnu_size);
5543
5544       /* For negative values, use NEGATE_EXPR of the supplied value.  */
5545       if (tree_int_cst_sgn (gnu_size) < 0)
5546         {
5547           /* The rediculous code below is to handle the case of the largest
5548              negative integer.  */
5549           tree negative_size = size_diffop (bitsize_zero_node, gnu_size);
5550           int adjust = 0;
5551           tree temp;
5552
5553           if (TREE_CONSTANT_OVERFLOW (negative_size))
5554             {
5555               negative_size
5556                 = size_binop (MINUS_EXPR, bitsize_zero_node,
5557                               size_binop (PLUS_EXPR, gnu_size,
5558                                           bitsize_one_node));
5559               adjust = 1;
5560             }
5561
5562           temp = build1 (NEGATE_EXPR, bitsizetype, negative_size);
5563           if (adjust)
5564             temp = build (MINUS_EXPR, bitsizetype, temp, bitsize_one_node);
5565
5566           return annotate_value (temp);
5567         }
5568
5569       if (! host_integerp (gnu_size, 1))
5570         return No_Uint;
5571
5572       size = tree_low_cst (gnu_size, 1);
5573
5574       /* This peculiar test is to make sure that the size fits in an int
5575          on machines where HOST_WIDE_INT is not "int".  */
5576       if (tree_low_cst (gnu_size, 1) == size)
5577         return UI_From_Int (size);
5578       else
5579         return No_Uint;
5580
5581     case COMPONENT_REF:
5582       /* The only case we handle here is a simple discriminant reference.  */
5583       if (TREE_CODE (TREE_OPERAND (gnu_size, 0)) == PLACEHOLDER_EXPR
5584           && TREE_CODE (TREE_OPERAND (gnu_size, 1)) == FIELD_DECL
5585           && DECL_DISCRIMINANT_NUMBER (TREE_OPERAND (gnu_size, 1)) != 0)
5586         return Create_Node (Discrim_Val,
5587                             annotate_value (DECL_DISCRIMINANT_NUMBER
5588                                             (TREE_OPERAND (gnu_size, 1))),
5589                             No_Uint, No_Uint);
5590       else
5591         return No_Uint;
5592
5593     case NOP_EXPR:  case CONVERT_EXPR:   case NON_LVALUE_EXPR:
5594       return annotate_value (TREE_OPERAND (gnu_size, 0));
5595
5596       /* Now just list the operations we handle.  */
5597     case COND_EXPR:             tcode = Cond_Expr; break;
5598     case PLUS_EXPR:             tcode = Plus_Expr; break;
5599     case MINUS_EXPR:            tcode = Minus_Expr; break;
5600     case MULT_EXPR:             tcode = Mult_Expr; break;
5601     case TRUNC_DIV_EXPR:        tcode = Trunc_Div_Expr; break;
5602     case CEIL_DIV_EXPR:         tcode = Ceil_Div_Expr; break;
5603     case FLOOR_DIV_EXPR:        tcode = Floor_Div_Expr; break;
5604     case TRUNC_MOD_EXPR:        tcode = Trunc_Mod_Expr; break;
5605     case CEIL_MOD_EXPR:         tcode = Ceil_Mod_Expr; break;
5606     case FLOOR_MOD_EXPR:        tcode = Floor_Mod_Expr; break;
5607     case EXACT_DIV_EXPR:        tcode = Exact_Div_Expr; break;
5608     case NEGATE_EXPR:           tcode = Negate_Expr; break;
5609     case MIN_EXPR:              tcode = Min_Expr; break;
5610     case MAX_EXPR:              tcode = Max_Expr; break;
5611     case ABS_EXPR:              tcode = Abs_Expr; break;
5612     case TRUTH_ANDIF_EXPR:      tcode = Truth_Andif_Expr; break;
5613     case TRUTH_ORIF_EXPR:       tcode = Truth_Orif_Expr; break;
5614     case TRUTH_AND_EXPR:        tcode = Truth_And_Expr; break;
5615     case TRUTH_OR_EXPR:         tcode = Truth_Or_Expr; break;
5616     case TRUTH_XOR_EXPR:        tcode = Truth_Xor_Expr; break;
5617     case TRUTH_NOT_EXPR:        tcode = Truth_Not_Expr; break;
5618     case LT_EXPR:               tcode = Lt_Expr; break;
5619     case LE_EXPR:               tcode = Le_Expr; break;
5620     case GT_EXPR:               tcode = Gt_Expr; break;
5621     case GE_EXPR:               tcode = Ge_Expr; break;
5622     case EQ_EXPR:               tcode = Eq_Expr; break;
5623     case NE_EXPR:               tcode = Ne_Expr; break;
5624
5625     default:
5626       return No_Uint;
5627     }
5628
5629   /* Now get each of the operands that's relevant for this code.  If any
5630      cannot be expressed as a repinfo node, say we can't.  */
5631   for (i = 0; i < 3; i++)
5632     ops[i] = No_Uint;
5633
5634   for (i = 0; i < len; i++)
5635     {
5636       ops[i] = annotate_value (TREE_OPERAND (gnu_size, i));
5637       if (ops[i] == No_Uint)
5638         return No_Uint;
5639     }
5640
5641   ret = Create_Node (tcode, ops[0], ops[1], ops[2]);
5642   TREE_COMPLEXITY (gnu_size) = ret;
5643   return ret;
5644 }
5645
5646 /* Given GNAT_ENTITY, a record type, and GNU_TYPE, its corresponding
5647    GCC type, set Component_Bit_Offset and Esize to the position and size
5648    used by Gigi.  */
5649
5650 static void
5651 annotate_rep (Entity_Id gnat_entity, tree gnu_type)
5652 {
5653   tree gnu_list;
5654   tree gnu_entry;
5655   Entity_Id gnat_field;
5656
5657   /* We operate by first making a list of all field and their positions
5658      (we can get the sizes easily at any time) by a recursive call
5659      and then update all the sizes into the tree.  */
5660   gnu_list = compute_field_positions (gnu_type, NULL_TREE,
5661                                       size_zero_node, bitsize_zero_node,
5662                                       BIGGEST_ALIGNMENT);
5663
5664   for (gnat_field = First_Entity (gnat_entity); Present (gnat_field);
5665        gnat_field = Next_Entity (gnat_field))
5666     if ((Ekind (gnat_field) == E_Component
5667          || (Ekind (gnat_field) == E_Discriminant
5668              && ! Is_Unchecked_Union (Scope (gnat_field)))))
5669       {
5670         tree parent_offset = bitsize_zero_node;
5671
5672         gnu_entry
5673           = purpose_member (gnat_to_gnu_entity (gnat_field, NULL_TREE, 0),
5674                             gnu_list);
5675
5676         if (gnu_entry)
5677           {
5678             if (type_annotate_only && Is_Tagged_Type (gnat_entity))
5679               {
5680                 /* In this mode the tag and parent components have not been
5681                    generated, so we add the appropriate offset to each
5682                    component.  For a component appearing in the current
5683                    extension, the offset is the size of the parent.  */
5684             if (Is_Derived_Type (gnat_entity)
5685                 && Original_Record_Component (gnat_field) == gnat_field)
5686               parent_offset
5687                 = UI_To_gnu (Esize (Etype (Base_Type (gnat_entity))),
5688                              bitsizetype);
5689             else
5690               parent_offset = bitsize_int (POINTER_SIZE);
5691           }
5692
5693           Set_Component_Bit_Offset
5694             (gnat_field,
5695              annotate_value
5696              (size_binop (PLUS_EXPR,
5697                           bit_from_pos (TREE_PURPOSE (TREE_VALUE (gnu_entry)),
5698                                         TREE_VALUE (TREE_VALUE
5699                                                     (TREE_VALUE (gnu_entry)))),
5700                           parent_offset)));
5701
5702             Set_Esize (gnat_field,
5703                        annotate_value (DECL_SIZE (TREE_PURPOSE (gnu_entry))));
5704           }
5705         else if (type_annotate_only
5706                  && Is_Tagged_Type (gnat_entity)
5707                  && Is_Derived_Type (gnat_entity))
5708           {
5709             /* If there is no gnu_entry, this is an inherited component whose
5710                position is the same as in the parent type.  */
5711             Set_Component_Bit_Offset
5712               (gnat_field,
5713                Component_Bit_Offset (Original_Record_Component (gnat_field)));
5714             Set_Esize (gnat_field,
5715                        Esize (Original_Record_Component (gnat_field)));
5716           }
5717       }
5718 }
5719
5720 /* Scan all fields in GNU_TYPE and build entries where TREE_PURPOSE is the
5721    FIELD_DECL and TREE_VALUE a TREE_LIST with TREE_PURPOSE being the byte
5722    position and TREE_VALUE being a TREE_LIST with TREE_PURPOSE the value to be
5723    placed into DECL_OFFSET_ALIGN and TREE_VALUE the bit position.  GNU_POS is
5724    to be added to the position, GNU_BITPOS to the bit position, OFFSET_ALIGN is
5725    the present value of DECL_OFFSET_ALIGN and GNU_LIST is a list of the entries
5726    so far.  */
5727
5728 static tree
5729 compute_field_positions (tree gnu_type,
5730                          tree gnu_list,
5731                          tree gnu_pos,
5732                          tree gnu_bitpos,
5733                          unsigned int offset_align)
5734 {
5735   tree gnu_field;
5736   tree gnu_result = gnu_list;
5737
5738   for (gnu_field = TYPE_FIELDS (gnu_type); gnu_field;
5739        gnu_field = TREE_CHAIN (gnu_field))
5740     {
5741       tree gnu_our_bitpos = size_binop (PLUS_EXPR, gnu_bitpos,
5742                                         DECL_FIELD_BIT_OFFSET (gnu_field));
5743       tree gnu_our_offset = size_binop (PLUS_EXPR, gnu_pos,
5744                                         DECL_FIELD_OFFSET (gnu_field));
5745       unsigned int our_offset_align
5746         = MIN (offset_align, DECL_OFFSET_ALIGN (gnu_field));
5747
5748       gnu_result
5749         = tree_cons (gnu_field,
5750                      tree_cons (gnu_our_offset,
5751                                 tree_cons (size_int (our_offset_align),
5752                                            gnu_our_bitpos, NULL_TREE),
5753                                 NULL_TREE),
5754                      gnu_result);
5755
5756       if (DECL_INTERNAL_P (gnu_field))
5757         gnu_result
5758           = compute_field_positions (TREE_TYPE (gnu_field), gnu_result,
5759                                      gnu_our_offset, gnu_our_bitpos,
5760                                      our_offset_align);
5761     }
5762
5763   return gnu_result;
5764 }
5765 \f
5766 /* UINT_SIZE is a Uint giving the specified size for an object of GNU_TYPE
5767    corresponding to GNAT_OBJECT.  If size is valid, return a tree corresponding
5768    to its value.  Otherwise return 0.  KIND is VAR_DECL is we are specifying
5769    the size for an object, TYPE_DECL for the size of a type, and FIELD_DECL
5770    for the size of a field.  COMPONENT_P is true if we are being called
5771    to process the Component_Size of GNAT_OBJECT.  This is used for error
5772    message handling and to indicate to use the object size of GNU_TYPE.
5773    ZERO_OK is nonzero if a size of zero is permitted; if ZERO_OK is zero,
5774    it means that a size of zero should be treated as an unspecified size.  */
5775
5776 static tree
5777 validate_size (Uint uint_size, tree gnu_type, Entity_Id gnat_object,
5778                enum tree_code kind, int component_p, int zero_ok)
5779 {
5780   Node_Id gnat_error_node;
5781   tree type_size
5782     = kind == VAR_DECL ? TYPE_SIZE (gnu_type) : rm_size (gnu_type);
5783   tree size;
5784
5785   /* Find the node to use for errors.  */
5786   if ((Ekind (gnat_object) == E_Component
5787        || Ekind (gnat_object) == E_Discriminant)
5788       && Present (Component_Clause (gnat_object)))
5789     gnat_error_node = Last_Bit (Component_Clause (gnat_object));
5790   else if (Present (Size_Clause (gnat_object)))
5791     gnat_error_node = Expression (Size_Clause (gnat_object));
5792   else
5793     gnat_error_node = gnat_object;
5794
5795   /* Return 0 if no size was specified, either because Esize was not Present or
5796      the specified size was zero.  */
5797   if (No (uint_size) || uint_size == No_Uint)
5798     return 0;
5799
5800   /* Get the size as a tree.  Give an error if a size was specified, but cannot
5801      be represented as in sizetype. */
5802   size = UI_To_gnu (uint_size, bitsizetype);
5803   if (TREE_OVERFLOW (size))
5804     {
5805       post_error_ne (component_p ? "component size of & is too large"
5806                      : "size of & is too large",
5807                      gnat_error_node, gnat_object);
5808       return 0;
5809     }
5810   /* Ignore a negative size since that corresponds to our back-annotation.
5811      Also ignore a zero size unless a size clause exists.  */
5812   else if (tree_int_cst_sgn (size) < 0 || (integer_zerop (size) && ! zero_ok))
5813     return 0;
5814
5815   /* The size of objects is always a multiple of a byte.  */
5816   if (kind == VAR_DECL
5817       && ! integer_zerop (size_binop (TRUNC_MOD_EXPR, size,
5818                                       bitsize_unit_node)))
5819     {
5820       if (component_p)
5821         post_error_ne ("component size for& is not a multiple of Storage_Unit",
5822                        gnat_error_node, gnat_object);
5823       else
5824         post_error_ne ("size for& is not a multiple of Storage_Unit",
5825                        gnat_error_node, gnat_object);
5826       return 0;
5827     }
5828
5829   /* If this is an integral type or a packed array type, the front-end has
5830      verified the size, so we need not do it here (which would entail
5831      checking against the bounds).  However, if this is an aliased object, it
5832      may not be smaller than the type of the object.  */
5833   if ((INTEGRAL_TYPE_P (gnu_type) || TYPE_IS_PACKED_ARRAY_TYPE_P (gnu_type))
5834       && ! (kind == VAR_DECL && Is_Aliased (gnat_object)))
5835     return size;
5836
5837   /* If the object is a record that contains a template, add the size of
5838      the template to the specified size.  */
5839   if (TREE_CODE (gnu_type) == RECORD_TYPE
5840       && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
5841     size = size_binop (PLUS_EXPR, DECL_SIZE (TYPE_FIELDS (gnu_type)), size);
5842
5843   /* Modify the size of the type to be that of the maximum size if it has a
5844      discriminant or the size of a thin pointer if this is a fat pointer.  */
5845   if (type_size != 0 && CONTAINS_PLACEHOLDER_P (type_size))
5846     type_size = max_size (type_size, 1);
5847   else if (TYPE_FAT_POINTER_P (gnu_type))
5848     type_size = bitsize_int (POINTER_SIZE);
5849
5850   /* If this is an access type, the minimum size is that given by the smallest
5851      integral mode that's valid for pointers.  */
5852   if (TREE_CODE (gnu_type) == POINTER_TYPE)
5853     {
5854       enum machine_mode p_mode;
5855
5856       for (p_mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
5857            !targetm.valid_pointer_mode (p_mode);
5858            p_mode = GET_MODE_WIDER_MODE (p_mode))
5859         ;
5860
5861       type_size = bitsize_int (GET_MODE_BITSIZE (p_mode));
5862     }
5863
5864   /* If the size of the object is a constant, the new size must not be
5865      smaller.  */
5866   if (TREE_CODE (type_size) != INTEGER_CST
5867       || TREE_OVERFLOW (type_size)
5868       || tree_int_cst_lt (size, type_size))
5869     {
5870       if (component_p)
5871         post_error_ne_tree
5872           ("component size for& too small{, minimum allowed is ^}",
5873            gnat_error_node, gnat_object, type_size);
5874       else
5875         post_error_ne_tree ("size for& too small{, minimum allowed is ^}",
5876                             gnat_error_node, gnat_object, type_size);
5877
5878       if (kind == VAR_DECL && ! component_p
5879           && TREE_CODE (rm_size (gnu_type)) == INTEGER_CST
5880           && ! tree_int_cst_lt (size, rm_size (gnu_type)))
5881         post_error_ne_tree_2
5882           ("\\size of ^ is not a multiple of alignment (^ bits)",
5883            gnat_error_node, gnat_object, rm_size (gnu_type),
5884            TYPE_ALIGN (gnu_type));
5885
5886       else if (INTEGRAL_TYPE_P (gnu_type))
5887         post_error_ne ("\\size would be legal if & were not aliased!",
5888                        gnat_error_node, gnat_object);
5889
5890       return 0;
5891     }
5892
5893   return size;
5894 }
5895 \f
5896 /* Similarly, but both validate and process a value of RM_Size.  This
5897    routine is only called for types.  */
5898
5899 static void
5900 set_rm_size (Uint uint_size, tree gnu_type, Entity_Id gnat_entity)
5901 {
5902   /* Only give an error if a Value_Size clause was explicitly given.
5903      Otherwise, we'd be duplicating an error on the Size clause.  */
5904   Node_Id gnat_attr_node
5905     = Get_Attribute_Definition_Clause (gnat_entity, Attr_Value_Size);
5906   tree old_size = rm_size (gnu_type);
5907   tree size;
5908
5909   /* Get the size as a tree.  Do nothing if none was specified, either
5910      because RM_Size was not Present or if the specified size was zero.
5911      Give an error if a size was specified, but cannot be represented as
5912      in sizetype.  */
5913   if (No (uint_size) || uint_size == No_Uint)
5914     return;
5915
5916   size = UI_To_gnu (uint_size, bitsizetype);
5917   if (TREE_OVERFLOW (size))
5918     {
5919       if (Present (gnat_attr_node))
5920         post_error_ne ("Value_Size of & is too large", gnat_attr_node,
5921                        gnat_entity);
5922
5923       return;
5924     }
5925
5926   /* Ignore a negative size since that corresponds to our back-annotation.
5927      Also ignore a zero size unless a size clause exists, a Value_Size
5928      clause exists, or this is an integer type, in which case the
5929      front end will have always set it.  */
5930   else if (tree_int_cst_sgn (size) < 0
5931            || (integer_zerop (size) && No (gnat_attr_node)
5932                && ! Has_Size_Clause (gnat_entity)
5933                && ! Is_Discrete_Or_Fixed_Point_Type (gnat_entity)))
5934     return;
5935
5936   /* If the old size is self-referential, get the maximum size.  */
5937   if (CONTAINS_PLACEHOLDER_P (old_size))
5938     old_size = max_size (old_size, 1);
5939
5940   /* If the size of the object is a constant, the new size must not be
5941      smaller (the front end checks this for scalar types).  */
5942   if (TREE_CODE (old_size) != INTEGER_CST
5943       || TREE_OVERFLOW (old_size)
5944       || (AGGREGATE_TYPE_P (gnu_type)
5945           && tree_int_cst_lt (size, old_size)))
5946     {
5947       if (Present (gnat_attr_node))
5948         post_error_ne_tree
5949           ("Value_Size for& too small{, minimum allowed is ^}",
5950            gnat_attr_node, gnat_entity, old_size);
5951
5952       return;
5953     }
5954
5955   /* Otherwise, set the RM_Size.  */
5956   if (TREE_CODE (gnu_type) == INTEGER_TYPE
5957       && Is_Discrete_Or_Fixed_Point_Type (gnat_entity))
5958     TYPE_RM_SIZE_INT (gnu_type) = size;
5959   else if (TREE_CODE (gnu_type) == ENUMERAL_TYPE)
5960     SET_TYPE_RM_SIZE_ENUM (gnu_type, size);
5961   else if ((TREE_CODE (gnu_type) == RECORD_TYPE
5962             || TREE_CODE (gnu_type) == UNION_TYPE
5963             || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
5964            && ! TYPE_IS_FAT_POINTER_P (gnu_type))
5965     SET_TYPE_ADA_SIZE (gnu_type, size);
5966 }
5967 \f
5968 /* Given a type TYPE, return a new type whose size is appropriate for SIZE.
5969    If TYPE is the best type, return it.  Otherwise, make a new type.  We
5970    only support new integral and pointer types.  BIASED_P is nonzero if
5971    we are making a biased type.  */
5972
5973 static tree
5974 make_type_from_size (tree type, tree size_tree, int biased_p)
5975 {
5976   tree new_type;
5977   unsigned HOST_WIDE_INT size;
5978
5979   /* If size indicates an error, just return TYPE to avoid propagating the
5980      error.  Likewise if it's too large to represent.  */
5981   if (size_tree == 0 || ! host_integerp (size_tree, 1))
5982     return type;
5983
5984   size = tree_low_cst (size_tree, 1);
5985   switch (TREE_CODE (type))
5986     {
5987     case INTEGER_TYPE:
5988     case ENUMERAL_TYPE:
5989       /* Only do something if the type is not already the proper size and is
5990          not a packed array type.  */
5991       if (TYPE_PACKED_ARRAY_TYPE_P (type)
5992           || (TYPE_PRECISION (type) == size
5993               && biased_p == (TREE_CODE (type) == INTEGER_CST
5994                               && TYPE_BIASED_REPRESENTATION_P (type))))
5995         break;
5996
5997       size = MIN (size, LONG_LONG_TYPE_SIZE);
5998       new_type = make_signed_type (size);
5999       TREE_TYPE (new_type)
6000         = TREE_TYPE (type) != 0 ? TREE_TYPE (type) : type;
6001       TYPE_MIN_VALUE (new_type)
6002         = convert (TREE_TYPE (new_type), TYPE_MIN_VALUE (type));
6003       TYPE_MAX_VALUE (new_type)
6004         = convert (TREE_TYPE (new_type), TYPE_MAX_VALUE (type));
6005       TYPE_BIASED_REPRESENTATION_P (new_type)
6006         = ((TREE_CODE (type) == INTEGER_TYPE
6007             && TYPE_BIASED_REPRESENTATION_P (type))
6008            || biased_p);
6009       TREE_UNSIGNED (new_type)
6010         = TREE_UNSIGNED (type) | TYPE_BIASED_REPRESENTATION_P (new_type);
6011       TYPE_RM_SIZE_INT (new_type) = bitsize_int (size);
6012       return new_type;
6013
6014     case RECORD_TYPE:
6015       /* Do something if this is a fat pointer, in which case we
6016          may need to return the thin pointer.  */
6017       if (TYPE_IS_FAT_POINTER_P (type) && size < POINTER_SIZE * 2)
6018         return
6019           build_pointer_type
6020             (TYPE_OBJECT_RECORD_TYPE (TYPE_UNCONSTRAINED_ARRAY (type)));
6021       break;
6022
6023     case POINTER_TYPE:
6024       /* Only do something if this is a thin pointer, in which case we
6025          may need to return the fat pointer.  */
6026       if (TYPE_THIN_POINTER_P (type) && size >= POINTER_SIZE * 2)
6027         return
6028           build_pointer_type (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)));
6029
6030       break;
6031
6032     default:
6033       break;
6034     }
6035
6036   return type;
6037 }
6038 \f
6039 /* ALIGNMENT is a Uint giving the alignment specified for GNAT_ENTITY,
6040    a type or object whose present alignment is ALIGN.  If this alignment is
6041    valid, return it.  Otherwise, give an error and return ALIGN.  */
6042
6043 static unsigned int
6044 validate_alignment (Uint alignment, Entity_Id gnat_entity, unsigned int align)
6045 {
6046   Node_Id gnat_error_node = gnat_entity;
6047   unsigned int new_align;
6048
6049 #ifndef MAX_OFILE_ALIGNMENT
6050 #define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
6051 #endif
6052
6053   if (Present (Alignment_Clause (gnat_entity)))
6054     gnat_error_node = Expression (Alignment_Clause (gnat_entity));
6055
6056   /* Don't worry about checking alignment if alignment was not specified
6057      by the source program and we already posted an error for this entity.  */
6058
6059   if (Error_Posted (gnat_entity) && !Has_Alignment_Clause (gnat_entity))
6060     return align;
6061
6062   /* Within GCC, an alignment is an integer, so we must make sure a
6063      value is specified that fits in that range.  Also, alignments of
6064      more than MAX_OFILE_ALIGNMENT can't be supported.  */
6065
6066   if (! UI_Is_In_Int_Range (alignment)
6067       || ((new_align = UI_To_Int (alignment))
6068            > MAX_OFILE_ALIGNMENT / BITS_PER_UNIT))
6069     post_error_ne_num ("largest supported alignment for& is ^",
6070                        gnat_error_node, gnat_entity,
6071                        MAX_OFILE_ALIGNMENT / BITS_PER_UNIT);
6072   else if (! (Present (Alignment_Clause (gnat_entity))
6073               && From_At_Mod (Alignment_Clause (gnat_entity)))
6074            && new_align * BITS_PER_UNIT < align)
6075     post_error_ne_num ("alignment for& must be at least ^",
6076                        gnat_error_node, gnat_entity,
6077                        align / BITS_PER_UNIT);
6078   else
6079     align = MAX (align, new_align == 0 ? 1 : new_align * BITS_PER_UNIT);
6080
6081   return align;
6082 }
6083 \f
6084 /* Verify that OBJECT, a type or decl, is something we can implement
6085    atomically.  If not, give an error for GNAT_ENTITY.  COMP_P is nonzero
6086    if we require atomic components.  */
6087
6088 static void
6089 check_ok_for_atomic (tree object, Entity_Id gnat_entity, int comp_p)
6090 {
6091   Node_Id gnat_error_point = gnat_entity;
6092   Node_Id gnat_node;
6093   enum machine_mode mode;
6094   unsigned int align;
6095   tree size;
6096
6097   /* There are three case of what OBJECT can be.  It can be a type, in which
6098      case we take the size, alignment and mode from the type.  It can be a
6099      declaration that was indirect, in which case the relevant values are
6100      that of the type being pointed to, or it can be a normal declaration,
6101      in which case the values are of the decl.  The code below assumes that
6102      OBJECT is either a type or a decl.  */
6103   if (TYPE_P (object))
6104     {
6105       mode = TYPE_MODE (object);
6106       align = TYPE_ALIGN (object);
6107       size = TYPE_SIZE (object);
6108     }
6109   else if (DECL_BY_REF_P (object))
6110     {
6111       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (object)));
6112       align = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (object)));
6113       size = TYPE_SIZE (TREE_TYPE (TREE_TYPE (object)));
6114     }
6115   else
6116     {
6117       mode = DECL_MODE (object);
6118       align = DECL_ALIGN (object);
6119       size = DECL_SIZE (object);
6120     }
6121
6122   /* Consider all floating-point types atomic and any types that that are
6123      represented by integers no wider than a machine word.  */
6124   if (GET_MODE_CLASS (mode) == MODE_FLOAT
6125       || ((GET_MODE_CLASS (mode) == MODE_INT
6126            || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
6127           && GET_MODE_BITSIZE (mode) <= BITS_PER_WORD))
6128     return;
6129
6130   /* For the moment, also allow anything that has an alignment equal
6131      to its size and which is smaller than a word.  */
6132   if (size != 0 && TREE_CODE (size) == INTEGER_CST
6133       && compare_tree_int (size, align) == 0
6134       && align <= BITS_PER_WORD)
6135     return;
6136
6137   for (gnat_node = First_Rep_Item (gnat_entity); Present (gnat_node);
6138        gnat_node = Next_Rep_Item (gnat_node))
6139     {
6140       if (! comp_p && Nkind (gnat_node) == N_Pragma
6141           && Get_Pragma_Id (Chars (gnat_node)) == Pragma_Atomic)
6142         gnat_error_point = First (Pragma_Argument_Associations (gnat_node));
6143       else if (comp_p && Nkind (gnat_node) == N_Pragma
6144                && (Get_Pragma_Id (Chars (gnat_node))
6145                    == Pragma_Atomic_Components))
6146         gnat_error_point = First (Pragma_Argument_Associations (gnat_node));
6147     }
6148
6149   if (comp_p)
6150     post_error_ne ("atomic access to component of & cannot be guaranteed",
6151                    gnat_error_point, gnat_entity);
6152   else
6153     post_error_ne ("atomic access to & cannot be guaranteed",
6154                    gnat_error_point, gnat_entity);
6155 }
6156 \f
6157 /* Given a type T, a FIELD_DECL F, and a replacement value R,
6158    return a new type with all size expressions that contain F
6159    updated by replacing F with R.  This is identical to GCC's
6160    substitute_in_type except that it knows about TYPE_INDEX_TYPE.
6161    If F is NULL_TREE, always make a new RECORD_TYPE, even if nothing has
6162    changed.  */
6163
6164 tree
6165 gnat_substitute_in_type (tree t, tree f, tree r)
6166 {
6167   tree new = t;
6168   tree tem;
6169
6170   switch (TREE_CODE (t))
6171     {
6172     case INTEGER_TYPE:
6173     case ENUMERAL_TYPE:
6174     case BOOLEAN_TYPE:
6175     case CHAR_TYPE:
6176       if (CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (t))
6177           || CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (t)))
6178         {
6179           tree low = substitute_in_expr (TYPE_MIN_VALUE (t), f, r);
6180           tree high = substitute_in_expr (TYPE_MAX_VALUE (t), f, r);
6181
6182           if (low == TYPE_MIN_VALUE (t) && high == TYPE_MAX_VALUE (t))
6183             return t;
6184
6185           new = build_range_type (TREE_TYPE (t), low, high);
6186           if (TYPE_INDEX_TYPE (t))
6187             SET_TYPE_INDEX_TYPE (new,
6188                 gnat_substitute_in_type (TYPE_INDEX_TYPE (t), f, r));
6189           return new;
6190         }
6191
6192       return t;
6193
6194     case REAL_TYPE:
6195       if ((TYPE_MIN_VALUE (t) != 0
6196            && CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (t)))
6197           || (TYPE_MAX_VALUE (t) != 0
6198               && CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (t))))
6199         {
6200           tree low = 0, high = 0;
6201
6202           if (TYPE_MIN_VALUE (t))
6203             low = substitute_in_expr (TYPE_MIN_VALUE (t), f, r);
6204           if (TYPE_MAX_VALUE (t))
6205             high = substitute_in_expr (TYPE_MAX_VALUE (t), f, r);
6206
6207           if (low == TYPE_MIN_VALUE (t) && high == TYPE_MAX_VALUE (t))
6208             return t;
6209
6210           t = copy_type (t);
6211           TYPE_MIN_VALUE (t) = low;
6212           TYPE_MAX_VALUE (t) = high;
6213         }
6214       return t;
6215
6216     case COMPLEX_TYPE:
6217       tem = gnat_substitute_in_type (TREE_TYPE (t), f, r);
6218       if (tem == TREE_TYPE (t))
6219         return t;
6220
6221       return build_complex_type (tem);
6222
6223     case OFFSET_TYPE:
6224     case METHOD_TYPE:
6225     case FILE_TYPE:
6226     case SET_TYPE:
6227     case FUNCTION_TYPE:
6228     case LANG_TYPE:
6229       /* Don't know how to do these yet.  */
6230       abort ();
6231
6232     case ARRAY_TYPE:
6233       {
6234         tree component = gnat_substitute_in_type (TREE_TYPE (t), f, r);
6235         tree domain = gnat_substitute_in_type (TYPE_DOMAIN (t), f, r);
6236
6237         if (component == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
6238           return t;
6239
6240         new = build_array_type (component, domain);
6241         TYPE_SIZE (new) = 0;
6242         TYPE_MULTI_ARRAY_P (new) = TYPE_MULTI_ARRAY_P (t);
6243         TYPE_CONVENTION_FORTRAN_P (new) = TYPE_CONVENTION_FORTRAN_P (t);
6244         layout_type (new);
6245         TYPE_ALIGN (new) = TYPE_ALIGN (t);
6246         return new;
6247       }
6248
6249     case RECORD_TYPE:
6250     case UNION_TYPE:
6251     case QUAL_UNION_TYPE:
6252       {
6253         tree field;
6254         int changed_field
6255           = (f == NULL_TREE && ! TREE_CONSTANT (TYPE_SIZE (t)));
6256         int field_has_rep = 0;
6257         tree last_field = 0;
6258
6259         tree new = copy_type (t);
6260
6261         /* Start out with no fields, make new fields, and chain them
6262            in.  If we haven't actually changed the type of any field,
6263            discard everything we've done and return the old type.  */
6264
6265         TYPE_FIELDS (new) = 0;
6266         TYPE_SIZE (new) = 0;
6267
6268         for (field = TYPE_FIELDS (t); field;
6269              field = TREE_CHAIN (field))
6270           {
6271             tree new_field = copy_node (field);
6272
6273             TREE_TYPE (new_field)
6274               = gnat_substitute_in_type (TREE_TYPE (new_field), f, r);
6275
6276             if (DECL_HAS_REP_P (field) && ! DECL_INTERNAL_P (field))
6277               field_has_rep = 1;
6278             else if (TREE_TYPE (new_field) != TREE_TYPE (field))
6279               changed_field = 1;
6280
6281             /* If this is an internal field and the type of this field is
6282                a UNION_TYPE or RECORD_TYPE with no elements, ignore it.  If
6283                the type just has one element, treat that as the field.
6284                But don't do this if we are processing a QUAL_UNION_TYPE.  */
6285             if (TREE_CODE (t) != QUAL_UNION_TYPE
6286                 && DECL_INTERNAL_P (new_field)
6287                 && (TREE_CODE (TREE_TYPE (new_field)) == UNION_TYPE
6288                     || TREE_CODE (TREE_TYPE (new_field)) == RECORD_TYPE))
6289               {
6290                 if (TYPE_FIELDS (TREE_TYPE (new_field)) == 0)
6291                   continue;
6292
6293                 if (TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new_field))) == 0)
6294                   {
6295                     tree next_new_field
6296                       = copy_node (TYPE_FIELDS (TREE_TYPE (new_field)));
6297
6298                     /* Make sure omitting the union doesn't change
6299                        the layout.  */
6300                     DECL_ALIGN (next_new_field) = DECL_ALIGN (new_field);
6301                     new_field = next_new_field;
6302                   }
6303               }
6304
6305             DECL_CONTEXT (new_field) = new;
6306             SET_DECL_ORIGINAL_FIELD (new_field,
6307                (DECL_ORIGINAL_FIELD (field) != 0
6308                 ? DECL_ORIGINAL_FIELD (field) : field));
6309
6310             /* If the size of the old field was set at a constant,
6311                propagate the size in case the type's size was variable.
6312                (This occurs in the case of a variant or discriminated
6313                record with a default size used as a field of another
6314                record.)  */
6315             DECL_SIZE (new_field)
6316               = TREE_CODE (DECL_SIZE (field)) == INTEGER_CST
6317                 ? DECL_SIZE (field) : 0;
6318             DECL_SIZE_UNIT (new_field)
6319               = TREE_CODE (DECL_SIZE_UNIT (field)) == INTEGER_CST
6320                 ? DECL_SIZE_UNIT (field) : 0;
6321
6322             if (TREE_CODE (t) == QUAL_UNION_TYPE)
6323               {
6324                 tree new_q = substitute_in_expr (DECL_QUALIFIER (field), f, r);
6325
6326                 if (new_q != DECL_QUALIFIER (new_field))
6327                   changed_field = 1;
6328
6329                 /* Do the substitution inside the qualifier and if we find
6330                    that this field will not be present, omit it.  */
6331                 DECL_QUALIFIER (new_field) = new_q;
6332
6333                 if (integer_zerop (DECL_QUALIFIER (new_field)))
6334                   continue;
6335               }
6336
6337             if (last_field == 0)
6338               TYPE_FIELDS (new) = new_field;
6339             else
6340               TREE_CHAIN (last_field) = new_field;
6341
6342             last_field = new_field;
6343
6344             /* If this is a qualified type and this field will always be
6345                present, we are done.  */
6346             if (TREE_CODE (t) == QUAL_UNION_TYPE
6347                 && integer_onep (DECL_QUALIFIER (new_field)))
6348               break;
6349           }
6350
6351         /* If this used to be a qualified union type, but we now know what
6352            field will be present, make this a normal union.  */
6353         if (changed_field && TREE_CODE (new) == QUAL_UNION_TYPE
6354             && (TYPE_FIELDS (new) == 0
6355                 || integer_onep (DECL_QUALIFIER (TYPE_FIELDS (new)))))
6356           TREE_SET_CODE (new, UNION_TYPE);
6357         else if (! changed_field)
6358           return t;
6359
6360         if (field_has_rep)
6361           gigi_abort (117);
6362
6363         layout_type (new);
6364
6365         /* If the size was originally a constant use it.  */
6366         if (TYPE_SIZE (t) != 0 && TREE_CODE (TYPE_SIZE (t)) == INTEGER_CST
6367             && TREE_CODE (TYPE_SIZE (new)) != INTEGER_CST)
6368           {
6369             TYPE_SIZE (new) = TYPE_SIZE (t);
6370             TYPE_SIZE_UNIT (new) = TYPE_SIZE_UNIT (t);
6371             SET_TYPE_ADA_SIZE (new, TYPE_ADA_SIZE (t));
6372           }
6373
6374         return new;
6375       }
6376
6377     default:
6378       return t;
6379     }
6380 }
6381 \f
6382 /* Return the "RM size" of GNU_TYPE.  This is the actual number of bits
6383    needed to represent the object.  */
6384
6385 tree
6386 rm_size (tree gnu_type)
6387 {
6388   /* For integer types, this is the precision.  For record types, we store
6389      the size explicitly.  For other types, this is just the size.  */
6390
6391   if (INTEGRAL_TYPE_P (gnu_type) && TYPE_RM_SIZE (gnu_type) != 0)
6392     return TYPE_RM_SIZE (gnu_type);
6393   else if (TREE_CODE (gnu_type) == RECORD_TYPE
6394            && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
6395     /* Return the rm_size of the actual data plus the size of the template.  */
6396     return
6397       size_binop (PLUS_EXPR,
6398                   rm_size (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)))),
6399                   DECL_SIZE (TYPE_FIELDS (gnu_type)));
6400   else if ((TREE_CODE (gnu_type) == RECORD_TYPE
6401             || TREE_CODE (gnu_type) == UNION_TYPE
6402             || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
6403            && ! TYPE_IS_FAT_POINTER_P (gnu_type)
6404            && TYPE_ADA_SIZE (gnu_type) != 0)
6405     return TYPE_ADA_SIZE (gnu_type);
6406   else
6407     return TYPE_SIZE (gnu_type);
6408 }
6409 \f
6410 /* Return an identifier representing the external name to be used for
6411    GNAT_ENTITY.  If SUFFIX is specified, the name is followed by "___"
6412    and the specified suffix.  */
6413
6414 tree
6415 create_concat_name (Entity_Id gnat_entity, const char *suffix)
6416 {
6417   const char *str = (suffix == 0 ? "" : suffix);
6418   String_Template temp = {1, strlen (str)};
6419   Fat_Pointer fp = {str, &temp};
6420
6421   Get_External_Name_With_Suffix (gnat_entity, fp);
6422
6423 #ifdef _WIN32
6424   /* A variable using the Stdcall convention (meaning we are running
6425      on a Windows box) live in a DLL. Here we adjust its name to use
6426      the jump-table, the _imp__NAME contains the address for the NAME
6427      variable. */
6428
6429   {
6430     Entity_Kind kind = Ekind (gnat_entity);
6431     const char *prefix = "_imp__";
6432     int plen = strlen (prefix);
6433
6434     if ((kind == E_Variable || kind == E_Constant)
6435         && Convention (gnat_entity) == Convention_Stdcall)
6436       {
6437         int k;
6438         for (k = 0; k <= Name_Len; k++)
6439           Name_Buffer [Name_Len - k + plen] = Name_Buffer [Name_Len - k];
6440         strncpy (Name_Buffer, prefix, plen);
6441       }
6442   }
6443 #endif
6444
6445   return get_identifier (Name_Buffer);
6446 }
6447
6448 /* Return the name to be used for GNAT_ENTITY.  If a type, create a
6449    fully-qualified name, possibly with type information encoding.
6450    Otherwise, return the name.  */
6451
6452 tree
6453 get_entity_name (Entity_Id gnat_entity)
6454 {
6455   Get_Encoded_Name (gnat_entity);
6456   return get_identifier (Name_Buffer);
6457 }
6458
6459 /* Given GNU_ID, an IDENTIFIER_NODE containing a name and SUFFIX, a
6460    string, return a new IDENTIFIER_NODE that is the concatenation of
6461    the name in GNU_ID and SUFFIX.  */
6462
6463 tree
6464 concat_id_with_name (tree gnu_id, const char *suffix)
6465 {
6466   int len = IDENTIFIER_LENGTH (gnu_id);
6467
6468   strncpy (Name_Buffer, IDENTIFIER_POINTER (gnu_id),
6469            IDENTIFIER_LENGTH (gnu_id));
6470   strncpy (Name_Buffer + len, "___", 3);
6471   len += 3;
6472   strcpy (Name_Buffer + len, suffix);
6473   return get_identifier (Name_Buffer);
6474 }
6475
6476 #include "gt-ada-decl.h"