OSDN Git Service

2004-04-08 Joel Sherrill <joel@oarcorp.com>
[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             TYPE_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       TYPE_UNSIGNED (gnu_type)
1303         = (TYPE_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         TYPE_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         TYPE_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 (TYPE_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                       TYPE_UNSIGNED (gnu_subtype)
2085                         = TYPE_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
2933               = build_pointer_type_for_mode (make_node (VOID_TYPE),
2934                                              p_mode,
2935                                              No_Strict_Aliasing (gnat_entity));
2936             TREE_TYPE (gnu_type) = TYPE_POINTER_TO (gnu_type) = gnu_type;
2937           }
2938         else
2939           gnu_desig_type = gnat_to_gnu_type (gnat_desig_type);
2940
2941         /* It is possible that the above call to gnat_to_gnu_type resolved our
2942            type.  If so, just return it.  */
2943         if (present_gnu_tree (gnat_entity))
2944           {
2945             maybe_present = 1;
2946             break;
2947           }
2948
2949         /* If we have a GCC type for the designated type, possibly modify it
2950            if we are pointing only to constant objects and then make a pointer
2951            to it.  Don't do this for unconstrained arrays.  */
2952         if (gnu_type == 0 && gnu_desig_type != 0)
2953           {
2954             if (Is_Access_Constant (gnat_entity)
2955                 && TREE_CODE (gnu_desig_type) != UNCONSTRAINED_ARRAY_TYPE)
2956               {
2957                 gnu_desig_type
2958                   = build_qualified_type
2959                     (gnu_desig_type,
2960                      TYPE_QUALS (gnu_desig_type) | TYPE_QUAL_CONST);
2961
2962                 /* Some extra processing is required if we are building a
2963                    pointer to an incomplete type (in the GCC sense). We might
2964                    have such a type if we just made a dummy, or directly out
2965                    of the call to gnat_to_gnu_type above if we are processing
2966                    an access type for a record component designating the
2967                    record type itself.  */
2968                 if (! COMPLETE_TYPE_P (gnu_desig_type))
2969                   {
2970                     /* We must ensure that the pointer to variant we make will
2971                        be processed by update_pointer_to when the initial type
2972                        is completed. Pretend we made a dummy and let further
2973                        processing act as usual.  */
2974                     made_dummy = 1;
2975
2976                     /* We must ensure that update_pointer_to will not retrieve
2977                        the dummy variant when building a properly qualified
2978                        version of the complete type. We take advantage of the
2979                        fact that get_qualified_type is requiring TYPE_NAMEs to
2980                        match to influence build_qualified_type and then also
2981                        update_pointer_to here. */
2982                     TYPE_NAME (gnu_desig_type)
2983                       = create_concat_name (gnat_desig_type, "INCOMPLETE_CST");
2984                   }
2985               }
2986
2987             gnu_type
2988               = build_pointer_type_for_mode (gnu_desig_type, p_mode,
2989                                              No_Strict_Aliasing (gnat_entity));
2990           }
2991
2992         /* If we are not defining this object and we made a dummy pointer,
2993            save our current definition, evaluate the actual type, and replace
2994            the tentative type we made with the actual one.  If we are to defer
2995            actually looking up the actual type, make an entry in the
2996            deferred list.  */
2997
2998         if (! in_main_unit && made_dummy)
2999           {
3000             tree gnu_old_type
3001               = TYPE_FAT_POINTER_P (gnu_type)
3002                 ? TYPE_UNCONSTRAINED_ARRAY (gnu_type) : TREE_TYPE (gnu_type);
3003
3004             if (esize == POINTER_SIZE
3005                 && (got_fat_p || TYPE_FAT_POINTER_P (gnu_type)))
3006               gnu_type
3007                 = build_pointer_type
3008                   (TYPE_OBJECT_RECORD_TYPE
3009                    (TYPE_UNCONSTRAINED_ARRAY (gnu_type)));
3010
3011             gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3012                                          ! Comes_From_Source (gnat_entity),
3013                                          debug_info_p);
3014             save_gnu_tree (gnat_entity, gnu_decl, 0);
3015             this_made_decl = saved = 1;
3016
3017             if (defer_incomplete_level == 0)
3018               {
3019                 update_pointer_to (TYPE_MAIN_VARIANT (gnu_old_type),
3020                                    gnat_to_gnu_type (gnat_desig_type));
3021                 /* Note that the call to gnat_to_gnu_type here might have
3022                    updated gnu_old_type directly, in which case it is not a
3023                    dummy type any more when we get into update_pointer_to.
3024
3025                    This may happen for instance when the designated type is a
3026                    record type, because their elaboration starts with an
3027                    initial node from make_dummy_type, which may yield the same
3028                    node as the one we got.
3029
3030                    Besides, variants of this non-dummy type might have been
3031                    created along the way. update_pointer_to is expected to
3032                    properly take care of those situations.  */
3033               }
3034             else
3035               {
3036                 struct incomplete *p
3037                   = (struct incomplete *) xmalloc (sizeof (struct incomplete));
3038
3039                 p->old_type = gnu_old_type;
3040                 p->full_type = gnat_desig_type;
3041                 p->next = defer_incomplete_list;
3042                 defer_incomplete_list = p;
3043               }
3044           }
3045       }
3046       break;
3047
3048     case E_Access_Protected_Subprogram_Type:
3049       if (type_annotate_only && No (Equivalent_Type (gnat_entity)))
3050         gnu_type = build_pointer_type (void_type_node);
3051       else
3052         /* The runtime representation is the equivalent type. */
3053         gnu_type = gnat_to_gnu_type (Equivalent_Type (gnat_entity));
3054
3055       if (Is_Itype (Directly_Designated_Type (gnat_entity))
3056           && ! present_gnu_tree (Directly_Designated_Type (gnat_entity))
3057           && No (Freeze_Node (Directly_Designated_Type (gnat_entity)))
3058           && ! Is_Record_Type (Scope (Directly_Designated_Type (gnat_entity))))
3059         gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity),
3060                             NULL_TREE, 0);
3061
3062       break;
3063
3064     case E_Access_Subtype:
3065
3066       /* We treat this as identical to its base type; any constraint is
3067          meaningful only to the front end.
3068
3069          The designated type must be elaborated as well, if it does
3070          not have its own freeze node. Designated (sub)types created
3071          for constrained components of records with discriminants are
3072          not frozen by the front end and thus not elaborated by gigi,
3073          because their use may appear before the base type is frozen,
3074          and because it is not clear that they are needed anywhere in
3075          Gigi. With the current model, there is no correct place where
3076          they could be elaborated.  */
3077
3078       gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
3079       if (Is_Itype (Directly_Designated_Type (gnat_entity))
3080           && ! present_gnu_tree (Directly_Designated_Type (gnat_entity))
3081           && Is_Frozen (Directly_Designated_Type (gnat_entity))
3082           && No (Freeze_Node (Directly_Designated_Type (gnat_entity))))
3083         {
3084           /* If we are not defining this entity, and we have incomplete
3085              entities being processed above us, make a dummy type and
3086              elaborate it later.  */
3087           if (! definition && defer_incomplete_level != 0)
3088             {
3089               struct incomplete *p
3090                 = (struct incomplete *) xmalloc (sizeof (struct incomplete));
3091               tree gnu_ptr_type
3092                 = build_pointer_type
3093                   (make_dummy_type (Directly_Designated_Type (gnat_entity)));
3094
3095               p->old_type = TREE_TYPE (gnu_ptr_type);
3096               p->full_type = Directly_Designated_Type (gnat_entity);
3097               p->next = defer_incomplete_list;
3098               defer_incomplete_list = p;
3099             }
3100           else if
3101             (IN (Ekind (Base_Type (Directly_Designated_Type (gnat_entity))),
3102               Incomplete_Or_Private_Kind))
3103             { ;}
3104           else
3105             gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity),
3106                                 NULL_TREE, 0);
3107         }
3108
3109       maybe_present = 1;
3110       break;
3111
3112     /* Subprogram Entities
3113
3114        The following access functions are defined for subprograms (functions
3115        or procedures):
3116
3117                 First_Formal    The first formal parameter.
3118                 Is_Imported     Indicates that the subprogram has appeared in
3119                                 an INTERFACE or IMPORT pragma. For now we
3120                                 assume that the external language is C.
3121                 Is_Inlined      True if the subprogram is to be inlined.
3122
3123        In addition for function subprograms we have:
3124
3125                 Etype           Return type of the function.
3126
3127        Each parameter is first checked by calling must_pass_by_ref on its
3128        type to determine if it is passed by reference.  For parameters which
3129        are copied in, if they are Ada IN OUT or OUT parameters, their return
3130        value becomes part of a record which becomes the return type of the
3131        function (C function - note that this applies only to Ada procedures
3132        so there is no Ada return type). Additional code to store back the
3133        parameters will be generated on the caller side.  This transformation
3134        is done here, not in the front-end.
3135
3136        The intended result of the transformation can be seen from the
3137        equivalent source rewritings that follow:
3138
3139                                                    struct temp {int a,b};
3140        procedure P (A,B: IN OUT ...) is            temp P (int A,B) {
3141         ..                                            ..
3142        end P;                                        return {A,B};
3143                                                    }
3144                               procedure call
3145
3146                                               {
3147                                                   temp t;
3148        P(X,Y);                                    t = P(X,Y);
3149                                                   X = t.a , Y = t.b;
3150                                               }
3151
3152        For subprogram types we need to perform mainly the same conversions to
3153        GCC form that are needed for procedures and function declarations.  The
3154        only difference is that at the end, we make a type declaration instead
3155        of a function declaration.  */
3156
3157     case E_Subprogram_Type:
3158     case E_Function:
3159     case E_Procedure:
3160       {
3161         /* The first GCC parameter declaration (a PARM_DECL node).  The
3162            PARM_DECL nodes are chained through the TREE_CHAIN field, so this
3163            actually is the head of this parameter list.  */
3164         tree gnu_param_list = NULL_TREE;
3165         /* The type returned by a function. If the subprogram is a procedure
3166            this type should be void_type_node.  */
3167         tree gnu_return_type = void_type_node;
3168         /* List of fields in return type of procedure with copy in copy out
3169            parameters.  */
3170         tree gnu_field_list = NULL_TREE;
3171         /* Non-null for subprograms containing  parameters passed by copy in
3172            copy out (Ada IN OUT or OUT parameters not passed by reference),
3173            in which case it is the list of nodes used to specify the values of
3174            the in out/out parameters that are returned as a record upon
3175            procedure return.  The TREE_PURPOSE of an element of this list is
3176            a field of the record and the TREE_VALUE is the PARM_DECL
3177            corresponding to that field.  This list will be saved in the
3178            TYPE_CI_CO_LIST field of the FUNCTION_TYPE node we create.  */
3179         tree gnu_return_list = NULL_TREE;
3180         Entity_Id gnat_param;
3181         int inline_flag = Is_Inlined (gnat_entity);
3182         int public_flag = Is_Public (gnat_entity);
3183         int extern_flag
3184           = (Is_Public (gnat_entity) && !definition) || imported_p;
3185         int pure_flag = Is_Pure (gnat_entity);
3186         int volatile_flag = No_Return (gnat_entity);
3187         int returns_by_ref = 0;
3188         int returns_unconstrained = 0;
3189         tree gnu_ext_name = create_concat_name (gnat_entity, 0);
3190         int has_copy_in_out = 0;
3191         int parmnum;
3192
3193         if (kind == E_Subprogram_Type && ! definition)
3194           /* A parameter may refer to this type, so defer completion
3195              of any incomplete types.  */
3196           defer_incomplete_level++, this_deferred = 1;
3197
3198         /* If the subprogram has an alias, it is probably inherited, so
3199            we can use the original one.  If the original "subprogram"
3200            is actually an enumeration literal, it may be the first use
3201            of its type, so we must elaborate that type now.  */
3202         if (Present (Alias (gnat_entity)))
3203           {
3204             if (Ekind (Alias (gnat_entity)) == E_Enumeration_Literal)
3205               gnat_to_gnu_entity (Etype (Alias (gnat_entity)), NULL_TREE, 0);
3206
3207             gnu_decl = gnat_to_gnu_entity (Alias (gnat_entity),
3208                                            gnu_expr, 0);
3209
3210             /* Elaborate any Itypes in the parameters of this entity.  */
3211             for (gnat_temp = First_Formal (gnat_entity);
3212                  Present (gnat_temp);
3213                  gnat_temp = Next_Formal_With_Extras (gnat_temp))
3214               if (Is_Itype (Etype (gnat_temp)))
3215                 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
3216
3217             break;
3218           }
3219
3220         if (kind == E_Function || kind == E_Subprogram_Type)
3221           gnu_return_type = gnat_to_gnu_type (Etype (gnat_entity));
3222
3223         /* If this function returns by reference, make the actual
3224            return type of this function the pointer and mark the decl.  */
3225         if (Returns_By_Ref (gnat_entity))
3226           {
3227             returns_by_ref = 1;
3228             gnu_return_type = build_pointer_type (gnu_return_type);
3229           }
3230
3231         /* If the Mechanism is By_Reference, ensure the return type uses
3232            the machine's by-reference mechanism, which may not the same
3233            as above (e.g., it might be by passing a fake parameter).  */
3234         else if (kind == E_Function
3235                  && Mechanism (gnat_entity) == By_Reference)
3236           {
3237             gnu_return_type = copy_type (gnu_return_type);
3238             TREE_ADDRESSABLE (gnu_return_type) = 1;
3239           }
3240
3241         /* If we are supposed to return an unconstrained array,
3242            actually return a fat pointer and make a note of that.  Return
3243            a pointer to an unconstrained record of variable size.  */
3244         else if (TREE_CODE (gnu_return_type) == UNCONSTRAINED_ARRAY_TYPE)
3245           {
3246             gnu_return_type = TREE_TYPE (gnu_return_type);
3247             returns_unconstrained = 1;
3248           }
3249
3250         /* If the type requires a transient scope, the result is allocated
3251            on the secondary stack, so the result type of the function is
3252            just a pointer.  */
3253         else if (Requires_Transient_Scope (Etype (gnat_entity)))
3254           {
3255             gnu_return_type = build_pointer_type (gnu_return_type);
3256             returns_unconstrained = 1;
3257           }
3258
3259         /* If the type is a padded type and the underlying type would not
3260            be passed by reference or this function has a foreign convention,
3261            return the underlying type.  */
3262         else if (TREE_CODE (gnu_return_type) == RECORD_TYPE
3263                  && TYPE_IS_PADDING_P (gnu_return_type)
3264                  && (! default_pass_by_ref (TREE_TYPE
3265                                             (TYPE_FIELDS (gnu_return_type)))
3266                      || Has_Foreign_Convention (gnat_entity)))
3267           gnu_return_type = TREE_TYPE (TYPE_FIELDS (gnu_return_type));
3268
3269         /* Look at all our parameters and get the type of
3270            each.  While doing this, build a copy-out structure if
3271            we need one.  */
3272
3273         /* If the return type has a size that overflows, we cannot have
3274            a function that returns that type.  This usage doesn't make
3275            sense anyway, so give an error here.  */
3276         if (TYPE_SIZE_UNIT (gnu_return_type)
3277             && TREE_OVERFLOW (TYPE_SIZE_UNIT (gnu_return_type)))
3278           {
3279             post_error ("cannot return type whose size overflows",
3280                         gnat_entity);
3281             gnu_return_type = copy_node (gnu_return_type);
3282             TYPE_SIZE (gnu_return_type) = bitsize_zero_node;
3283             TYPE_SIZE_UNIT (gnu_return_type) = size_zero_node;
3284             TYPE_MAIN_VARIANT (gnu_return_type) = gnu_return_type;
3285             TYPE_NEXT_VARIANT (gnu_return_type) = 0;
3286           }
3287
3288         for (gnat_param = First_Formal (gnat_entity), parmnum = 0;
3289              Present (gnat_param);
3290              gnat_param = Next_Formal_With_Extras (gnat_param), parmnum++)
3291           {
3292             tree gnu_param_name = get_entity_name (gnat_param);
3293             tree gnu_param_type = gnat_to_gnu_type (Etype (gnat_param));
3294             tree gnu_param, gnu_field;
3295             int by_ref_p = 0;
3296             int by_descr_p = 0;
3297             int by_component_ptr_p = 0;
3298             int copy_in_copy_out_flag = 0;
3299             int req_by_copy = 0, req_by_ref = 0;
3300
3301             /* See if a Mechanism was supplied that forced this
3302                parameter to be passed one way or another.  */
3303             if (Is_Valued_Procedure (gnat_entity) && parmnum == 0)
3304               req_by_copy = 1;
3305             else if (Mechanism (gnat_param) == Default)
3306               ;
3307             else if (Mechanism (gnat_param) == By_Copy)
3308               req_by_copy = 1;
3309             else if (Mechanism (gnat_param) == By_Reference)
3310               req_by_ref = 1;
3311             else if (Mechanism (gnat_param) <= By_Descriptor)
3312               by_descr_p = 1;
3313             else if (Mechanism (gnat_param) > 0)
3314               {
3315                 if (TREE_CODE (gnu_param_type) == UNCONSTRAINED_ARRAY_TYPE
3316                     || TREE_CODE (TYPE_SIZE (gnu_param_type)) != INTEGER_CST
3317                     || 0 < compare_tree_int (TYPE_SIZE (gnu_param_type),
3318                                              Mechanism (gnat_param)))
3319                   req_by_ref = 1;
3320                 else
3321                   req_by_copy = 1;
3322               }
3323             else
3324               post_error ("unsupported mechanism for&", gnat_param);
3325
3326             /* If this is either a foreign function or if the
3327                underlying type won't be passed by refererence, strip off
3328                possible padding type.  */
3329             if (TREE_CODE (gnu_param_type) == RECORD_TYPE
3330                 && TYPE_IS_PADDING_P (gnu_param_type)
3331                 && (req_by_ref || Has_Foreign_Convention (gnat_entity)
3332                     || ! must_pass_by_ref (TREE_TYPE (TYPE_FIELDS
3333                                                       (gnu_param_type)))))
3334               gnu_param_type = TREE_TYPE (TYPE_FIELDS (gnu_param_type));
3335
3336             /* If this is an IN parameter it is read-only, so make a variant
3337                of the type that is read-only.
3338
3339                ??? However, if this is an unconstrained array, that type can
3340                be very complex.  So skip it for now.  Likewise for any other
3341                self-referential type.  */
3342             if (Ekind (gnat_param) == E_In_Parameter
3343                 && TREE_CODE (gnu_param_type) != UNCONSTRAINED_ARRAY_TYPE
3344                 && ! (TYPE_SIZE (gnu_param_type) != 0
3345                       && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_param_type))))
3346               gnu_param_type
3347                 = build_qualified_type (gnu_param_type,
3348                                         (TYPE_QUALS (gnu_param_type)
3349                                          | TYPE_QUAL_CONST));
3350
3351             /* For foreign conventions, pass arrays as a pointer to the
3352                underlying type.  First check for unconstrained array and get
3353                the underlying array.  Then get the component type and build
3354                a pointer to it.  */
3355             if (Has_Foreign_Convention (gnat_entity)
3356                 && TREE_CODE (gnu_param_type) == UNCONSTRAINED_ARRAY_TYPE)
3357               gnu_param_type
3358                 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS
3359                                         (TREE_TYPE (gnu_param_type))));
3360
3361             if (by_descr_p)
3362               gnu_param_type
3363                 = build_pointer_type
3364                   (build_vms_descriptor (gnu_param_type,
3365                                          Mechanism (gnat_param),
3366                                          gnat_entity));
3367
3368             else if (Has_Foreign_Convention (gnat_entity)
3369                      && ! req_by_copy
3370                      && TREE_CODE (gnu_param_type) == ARRAY_TYPE)
3371               {
3372                 /* Strip off any multi-dimensional entries, then strip
3373                    off the last array to get the component type.  */
3374                 while (TREE_CODE (TREE_TYPE (gnu_param_type)) == ARRAY_TYPE
3375                        && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_param_type)))
3376                   gnu_param_type = TREE_TYPE (gnu_param_type);
3377
3378                 by_component_ptr_p = 1;
3379                 gnu_param_type = TREE_TYPE (gnu_param_type);
3380
3381                 if (Ekind (gnat_param) == E_In_Parameter)
3382                   gnu_param_type
3383                     = build_qualified_type (gnu_param_type,
3384                                             (TYPE_QUALS (gnu_param_type)
3385                                              | TYPE_QUAL_CONST));
3386
3387                 gnu_param_type = build_pointer_type (gnu_param_type);
3388               }
3389
3390             /* Fat pointers are passed as thin pointers for foreign
3391                conventions.  */
3392             else if (Has_Foreign_Convention (gnat_entity)
3393                      && TYPE_FAT_POINTER_P (gnu_param_type))
3394               gnu_param_type
3395                 = make_type_from_size (gnu_param_type,
3396                                        size_int (POINTER_SIZE), 0);
3397
3398             /* If we must pass or were requested to pass by reference, do so.
3399                If we were requested to pass by copy, do so.
3400                Otherwise, for foreign conventions, pass all in out parameters
3401                or aggregates by reference.  For COBOL and Fortran, pass
3402                all integer and FP types that way too.  For Convention Ada,
3403                use the standard Ada default.  */
3404             else if (must_pass_by_ref (gnu_param_type) || req_by_ref
3405                      || (! req_by_copy
3406                          && ((Has_Foreign_Convention (gnat_entity)
3407                               && (Ekind (gnat_param) != E_In_Parameter
3408                                   || AGGREGATE_TYPE_P (gnu_param_type)))
3409                              || (((Convention (gnat_entity)
3410                                    == Convention_Fortran)
3411                                   || (Convention (gnat_entity)
3412                                       == Convention_COBOL))
3413                                  && (INTEGRAL_TYPE_P (gnu_param_type)
3414                                      || FLOAT_TYPE_P (gnu_param_type)))
3415                              /* For convention Ada, see if we pass by reference
3416                                 by default.  */
3417                              || (! Has_Foreign_Convention (gnat_entity)
3418                                  && default_pass_by_ref (gnu_param_type)))))
3419               {
3420                 gnu_param_type = build_reference_type (gnu_param_type);
3421                 by_ref_p = 1;
3422               }
3423
3424             else if (Ekind (gnat_param) != E_In_Parameter)
3425               copy_in_copy_out_flag = 1;
3426
3427             if (req_by_copy && (by_ref_p || by_component_ptr_p))
3428               post_error ("?cannot pass & by copy", gnat_param);
3429
3430             /* If this is an OUT parameter that isn't passed by reference
3431                and isn't a pointer or aggregate, we don't make a PARM_DECL
3432                for it.  Instead, it will be a VAR_DECL created when we process
3433                the procedure.  For the special parameter of Valued_Procedure,
3434                never pass it in.
3435
3436                An exception is made to cover the RM-6.4.1 rule requiring "by
3437                copy" out parameters with discriminants or implicit initial
3438                values to be handled like in out parameters. These type are
3439                normally built as aggregates, and hence passed by reference,
3440                except for some packed arrays which end up encoded in special
3441                integer types.
3442
3443                The exception we need to make is then for packed arrays of
3444                records with discriminants or implicit initial values. We have
3445                no light/easy way to check for the latter case, so we merely
3446                check for packed arrays of records. This may lead to useless
3447                copy-in operations, but in very rare cases only, as these would
3448                be exceptions in a set of already exceptional situations.  */
3449             if (Ekind (gnat_param) == E_Out_Parameter && ! by_ref_p
3450                 && ((Is_Valued_Procedure (gnat_entity) && parmnum == 0)
3451                     || (! by_descr_p
3452                         && ! POINTER_TYPE_P (gnu_param_type)
3453                         && ! AGGREGATE_TYPE_P (gnu_param_type)))
3454                 && ! (Is_Array_Type (Etype (gnat_param))
3455                       && Is_Packed (Etype (gnat_param))
3456                       && Is_Composite_Type (Component_Type
3457                                             (Etype (gnat_param)))))
3458               gnu_param = 0;
3459             else
3460               {
3461                 set_lineno (gnat_param, 0);
3462                 gnu_param
3463                   = create_param_decl
3464                     (gnu_param_name, gnu_param_type,
3465                      by_ref_p || by_component_ptr_p
3466                      || Ekind (gnat_param) == E_In_Parameter);
3467
3468                 DECL_BY_REF_P (gnu_param) = by_ref_p;
3469                 DECL_BY_COMPONENT_PTR_P (gnu_param) = by_component_ptr_p;
3470                 DECL_BY_DESCRIPTOR_P (gnu_param) = by_descr_p;
3471                 DECL_POINTS_TO_READONLY_P (gnu_param)
3472                   = (Ekind (gnat_param) == E_In_Parameter
3473                      && (by_ref_p || by_component_ptr_p));
3474                 save_gnu_tree (gnat_param, gnu_param, 0);
3475                 gnu_param_list = chainon (gnu_param, gnu_param_list);
3476
3477                 /* If a parameter is a pointer, this function may modify
3478                    memory through it and thus shouldn't be considered
3479                    a pure function.  Also, the memory may be modified
3480                    between two calls, so they can't be CSE'ed.  The latter
3481                    case also handles by-ref parameters.  */
3482                 if (POINTER_TYPE_P (gnu_param_type)
3483                     ||  TYPE_FAT_POINTER_P (gnu_param_type))
3484                   pure_flag = 0;
3485               }
3486
3487             if (copy_in_copy_out_flag)
3488               {
3489                 if (! has_copy_in_out)
3490                   {
3491                     if (TREE_CODE (gnu_return_type) != VOID_TYPE)
3492                       gigi_abort (111);
3493
3494                     gnu_return_type = make_node (RECORD_TYPE);
3495                     TYPE_NAME (gnu_return_type) = get_identifier ("RETURN");
3496                     has_copy_in_out = 1;
3497                   }
3498
3499                 set_lineno (gnat_param, 0);
3500                 gnu_field = create_field_decl (gnu_param_name, gnu_param_type,
3501                                                gnu_return_type, 0, 0, 0, 0);
3502                 TREE_CHAIN (gnu_field) = gnu_field_list;
3503                 gnu_field_list = gnu_field;
3504                 gnu_return_list = tree_cons (gnu_field, gnu_param,
3505                                              gnu_return_list);
3506               }
3507           }
3508
3509         /* Do not compute record for out parameters if subprogram is
3510            stubbed since structures are incomplete for the back-end.  */
3511         if (gnu_field_list != 0
3512             && Convention (gnat_entity) != Convention_Stubbed)
3513           finish_record_type (gnu_return_type, nreverse (gnu_field_list),
3514                               0, 0);
3515
3516         /* If we have a CICO list but it has only one entry, we convert
3517            this function into a function that simply returns that one
3518            object.  */
3519         if (list_length (gnu_return_list) == 1)
3520           gnu_return_type = TREE_TYPE (TREE_PURPOSE (gnu_return_list));
3521
3522 #ifdef _WIN32
3523         if (Convention (gnat_entity) == Convention_Stdcall)
3524           {
3525             struct attrib *attr
3526               = (struct attrib *) xmalloc (sizeof (struct attrib));
3527
3528             attr->next = attr_list;
3529             attr->type = ATTR_MACHINE_ATTRIBUTE;
3530             attr->name = get_identifier ("stdcall");
3531             attr->arg = NULL_TREE;
3532             attr->error_point = gnat_entity;
3533             attr_list = attr;
3534           }
3535 #endif
3536
3537         /* Both lists ware built in reverse.  */
3538         gnu_param_list = nreverse (gnu_param_list);
3539         gnu_return_list = nreverse (gnu_return_list);
3540
3541         gnu_type
3542           = create_subprog_type (gnu_return_type, gnu_param_list,
3543                                  gnu_return_list, returns_unconstrained,
3544                                  returns_by_ref,
3545                                  Function_Returns_With_DSP (gnat_entity));
3546
3547         /* ??? For now, don't consider nested functions pure.  */
3548         if (! global_bindings_p ())
3549           pure_flag = 0;
3550
3551         /* A subprogram (something that doesn't return anything) shouldn't
3552            be considered Pure since there would be no reason for such a
3553            subprogram.  Note that procedures with Out (or In Out) parameters
3554            have already been converted into a function with a return type. */
3555         if (TREE_CODE (gnu_return_type) == VOID_TYPE)
3556           pure_flag = 0;
3557
3558         gnu_type
3559           = build_qualified_type (gnu_type,
3560                                   (TYPE_QUALS (gnu_type)
3561                                    | (TYPE_QUAL_CONST * pure_flag)
3562                                    | (TYPE_QUAL_VOLATILE * volatile_flag)));
3563
3564         set_lineno (gnat_entity, 0);
3565
3566         /* If there was no specified Interface_Name and the external and
3567            internal names of the subprogram are the same, only use the
3568            internal name to allow disambiguation of nested subprograms.  */
3569         if (No (Interface_Name (gnat_entity)) && gnu_ext_name == gnu_entity_id)
3570           gnu_ext_name = 0;
3571
3572         /* If we are defining the subprogram and it has an Address clause
3573            we must get the address expression from the saved GCC tree for the
3574            subprogram if it has a Freeze_Node.  Otherwise, we elaborate
3575            the address expression here since the front-end has guaranteed
3576            in that case that the elaboration has no effects.  If there is
3577            an Address clause and we are not defining the object, just
3578            make it a constant.  */
3579         if (Present (Address_Clause (gnat_entity)))
3580           {
3581             tree gnu_address = 0;
3582
3583             if (definition)
3584               gnu_address
3585                 = (present_gnu_tree (gnat_entity)
3586                    ? get_gnu_tree (gnat_entity)
3587                    : gnat_to_gnu (Expression (Address_Clause (gnat_entity))));
3588
3589             save_gnu_tree (gnat_entity, NULL_TREE, 0);
3590
3591             gnu_type = build_reference_type (gnu_type);
3592             if (gnu_address != 0)
3593               gnu_address = convert (gnu_type, gnu_address);
3594
3595             gnu_decl
3596               = create_var_decl (gnu_entity_id, gnu_ext_name, gnu_type,
3597                                  gnu_address, 0, Is_Public (gnat_entity),
3598                                  extern_flag, 0, 0);
3599             DECL_BY_REF_P (gnu_decl) = 1;
3600           }
3601
3602         else if (kind == E_Subprogram_Type)
3603           gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3604                                        ! Comes_From_Source (gnat_entity),
3605                                        debug_info_p);
3606         else
3607           {
3608             gnu_decl = create_subprog_decl (gnu_entity_id, gnu_ext_name,
3609                                             gnu_type, gnu_param_list,
3610                                             inline_flag, public_flag,
3611                                             extern_flag, attr_list);
3612             DECL_STUBBED_P (gnu_decl)
3613               = Convention (gnat_entity) == Convention_Stubbed;
3614           }
3615       }
3616       break;
3617
3618     case E_Incomplete_Type:
3619     case E_Private_Type:
3620     case E_Limited_Private_Type:
3621     case E_Record_Type_With_Private:
3622     case E_Private_Subtype:
3623     case E_Limited_Private_Subtype:
3624     case E_Record_Subtype_With_Private:
3625
3626       /* If this type does not have a full view in the unit we are
3627          compiling, then just get the type from its Etype.  */
3628       if (No (Full_View (gnat_entity)))
3629         {
3630           /* If this is an incomplete type with no full view, it must
3631              be a Taft Amendement type, so just return a dummy type.  */
3632           if (kind == E_Incomplete_Type)
3633             gnu_type = make_dummy_type (gnat_entity);
3634
3635           else if (Present (Underlying_Full_View (gnat_entity)))
3636              gnu_decl = gnat_to_gnu_entity (Underlying_Full_View (gnat_entity),
3637                                             NULL_TREE, 0);
3638           else
3639             {
3640               gnu_decl = gnat_to_gnu_entity (Etype (gnat_entity),
3641                                              NULL_TREE, 0);
3642               maybe_present = 1;
3643             }
3644
3645           break;
3646         }
3647
3648       /* Otherwise, if we are not defining the type now, get the
3649          type from the full view. But always get the type from the full
3650          view for define on use types, since otherwise we won't see them! */
3651
3652       else if (! definition
3653                || (Is_Itype (Full_View (gnat_entity))
3654                    && No (Freeze_Node (gnat_entity)))
3655                || (Is_Itype (gnat_entity)
3656                    && No (Freeze_Node (Full_View (gnat_entity)))))
3657         {
3658           gnu_decl = gnat_to_gnu_entity (Full_View (gnat_entity),
3659                                          NULL_TREE, 0);
3660           maybe_present = 1;
3661           break;
3662         }
3663
3664       /* For incomplete types, make a dummy type entry which will be
3665          replaced later.  */
3666       gnu_type = make_dummy_type (gnat_entity);
3667
3668       /* Save this type as the full declaration's type so we can do any needed
3669          updates when we see it.  */
3670       set_lineno (gnat_entity, 0);
3671       gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3672                                    ! Comes_From_Source (gnat_entity),
3673                                    debug_info_p);
3674       save_gnu_tree (Full_View (gnat_entity), gnu_decl, 0);
3675       break;
3676
3677       /* Simple class_wide types are always viewed as their root_type
3678          by Gigi unless an Equivalent_Type is specified.  */
3679     case E_Class_Wide_Type:
3680       if (Present (Equivalent_Type (gnat_entity)))
3681         gnu_type = gnat_to_gnu_type (Equivalent_Type (gnat_entity));
3682       else
3683         gnu_type = gnat_to_gnu_type (Root_Type (gnat_entity));
3684
3685       maybe_present = 1;
3686       break;
3687
3688     case E_Task_Type:
3689     case E_Task_Subtype:
3690     case E_Protected_Type:
3691     case E_Protected_Subtype:
3692       if (type_annotate_only && No (Corresponding_Record_Type (gnat_entity)))
3693         gnu_type = void_type_node;
3694       else
3695         gnu_type = gnat_to_gnu_type (Corresponding_Record_Type (gnat_entity));
3696
3697       maybe_present = 1;
3698       break;
3699
3700     case E_Label:
3701       gnu_decl = create_label_decl (gnu_entity_id);
3702       break;
3703
3704     case E_Block:
3705     case E_Loop:
3706       /* Nothing at all to do here, so just return an ERROR_MARK and claim
3707          we've already saved it, so we don't try to.  */
3708       gnu_decl = error_mark_node;
3709       saved = 1;
3710       break;
3711
3712     default:
3713       gigi_abort (113);
3714     }
3715
3716   /* If we had a case where we evaluated another type and it might have
3717      defined this one, handle it here.  */
3718   if (maybe_present && present_gnu_tree (gnat_entity))
3719     {
3720       gnu_decl = get_gnu_tree (gnat_entity);
3721       saved = 1;
3722     }
3723
3724   /* If we are processing a type and there is either no decl for it or
3725      we just made one, do some common processing for the type, such as
3726      handling alignment and possible padding.  */
3727
3728   if ((gnu_decl == 0 || this_made_decl) && IN (kind, Type_Kind))
3729     {
3730       if (Is_Tagged_Type (gnat_entity)
3731           || Is_Class_Wide_Equivalent_Type (gnat_entity))
3732         TYPE_ALIGN_OK (gnu_type) = 1;
3733
3734       if (AGGREGATE_TYPE_P (gnu_type) && Is_By_Reference_Type (gnat_entity))
3735         TYPE_BY_REFERENCE_P (gnu_type) = 1;
3736
3737       /* ??? Don't set the size for a String_Literal since it is either
3738          confirming or we don't handle it properly (if the low bound is
3739          non-constant).  */
3740       if (gnu_size == 0 && kind != E_String_Literal_Subtype)
3741         gnu_size = validate_size (Esize (gnat_entity), gnu_type, gnat_entity,
3742                                   TYPE_DECL, 0, Has_Size_Clause (gnat_entity));
3743
3744       /* If a size was specified, see if we can make a new type of that size
3745          by rearranging the type, for example from a fat to a thin pointer.  */
3746       if (gnu_size != 0)
3747         {
3748           gnu_type
3749             = make_type_from_size (gnu_type, gnu_size,
3750                                    Has_Biased_Representation (gnat_entity));
3751
3752           if (operand_equal_p (TYPE_SIZE (gnu_type), gnu_size, 0)
3753               && operand_equal_p (rm_size (gnu_type), gnu_size, 0))
3754             gnu_size = 0;
3755         }
3756
3757       /* If the alignment hasn't already been processed and this is
3758          not an unconstrained array, see if an alignment is specified.
3759          If not, we pick a default alignment for atomic objects.  */
3760       if (align != 0 || TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
3761         ;
3762       else if (Known_Alignment (gnat_entity))
3763         align = validate_alignment (Alignment (gnat_entity), gnat_entity,
3764                                     TYPE_ALIGN (gnu_type));
3765       else if (Is_Atomic (gnat_entity) && gnu_size == 0
3766                && host_integerp (TYPE_SIZE (gnu_type), 1)
3767                && integer_pow2p (TYPE_SIZE (gnu_type)))
3768         align = MIN (BIGGEST_ALIGNMENT,
3769                      tree_low_cst (TYPE_SIZE (gnu_type), 1));
3770       else if (Is_Atomic (gnat_entity) && gnu_size != 0
3771                && host_integerp (gnu_size, 1)
3772                && integer_pow2p (gnu_size))
3773         align = MIN (BIGGEST_ALIGNMENT, tree_low_cst (gnu_size, 1));
3774
3775       /* See if we need to pad the type.  If we did, and made a record,
3776          the name of the new type may be changed.  So get it back for
3777          us when we make the new TYPE_DECL below.  */
3778       gnu_type = maybe_pad_type (gnu_type, gnu_size, align,
3779                                  gnat_entity, "PAD", 1, definition, 0);
3780       if (TREE_CODE (gnu_type) == RECORD_TYPE
3781           && TYPE_IS_PADDING_P (gnu_type))
3782         {
3783           gnu_entity_id = TYPE_NAME (gnu_type);
3784           if (TREE_CODE (gnu_entity_id) == TYPE_DECL)
3785             gnu_entity_id = DECL_NAME (gnu_entity_id);
3786         }
3787
3788       set_rm_size (RM_Size (gnat_entity), gnu_type, gnat_entity);
3789
3790       /* If we are at global level, GCC will have applied variable_size to
3791          the type, but that won't have done anything.  So, if it's not
3792          a constant or self-referential, call elaborate_expression_1 to
3793          make a variable for the size rather than calculating it each time.
3794          Handle both the RM size and the actual size.  */
3795       if (global_bindings_p ()
3796           && TYPE_SIZE (gnu_type) != 0
3797           && ! TREE_CONSTANT (TYPE_SIZE (gnu_type))
3798           && ! CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
3799         {
3800           if (TREE_CODE (gnu_type) == RECORD_TYPE
3801               && operand_equal_p (TYPE_ADA_SIZE (gnu_type),
3802                                   TYPE_SIZE (gnu_type), 0))
3803             {
3804               TYPE_SIZE (gnu_type)
3805                 = elaborate_expression_1 (gnat_entity, gnat_entity,
3806                                           TYPE_SIZE (gnu_type),
3807                                           get_identifier ("SIZE"),
3808                                           definition, 0);
3809               SET_TYPE_ADA_SIZE (gnu_type, TYPE_SIZE (gnu_type));
3810             }
3811           else
3812             {
3813               TYPE_SIZE (gnu_type)
3814                 = elaborate_expression_1 (gnat_entity, gnat_entity,
3815                                           TYPE_SIZE (gnu_type),
3816                                           get_identifier ("SIZE"),
3817                                           definition, 0);
3818
3819               /* ??? For now, store the size as a multiple of the alignment
3820                  in bytes so that we can see the alignment from the tree.  */
3821               TYPE_SIZE_UNIT (gnu_type)
3822                 = build_binary_op
3823                   (MULT_EXPR, sizetype,
3824                    elaborate_expression_1
3825                    (gnat_entity, gnat_entity,
3826                     build_binary_op (EXACT_DIV_EXPR, sizetype,
3827                                      TYPE_SIZE_UNIT (gnu_type),
3828                                      size_int (TYPE_ALIGN (gnu_type)
3829                                                / BITS_PER_UNIT)),
3830                     get_identifier ("SIZE_A_UNIT"),
3831                     definition, 0),
3832                    size_int (TYPE_ALIGN (gnu_type) / BITS_PER_UNIT));
3833
3834               if (TREE_CODE (gnu_type) == RECORD_TYPE)
3835                 SET_TYPE_ADA_SIZE (gnu_type,
3836                     elaborate_expression_1 (gnat_entity, gnat_entity,
3837                                             TYPE_ADA_SIZE (gnu_type),
3838                                             get_identifier ("RM_SIZE"),
3839                                             definition, 0));
3840             }
3841         }
3842
3843       /* If this is a record type or subtype, call elaborate_expression_1 on
3844          any field position.  Do this for both global and local types.
3845          Skip any fields that we haven't made trees for to avoid problems with
3846          class wide types.  */
3847       if (IN (kind, Record_Kind))
3848         for (gnat_temp = First_Entity (gnat_entity); Present (gnat_temp);
3849              gnat_temp = Next_Entity (gnat_temp))
3850           if (Ekind (gnat_temp) == E_Component && present_gnu_tree (gnat_temp))
3851             {
3852               tree gnu_field = get_gnu_tree (gnat_temp);
3853
3854               /* ??? Unfortunately, GCC needs to be able to prove the
3855                  alignment of this offset and if it's a variable, it can't.
3856                  In GCC 3.4, we'll use DECL_OFFSET_ALIGN in some way, but
3857                  right now, we have to put in an explicit multiply and
3858                  divide by that value.  */
3859               if (! CONTAINS_PLACEHOLDER_P (DECL_FIELD_OFFSET (gnu_field)))
3860                 DECL_FIELD_OFFSET (gnu_field)
3861                   = build_binary_op
3862                     (MULT_EXPR, sizetype,
3863                      elaborate_expression_1
3864                      (gnat_temp, gnat_temp,
3865                       build_binary_op (EXACT_DIV_EXPR, sizetype,
3866                                        DECL_FIELD_OFFSET (gnu_field),
3867                                        size_int (DECL_OFFSET_ALIGN (gnu_field)
3868                                                  / BITS_PER_UNIT)),
3869                       get_identifier ("OFFSET"),
3870                       definition, 0),
3871                      size_int (DECL_OFFSET_ALIGN (gnu_field) / BITS_PER_UNIT));
3872             }
3873
3874       gnu_type = build_qualified_type (gnu_type,
3875                                        (TYPE_QUALS (gnu_type)
3876                                         | (TYPE_QUAL_VOLATILE
3877                                            * Treat_As_Volatile (gnat_entity))));
3878
3879       if (Is_Atomic (gnat_entity))
3880         check_ok_for_atomic (gnu_type, gnat_entity, 0);
3881
3882       if (Known_Alignment (gnat_entity))
3883         TYPE_USER_ALIGN (gnu_type) = 1;
3884
3885       if (gnu_decl == 0)
3886         {
3887           set_lineno (gnat_entity, 0);
3888           gnu_decl = create_type_decl (gnu_entity_id, gnu_type, attr_list,
3889                                        ! Comes_From_Source (gnat_entity),
3890                                        debug_info_p);
3891         }
3892       else
3893         TREE_TYPE (gnu_decl) = gnu_type;
3894     }
3895
3896   if (IN (kind, Type_Kind) && ! TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl)))
3897     {
3898       gnu_type = TREE_TYPE (gnu_decl);
3899
3900       /* Back-annotate the Alignment of the type if not already in the
3901          tree.  Likewise for sizes.  */
3902       if (Unknown_Alignment (gnat_entity))
3903         Set_Alignment (gnat_entity,
3904                        UI_From_Int (TYPE_ALIGN (gnu_type) / BITS_PER_UNIT));
3905
3906       if (Unknown_Esize (gnat_entity) && TYPE_SIZE (gnu_type) != 0)
3907         {
3908           /* If the size is self-referential, we annotate the maximum
3909              value of that size.  */
3910           tree gnu_size = TYPE_SIZE (gnu_type);
3911
3912           if (CONTAINS_PLACEHOLDER_P (gnu_size))
3913             gnu_size = max_size (gnu_size, 1);
3914
3915           Set_Esize (gnat_entity, annotate_value (gnu_size));
3916
3917           if (type_annotate_only && Is_Tagged_Type (gnat_entity))
3918             {
3919               /* In this mode the tag and the parent components are not
3920                  generated by the front-end, so the sizes must be adjusted
3921                  explicitly now. */
3922
3923              int size_offset;
3924              int new_size;
3925
3926              if (Is_Derived_Type (gnat_entity))
3927                {
3928                  size_offset
3929                    = UI_To_Int (Esize (Etype (Base_Type (gnat_entity))));
3930                  Set_Alignment (gnat_entity,
3931                                 Alignment (Etype (Base_Type (gnat_entity))));
3932                }
3933              else
3934                size_offset = POINTER_SIZE;
3935
3936              new_size = UI_To_Int (Esize (gnat_entity)) + size_offset;
3937              Set_Esize (gnat_entity,
3938                         UI_From_Int (((new_size + (POINTER_SIZE - 1))
3939                                       / POINTER_SIZE) * POINTER_SIZE));
3940              Set_RM_Size (gnat_entity, Esize (gnat_entity));
3941            }
3942         }
3943
3944       if (Unknown_RM_Size (gnat_entity) && rm_size (gnu_type) != 0)
3945         Set_RM_Size (gnat_entity, annotate_value (rm_size (gnu_type)));
3946     }
3947
3948   if (! Comes_From_Source (gnat_entity) && DECL_P (gnu_decl))
3949     DECL_ARTIFICIAL (gnu_decl) = 1;
3950
3951   if (! debug_info_p && DECL_P (gnu_decl)
3952       && TREE_CODE (gnu_decl) != FUNCTION_DECL)
3953     DECL_IGNORED_P (gnu_decl) = 1;
3954
3955   /* If this decl is really indirect, adjust it.  */
3956   if (TREE_CODE (gnu_decl) == VAR_DECL)
3957     adjust_decl_rtl (gnu_decl);
3958
3959   /* If we haven't already, associate the ..._DECL node that we just made with
3960      the input GNAT entity node. */
3961   if (! saved)
3962     save_gnu_tree (gnat_entity, gnu_decl, 0);
3963
3964   /* If this is an enumeral or floating-point type, we were not able to set
3965      the bounds since they refer to the type.  These bounds are always static.
3966
3967      For enumeration types, also write debugging information and declare the
3968      enumeration literal  table, if needed.  */
3969
3970   if ((kind == E_Enumeration_Type && Present (First_Literal (gnat_entity)))
3971       || (kind == E_Floating_Point_Type && ! Vax_Float (gnat_entity)))
3972     {
3973       tree gnu_scalar_type = gnu_type;
3974
3975       /* If this is a padded type, we need to use the underlying type.  */
3976       if (TREE_CODE (gnu_scalar_type) == RECORD_TYPE
3977           && TYPE_IS_PADDING_P (gnu_scalar_type))
3978         gnu_scalar_type = TREE_TYPE (TYPE_FIELDS (gnu_scalar_type));
3979
3980       /* If this is a floating point type and we haven't set a floating
3981          point type yet, use this in the evaluation of the bounds.  */
3982       if (longest_float_type_node == 0 && kind == E_Floating_Point_Type)
3983         longest_float_type_node = gnu_type;
3984
3985       TYPE_MIN_VALUE (gnu_scalar_type)
3986         = gnat_to_gnu (Type_Low_Bound (gnat_entity));
3987       TYPE_MAX_VALUE (gnu_scalar_type)
3988         = gnat_to_gnu (Type_High_Bound (gnat_entity));
3989
3990       if (kind == E_Enumeration_Type)
3991         {
3992           TYPE_STUB_DECL (gnu_scalar_type) = gnu_decl;
3993
3994           /* Since this has both a typedef and a tag, avoid outputting
3995              the name twice.  */
3996           DECL_ARTIFICIAL (gnu_decl) = 1;
3997           rest_of_type_compilation (gnu_scalar_type, global_bindings_p ());
3998         }
3999     }
4000
4001   /* If we deferred processing of incomplete types, re-enable it.  If there
4002      were no other disables and we have some to process, do so.  */
4003   if (this_deferred && --defer_incomplete_level == 0
4004       && defer_incomplete_list != 0)
4005     {
4006       struct incomplete *incp = defer_incomplete_list;
4007       struct incomplete *next;
4008
4009       defer_incomplete_list = 0;
4010       for (; incp; incp = next)
4011         {
4012           next = incp->next;
4013
4014           if (incp->old_type != 0)
4015             update_pointer_to (TYPE_MAIN_VARIANT (incp->old_type),
4016                                gnat_to_gnu_type (incp->full_type));
4017           free (incp);
4018         }
4019     }
4020
4021   /* If we are not defining this type, see if it's in the incomplete list.
4022      If so, handle that list entry now.  */
4023   else if (! definition)
4024     {
4025       struct incomplete *incp;
4026
4027       for (incp = defer_incomplete_list; incp; incp = incp->next)
4028         if (incp->old_type != 0 && incp->full_type == gnat_entity)
4029           {
4030             update_pointer_to (TYPE_MAIN_VARIANT (incp->old_type),
4031                                TREE_TYPE (gnu_decl));
4032             incp->old_type = 0;
4033           }
4034     }
4035
4036   if (this_global)
4037     force_global--;
4038
4039   if (Is_Packed_Array_Type (gnat_entity)
4040       && Is_Itype (Associated_Node_For_Itype (gnat_entity))
4041       && No (Freeze_Node (Associated_Node_For_Itype (gnat_entity)))
4042       && ! present_gnu_tree (Associated_Node_For_Itype (gnat_entity)))
4043     gnat_to_gnu_entity (Associated_Node_For_Itype (gnat_entity), NULL_TREE, 0);
4044
4045   return gnu_decl;
4046 }
4047 \f
4048 /* Given GNAT_ENTITY, elaborate all expressions that are required to
4049    be elaborated at the point of its definition, but do nothing else.  */
4050
4051 void
4052 elaborate_entity (Entity_Id gnat_entity)
4053 {
4054   switch (Ekind (gnat_entity))
4055     {
4056     case E_Signed_Integer_Subtype:
4057     case E_Modular_Integer_Subtype:
4058     case E_Enumeration_Subtype:
4059     case E_Ordinary_Fixed_Point_Subtype:
4060     case E_Decimal_Fixed_Point_Subtype:
4061     case E_Floating_Point_Subtype:
4062       {
4063         Node_Id gnat_lb = Type_Low_Bound (gnat_entity);
4064         Node_Id gnat_hb = Type_High_Bound (gnat_entity);
4065
4066         /* ??? Tests for avoiding static constaint error expression
4067            is needed until the front stops generating bogus conversions
4068            on bounds of real types. */
4069
4070         if (! Raises_Constraint_Error (gnat_lb))
4071           elaborate_expression (gnat_lb, gnat_entity, get_identifier ("L"),
4072                                 1, 0, Needs_Debug_Info (gnat_entity));
4073         if (! Raises_Constraint_Error (gnat_hb))
4074           elaborate_expression (gnat_hb, gnat_entity, get_identifier ("U"),
4075                                 1, 0, Needs_Debug_Info (gnat_entity));
4076       break;
4077       }
4078
4079     case E_Record_Type:
4080       {
4081         Node_Id full_definition = Declaration_Node (gnat_entity);
4082         Node_Id record_definition = Type_Definition (full_definition);
4083
4084         /* If this is a record extension, go a level further to find the
4085            record definition.  */
4086         if (Nkind (record_definition) == N_Derived_Type_Definition)
4087           record_definition = Record_Extension_Part (record_definition);
4088       }
4089       break;
4090
4091     case E_Record_Subtype:
4092     case E_Private_Subtype:
4093     case E_Limited_Private_Subtype:
4094     case E_Record_Subtype_With_Private:
4095       if (Is_Constrained (gnat_entity)
4096           && Has_Discriminants (Base_Type (gnat_entity))
4097           && Present (Discriminant_Constraint (gnat_entity)))
4098         {
4099           Node_Id gnat_discriminant_expr;
4100           Entity_Id gnat_field;
4101
4102           for (gnat_field = First_Discriminant (Base_Type (gnat_entity)),
4103                gnat_discriminant_expr
4104                = First_Elmt (Discriminant_Constraint (gnat_entity));
4105                Present (gnat_field);
4106                gnat_field = Next_Discriminant (gnat_field),
4107                gnat_discriminant_expr = Next_Elmt (gnat_discriminant_expr))
4108             /* ??? For now, ignore access discriminants.  */
4109             if (! Is_Access_Type (Etype (Node (gnat_discriminant_expr))))
4110               elaborate_expression (Node (gnat_discriminant_expr),
4111                                     gnat_entity,
4112                                     get_entity_name (gnat_field), 1, 0, 0);
4113         }
4114       break;
4115
4116     }
4117 }
4118 \f
4119 /* Mark GNAT_ENTITY as going out of scope at this point.  Recursively mark
4120    any entities on its entity chain similarly.  */
4121
4122 void
4123 mark_out_of_scope (Entity_Id gnat_entity)
4124 {
4125   Entity_Id gnat_sub_entity;
4126   unsigned int kind = Ekind (gnat_entity);
4127
4128   /* If this has an entity list, process all in the list.  */
4129   if (IN (kind, Class_Wide_Kind) || IN (kind, Concurrent_Kind)
4130       || IN (kind, Private_Kind)
4131       || kind == E_Block || kind == E_Entry || kind == E_Entry_Family
4132       || kind == E_Function || kind == E_Generic_Function
4133       || kind == E_Generic_Package || kind == E_Generic_Procedure
4134       || kind == E_Loop || kind == E_Operator || kind == E_Package
4135       || kind == E_Package_Body || kind == E_Procedure
4136       || kind == E_Record_Type || kind == E_Record_Subtype
4137       || kind == E_Subprogram_Body || kind == E_Subprogram_Type)
4138     for (gnat_sub_entity = First_Entity (gnat_entity);
4139          Present (gnat_sub_entity);
4140          gnat_sub_entity = Next_Entity (gnat_sub_entity))
4141             if (Scope (gnat_sub_entity) == gnat_entity
4142                 && gnat_sub_entity != gnat_entity)
4143         mark_out_of_scope (gnat_sub_entity);
4144
4145   /* Now clear this if it has been defined, but only do so if it isn't
4146      a subprogram or parameter.  We could refine this, but it isn't
4147      worth it.  If this is statically allocated, it is supposed to
4148      hang around out of cope.  */
4149   if (present_gnu_tree (gnat_entity) && ! Is_Statically_Allocated (gnat_entity)
4150       && kind != E_Procedure && kind != E_Function && ! IN (kind, Formal_Kind))
4151     {
4152       save_gnu_tree (gnat_entity, NULL_TREE, 1);
4153       save_gnu_tree (gnat_entity, error_mark_node, 1);
4154     }
4155 }
4156 \f
4157 /* Set the alias set of GNU_NEW_TYPE to be that of GNU_OLD_TYPE.  If this
4158    is a multi-dimensional array type, do this recursively.  */
4159
4160 static void
4161 copy_alias_set (tree gnu_new_type, tree gnu_old_type)
4162 {
4163   if (TREE_CODE (gnu_new_type) == ARRAY_TYPE
4164       && TREE_CODE (TREE_TYPE (gnu_new_type)) == ARRAY_TYPE
4165       && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_new_type)))
4166     {
4167       /* We need to be careful here in case GNU_OLD_TYPE is an unconstrained
4168          array.  In that case, it doesn't have the same shape as GNU_NEW_TYPE,
4169          so we need to go down to what does.  */
4170       if (TREE_CODE (gnu_old_type) == UNCONSTRAINED_ARRAY_TYPE)
4171         gnu_old_type
4172           = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_old_type))));
4173
4174       copy_alias_set (TREE_TYPE (gnu_new_type), TREE_TYPE (gnu_old_type));
4175     }
4176
4177   TYPE_ALIAS_SET (gnu_new_type) = get_alias_set (gnu_old_type);
4178   record_component_aliases (gnu_new_type);
4179 }
4180 \f
4181 /* Return a TREE_LIST describing the substitutions needed to reflect
4182    discriminant substitutions from GNAT_SUBTYPE to GNAT_TYPE and add
4183    them to GNU_LIST.  If GNAT_TYPE is not specified, use the base type
4184    of GNAT_SUBTYPE. The substitions can be in any order.  TREE_PURPOSE
4185    gives the tree for the discriminant and TREE_VALUES is the replacement
4186    value.  They are in the form of operands to substitute_in_expr.
4187    DEFINITION is as in gnat_to_gnu_entity.  */
4188
4189 static tree
4190 substitution_list (Entity_Id gnat_subtype,
4191                    Entity_Id gnat_type,
4192                    tree gnu_list,
4193                    int definition)
4194 {
4195   Entity_Id gnat_discrim;
4196   Node_Id gnat_value;
4197
4198   if (No (gnat_type))
4199     gnat_type = Implementation_Base_Type (gnat_subtype);
4200
4201   if (Has_Discriminants (gnat_type))
4202     for (gnat_discrim = First_Stored_Discriminant (gnat_type),
4203          gnat_value = First_Elmt (Stored_Constraint (gnat_subtype));
4204          Present (gnat_discrim);
4205          gnat_discrim = Next_Stored_Discriminant (gnat_discrim),
4206          gnat_value = Next_Elmt (gnat_value))
4207       /* Ignore access discriminants.  */
4208       if (! Is_Access_Type (Etype (Node (gnat_value))))
4209         gnu_list = tree_cons (gnat_to_gnu_entity (gnat_discrim, NULL_TREE, 0),
4210                             elaborate_expression
4211                               (Node (gnat_value), gnat_subtype,
4212                                get_entity_name (gnat_discrim), definition,
4213                                1, 0),
4214                               gnu_list);
4215
4216   return gnu_list;
4217 }
4218 \f
4219 /* For the following two functions: for each GNAT entity, the GCC
4220    tree node used as a dummy for that entity, if any.  */
4221
4222 static GTY((length ("max_gnat_nodes"))) tree * dummy_node_table;
4223
4224 /* Initialize the above table.  */
4225
4226 void
4227 init_dummy_type (void)
4228 {
4229   Node_Id gnat_node;
4230
4231   dummy_node_table = (tree *) ggc_alloc (max_gnat_nodes * sizeof (tree));
4232
4233   for (gnat_node = 0; gnat_node < max_gnat_nodes; gnat_node++)
4234     dummy_node_table[gnat_node] = NULL_TREE;
4235
4236   dummy_node_table -= First_Node_Id;
4237 }
4238
4239 /* Make a dummy type corresponding to GNAT_TYPE.  */
4240
4241 tree
4242 make_dummy_type (Entity_Id gnat_type)
4243 {
4244   Entity_Id gnat_underlying;
4245   tree gnu_type;
4246
4247   /* Find a full type for GNAT_TYPE, taking into account any class wide
4248      types.  */
4249   if (Is_Class_Wide_Type (gnat_type) && Present (Equivalent_Type (gnat_type)))
4250     gnat_type = Equivalent_Type (gnat_type);
4251   else if (Ekind (gnat_type) == E_Class_Wide_Type)
4252     gnat_type = Root_Type (gnat_type);
4253
4254   for (gnat_underlying = gnat_type;
4255        (IN (Ekind (gnat_underlying), Incomplete_Or_Private_Kind)
4256         && Present (Full_View (gnat_underlying)));
4257        gnat_underlying = Full_View (gnat_underlying))
4258     ;
4259
4260   /* If it there already a dummy type, use that one.  Else make one.  */
4261   if (dummy_node_table[gnat_underlying])
4262     return dummy_node_table[gnat_underlying];
4263
4264   /* If this is a record, make this a RECORD_TYPE or UNION_TYPE; else make
4265      it a VOID_TYPE.  */
4266   if (Is_Record_Type (gnat_underlying))
4267     gnu_type = make_node (Is_Unchecked_Union (gnat_underlying)
4268                           ? UNION_TYPE : RECORD_TYPE);
4269   else
4270     gnu_type = make_node (ENUMERAL_TYPE);
4271
4272   TYPE_NAME (gnu_type) = get_entity_name (gnat_type);
4273   if (AGGREGATE_TYPE_P (gnu_type))
4274     TYPE_STUB_DECL (gnu_type)
4275       = pushdecl (build_decl (TYPE_DECL, NULL_TREE, gnu_type));
4276
4277   TYPE_DUMMY_P (gnu_type) = 1;
4278   dummy_node_table[gnat_underlying] = gnu_type;
4279
4280   return gnu_type;
4281 }
4282 \f
4283 /* Return 1 if the size represented by GNU_SIZE can be handled by an
4284    allocation.  If STATIC_P is non-zero, consider only what can be
4285    done with a static allocation.  */
4286
4287 static int
4288 allocatable_size_p (tree gnu_size, int static_p)
4289 {
4290   HOST_WIDE_INT our_size;
4291
4292   /* If this is not a static allocation, the only case we want to forbid
4293      is an overflowing size.  That will be converted into a raise a
4294      Storage_Error.  */
4295   if (! static_p)
4296     return ! (TREE_CODE (gnu_size) == INTEGER_CST
4297               && TREE_CONSTANT_OVERFLOW (gnu_size));
4298
4299   /* Otherwise, we need to deal with both variable sizes and constant
4300      sizes that won't fit in a host int.  We use int instead of HOST_WIDE_INT
4301      since assemblers may not like very large sizes.  */
4302   if (!host_integerp (gnu_size, 1))
4303     return 0;
4304
4305   our_size = tree_low_cst (gnu_size, 1);
4306   return (int) our_size == our_size;
4307 }
4308 \f
4309 /* Return a list of attributes for GNAT_ENTITY, if any.  */
4310
4311 static struct attrib *
4312 build_attr_list (Entity_Id gnat_entity)
4313 {
4314   struct attrib *attr_list = 0;
4315   Node_Id gnat_temp;
4316
4317   for (gnat_temp = First_Rep_Item (gnat_entity); Present (gnat_temp);
4318        gnat_temp = Next_Rep_Item (gnat_temp))
4319     if (Nkind (gnat_temp) == N_Pragma)
4320       {
4321         struct attrib *attr;
4322         tree gnu_arg0 = 0, gnu_arg1 = 0;
4323         Node_Id gnat_assoc = Pragma_Argument_Associations (gnat_temp);
4324         enum attr_type etype;
4325
4326         if (Present (gnat_assoc) && Present (First (gnat_assoc))
4327             && Present (Next (First (gnat_assoc)))
4328             && (Nkind (Expression (Next (First (gnat_assoc))))
4329                 == N_String_Literal))
4330           {
4331             gnu_arg0 = get_identifier (TREE_STRING_POINTER
4332                                        (gnat_to_gnu
4333                                         (Expression (Next
4334                                                      (First (gnat_assoc))))));
4335             if (Present (Next (Next (First (gnat_assoc))))
4336                 && (Nkind (Expression (Next (Next (First (gnat_assoc)))))
4337                     == N_String_Literal))
4338               gnu_arg1 = get_identifier (TREE_STRING_POINTER
4339                                          (gnat_to_gnu
4340                                           (Expression
4341                                            (Next (Next
4342                                                   (First (gnat_assoc)))))));
4343           }
4344
4345         switch (Get_Pragma_Id (Chars (gnat_temp)))
4346           {
4347           case Pragma_Machine_Attribute:
4348             etype = ATTR_MACHINE_ATTRIBUTE;
4349             break;
4350
4351           case Pragma_Linker_Alias:
4352             etype = ATTR_LINK_ALIAS;
4353             break;
4354
4355           case Pragma_Linker_Section:
4356             etype = ATTR_LINK_SECTION;
4357             break;
4358
4359           case Pragma_Weak_External:
4360             etype = ATTR_WEAK_EXTERNAL;
4361             break;
4362
4363           default:
4364             continue;
4365           }
4366
4367         attr = (struct attrib *) xmalloc (sizeof (struct attrib));
4368         attr->next = attr_list;
4369         attr->type = etype;
4370         attr->name = gnu_arg0;
4371         attr->arg = gnu_arg1;
4372         attr->error_point
4373           = Present (Next (First (gnat_assoc)))
4374             ? Expression (Next (First (gnat_assoc))) : gnat_temp;
4375         attr_list = attr;
4376       }
4377
4378   return attr_list;
4379 }
4380 \f
4381 /* Get the unpadded version of a GNAT type.  */
4382
4383 tree
4384 get_unpadded_type (Entity_Id gnat_entity)
4385 {
4386   tree type = gnat_to_gnu_type (gnat_entity);
4387
4388   if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
4389     type = TREE_TYPE (TYPE_FIELDS (type));
4390
4391   return type;
4392 }
4393 \f
4394 /* Called when we need to protect a variable object using a save_expr.  */
4395
4396 tree
4397 maybe_variable (tree gnu_operand, Node_Id gnat_node)
4398 {
4399   if (TREE_CONSTANT (gnu_operand) || TREE_READONLY (gnu_operand)
4400       || TREE_CODE (gnu_operand) == SAVE_EXPR
4401       || TREE_CODE (gnu_operand) == NULL_EXPR)
4402     return gnu_operand;
4403
4404   /* If we will be generating code, make sure we are at the proper
4405      line number.  */
4406   if (! global_bindings_p () && ! CONTAINS_PLACEHOLDER_P (gnu_operand))
4407   set_lineno (gnat_node, 1);
4408
4409   if (TREE_CODE (gnu_operand) == UNCONSTRAINED_ARRAY_REF)
4410     return build1 (UNCONSTRAINED_ARRAY_REF, TREE_TYPE (gnu_operand),
4411                    variable_size (TREE_OPERAND (gnu_operand, 0)));
4412   else
4413     return variable_size (gnu_operand);
4414 }
4415 \f
4416 /* Given a GNAT tree GNAT_EXPR, for an expression which is a value within a
4417    type definition (either a bound or a discriminant value) for GNAT_ENTITY,
4418    return the GCC tree to use for that expression.  GNU_NAME is the
4419    qualification to use if an external name is appropriate and DEFINITION is
4420    nonzero if this is a definition of GNAT_ENTITY.  If NEED_VALUE is nonzero,
4421    we need a result.  Otherwise, we are just elaborating this for
4422    side-effects.  If NEED_DEBUG is nonzero we need the symbol for debugging
4423    purposes even if it isn't needed for code generation.  */
4424
4425 static tree
4426 elaborate_expression (Node_Id gnat_expr,
4427                       Entity_Id gnat_entity,
4428                       tree gnu_name,
4429                       int definition,
4430                       int need_value,
4431                       int need_debug)
4432 {
4433   tree gnu_expr;
4434
4435   /* If we already elaborated this expression (e.g., it was involved
4436      in the definition of a private type), use the old value.  */
4437   if (present_gnu_tree (gnat_expr))
4438     return get_gnu_tree (gnat_expr);
4439
4440   /* If we don't need a value and this is static or a discriment, we
4441      don't need to do anything.  */
4442   else if (! need_value
4443            && (Is_OK_Static_Expression (gnat_expr)
4444                || (Nkind (gnat_expr) == N_Identifier
4445                    && Ekind (Entity (gnat_expr)) == E_Discriminant)))
4446     return 0;
4447
4448   /* Otherwise, convert this tree to its GCC equivalant.  */
4449   gnu_expr
4450     = elaborate_expression_1 (gnat_expr, gnat_entity, gnat_to_gnu (gnat_expr),
4451                               gnu_name, definition, need_debug);
4452
4453   /* Save the expression in case we try to elaborate this entity again.
4454      Since this is not a DECL, don't check it.  If this is a constant,
4455      don't save it since GNAT_EXPR might be used more than once.  Also,
4456      don't save if it's a discriminant.  */
4457   if (! CONTAINS_PLACEHOLDER_P (gnu_expr))
4458     save_gnu_tree (gnat_expr, gnu_expr, 1);
4459
4460   return need_value ? gnu_expr : error_mark_node;
4461 }
4462
4463 /* Similar, but take a GNU expression.  */
4464
4465 static tree
4466 elaborate_expression_1 (Node_Id gnat_expr,
4467                         Entity_Id gnat_entity,
4468                         tree gnu_expr,
4469                         tree gnu_name,
4470                         int definition,
4471                         int need_debug)
4472 {
4473   tree gnu_decl = 0;
4474   /* Strip any conversions to see if the expression is a readonly variable.
4475      ??? This really should remain readonly, but we have to think about
4476      the typing of the tree here.  */
4477   tree gnu_inner_expr = remove_conversions (gnu_expr, 1);
4478   int expr_global = Is_Public (gnat_entity) || global_bindings_p ();
4479   int expr_variable;
4480
4481   /* In most cases, we won't see a naked FIELD_DECL here because a
4482      discriminant reference will have been replaced with a COMPONENT_REF
4483      when the type is being elaborated.  However, there are some cases
4484      involving child types where we will.  So convert it to a COMPONENT_REF
4485      here.  We have to hope it will be at the highest level of the
4486      expression in these cases.  */
4487   if (TREE_CODE (gnu_expr) == FIELD_DECL)
4488     gnu_expr = build (COMPONENT_REF, TREE_TYPE (gnu_expr),
4489                       build (PLACEHOLDER_EXPR, DECL_CONTEXT (gnu_expr)),
4490                       gnu_expr);
4491
4492   /* If GNU_EXPR is neither a placeholder nor a constant, nor a variable
4493      that is a constant, make a variable that is initialized to contain the
4494      bound when the package containing the definition is elaborated.  If
4495      this entity is defined at top level and a bound or discriminant value
4496      isn't a constant or a reference to a discriminant, replace the bound
4497      by the variable; otherwise use a SAVE_EXPR if needed.  Note that we
4498      rely here on the fact that an expression cannot contain both the
4499      discriminant and some other variable.  */
4500
4501   expr_variable = (TREE_CODE_CLASS (TREE_CODE (gnu_expr)) != 'c'
4502                    && ! (TREE_CODE (gnu_inner_expr) == VAR_DECL
4503                          && TREE_READONLY (gnu_inner_expr))
4504                    && ! CONTAINS_PLACEHOLDER_P (gnu_expr));
4505
4506   /* If this is a static expression or contains a discriminant, we don't
4507      need the variable for debugging (and can't elaborate anyway if a
4508      discriminant).  */
4509   if (need_debug
4510       && (Is_OK_Static_Expression (gnat_expr)
4511           || CONTAINS_PLACEHOLDER_P (gnu_expr)))
4512     need_debug = 0;
4513
4514   /* Now create the variable if we need it.  */
4515   if (need_debug || (expr_variable && expr_global))
4516     {
4517       set_lineno (gnat_entity, ! global_bindings_p ());
4518       gnu_decl
4519         = create_var_decl (create_concat_name (gnat_entity,
4520                                                IDENTIFIER_POINTER (gnu_name)),
4521                            NULL_TREE, TREE_TYPE (gnu_expr), gnu_expr, 1,
4522                            Is_Public (gnat_entity), ! definition, 0, 0);
4523     }
4524
4525   /* We only need to use this variable if we are in global context since GCC
4526      can do the right thing in the local case.  */
4527   if (expr_global && expr_variable)
4528     return gnu_decl;
4529   else if (! expr_variable)
4530     return gnu_expr;
4531   else
4532     return maybe_variable (gnu_expr, gnat_expr);
4533 }
4534 \f
4535 /* Create a record type that contains a field of TYPE with a starting bit
4536    position so that it is aligned to ALIGN bits and is SIZE bytes long.  */
4537
4538 tree
4539 make_aligning_type (tree type, int align, tree size)
4540 {
4541   tree record_type = make_node (RECORD_TYPE);
4542   tree place = build (PLACEHOLDER_EXPR, record_type);
4543   tree size_addr_place = convert (sizetype,
4544                                   build_unary_op (ADDR_EXPR, NULL_TREE,
4545                                                   place));
4546   tree name = TYPE_NAME (type);
4547   tree pos, field;
4548
4549   if (TREE_CODE (name) == TYPE_DECL)
4550     name = DECL_NAME (name);
4551
4552   TYPE_NAME (record_type) = concat_id_with_name (name, "_ALIGN");
4553
4554   /* The bit position is obtained by "and"ing the alignment minus 1
4555      with the two's complement of the address and  multiplying
4556      by the number of bits per unit.  Do all this in sizetype.  */
4557
4558   pos = size_binop (MULT_EXPR,
4559                     convert (bitsizetype,
4560                              size_binop (BIT_AND_EXPR,
4561                                          size_diffop (size_zero_node,
4562                                                       size_addr_place),
4563                                          ssize_int ((align / BITS_PER_UNIT)
4564                                                     - 1))),
4565                     bitsize_unit_node);
4566
4567   field = create_field_decl (get_identifier ("F"), type, record_type,
4568                              1, size, pos, 1);
4569   DECL_BIT_FIELD (field) = 0;
4570
4571   finish_record_type (record_type, field, 1, 0);
4572   TYPE_ALIGN (record_type) = BIGGEST_ALIGNMENT;
4573   TYPE_SIZE (record_type)
4574     = size_binop (PLUS_EXPR,
4575                   size_binop (MULT_EXPR, convert (bitsizetype, size),
4576                               bitsize_unit_node),
4577                   bitsize_int (align));
4578   TYPE_SIZE_UNIT (record_type)
4579     = size_binop (PLUS_EXPR, size, size_int (align / BITS_PER_UNIT));
4580   copy_alias_set (record_type, type);
4581   return record_type;
4582 }
4583 \f
4584 /* TYPE is a RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE, with BLKmode that's
4585    being used as the field type of a packed record.  See if we can rewrite it
4586    as a record that has a non-BLKmode type, which we can pack tighter.  If so,
4587    return the new type.  If not, return the original type.  */
4588
4589 static tree
4590 make_packable_type (tree type)
4591 {
4592   tree new_type = make_node (TREE_CODE (type));
4593   tree field_list = NULL_TREE;
4594   tree old_field;
4595
4596   /* Copy the name and flags from the old type to that of the new and set
4597      the alignment to try for an integral type.  For QUAL_UNION_TYPE,
4598      also copy the size.  */
4599   TYPE_NAME (new_type) = TYPE_NAME (type);
4600   TYPE_LEFT_JUSTIFIED_MODULAR_P (new_type)
4601     = TYPE_LEFT_JUSTIFIED_MODULAR_P (type);
4602   TYPE_CONTAINS_TEMPLATE_P (new_type) = TYPE_CONTAINS_TEMPLATE_P (type);
4603   TYPE_IS_PADDING_P (new_type) = TYPE_IS_PADDING_P (type);
4604   if (TREE_CODE (type) == QUAL_UNION_TYPE)
4605     {
4606       TYPE_SIZE (new_type) = TYPE_SIZE (type);
4607       TYPE_SIZE_UNIT (new_type) = TYPE_SIZE_UNIT (type);
4608     }
4609
4610   TYPE_ALIGN (new_type)
4611     = ((HOST_WIDE_INT) 1
4612        << (floor_log2 (tree_low_cst (TYPE_SIZE (type), 1) - 1) + 1));
4613
4614   /* Now copy the fields, keeping the position and size.  */
4615   for (old_field = TYPE_FIELDS (type); old_field != 0;
4616        old_field = TREE_CHAIN (old_field))
4617     {
4618       tree new_field_type = TREE_TYPE (old_field);
4619       tree new_field;
4620
4621       if (TYPE_MODE (new_field_type) == BLKmode
4622           && (TREE_CODE (new_field_type) == RECORD_TYPE
4623               || TREE_CODE (new_field_type) == UNION_TYPE
4624               || TREE_CODE (new_field_type) == QUAL_UNION_TYPE)
4625           && host_integerp (TYPE_SIZE (new_field_type), 1))
4626         new_field_type = make_packable_type (new_field_type);
4627
4628       new_field = create_field_decl (DECL_NAME (old_field), new_field_type,
4629                                      new_type, TYPE_PACKED (type),
4630                                      DECL_SIZE (old_field),
4631                                      bit_position (old_field),
4632                                      ! DECL_NONADDRESSABLE_P (old_field));
4633
4634       DECL_INTERNAL_P (new_field) = DECL_INTERNAL_P (old_field);
4635       SET_DECL_ORIGINAL_FIELD (new_field,
4636           (DECL_ORIGINAL_FIELD (old_field) != 0
4637            ? DECL_ORIGINAL_FIELD (old_field) : old_field));
4638
4639       if (TREE_CODE (new_type) == QUAL_UNION_TYPE)
4640         DECL_QUALIFIER (new_field) = DECL_QUALIFIER (old_field);
4641
4642       TREE_CHAIN (new_field) = field_list;
4643       field_list = new_field;
4644     }
4645
4646   finish_record_type (new_type, nreverse (field_list), 1, 1);
4647   copy_alias_set (new_type, type);
4648   return TYPE_MODE (new_type) == BLKmode ? type : new_type;
4649 }
4650 \f
4651 /* Ensure that TYPE has SIZE and ALIGN.  Make and return a new padded type
4652    if needed.  We have already verified that SIZE and TYPE are large enough.
4653
4654    GNAT_ENTITY and NAME_TRAILER are used to name the resulting record and
4655    to issue a warning.
4656
4657    IS_USER_TYPE is nonzero if we must be sure we complete the original type.
4658
4659    DEFINITION is nonzero if this type is being defined.
4660
4661    SAME_RM_SIZE is nonzero if the RM_Size of the resulting type is to be
4662    set to its TYPE_SIZE; otherwise, it's set to the RM_Size of the original
4663    type.  */
4664
4665 static tree
4666 maybe_pad_type (tree type,
4667                 tree size,
4668                 unsigned int align,
4669                 Entity_Id gnat_entity,
4670                 const char *name_trailer,
4671                 int is_user_type,
4672                 int definition,
4673                 int same_rm_size)
4674 {
4675   tree orig_size = TYPE_SIZE (type);
4676   tree record;
4677   tree field;
4678
4679   /* If TYPE is a padded type, see if it agrees with any size and alignment
4680      we were given.  If so, return the original type.  Otherwise, strip
4681      off the padding, since we will either be returning the inner type
4682      or repadding it.  If no size or alignment is specified, use that of
4683      the original padded type.  */
4684
4685   if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
4686     {
4687       if ((size == 0
4688            || operand_equal_p (round_up (size,
4689                                          MAX (align, TYPE_ALIGN (type))),
4690                                round_up (TYPE_SIZE (type),
4691                                          MAX (align, TYPE_ALIGN (type))),
4692                                0))
4693           && (align == 0 || align == TYPE_ALIGN (type)))
4694         return type;
4695
4696       if (size == 0)
4697         size = TYPE_SIZE (type);
4698       if (align == 0)
4699         align = TYPE_ALIGN (type);
4700
4701       type = TREE_TYPE (TYPE_FIELDS (type));
4702       orig_size = TYPE_SIZE (type);
4703     }
4704
4705   /* If the size is either not being changed or is being made smaller (which
4706      is not done here (and is only valid for bitfields anyway), show the size
4707      isn't changing.  Likewise, clear the alignment if it isn't being
4708      changed.  Then return if we aren't doing anything.  */
4709
4710   if (size != 0
4711       && (operand_equal_p (size, orig_size, 0)
4712           || (TREE_CODE (orig_size) == INTEGER_CST
4713               && tree_int_cst_lt (size, orig_size))))
4714     size = 0;
4715
4716   if (align == TYPE_ALIGN (type))
4717     align = 0;
4718
4719   if (align == 0 && size == 0)
4720     return type;
4721
4722   /* We used to modify the record in place in some cases, but that could
4723      generate incorrect debugging information.  So make a new record
4724      type and name.  */
4725   record = make_node (RECORD_TYPE);
4726
4727   if (Present (gnat_entity))
4728     TYPE_NAME (record) = create_concat_name (gnat_entity, name_trailer);
4729
4730   /* If we were making a type, complete the original type and give it a
4731      name.  */
4732   if (is_user_type)
4733     create_type_decl (get_entity_name (gnat_entity), type,
4734                       0, ! Comes_From_Source (gnat_entity),
4735                       ! (TYPE_NAME (type) != 0
4736                          && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
4737                          && DECL_IGNORED_P (TYPE_NAME (type))));
4738
4739   /* If we are changing the alignment and the input type is a record with
4740      BLKmode and a small constant size, try to make a form that has an
4741      integral mode.  That might allow this record to have an integral mode,
4742      which will be much more efficient.  There is no point in doing this if a
4743      size is specified unless it is also smaller than the biggest alignment
4744      and it is incorrect to do this if the size of the original type is not a
4745      multiple of the alignment.  */
4746   if (align != 0
4747       && TREE_CODE (type) == RECORD_TYPE
4748       && TYPE_MODE (type) == BLKmode
4749       && host_integerp (orig_size, 1)
4750       && compare_tree_int (orig_size, BIGGEST_ALIGNMENT) <= 0
4751       && (size == 0
4752           || (TREE_CODE (size) == INTEGER_CST
4753               && compare_tree_int (size, BIGGEST_ALIGNMENT) <= 0))
4754       && tree_low_cst (orig_size, 1) % align == 0)
4755     type = make_packable_type (type);
4756
4757   field  = create_field_decl (get_identifier ("F"), type, record, 0,
4758                               NULL_TREE, bitsize_zero_node, 1);
4759
4760   DECL_INTERNAL_P (field) = 1;
4761   TYPE_SIZE (record) = size != 0 ? size : orig_size;
4762   TYPE_SIZE_UNIT (record)
4763     = convert (sizetype,
4764                size_binop (CEIL_DIV_EXPR, TYPE_SIZE (record),
4765                            bitsize_unit_node));
4766   TYPE_ALIGN (record) = align;
4767   TYPE_IS_PADDING_P (record) = 1;
4768   TYPE_VOLATILE (record)
4769     = Present (gnat_entity) && Treat_As_Volatile (gnat_entity);
4770   finish_record_type (record, field, 1, 0);
4771
4772   /* Keep the RM_Size of the padded record as that of the old record
4773      if requested.  */
4774   SET_TYPE_ADA_SIZE (record, same_rm_size ? size : rm_size (type));
4775
4776   /* Unless debugging information isn't being written for the input type,
4777      write a record that shows what we are a subtype of and also make a
4778      variable that indicates our size, if variable. */
4779   if (TYPE_NAME (record) != 0
4780       && AGGREGATE_TYPE_P (type)
4781       && (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL
4782           || ! DECL_IGNORED_P (TYPE_NAME (type))))
4783     {
4784       tree marker = make_node (RECORD_TYPE);
4785       tree name = DECL_NAME (TYPE_NAME (record));
4786       tree orig_name = TYPE_NAME (type);
4787
4788       if (TREE_CODE (orig_name) == TYPE_DECL)
4789         orig_name = DECL_NAME (orig_name);
4790
4791       TYPE_NAME (marker) = concat_id_with_name (name, "XVS");
4792       finish_record_type (marker,
4793                           create_field_decl (orig_name, integer_type_node,
4794                                              marker, 0, NULL_TREE, NULL_TREE,
4795                                              0),
4796                           0, 0);
4797
4798       if (size != 0 && TREE_CODE (size) != INTEGER_CST && definition)
4799         create_var_decl (concat_id_with_name (name, "XVZ"), NULL_TREE,
4800                          sizetype, TYPE_SIZE (record), 0, 0, 0, 0,
4801                          0);
4802     }
4803
4804   type = record;
4805
4806   if (CONTAINS_PLACEHOLDER_P (orig_size))
4807     orig_size = max_size (orig_size, 1);
4808
4809   /* If the size was widened explicitly, maybe give a warning.  */
4810   if (size != 0 && Present (gnat_entity)
4811       && ! operand_equal_p (size, orig_size, 0)
4812       && ! (TREE_CODE (size) == INTEGER_CST
4813             && TREE_CODE (orig_size) == INTEGER_CST
4814             && tree_int_cst_lt (size, orig_size)))
4815     {
4816       Node_Id gnat_error_node = Empty;
4817
4818       if (Is_Packed_Array_Type (gnat_entity))
4819         gnat_entity = Associated_Node_For_Itype (gnat_entity);
4820
4821       if ((Ekind (gnat_entity) == E_Component
4822            || Ekind (gnat_entity) == E_Discriminant)
4823           && Present (Component_Clause (gnat_entity)))
4824         gnat_error_node = Last_Bit (Component_Clause (gnat_entity));
4825       else if (Present (Size_Clause (gnat_entity)))
4826         gnat_error_node = Expression (Size_Clause (gnat_entity));
4827
4828       /* Generate message only for entities that come from source, since
4829          if we have an entity created by expansion, the message will be
4830          generated for some other corresponding source entity.  */
4831       if (Comes_From_Source (gnat_entity) && Present (gnat_error_node))
4832         post_error_ne_tree ("{^ }bits of & unused?", gnat_error_node,
4833                             gnat_entity,
4834                             size_diffop (size, orig_size));
4835
4836       else if (*name_trailer == 'C' && ! Is_Internal (gnat_entity))
4837         post_error_ne_tree ("component of& padded{ by ^ bits}?",
4838                             gnat_entity, gnat_entity,
4839                             size_diffop (size, orig_size));
4840     }
4841
4842   return type;
4843 }
4844 \f
4845 /* Given a GNU tree and a GNAT list of choices, generate an expression to test
4846    the value passed against the list of choices.  */
4847
4848 tree
4849 choices_to_gnu (tree operand, Node_Id choices)
4850 {
4851   Node_Id choice;
4852   Node_Id gnat_temp;
4853   tree result = integer_zero_node;
4854   tree this_test, low = 0, high = 0, single = 0;
4855
4856   for (choice = First (choices); Present (choice); choice = Next (choice))
4857     {
4858       switch (Nkind (choice))
4859         {
4860         case N_Range:
4861           low = gnat_to_gnu (Low_Bound (choice));
4862           high = gnat_to_gnu (High_Bound (choice));
4863
4864           /* There's no good type to use here, so we might as well use
4865              integer_type_node.  */
4866           this_test
4867             = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
4868                                build_binary_op (GE_EXPR, integer_type_node,
4869                                                 operand, low),
4870                                build_binary_op (LE_EXPR, integer_type_node,
4871                                                 operand, high));
4872
4873           break;
4874
4875         case N_Subtype_Indication:
4876           gnat_temp = Range_Expression (Constraint (choice));
4877           low = gnat_to_gnu (Low_Bound (gnat_temp));
4878           high = gnat_to_gnu (High_Bound (gnat_temp));
4879
4880           this_test
4881             = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
4882                                build_binary_op (GE_EXPR, integer_type_node,
4883                                                 operand, low),
4884                                build_binary_op (LE_EXPR, integer_type_node,
4885                                                 operand, high));
4886           break;
4887
4888         case N_Identifier:
4889         case N_Expanded_Name:
4890           /* This represents either a subtype range, an enumeration
4891              literal, or a constant  Ekind says which.  If an enumeration
4892              literal or constant, fall through to the next case.  */
4893           if (Ekind (Entity (choice)) != E_Enumeration_Literal
4894               && Ekind (Entity (choice)) != E_Constant)
4895             {
4896               tree type = gnat_to_gnu_type (Entity (choice));
4897
4898               low = TYPE_MIN_VALUE (type);
4899               high = TYPE_MAX_VALUE (type);
4900
4901               this_test
4902                 = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
4903                                    build_binary_op (GE_EXPR, integer_type_node,
4904                                                     operand, low),
4905                                    build_binary_op (LE_EXPR, integer_type_node,
4906                                                     operand, high));
4907               break;
4908             }
4909           /* ... fall through ... */
4910         case N_Character_Literal:
4911         case N_Integer_Literal:
4912           single = gnat_to_gnu (choice);
4913           this_test = build_binary_op (EQ_EXPR, integer_type_node, operand,
4914                                        single);
4915           break;
4916
4917         case N_Others_Choice:
4918           this_test = integer_one_node;
4919           break;
4920
4921         default:
4922           gigi_abort (114);
4923         }
4924
4925       result = build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
4926                                 result, this_test);
4927     }
4928
4929   return result;
4930 }
4931 \f
4932 /* Return a GCC tree for a field corresponding to GNAT_FIELD to be
4933    placed in GNU_RECORD_TYPE.
4934
4935    PACKED is 1 if the enclosing record is packed and -1 if the enclosing
4936    record has a Component_Alignment of Storage_Unit.
4937
4938    DEFINITION is nonzero if this field is for a record being defined.  */
4939
4940 static tree
4941 gnat_to_gnu_field (Entity_Id gnat_field,
4942                    tree gnu_record_type,
4943                    int packed,
4944                    int definition)
4945 {
4946   tree gnu_field_id = get_entity_name (gnat_field);
4947   tree gnu_field_type = gnat_to_gnu_type (Etype (gnat_field));
4948   tree gnu_orig_field_type = gnu_field_type;
4949   tree gnu_pos = 0;
4950   tree gnu_size = 0;
4951   tree gnu_field;
4952   int needs_strict_alignment
4953     = (Is_Aliased (gnat_field) || Strict_Alignment (Etype (gnat_field))
4954        || Treat_As_Volatile (gnat_field));
4955
4956   /* If this field requires strict alignment or contains an item of
4957      variable sized, pretend it isn't packed.  */
4958   if (needs_strict_alignment || is_variable_size (gnu_field_type))
4959     packed = 0;
4960
4961   /* For packed records, this is one of the few occasions on which we use
4962      the official RM size for discrete or fixed-point components, instead
4963      of the normal GNAT size stored in Esize. See description in Einfo:
4964      "Handling of Type'Size Values" for further details.  */
4965
4966   if (packed == 1)
4967     gnu_size = validate_size (RM_Size (Etype (gnat_field)), gnu_field_type,
4968                               gnat_field, FIELD_DECL, 0, 1);
4969
4970   if (Known_Static_Esize (gnat_field))
4971     gnu_size = validate_size (Esize (gnat_field), gnu_field_type,
4972                               gnat_field, FIELD_DECL, 0, 1);
4973
4974   /* If the field's type is left-justified modular, the wrapper can prevent
4975      packing so we make the field the type of the inner object unless the
4976      situation forbids it. We may not do that when the field is addressable_p,
4977      typically because in that case this field may later be passed by-ref for
4978      a formal argument expecting the left justification.  The condition below
4979      is then matching the addressable_p code for COMPONENT_REF.  */
4980   if (! Is_Aliased (gnat_field) && flag_strict_aliasing
4981       && TREE_CODE (gnu_field_type) == RECORD_TYPE
4982       && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_field_type))
4983     gnu_field_type = TREE_TYPE (TYPE_FIELDS (gnu_field_type));
4984
4985   /* If we are packing this record or we have a specified size that's
4986      smaller than that of the field type and the field type is also a record
4987      that's BLKmode and with a small constant size, see if we can get a
4988      better form of the type that allows more packing.  If we can, show
4989      a size was specified for it if there wasn't one so we know to
4990      make this a bitfield and avoid making things wider.  */
4991   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
4992       && TYPE_MODE (gnu_field_type) == BLKmode
4993       && host_integerp (TYPE_SIZE (gnu_field_type), 1)
4994       && compare_tree_int (TYPE_SIZE (gnu_field_type), BIGGEST_ALIGNMENT) <= 0
4995       && (packed
4996           || (gnu_size != 0 && tree_int_cst_lt (gnu_size,
4997                                                 TYPE_SIZE (gnu_field_type)))))
4998     {
4999       gnu_field_type = make_packable_type (gnu_field_type);
5000
5001       if (gnu_field_type != gnu_orig_field_type && gnu_size == 0)
5002         gnu_size = rm_size (gnu_field_type);
5003     }
5004
5005   /* If we are packing the record and the field is BLKmode, round the
5006      size up to a byte boundary.  */
5007   if (packed && TYPE_MODE (gnu_field_type) == BLKmode && gnu_size != 0)
5008     gnu_size = round_up (gnu_size, BITS_PER_UNIT);
5009
5010   if (Present (Component_Clause (gnat_field)))
5011     {
5012       gnu_pos = UI_To_gnu (Component_Bit_Offset (gnat_field), bitsizetype);
5013       gnu_size = validate_size (Esize (gnat_field), gnu_field_type,
5014                                 gnat_field, FIELD_DECL, 0, 1);
5015
5016       /* Ensure the position does not overlap with the parent subtype,
5017          if there is one.  */
5018       if (Present (Parent_Subtype (Underlying_Type (Scope (gnat_field)))))
5019         {
5020           tree gnu_parent
5021             = gnat_to_gnu_type (Parent_Subtype
5022                                 (Underlying_Type (Scope (gnat_field))));
5023
5024           if (TREE_CODE (TYPE_SIZE (gnu_parent)) == INTEGER_CST
5025               && tree_int_cst_lt (gnu_pos, TYPE_SIZE (gnu_parent)))
5026             {
5027               post_error_ne_tree
5028                 ("offset of& must be beyond parent{, minimum allowed is ^}",
5029                  First_Bit (Component_Clause (gnat_field)), gnat_field,
5030                  TYPE_SIZE_UNIT (gnu_parent));
5031             }
5032         }
5033
5034       /* If this field needs strict alignment, ensure the record is
5035          sufficiently aligned and that that position and size are
5036          consistent with the alignment.  */
5037       if (needs_strict_alignment)
5038         {
5039           tree gnu_min_size = round_up (rm_size (gnu_field_type),
5040                                         TYPE_ALIGN (gnu_field_type));
5041
5042           TYPE_ALIGN (gnu_record_type)
5043             = MAX (TYPE_ALIGN (gnu_record_type), TYPE_ALIGN (gnu_field_type));
5044
5045           /* If Atomic, the size must match exactly and if aliased, the size
5046              must not be less than the rounded size.  */
5047           if ((Is_Atomic (gnat_field) || Is_Atomic (Etype (gnat_field)))
5048               && ! operand_equal_p (gnu_size, TYPE_SIZE (gnu_field_type), 0))
5049             {
5050               post_error_ne_tree
5051                 ("atomic field& must be natural size of type{ (^)}",
5052                  Last_Bit (Component_Clause (gnat_field)), gnat_field,
5053                  TYPE_SIZE (gnu_field_type));
5054
5055               gnu_size = 0;
5056             }
5057
5058           else if (Is_Aliased (gnat_field)
5059                    && gnu_size != 0
5060                    && tree_int_cst_lt (gnu_size, gnu_min_size))
5061             {
5062               post_error_ne_tree
5063                 ("size of aliased field& too small{, minimum required is ^}",
5064                  Last_Bit (Component_Clause (gnat_field)), gnat_field,
5065                  gnu_min_size);
5066               gnu_size = 0;
5067             }
5068
5069           if (! integer_zerop (size_binop
5070                                (TRUNC_MOD_EXPR, gnu_pos,
5071                                 bitsize_int (TYPE_ALIGN (gnu_field_type)))))
5072             {
5073               if (Is_Aliased (gnat_field))
5074                 post_error_ne_num
5075                   ("position of aliased field& must be multiple of ^ bits",
5076                    First_Bit (Component_Clause (gnat_field)), gnat_field,
5077                    TYPE_ALIGN (gnu_field_type));
5078
5079               else if (Treat_As_Volatile (gnat_field))
5080                 post_error_ne_num
5081                   ("position of volatile field& must be multiple of ^ bits",
5082                    First_Bit (Component_Clause (gnat_field)), gnat_field,
5083                    TYPE_ALIGN (gnu_field_type));
5084
5085               else if (Strict_Alignment (Etype (gnat_field)))
5086                 post_error_ne_num
5087   ("position of & with aliased or tagged components not multiple of ^ bits",
5088                    First_Bit (Component_Clause (gnat_field)), gnat_field,
5089                    TYPE_ALIGN (gnu_field_type));
5090               else
5091                 gigi_abort (124);
5092
5093               gnu_pos = 0;
5094             }
5095
5096           /* If an error set the size to zero, show we have no position
5097              either.  */
5098           if (gnu_size == 0)
5099             gnu_pos = 0;
5100         }
5101
5102       if (Is_Atomic (gnat_field))
5103         check_ok_for_atomic (gnu_field_type, gnat_field, 0);
5104     }
5105
5106   /* If the record has rep clauses and this is the tag field, make a rep
5107      clause for it as well.  */
5108   else if (Has_Specified_Layout (Scope (gnat_field))
5109            && Chars (gnat_field) == Name_uTag)
5110     {
5111       gnu_pos = bitsize_zero_node;
5112       gnu_size = TYPE_SIZE (gnu_field_type);
5113     }
5114
5115   /* We need to make the size the maximum for the type if it is
5116      self-referential and an unconstrained type.  In that case, we can't
5117      pack the field since we can't make a copy to align it.  */
5118   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
5119       && gnu_size == 0
5120       && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_field_type))
5121       && ! Is_Constrained (Underlying_Type (Etype (gnat_field))))
5122     {
5123       gnu_size = max_size (TYPE_SIZE (gnu_field_type), 1);
5124       packed = 0;
5125     }
5126
5127   /* If no size is specified (or if there was an error), don't specify a
5128      position.  */
5129   if (gnu_size == 0)
5130     gnu_pos = 0;
5131   else
5132     {
5133       /* Unless this field is aliased, we can remove any left-justified
5134          modular type since it's only needed in the unchecked conversion
5135          case, which doesn't apply here.  */
5136       if (! needs_strict_alignment
5137           && TREE_CODE (gnu_field_type) == RECORD_TYPE
5138           && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_field_type))
5139         gnu_field_type = TREE_TYPE (TYPE_FIELDS (gnu_field_type));
5140
5141       gnu_field_type
5142         = make_type_from_size (gnu_field_type, gnu_size,
5143                                Has_Biased_Representation (gnat_field));
5144       gnu_field_type = maybe_pad_type (gnu_field_type, gnu_size, 0,
5145                                        gnat_field, "PAD", 0, definition, 1);
5146     }
5147
5148   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
5149       && TYPE_CONTAINS_TEMPLATE_P (gnu_field_type))
5150     gigi_abort (118);
5151
5152   /* Now create the decl for the field.  */
5153   set_lineno (gnat_field, 0);
5154   gnu_field = create_field_decl (gnu_field_id, gnu_field_type, gnu_record_type,
5155                                  packed, gnu_size, gnu_pos,
5156                                  Is_Aliased (gnat_field));
5157
5158   TREE_THIS_VOLATILE (gnu_field) = Treat_As_Volatile (gnat_field);
5159
5160   if (Ekind (gnat_field) == E_Discriminant)
5161     DECL_DISCRIMINANT_NUMBER (gnu_field)
5162       = UI_To_gnu (Discriminant_Number (gnat_field), sizetype);
5163
5164   return gnu_field;
5165 }
5166 \f
5167 /* Return 1 if TYPE is a type with variable size, a padding type with a field
5168    of variable size or is a record that has a field such a field.  */
5169
5170 static int
5171 is_variable_size (tree type)
5172 {
5173   tree field;
5174
5175   /* We need not be concerned about this at all if we don't have
5176      strict alignment.  */
5177   if (! STRICT_ALIGNMENT)
5178     return 0;
5179   else if (! TREE_CONSTANT (TYPE_SIZE (type)))
5180     return 1;
5181   else if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type)
5182            && ! TREE_CONSTANT (DECL_SIZE (TYPE_FIELDS (type))))
5183     return 1;
5184   else if (TREE_CODE (type) != RECORD_TYPE
5185            && TREE_CODE (type) != UNION_TYPE
5186            && TREE_CODE (type) != QUAL_UNION_TYPE)
5187     return 0;
5188
5189   for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
5190     if (is_variable_size (TREE_TYPE (field)))
5191       return 1;
5192
5193   return 0;
5194 }
5195 \f
5196 /* Return a GCC tree for a record type given a GNAT Component_List and a chain
5197    of GCC trees for fields that are in the record and have already been
5198    processed.  When called from gnat_to_gnu_entity during the processing of a
5199    record type definition, the GCC nodes for the discriminants will be on
5200    the chain.  The other calls to this function are recursive calls from
5201    itself for the Component_List of a variant and the chain is empty.
5202
5203    PACKED is 1 if this is for a record with "pragma pack" and -1 is this is
5204    for a record type with "pragma component_alignment (storage_unit)".
5205
5206    FINISH_RECORD is nonzero if this call will supply all of the remaining
5207    fields of the record.
5208
5209    P_GNU_REP_LIST, if nonzero, is a pointer to a list to which each field
5210    with a rep clause is to be added.  If it is nonzero, that is all that
5211    should be done with such fields.
5212
5213    CANCEL_ALIGNMENT, if nonzero, means the alignment should be zeroed
5214    before laying out the record.  This means the alignment only serves
5215    to force fields to be bitfields, but not require the record to be
5216    that aligned.  This is used for variants.
5217
5218    ALL_REP, if nonzero, means that a rep clause was found for all the
5219    fields.  This simplifies the logic since we know we're not in the mixed
5220    case.
5221
5222    The processing of the component list fills in the chain with all of the
5223    fields of the record and then the record type is finished.  */
5224
5225 static void
5226 components_to_record (tree gnu_record_type,
5227                       Node_Id component_list,
5228                       tree gnu_field_list,
5229                       int packed,
5230                       int definition,
5231                       tree *p_gnu_rep_list,
5232                       int cancel_alignment,
5233                       int all_rep)
5234 {
5235   Node_Id component_decl;
5236   Entity_Id gnat_field;
5237   Node_Id variant_part;
5238   Node_Id variant;
5239   tree gnu_our_rep_list = NULL_TREE;
5240   tree gnu_field, gnu_last;
5241   int layout_with_rep = 0;
5242   int all_rep_and_size = all_rep && TYPE_SIZE (gnu_record_type) != 0;
5243
5244   /* For each variable within each component declaration create a GCC field
5245      and add it to the list, skipping any pragmas in the list.  */
5246
5247   if (Present (Component_Items (component_list)))
5248     for (component_decl = First_Non_Pragma (Component_Items (component_list));
5249          Present (component_decl);
5250          component_decl = Next_Non_Pragma (component_decl))
5251       {
5252         gnat_field = Defining_Entity (component_decl);
5253
5254         if (Chars (gnat_field) == Name_uParent)
5255           gnu_field = tree_last (TYPE_FIELDS (gnu_record_type));
5256         else
5257           {
5258             gnu_field = gnat_to_gnu_field (gnat_field, gnu_record_type,
5259                                            packed, definition);
5260
5261             /* If this is the _Tag field, put it before any discriminants,
5262                instead of after them as is the case for all other fields.
5263                Ignore field of void type if only annotating.  */
5264             if (Chars (gnat_field) == Name_uTag)
5265               gnu_field_list = chainon (gnu_field_list, gnu_field);
5266             else
5267               {
5268                 TREE_CHAIN (gnu_field) = gnu_field_list;
5269                 gnu_field_list = gnu_field;
5270               }
5271           }
5272
5273           save_gnu_tree (gnat_field, gnu_field, 0);
5274         }
5275
5276   /* At the end of the component list there may be a variant part.  */
5277   variant_part = Variant_Part (component_list);
5278
5279   /* If this is an unchecked union, each variant must have exactly one
5280      component, each of which becomes one component of this union.  */
5281   if (TREE_CODE (gnu_record_type) == UNION_TYPE && Present (variant_part))
5282     for (variant = First_Non_Pragma (Variants (variant_part));
5283          Present (variant);
5284          variant = Next_Non_Pragma (variant))
5285       {
5286         component_decl
5287           = First_Non_Pragma (Component_Items (Component_List (variant)));
5288         gnat_field = Defining_Entity (component_decl);
5289         gnu_field = gnat_to_gnu_field (gnat_field, gnu_record_type, packed,
5290                                        definition);
5291         TREE_CHAIN (gnu_field) = gnu_field_list;
5292         gnu_field_list = gnu_field;
5293         save_gnu_tree (gnat_field, gnu_field, 0);
5294       }
5295
5296   /* We create a QUAL_UNION_TYPE for the variant part since the variants are
5297      mutually exclusive and should go in the same memory.  To do this we need
5298      to treat each variant as a record whose elements are created from the
5299      component list for the variant.  So here we create the records from the
5300      lists for the variants and put them all into the QUAL_UNION_TYPE.  */
5301   else if (Present (variant_part))
5302     {
5303       tree gnu_discriminant = gnat_to_gnu (Name (variant_part));
5304       Node_Id variant;
5305       tree gnu_union_type = make_node (QUAL_UNION_TYPE);
5306       tree gnu_union_field;
5307       tree gnu_variant_list = NULL_TREE;
5308       tree gnu_name = TYPE_NAME (gnu_record_type);
5309       tree gnu_var_name
5310         = concat_id_with_name
5311           (get_identifier (Get_Name_String (Chars (Name (variant_part)))),
5312            "XVN");
5313
5314       if (TREE_CODE (gnu_name) == TYPE_DECL)
5315         gnu_name = DECL_NAME (gnu_name);
5316
5317       TYPE_NAME (gnu_union_type)
5318         = concat_id_with_name (gnu_name, IDENTIFIER_POINTER (gnu_var_name));
5319       TYPE_PACKED (gnu_union_type) = TYPE_PACKED (gnu_record_type);
5320
5321       for (variant = First_Non_Pragma (Variants (variant_part));
5322            Present (variant);
5323            variant = Next_Non_Pragma (variant))
5324         {
5325           tree gnu_variant_type = make_node (RECORD_TYPE);
5326           tree gnu_inner_name;
5327           tree gnu_qual;
5328
5329           Get_Variant_Encoding (variant);
5330           gnu_inner_name = get_identifier (Name_Buffer);
5331           TYPE_NAME (gnu_variant_type)
5332             = concat_id_with_name (TYPE_NAME (gnu_union_type),
5333                                    IDENTIFIER_POINTER (gnu_inner_name));
5334
5335           /* Set the alignment of the inner type in case we need to make
5336              inner objects into bitfields, but then clear it out
5337              so the record actually gets only the alignment required.  */
5338           TYPE_ALIGN (gnu_variant_type) = TYPE_ALIGN (gnu_record_type);
5339           TYPE_PACKED (gnu_variant_type) = TYPE_PACKED (gnu_record_type);
5340
5341           /* Similarly, if the outer record has a size specified and all fields
5342              have record rep clauses, we can propagate the size into the
5343              variant part.  */
5344           if (all_rep_and_size)
5345             {
5346               TYPE_SIZE (gnu_variant_type) = TYPE_SIZE (gnu_record_type);
5347               TYPE_SIZE_UNIT (gnu_variant_type)
5348                 = TYPE_SIZE_UNIT (gnu_record_type);
5349             }
5350
5351           components_to_record (gnu_variant_type, Component_List (variant),
5352                                 NULL_TREE, packed, definition,
5353                                 &gnu_our_rep_list, !all_rep_and_size, all_rep);
5354
5355           gnu_qual = choices_to_gnu (gnu_discriminant,
5356                                      Discrete_Choices (variant));
5357
5358           Set_Present_Expr (variant, annotate_value (gnu_qual));
5359           gnu_field = create_field_decl (gnu_inner_name, gnu_variant_type,
5360                                          gnu_union_type, 0,
5361                                          (all_rep_and_size
5362                                           ? TYPE_SIZE (gnu_record_type) : 0),
5363                                          (all_rep_and_size
5364                                           ? bitsize_zero_node : 0),
5365                                          0);
5366
5367           DECL_INTERNAL_P (gnu_field) = 1;
5368           DECL_QUALIFIER (gnu_field) = gnu_qual;
5369           TREE_CHAIN (gnu_field) = gnu_variant_list;
5370           gnu_variant_list = gnu_field;
5371         }
5372
5373       /* We use to delete the empty variants from the end. However,
5374          we no longer do that because we need them to generate complete
5375          debugging information for the variant record.  Otherwise,
5376          the union type definition will be missing the fields associated
5377          to these empty variants.  */
5378
5379       /* Only make the QUAL_UNION_TYPE if there are any non-empty variants.  */
5380       if (gnu_variant_list != 0)
5381         {
5382           if (all_rep_and_size)
5383             {
5384               TYPE_SIZE (gnu_union_type) = TYPE_SIZE (gnu_record_type);
5385               TYPE_SIZE_UNIT (gnu_union_type)
5386                 = TYPE_SIZE_UNIT (gnu_record_type);
5387             }
5388
5389           finish_record_type (gnu_union_type, nreverse (gnu_variant_list),
5390                               all_rep_and_size, 0);
5391
5392           gnu_union_field
5393             = create_field_decl (gnu_var_name, gnu_union_type, gnu_record_type,
5394                                  packed,
5395                                  all_rep ? TYPE_SIZE (gnu_union_type) : 0,
5396                                  all_rep ? bitsize_zero_node : 0, 0);
5397
5398           DECL_INTERNAL_P (gnu_union_field) = 1;
5399           TREE_CHAIN (gnu_union_field) = gnu_field_list;
5400           gnu_field_list = gnu_union_field;
5401         }
5402     }
5403
5404   /* Scan GNU_FIELD_LIST and see if any fields have rep clauses.  If they
5405      do, pull them out and put them into GNU_OUR_REP_LIST.  We have to do this
5406      in a separate pass since we want to handle the discriminants but can't
5407      play with them until we've used them in debugging data above.
5408
5409      ??? Note: if we then reorder them, debugging information will be wrong,
5410      but there's nothing that can be done about this at the moment.  */
5411
5412   for (gnu_field = gnu_field_list, gnu_last = 0; gnu_field; )
5413     {
5414       if (DECL_FIELD_OFFSET (gnu_field) != 0)
5415         {
5416           tree gnu_next = TREE_CHAIN (gnu_field);
5417
5418           if (gnu_last == 0)
5419             gnu_field_list = gnu_next;
5420           else
5421             TREE_CHAIN (gnu_last) = gnu_next;
5422
5423           TREE_CHAIN (gnu_field) = gnu_our_rep_list;
5424           gnu_our_rep_list = gnu_field;
5425           gnu_field = gnu_next;
5426         }
5427       else
5428         {
5429           gnu_last = gnu_field;
5430           gnu_field = TREE_CHAIN (gnu_field);
5431         }
5432     }
5433
5434   /* If we have any items in our rep'ed field list, it is not the case that all
5435      the fields in the record have rep clauses, and P_REP_LIST is nonzero,
5436      set it and ignore the items.  Otherwise, sort the fields by bit position
5437      and put them into their own record if we have any fields without
5438      rep clauses. */
5439   if (gnu_our_rep_list != 0 && p_gnu_rep_list != 0 && ! all_rep)
5440     *p_gnu_rep_list = chainon (*p_gnu_rep_list, gnu_our_rep_list);
5441   else if (gnu_our_rep_list != 0)
5442     {
5443       tree gnu_rep_type
5444         = gnu_field_list == 0 ? gnu_record_type : make_node (RECORD_TYPE);
5445       int len = list_length (gnu_our_rep_list);
5446       tree *gnu_arr = (tree *) alloca (sizeof (tree) * len);
5447       int i;
5448
5449       /* Set DECL_SECTION_NAME to increasing integers so we have a
5450          stable sort.  */
5451       for (i = 0, gnu_field = gnu_our_rep_list; gnu_field;
5452            gnu_field = TREE_CHAIN (gnu_field), i++)
5453         {
5454           gnu_arr[i] = gnu_field;
5455           DECL_SECTION_NAME (gnu_field) = size_int (i);
5456         }
5457
5458       qsort (gnu_arr, len, sizeof (tree), compare_field_bitpos);
5459
5460       /* Put the fields in the list in order of increasing position, which
5461          means we start from the end.  */
5462       gnu_our_rep_list = NULL_TREE;
5463       for (i = len - 1; i >= 0; i--)
5464         {
5465           TREE_CHAIN (gnu_arr[i]) = gnu_our_rep_list;
5466           gnu_our_rep_list = gnu_arr[i];
5467           DECL_CONTEXT (gnu_arr[i]) = gnu_rep_type;
5468           DECL_SECTION_NAME (gnu_arr[i]) = 0;
5469         }
5470
5471       if (gnu_field_list != 0)
5472         {
5473           finish_record_type (gnu_rep_type, gnu_our_rep_list, 1, 0);
5474           gnu_field = create_field_decl (get_identifier ("REP"), gnu_rep_type,
5475                                          gnu_record_type, 0, 0, 0, 1);
5476           DECL_INTERNAL_P (gnu_field) = 1;
5477           gnu_field_list = chainon (gnu_field_list, gnu_field);
5478         }
5479       else
5480         {
5481           layout_with_rep = 1;
5482           gnu_field_list = nreverse (gnu_our_rep_list);
5483         }
5484     }
5485
5486   if (cancel_alignment)
5487     TYPE_ALIGN (gnu_record_type) = 0;
5488
5489   finish_record_type (gnu_record_type, nreverse (gnu_field_list),
5490                       layout_with_rep, 0);
5491 }
5492 \f
5493 /* Called via qsort from the above.  Returns -1, 1, depending on the
5494    bit positions and ordinals of the two fields.  */
5495
5496 static int
5497 compare_field_bitpos (const PTR rt1, const PTR rt2)
5498 {
5499   tree *t1 = (tree *) rt1;
5500   tree *t2 = (tree *) rt2;
5501
5502   if (tree_int_cst_equal (bit_position (*t1), bit_position (*t2)))
5503     return
5504       (tree_int_cst_lt (DECL_SECTION_NAME (*t1), DECL_SECTION_NAME (*t2))
5505        ? -1 : 1);
5506   else if (tree_int_cst_lt (bit_position (*t1), bit_position (*t2)))
5507     return -1;
5508   else
5509     return 1;
5510 }
5511 \f
5512 /* Given GNU_SIZE, a GCC tree representing a size, return a Uint to be
5513    placed into an Esize, Component_Bit_Offset, or Component_Size value
5514    in the GNAT tree.  */
5515
5516 static Uint
5517 annotate_value (tree gnu_size)
5518 {
5519   int len = TREE_CODE_LENGTH (TREE_CODE (gnu_size));
5520   TCode tcode;
5521   Node_Ref_Or_Val ops[3], ret;
5522   int i;
5523   int size;
5524
5525   /* If back annotation is suppressed by the front end, return No_Uint */
5526   if (!Back_Annotate_Rep_Info)
5527     return No_Uint;
5528
5529   /* See if we've already saved the value for this node.  */
5530   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (gnu_size)))
5531       && TREE_COMPLEXITY (gnu_size) != 0)
5532     return (Node_Ref_Or_Val) TREE_COMPLEXITY (gnu_size);
5533
5534   /* If we do not return inside this switch, TCODE will be set to the
5535      code to use for a Create_Node operand and LEN (set above) will be
5536      the number of recursive calls for us to make.  */
5537
5538   switch (TREE_CODE (gnu_size))
5539     {
5540     case INTEGER_CST:
5541       if (TREE_OVERFLOW (gnu_size))
5542         return No_Uint;
5543
5544       /* This may have come from a conversion from some smaller type,
5545          so ensure this is in bitsizetype.  */
5546       gnu_size = convert (bitsizetype, gnu_size);
5547
5548       /* For negative values, use NEGATE_EXPR of the supplied value.  */
5549       if (tree_int_cst_sgn (gnu_size) < 0)
5550         {
5551           /* The rediculous code below is to handle the case of the largest
5552              negative integer.  */
5553           tree negative_size = size_diffop (bitsize_zero_node, gnu_size);
5554           int adjust = 0;
5555           tree temp;
5556
5557           if (TREE_CONSTANT_OVERFLOW (negative_size))
5558             {
5559               negative_size
5560                 = size_binop (MINUS_EXPR, bitsize_zero_node,
5561                               size_binop (PLUS_EXPR, gnu_size,
5562                                           bitsize_one_node));
5563               adjust = 1;
5564             }
5565
5566           temp = build1 (NEGATE_EXPR, bitsizetype, negative_size);
5567           if (adjust)
5568             temp = build (MINUS_EXPR, bitsizetype, temp, bitsize_one_node);
5569
5570           return annotate_value (temp);
5571         }
5572
5573       if (! host_integerp (gnu_size, 1))
5574         return No_Uint;
5575
5576       size = tree_low_cst (gnu_size, 1);
5577
5578       /* This peculiar test is to make sure that the size fits in an int
5579          on machines where HOST_WIDE_INT is not "int".  */
5580       if (tree_low_cst (gnu_size, 1) == size)
5581         return UI_From_Int (size);
5582       else
5583         return No_Uint;
5584
5585     case COMPONENT_REF:
5586       /* The only case we handle here is a simple discriminant reference.  */
5587       if (TREE_CODE (TREE_OPERAND (gnu_size, 0)) == PLACEHOLDER_EXPR
5588           && TREE_CODE (TREE_OPERAND (gnu_size, 1)) == FIELD_DECL
5589           && DECL_DISCRIMINANT_NUMBER (TREE_OPERAND (gnu_size, 1)) != 0)
5590         return Create_Node (Discrim_Val,
5591                             annotate_value (DECL_DISCRIMINANT_NUMBER
5592                                             (TREE_OPERAND (gnu_size, 1))),
5593                             No_Uint, No_Uint);
5594       else
5595         return No_Uint;
5596
5597     case NOP_EXPR:  case CONVERT_EXPR:   case NON_LVALUE_EXPR:
5598       return annotate_value (TREE_OPERAND (gnu_size, 0));
5599
5600       /* Now just list the operations we handle.  */
5601     case COND_EXPR:             tcode = Cond_Expr; break;
5602     case PLUS_EXPR:             tcode = Plus_Expr; break;
5603     case MINUS_EXPR:            tcode = Minus_Expr; break;
5604     case MULT_EXPR:             tcode = Mult_Expr; break;
5605     case TRUNC_DIV_EXPR:        tcode = Trunc_Div_Expr; break;
5606     case CEIL_DIV_EXPR:         tcode = Ceil_Div_Expr; break;
5607     case FLOOR_DIV_EXPR:        tcode = Floor_Div_Expr; break;
5608     case TRUNC_MOD_EXPR:        tcode = Trunc_Mod_Expr; break;
5609     case CEIL_MOD_EXPR:         tcode = Ceil_Mod_Expr; break;
5610     case FLOOR_MOD_EXPR:        tcode = Floor_Mod_Expr; break;
5611     case EXACT_DIV_EXPR:        tcode = Exact_Div_Expr; break;
5612     case NEGATE_EXPR:           tcode = Negate_Expr; break;
5613     case MIN_EXPR:              tcode = Min_Expr; break;
5614     case MAX_EXPR:              tcode = Max_Expr; break;
5615     case ABS_EXPR:              tcode = Abs_Expr; break;
5616     case TRUTH_ANDIF_EXPR:      tcode = Truth_Andif_Expr; break;
5617     case TRUTH_ORIF_EXPR:       tcode = Truth_Orif_Expr; break;
5618     case TRUTH_AND_EXPR:        tcode = Truth_And_Expr; break;
5619     case TRUTH_OR_EXPR:         tcode = Truth_Or_Expr; break;
5620     case TRUTH_XOR_EXPR:        tcode = Truth_Xor_Expr; break;
5621     case TRUTH_NOT_EXPR:        tcode = Truth_Not_Expr; break;
5622     case LT_EXPR:               tcode = Lt_Expr; break;
5623     case LE_EXPR:               tcode = Le_Expr; break;
5624     case GT_EXPR:               tcode = Gt_Expr; break;
5625     case GE_EXPR:               tcode = Ge_Expr; break;
5626     case EQ_EXPR:               tcode = Eq_Expr; break;
5627     case NE_EXPR:               tcode = Ne_Expr; break;
5628
5629     default:
5630       return No_Uint;
5631     }
5632
5633   /* Now get each of the operands that's relevant for this code.  If any
5634      cannot be expressed as a repinfo node, say we can't.  */
5635   for (i = 0; i < 3; i++)
5636     ops[i] = No_Uint;
5637
5638   for (i = 0; i < len; i++)
5639     {
5640       ops[i] = annotate_value (TREE_OPERAND (gnu_size, i));
5641       if (ops[i] == No_Uint)
5642         return No_Uint;
5643     }
5644
5645   ret = Create_Node (tcode, ops[0], ops[1], ops[2]);
5646   TREE_COMPLEXITY (gnu_size) = ret;
5647   return ret;
5648 }
5649
5650 /* Given GNAT_ENTITY, a record type, and GNU_TYPE, its corresponding
5651    GCC type, set Component_Bit_Offset and Esize to the position and size
5652    used by Gigi.  */
5653
5654 static void
5655 annotate_rep (Entity_Id gnat_entity, tree gnu_type)
5656 {
5657   tree gnu_list;
5658   tree gnu_entry;
5659   Entity_Id gnat_field;
5660
5661   /* We operate by first making a list of all field and their positions
5662      (we can get the sizes easily at any time) by a recursive call
5663      and then update all the sizes into the tree.  */
5664   gnu_list = compute_field_positions (gnu_type, NULL_TREE,
5665                                       size_zero_node, bitsize_zero_node,
5666                                       BIGGEST_ALIGNMENT);
5667
5668   for (gnat_field = First_Entity (gnat_entity); Present (gnat_field);
5669        gnat_field = Next_Entity (gnat_field))
5670     if ((Ekind (gnat_field) == E_Component
5671          || (Ekind (gnat_field) == E_Discriminant
5672              && ! Is_Unchecked_Union (Scope (gnat_field)))))
5673       {
5674         tree parent_offset = bitsize_zero_node;
5675
5676         gnu_entry
5677           = purpose_member (gnat_to_gnu_entity (gnat_field, NULL_TREE, 0),
5678                             gnu_list);
5679
5680         if (gnu_entry)
5681           {
5682             if (type_annotate_only && Is_Tagged_Type (gnat_entity))
5683               {
5684                 /* In this mode the tag and parent components have not been
5685                    generated, so we add the appropriate offset to each
5686                    component.  For a component appearing in the current
5687                    extension, the offset is the size of the parent.  */
5688             if (Is_Derived_Type (gnat_entity)
5689                 && Original_Record_Component (gnat_field) == gnat_field)
5690               parent_offset
5691                 = UI_To_gnu (Esize (Etype (Base_Type (gnat_entity))),
5692                              bitsizetype);
5693             else
5694               parent_offset = bitsize_int (POINTER_SIZE);
5695           }
5696
5697           Set_Component_Bit_Offset
5698             (gnat_field,
5699              annotate_value
5700              (size_binop (PLUS_EXPR,
5701                           bit_from_pos (TREE_PURPOSE (TREE_VALUE (gnu_entry)),
5702                                         TREE_VALUE (TREE_VALUE
5703                                                     (TREE_VALUE (gnu_entry)))),
5704                           parent_offset)));
5705
5706             Set_Esize (gnat_field,
5707                        annotate_value (DECL_SIZE (TREE_PURPOSE (gnu_entry))));
5708           }
5709         else if (type_annotate_only
5710                  && Is_Tagged_Type (gnat_entity)
5711                  && Is_Derived_Type (gnat_entity))
5712           {
5713             /* If there is no gnu_entry, this is an inherited component whose
5714                position is the same as in the parent type.  */
5715             Set_Component_Bit_Offset
5716               (gnat_field,
5717                Component_Bit_Offset (Original_Record_Component (gnat_field)));
5718             Set_Esize (gnat_field,
5719                        Esize (Original_Record_Component (gnat_field)));
5720           }
5721       }
5722 }
5723
5724 /* Scan all fields in GNU_TYPE and build entries where TREE_PURPOSE is the
5725    FIELD_DECL and TREE_VALUE a TREE_LIST with TREE_PURPOSE being the byte
5726    position and TREE_VALUE being a TREE_LIST with TREE_PURPOSE the value to be
5727    placed into DECL_OFFSET_ALIGN and TREE_VALUE the bit position.  GNU_POS is
5728    to be added to the position, GNU_BITPOS to the bit position, OFFSET_ALIGN is
5729    the present value of DECL_OFFSET_ALIGN and GNU_LIST is a list of the entries
5730    so far.  */
5731
5732 static tree
5733 compute_field_positions (tree gnu_type,
5734                          tree gnu_list,
5735                          tree gnu_pos,
5736                          tree gnu_bitpos,
5737                          unsigned int offset_align)
5738 {
5739   tree gnu_field;
5740   tree gnu_result = gnu_list;
5741
5742   for (gnu_field = TYPE_FIELDS (gnu_type); gnu_field;
5743        gnu_field = TREE_CHAIN (gnu_field))
5744     {
5745       tree gnu_our_bitpos = size_binop (PLUS_EXPR, gnu_bitpos,
5746                                         DECL_FIELD_BIT_OFFSET (gnu_field));
5747       tree gnu_our_offset = size_binop (PLUS_EXPR, gnu_pos,
5748                                         DECL_FIELD_OFFSET (gnu_field));
5749       unsigned int our_offset_align
5750         = MIN (offset_align, DECL_OFFSET_ALIGN (gnu_field));
5751
5752       gnu_result
5753         = tree_cons (gnu_field,
5754                      tree_cons (gnu_our_offset,
5755                                 tree_cons (size_int (our_offset_align),
5756                                            gnu_our_bitpos, NULL_TREE),
5757                                 NULL_TREE),
5758                      gnu_result);
5759
5760       if (DECL_INTERNAL_P (gnu_field))
5761         gnu_result
5762           = compute_field_positions (TREE_TYPE (gnu_field), gnu_result,
5763                                      gnu_our_offset, gnu_our_bitpos,
5764                                      our_offset_align);
5765     }
5766
5767   return gnu_result;
5768 }
5769 \f
5770 /* UINT_SIZE is a Uint giving the specified size for an object of GNU_TYPE
5771    corresponding to GNAT_OBJECT.  If size is valid, return a tree corresponding
5772    to its value.  Otherwise return 0.  KIND is VAR_DECL is we are specifying
5773    the size for an object, TYPE_DECL for the size of a type, and FIELD_DECL
5774    for the size of a field.  COMPONENT_P is true if we are being called
5775    to process the Component_Size of GNAT_OBJECT.  This is used for error
5776    message handling and to indicate to use the object size of GNU_TYPE.
5777    ZERO_OK is nonzero if a size of zero is permitted; if ZERO_OK is zero,
5778    it means that a size of zero should be treated as an unspecified size.  */
5779
5780 static tree
5781 validate_size (Uint uint_size, tree gnu_type, Entity_Id gnat_object,
5782                enum tree_code kind, int component_p, int zero_ok)
5783 {
5784   Node_Id gnat_error_node;
5785   tree type_size
5786     = kind == VAR_DECL ? TYPE_SIZE (gnu_type) : rm_size (gnu_type);
5787   tree size;
5788
5789   /* Find the node to use for errors.  */
5790   if ((Ekind (gnat_object) == E_Component
5791        || Ekind (gnat_object) == E_Discriminant)
5792       && Present (Component_Clause (gnat_object)))
5793     gnat_error_node = Last_Bit (Component_Clause (gnat_object));
5794   else if (Present (Size_Clause (gnat_object)))
5795     gnat_error_node = Expression (Size_Clause (gnat_object));
5796   else
5797     gnat_error_node = gnat_object;
5798
5799   /* Return 0 if no size was specified, either because Esize was not Present or
5800      the specified size was zero.  */
5801   if (No (uint_size) || uint_size == No_Uint)
5802     return 0;
5803
5804   /* Get the size as a tree.  Give an error if a size was specified, but cannot
5805      be represented as in sizetype. */
5806   size = UI_To_gnu (uint_size, bitsizetype);
5807   if (TREE_OVERFLOW (size))
5808     {
5809       post_error_ne (component_p ? "component size of & is too large"
5810                      : "size of & is too large",
5811                      gnat_error_node, gnat_object);
5812       return 0;
5813     }
5814   /* Ignore a negative size since that corresponds to our back-annotation.
5815      Also ignore a zero size unless a size clause exists.  */
5816   else if (tree_int_cst_sgn (size) < 0 || (integer_zerop (size) && ! zero_ok))
5817     return 0;
5818
5819   /* The size of objects is always a multiple of a byte.  */
5820   if (kind == VAR_DECL
5821       && ! integer_zerop (size_binop (TRUNC_MOD_EXPR, size,
5822                                       bitsize_unit_node)))
5823     {
5824       if (component_p)
5825         post_error_ne ("component size for& is not a multiple of Storage_Unit",
5826                        gnat_error_node, gnat_object);
5827       else
5828         post_error_ne ("size for& is not a multiple of Storage_Unit",
5829                        gnat_error_node, gnat_object);
5830       return 0;
5831     }
5832
5833   /* If this is an integral type or a packed array type, the front-end has
5834      verified the size, so we need not do it here (which would entail
5835      checking against the bounds).  However, if this is an aliased object, it
5836      may not be smaller than the type of the object.  */
5837   if ((INTEGRAL_TYPE_P (gnu_type) || TYPE_IS_PACKED_ARRAY_TYPE_P (gnu_type))
5838       && ! (kind == VAR_DECL && Is_Aliased (gnat_object)))
5839     return size;
5840
5841   /* If the object is a record that contains a template, add the size of
5842      the template to the specified size.  */
5843   if (TREE_CODE (gnu_type) == RECORD_TYPE
5844       && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
5845     size = size_binop (PLUS_EXPR, DECL_SIZE (TYPE_FIELDS (gnu_type)), size);
5846
5847   /* Modify the size of the type to be that of the maximum size if it has a
5848      discriminant or the size of a thin pointer if this is a fat pointer.  */
5849   if (type_size != 0 && CONTAINS_PLACEHOLDER_P (type_size))
5850     type_size = max_size (type_size, 1);
5851   else if (TYPE_FAT_POINTER_P (gnu_type))
5852     type_size = bitsize_int (POINTER_SIZE);
5853
5854   /* If this is an access type, the minimum size is that given by the smallest
5855      integral mode that's valid for pointers.  */
5856   if (TREE_CODE (gnu_type) == POINTER_TYPE)
5857     {
5858       enum machine_mode p_mode;
5859
5860       for (p_mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
5861            !targetm.valid_pointer_mode (p_mode);
5862            p_mode = GET_MODE_WIDER_MODE (p_mode))
5863         ;
5864
5865       type_size = bitsize_int (GET_MODE_BITSIZE (p_mode));
5866     }
5867
5868   /* If the size of the object is a constant, the new size must not be
5869      smaller.  */
5870   if (TREE_CODE (type_size) != INTEGER_CST
5871       || TREE_OVERFLOW (type_size)
5872       || tree_int_cst_lt (size, type_size))
5873     {
5874       if (component_p)
5875         post_error_ne_tree
5876           ("component size for& too small{, minimum allowed is ^}",
5877            gnat_error_node, gnat_object, type_size);
5878       else
5879         post_error_ne_tree ("size for& too small{, minimum allowed is ^}",
5880                             gnat_error_node, gnat_object, type_size);
5881
5882       if (kind == VAR_DECL && ! component_p
5883           && TREE_CODE (rm_size (gnu_type)) == INTEGER_CST
5884           && ! tree_int_cst_lt (size, rm_size (gnu_type)))
5885         post_error_ne_tree_2
5886           ("\\size of ^ is not a multiple of alignment (^ bits)",
5887            gnat_error_node, gnat_object, rm_size (gnu_type),
5888            TYPE_ALIGN (gnu_type));
5889
5890       else if (INTEGRAL_TYPE_P (gnu_type))
5891         post_error_ne ("\\size would be legal if & were not aliased!",
5892                        gnat_error_node, gnat_object);
5893
5894       return 0;
5895     }
5896
5897   return size;
5898 }
5899 \f
5900 /* Similarly, but both validate and process a value of RM_Size.  This
5901    routine is only called for types.  */
5902
5903 static void
5904 set_rm_size (Uint uint_size, tree gnu_type, Entity_Id gnat_entity)
5905 {
5906   /* Only give an error if a Value_Size clause was explicitly given.
5907      Otherwise, we'd be duplicating an error on the Size clause.  */
5908   Node_Id gnat_attr_node
5909     = Get_Attribute_Definition_Clause (gnat_entity, Attr_Value_Size);
5910   tree old_size = rm_size (gnu_type);
5911   tree size;
5912
5913   /* Get the size as a tree.  Do nothing if none was specified, either
5914      because RM_Size was not Present or if the specified size was zero.
5915      Give an error if a size was specified, but cannot be represented as
5916      in sizetype.  */
5917   if (No (uint_size) || uint_size == No_Uint)
5918     return;
5919
5920   size = UI_To_gnu (uint_size, bitsizetype);
5921   if (TREE_OVERFLOW (size))
5922     {
5923       if (Present (gnat_attr_node))
5924         post_error_ne ("Value_Size of & is too large", gnat_attr_node,
5925                        gnat_entity);
5926
5927       return;
5928     }
5929
5930   /* Ignore a negative size since that corresponds to our back-annotation.
5931      Also ignore a zero size unless a size clause exists, a Value_Size
5932      clause exists, or this is an integer type, in which case the
5933      front end will have always set it.  */
5934   else if (tree_int_cst_sgn (size) < 0
5935            || (integer_zerop (size) && No (gnat_attr_node)
5936                && ! Has_Size_Clause (gnat_entity)
5937                && ! Is_Discrete_Or_Fixed_Point_Type (gnat_entity)))
5938     return;
5939
5940   /* If the old size is self-referential, get the maximum size.  */
5941   if (CONTAINS_PLACEHOLDER_P (old_size))
5942     old_size = max_size (old_size, 1);
5943
5944   /* If the size of the object is a constant, the new size must not be
5945      smaller (the front end checks this for scalar types).  */
5946   if (TREE_CODE (old_size) != INTEGER_CST
5947       || TREE_OVERFLOW (old_size)
5948       || (AGGREGATE_TYPE_P (gnu_type)
5949           && tree_int_cst_lt (size, old_size)))
5950     {
5951       if (Present (gnat_attr_node))
5952         post_error_ne_tree
5953           ("Value_Size for& too small{, minimum allowed is ^}",
5954            gnat_attr_node, gnat_entity, old_size);
5955
5956       return;
5957     }
5958
5959   /* Otherwise, set the RM_Size.  */
5960   if (TREE_CODE (gnu_type) == INTEGER_TYPE
5961       && Is_Discrete_Or_Fixed_Point_Type (gnat_entity))
5962     TYPE_RM_SIZE_INT (gnu_type) = size;
5963   else if (TREE_CODE (gnu_type) == ENUMERAL_TYPE)
5964     SET_TYPE_RM_SIZE_ENUM (gnu_type, size);
5965   else if ((TREE_CODE (gnu_type) == RECORD_TYPE
5966             || TREE_CODE (gnu_type) == UNION_TYPE
5967             || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
5968            && ! TYPE_IS_FAT_POINTER_P (gnu_type))
5969     SET_TYPE_ADA_SIZE (gnu_type, size);
5970 }
5971 \f
5972 /* Given a type TYPE, return a new type whose size is appropriate for SIZE.
5973    If TYPE is the best type, return it.  Otherwise, make a new type.  We
5974    only support new integral and pointer types.  BIASED_P is nonzero if
5975    we are making a biased type.  */
5976
5977 static tree
5978 make_type_from_size (tree type, tree size_tree, int biased_p)
5979 {
5980   tree new_type;
5981   unsigned HOST_WIDE_INT size;
5982
5983   /* If size indicates an error, just return TYPE to avoid propagating the
5984      error.  Likewise if it's too large to represent.  */
5985   if (size_tree == 0 || ! host_integerp (size_tree, 1))
5986     return type;
5987
5988   size = tree_low_cst (size_tree, 1);
5989   switch (TREE_CODE (type))
5990     {
5991     case INTEGER_TYPE:
5992     case ENUMERAL_TYPE:
5993       /* Only do something if the type is not already the proper size and is
5994          not a packed array type.  */
5995       if (TYPE_PACKED_ARRAY_TYPE_P (type)
5996           || (TYPE_PRECISION (type) == size
5997               && biased_p == (TREE_CODE (type) == INTEGER_CST
5998                               && TYPE_BIASED_REPRESENTATION_P (type))))
5999         break;
6000
6001       size = MIN (size, LONG_LONG_TYPE_SIZE);
6002       new_type = make_signed_type (size);
6003       TREE_TYPE (new_type)
6004         = TREE_TYPE (type) != 0 ? TREE_TYPE (type) : type;
6005       TYPE_MIN_VALUE (new_type)
6006         = convert (TREE_TYPE (new_type), TYPE_MIN_VALUE (type));
6007       TYPE_MAX_VALUE (new_type)
6008         = convert (TREE_TYPE (new_type), TYPE_MAX_VALUE (type));
6009       TYPE_BIASED_REPRESENTATION_P (new_type)
6010         = ((TREE_CODE (type) == INTEGER_TYPE
6011             && TYPE_BIASED_REPRESENTATION_P (type))
6012            || biased_p);
6013       TYPE_UNSIGNED (new_type)
6014         = TYPE_UNSIGNED (type) | TYPE_BIASED_REPRESENTATION_P (new_type);
6015       TYPE_RM_SIZE_INT (new_type) = bitsize_int (size);
6016       return new_type;
6017
6018     case RECORD_TYPE:
6019       /* Do something if this is a fat pointer, in which case we
6020          may need to return the thin pointer.  */
6021       if (TYPE_IS_FAT_POINTER_P (type) && size < POINTER_SIZE * 2)
6022         return
6023           build_pointer_type
6024             (TYPE_OBJECT_RECORD_TYPE (TYPE_UNCONSTRAINED_ARRAY (type)));
6025       break;
6026
6027     case POINTER_TYPE:
6028       /* Only do something if this is a thin pointer, in which case we
6029          may need to return the fat pointer.  */
6030       if (TYPE_THIN_POINTER_P (type) && size >= POINTER_SIZE * 2)
6031         return
6032           build_pointer_type (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)));
6033
6034       break;
6035
6036     default:
6037       break;
6038     }
6039
6040   return type;
6041 }
6042 \f
6043 /* ALIGNMENT is a Uint giving the alignment specified for GNAT_ENTITY,
6044    a type or object whose present alignment is ALIGN.  If this alignment is
6045    valid, return it.  Otherwise, give an error and return ALIGN.  */
6046
6047 static unsigned int
6048 validate_alignment (Uint alignment, Entity_Id gnat_entity, unsigned int align)
6049 {
6050   Node_Id gnat_error_node = gnat_entity;
6051   unsigned int new_align;
6052
6053 #ifndef MAX_OFILE_ALIGNMENT
6054 #define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
6055 #endif
6056
6057   if (Present (Alignment_Clause (gnat_entity)))
6058     gnat_error_node = Expression (Alignment_Clause (gnat_entity));
6059
6060   /* Don't worry about checking alignment if alignment was not specified
6061      by the source program and we already posted an error for this entity.  */
6062
6063   if (Error_Posted (gnat_entity) && !Has_Alignment_Clause (gnat_entity))
6064     return align;
6065
6066   /* Within GCC, an alignment is an integer, so we must make sure a
6067      value is specified that fits in that range.  Also, alignments of
6068      more than MAX_OFILE_ALIGNMENT can't be supported.  */
6069
6070   if (! UI_Is_In_Int_Range (alignment)
6071       || ((new_align = UI_To_Int (alignment))
6072            > MAX_OFILE_ALIGNMENT / BITS_PER_UNIT))
6073     post_error_ne_num ("largest supported alignment for& is ^",
6074                        gnat_error_node, gnat_entity,
6075                        MAX_OFILE_ALIGNMENT / BITS_PER_UNIT);
6076   else if (! (Present (Alignment_Clause (gnat_entity))
6077               && From_At_Mod (Alignment_Clause (gnat_entity)))
6078            && new_align * BITS_PER_UNIT < align)
6079     post_error_ne_num ("alignment for& must be at least ^",
6080                        gnat_error_node, gnat_entity,
6081                        align / BITS_PER_UNIT);
6082   else
6083     align = MAX (align, new_align == 0 ? 1 : new_align * BITS_PER_UNIT);
6084
6085   return align;
6086 }
6087 \f
6088 /* Verify that OBJECT, a type or decl, is something we can implement
6089    atomically.  If not, give an error for GNAT_ENTITY.  COMP_P is nonzero
6090    if we require atomic components.  */
6091
6092 static void
6093 check_ok_for_atomic (tree object, Entity_Id gnat_entity, int comp_p)
6094 {
6095   Node_Id gnat_error_point = gnat_entity;
6096   Node_Id gnat_node;
6097   enum machine_mode mode;
6098   unsigned int align;
6099   tree size;
6100
6101   /* There are three case of what OBJECT can be.  It can be a type, in which
6102      case we take the size, alignment and mode from the type.  It can be a
6103      declaration that was indirect, in which case the relevant values are
6104      that of the type being pointed to, or it can be a normal declaration,
6105      in which case the values are of the decl.  The code below assumes that
6106      OBJECT is either a type or a decl.  */
6107   if (TYPE_P (object))
6108     {
6109       mode = TYPE_MODE (object);
6110       align = TYPE_ALIGN (object);
6111       size = TYPE_SIZE (object);
6112     }
6113   else if (DECL_BY_REF_P (object))
6114     {
6115       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (object)));
6116       align = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (object)));
6117       size = TYPE_SIZE (TREE_TYPE (TREE_TYPE (object)));
6118     }
6119   else
6120     {
6121       mode = DECL_MODE (object);
6122       align = DECL_ALIGN (object);
6123       size = DECL_SIZE (object);
6124     }
6125
6126   /* Consider all floating-point types atomic and any types that that are
6127      represented by integers no wider than a machine word.  */
6128   if (GET_MODE_CLASS (mode) == MODE_FLOAT
6129       || ((GET_MODE_CLASS (mode) == MODE_INT
6130            || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
6131           && GET_MODE_BITSIZE (mode) <= BITS_PER_WORD))
6132     return;
6133
6134   /* For the moment, also allow anything that has an alignment equal
6135      to its size and which is smaller than a word.  */
6136   if (size != 0 && TREE_CODE (size) == INTEGER_CST
6137       && compare_tree_int (size, align) == 0
6138       && align <= BITS_PER_WORD)
6139     return;
6140
6141   for (gnat_node = First_Rep_Item (gnat_entity); Present (gnat_node);
6142        gnat_node = Next_Rep_Item (gnat_node))
6143     {
6144       if (! comp_p && Nkind (gnat_node) == N_Pragma
6145           && Get_Pragma_Id (Chars (gnat_node)) == Pragma_Atomic)
6146         gnat_error_point = First (Pragma_Argument_Associations (gnat_node));
6147       else if (comp_p && Nkind (gnat_node) == N_Pragma
6148                && (Get_Pragma_Id (Chars (gnat_node))
6149                    == Pragma_Atomic_Components))
6150         gnat_error_point = First (Pragma_Argument_Associations (gnat_node));
6151     }
6152
6153   if (comp_p)
6154     post_error_ne ("atomic access to component of & cannot be guaranteed",
6155                    gnat_error_point, gnat_entity);
6156   else
6157     post_error_ne ("atomic access to & cannot be guaranteed",
6158                    gnat_error_point, gnat_entity);
6159 }
6160 \f
6161 /* Given a type T, a FIELD_DECL F, and a replacement value R,
6162    return a new type with all size expressions that contain F
6163    updated by replacing F with R.  This is identical to GCC's
6164    substitute_in_type except that it knows about TYPE_INDEX_TYPE.
6165    If F is NULL_TREE, always make a new RECORD_TYPE, even if nothing has
6166    changed.  */
6167
6168 tree
6169 gnat_substitute_in_type (tree t, tree f, tree r)
6170 {
6171   tree new = t;
6172   tree tem;
6173
6174   switch (TREE_CODE (t))
6175     {
6176     case INTEGER_TYPE:
6177     case ENUMERAL_TYPE:
6178     case BOOLEAN_TYPE:
6179     case CHAR_TYPE:
6180       if (CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (t))
6181           || CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (t)))
6182         {
6183           tree low = substitute_in_expr (TYPE_MIN_VALUE (t), f, r);
6184           tree high = substitute_in_expr (TYPE_MAX_VALUE (t), f, r);
6185
6186           if (low == TYPE_MIN_VALUE (t) && high == TYPE_MAX_VALUE (t))
6187             return t;
6188
6189           new = build_range_type (TREE_TYPE (t), low, high);
6190           if (TYPE_INDEX_TYPE (t))
6191             SET_TYPE_INDEX_TYPE (new,
6192                 gnat_substitute_in_type (TYPE_INDEX_TYPE (t), f, r));
6193           return new;
6194         }
6195
6196       return t;
6197
6198     case REAL_TYPE:
6199       if ((TYPE_MIN_VALUE (t) != 0
6200            && CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (t)))
6201           || (TYPE_MAX_VALUE (t) != 0
6202               && CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (t))))
6203         {
6204           tree low = 0, high = 0;
6205
6206           if (TYPE_MIN_VALUE (t))
6207             low = substitute_in_expr (TYPE_MIN_VALUE (t), f, r);
6208           if (TYPE_MAX_VALUE (t))
6209             high = substitute_in_expr (TYPE_MAX_VALUE (t), f, r);
6210
6211           if (low == TYPE_MIN_VALUE (t) && high == TYPE_MAX_VALUE (t))
6212             return t;
6213
6214           t = copy_type (t);
6215           TYPE_MIN_VALUE (t) = low;
6216           TYPE_MAX_VALUE (t) = high;
6217         }
6218       return t;
6219
6220     case COMPLEX_TYPE:
6221       tem = gnat_substitute_in_type (TREE_TYPE (t), f, r);
6222       if (tem == TREE_TYPE (t))
6223         return t;
6224
6225       return build_complex_type (tem);
6226
6227     case OFFSET_TYPE:
6228     case METHOD_TYPE:
6229     case FILE_TYPE:
6230     case SET_TYPE:
6231     case FUNCTION_TYPE:
6232     case LANG_TYPE:
6233       /* Don't know how to do these yet.  */
6234       abort ();
6235
6236     case ARRAY_TYPE:
6237       {
6238         tree component = gnat_substitute_in_type (TREE_TYPE (t), f, r);
6239         tree domain = gnat_substitute_in_type (TYPE_DOMAIN (t), f, r);
6240
6241         if (component == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
6242           return t;
6243
6244         new = build_array_type (component, domain);
6245         TYPE_SIZE (new) = 0;
6246         TYPE_MULTI_ARRAY_P (new) = TYPE_MULTI_ARRAY_P (t);
6247         TYPE_CONVENTION_FORTRAN_P (new) = TYPE_CONVENTION_FORTRAN_P (t);
6248         layout_type (new);
6249         TYPE_ALIGN (new) = TYPE_ALIGN (t);
6250         return new;
6251       }
6252
6253     case RECORD_TYPE:
6254     case UNION_TYPE:
6255     case QUAL_UNION_TYPE:
6256       {
6257         tree field;
6258         int changed_field
6259           = (f == NULL_TREE && ! TREE_CONSTANT (TYPE_SIZE (t)));
6260         int field_has_rep = 0;
6261         tree last_field = 0;
6262
6263         tree new = copy_type (t);
6264
6265         /* Start out with no fields, make new fields, and chain them
6266            in.  If we haven't actually changed the type of any field,
6267            discard everything we've done and return the old type.  */
6268
6269         TYPE_FIELDS (new) = 0;
6270         TYPE_SIZE (new) = 0;
6271
6272         for (field = TYPE_FIELDS (t); field;
6273              field = TREE_CHAIN (field))
6274           {
6275             tree new_field = copy_node (field);
6276
6277             TREE_TYPE (new_field)
6278               = gnat_substitute_in_type (TREE_TYPE (new_field), f, r);
6279
6280             if (DECL_HAS_REP_P (field) && ! DECL_INTERNAL_P (field))
6281               field_has_rep = 1;
6282             else if (TREE_TYPE (new_field) != TREE_TYPE (field))
6283               changed_field = 1;
6284
6285             /* If this is an internal field and the type of this field is
6286                a UNION_TYPE or RECORD_TYPE with no elements, ignore it.  If
6287                the type just has one element, treat that as the field.
6288                But don't do this if we are processing a QUAL_UNION_TYPE.  */
6289             if (TREE_CODE (t) != QUAL_UNION_TYPE
6290                 && DECL_INTERNAL_P (new_field)
6291                 && (TREE_CODE (TREE_TYPE (new_field)) == UNION_TYPE
6292                     || TREE_CODE (TREE_TYPE (new_field)) == RECORD_TYPE))
6293               {
6294                 if (TYPE_FIELDS (TREE_TYPE (new_field)) == 0)
6295                   continue;
6296
6297                 if (TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new_field))) == 0)
6298                   {
6299                     tree next_new_field
6300                       = copy_node (TYPE_FIELDS (TREE_TYPE (new_field)));
6301
6302                     /* Make sure omitting the union doesn't change
6303                        the layout.  */
6304                     DECL_ALIGN (next_new_field) = DECL_ALIGN (new_field);
6305                     new_field = next_new_field;
6306                   }
6307               }
6308
6309             DECL_CONTEXT (new_field) = new;
6310             SET_DECL_ORIGINAL_FIELD (new_field,
6311                (DECL_ORIGINAL_FIELD (field) != 0
6312                 ? DECL_ORIGINAL_FIELD (field) : field));
6313
6314             /* If the size of the old field was set at a constant,
6315                propagate the size in case the type's size was variable.
6316                (This occurs in the case of a variant or discriminated
6317                record with a default size used as a field of another
6318                record.)  */
6319             DECL_SIZE (new_field)
6320               = TREE_CODE (DECL_SIZE (field)) == INTEGER_CST
6321                 ? DECL_SIZE (field) : 0;
6322             DECL_SIZE_UNIT (new_field)
6323               = TREE_CODE (DECL_SIZE_UNIT (field)) == INTEGER_CST
6324                 ? DECL_SIZE_UNIT (field) : 0;
6325
6326             if (TREE_CODE (t) == QUAL_UNION_TYPE)
6327               {
6328                 tree new_q = substitute_in_expr (DECL_QUALIFIER (field), f, r);
6329
6330                 if (new_q != DECL_QUALIFIER (new_field))
6331                   changed_field = 1;
6332
6333                 /* Do the substitution inside the qualifier and if we find
6334                    that this field will not be present, omit it.  */
6335                 DECL_QUALIFIER (new_field) = new_q;
6336
6337                 if (integer_zerop (DECL_QUALIFIER (new_field)))
6338                   continue;
6339               }
6340
6341             if (last_field == 0)
6342               TYPE_FIELDS (new) = new_field;
6343             else
6344               TREE_CHAIN (last_field) = new_field;
6345
6346             last_field = new_field;
6347
6348             /* If this is a qualified type and this field will always be
6349                present, we are done.  */
6350             if (TREE_CODE (t) == QUAL_UNION_TYPE
6351                 && integer_onep (DECL_QUALIFIER (new_field)))
6352               break;
6353           }
6354
6355         /* If this used to be a qualified union type, but we now know what
6356            field will be present, make this a normal union.  */
6357         if (changed_field && TREE_CODE (new) == QUAL_UNION_TYPE
6358             && (TYPE_FIELDS (new) == 0
6359                 || integer_onep (DECL_QUALIFIER (TYPE_FIELDS (new)))))
6360           TREE_SET_CODE (new, UNION_TYPE);
6361         else if (! changed_field)
6362           return t;
6363
6364         if (field_has_rep)
6365           gigi_abort (117);
6366
6367         layout_type (new);
6368
6369         /* If the size was originally a constant use it.  */
6370         if (TYPE_SIZE (t) != 0 && TREE_CODE (TYPE_SIZE (t)) == INTEGER_CST
6371             && TREE_CODE (TYPE_SIZE (new)) != INTEGER_CST)
6372           {
6373             TYPE_SIZE (new) = TYPE_SIZE (t);
6374             TYPE_SIZE_UNIT (new) = TYPE_SIZE_UNIT (t);
6375             SET_TYPE_ADA_SIZE (new, TYPE_ADA_SIZE (t));
6376           }
6377
6378         return new;
6379       }
6380
6381     default:
6382       return t;
6383     }
6384 }
6385 \f
6386 /* Return the "RM size" of GNU_TYPE.  This is the actual number of bits
6387    needed to represent the object.  */
6388
6389 tree
6390 rm_size (tree gnu_type)
6391 {
6392   /* For integer types, this is the precision.  For record types, we store
6393      the size explicitly.  For other types, this is just the size.  */
6394
6395   if (INTEGRAL_TYPE_P (gnu_type) && TYPE_RM_SIZE (gnu_type) != 0)
6396     return TYPE_RM_SIZE (gnu_type);
6397   else if (TREE_CODE (gnu_type) == RECORD_TYPE
6398            && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
6399     /* Return the rm_size of the actual data plus the size of the template.  */
6400     return
6401       size_binop (PLUS_EXPR,
6402                   rm_size (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)))),
6403                   DECL_SIZE (TYPE_FIELDS (gnu_type)));
6404   else if ((TREE_CODE (gnu_type) == RECORD_TYPE
6405             || TREE_CODE (gnu_type) == UNION_TYPE
6406             || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
6407            && ! TYPE_IS_FAT_POINTER_P (gnu_type)
6408            && TYPE_ADA_SIZE (gnu_type) != 0)
6409     return TYPE_ADA_SIZE (gnu_type);
6410   else
6411     return TYPE_SIZE (gnu_type);
6412 }
6413 \f
6414 /* Return an identifier representing the external name to be used for
6415    GNAT_ENTITY.  If SUFFIX is specified, the name is followed by "___"
6416    and the specified suffix.  */
6417
6418 tree
6419 create_concat_name (Entity_Id gnat_entity, const char *suffix)
6420 {
6421   const char *str = (suffix == 0 ? "" : suffix);
6422   String_Template temp = {1, strlen (str)};
6423   Fat_Pointer fp = {str, &temp};
6424
6425   Get_External_Name_With_Suffix (gnat_entity, fp);
6426
6427 #ifdef _WIN32
6428   /* A variable using the Stdcall convention (meaning we are running
6429      on a Windows box) live in a DLL. Here we adjust its name to use
6430      the jump-table, the _imp__NAME contains the address for the NAME
6431      variable. */
6432
6433   {
6434     Entity_Kind kind = Ekind (gnat_entity);
6435     const char *prefix = "_imp__";
6436     int plen = strlen (prefix);
6437
6438     if ((kind == E_Variable || kind == E_Constant)
6439         && Convention (gnat_entity) == Convention_Stdcall)
6440       {
6441         int k;
6442         for (k = 0; k <= Name_Len; k++)
6443           Name_Buffer [Name_Len - k + plen] = Name_Buffer [Name_Len - k];
6444         strncpy (Name_Buffer, prefix, plen);
6445       }
6446   }
6447 #endif
6448
6449   return get_identifier (Name_Buffer);
6450 }
6451
6452 /* Return the name to be used for GNAT_ENTITY.  If a type, create a
6453    fully-qualified name, possibly with type information encoding.
6454    Otherwise, return the name.  */
6455
6456 tree
6457 get_entity_name (Entity_Id gnat_entity)
6458 {
6459   Get_Encoded_Name (gnat_entity);
6460   return get_identifier (Name_Buffer);
6461 }
6462
6463 /* Given GNU_ID, an IDENTIFIER_NODE containing a name and SUFFIX, a
6464    string, return a new IDENTIFIER_NODE that is the concatenation of
6465    the name in GNU_ID and SUFFIX.  */
6466
6467 tree
6468 concat_id_with_name (tree gnu_id, const char *suffix)
6469 {
6470   int len = IDENTIFIER_LENGTH (gnu_id);
6471
6472   strncpy (Name_Buffer, IDENTIFIER_POINTER (gnu_id),
6473            IDENTIFIER_LENGTH (gnu_id));
6474   strncpy (Name_Buffer + len, "___", 3);
6475   len += 3;
6476   strcpy (Name_Buffer + len, suffix);
6477   return get_identifier (Name_Buffer);
6478 }
6479
6480 #include "gt-ada-decl.h"