OSDN Git Service

* ttypes.ads (Target_Double_Float_Alignment): New variable.
[pf3gnuchains/gcc-fork.git] / gcc / ada / gcc-interface / decl.c
1 /****************************************************************************
2  *                                                                          *
3  *                         GNAT COMPILER COMPONENTS                         *
4  *                                                                          *
5  *                                 D E C L                                  *
6  *                                                                          *
7  *                          C Implementation File                           *
8  *                                                                          *
9  *          Copyright (C) 1992-2009, Free Software Foundation, Inc.         *
10  *                                                                          *
11  * GNAT is free software;  you can  redistribute it  and/or modify it under *
12  * terms of the  GNU General Public License as published  by the Free Soft- *
13  * ware  Foundation;  either version 3,  or (at your option) any later ver- *
14  * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
15  * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
16  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License *
17  * for  more details.  You should have received a copy of the GNU General   *
18  * Public License along with GCC; see the file COPYING3.  If not see        *
19  * <http://www.gnu.org/licenses/>.                                          *
20  *                                                                          *
21  * GNAT was originally developed  by the GNAT team at  New York University. *
22  * Extensive contributions were provided by Ada Core Technologies Inc.      *
23  *                                                                          *
24  ****************************************************************************/
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "tree.h"
31 #include "flags.h"
32 #include "toplev.h"
33 #include "ggc.h"
34 #include "target.h"
35 #include "expr.h"
36
37 #include "ada.h"
38 #include "types.h"
39 #include "atree.h"
40 #include "elists.h"
41 #include "namet.h"
42 #include "nlists.h"
43 #include "repinfo.h"
44 #include "snames.h"
45 #include "stringt.h"
46 #include "uintp.h"
47 #include "fe.h"
48 #include "sinfo.h"
49 #include "einfo.h"
50 #include "ada-tree.h"
51 #include "gigi.h"
52
53 #ifndef MAX_FIXED_MODE_SIZE
54 #define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode)
55 #endif
56
57 /* Convention_Stdcall should be processed in a specific way on Windows targets
58    only.  The macro below is a helper to avoid having to check for a Windows
59    specific attribute throughout this unit.  */
60
61 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
62 #define Has_Stdcall_Convention(E) (Convention (E) == Convention_Stdcall)
63 #else
64 #define Has_Stdcall_Convention(E) (0)
65 #endif
66
67 /* Stack realignment for functions with foreign conventions is provided on a
68    per back-end basis now, as it is handled by the prologue expanders and not
69    as part of the function's body any more.  It might be requested by way of a
70    dedicated function type attribute on the targets that support it.
71
72    We need a way to avoid setting the attribute on the targets that don't
73    support it and use FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN for this purpose.
74
75    It is defined on targets where the circuitry is available, and indicates
76    whether the realignment is needed for 'main'.  We use this to decide for
77    foreign subprograms as well.
78
79    It is not defined on targets where the circuitry is not implemented, and
80    we just never set the attribute in these cases.
81
82    Whether it is defined on all targets that would need it in theory is
83    not entirely clear.  We currently trust the base GCC settings for this
84    purpose.  */
85
86 #ifndef FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
87 #define FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN 0
88 #endif
89
90 struct incomplete
91 {
92   struct incomplete *next;
93   tree old_type;
94   Entity_Id full_type;
95 };
96
97 /* These variables are used to defer recursively expanding incomplete types
98    while we are processing an array, a record or a subprogram type.  */
99 static int defer_incomplete_level = 0;
100 static struct incomplete *defer_incomplete_list;
101
102 /* This variable is used to delay expanding From_With_Type types until the
103    end of the spec.  */
104 static struct incomplete *defer_limited_with;
105
106 /* These variables are used to defer finalizing types.  The element of the
107    list is the TYPE_DECL associated with the type.  */
108 static int defer_finalize_level = 0;
109 static VEC (tree,heap) *defer_finalize_list;
110
111 /* A hash table used to cache the result of annotate_value.  */
112 static GTY ((if_marked ("tree_int_map_marked_p"),
113              param_is (struct tree_int_map))) htab_t annotate_value_cache;
114
115 enum alias_set_op
116 {
117   ALIAS_SET_COPY,
118   ALIAS_SET_SUBSET,
119   ALIAS_SET_SUPERSET
120 };
121
122 static void relate_alias_sets (tree, tree, enum alias_set_op);
123
124 static tree substitution_list (Entity_Id, Entity_Id, tree, bool);
125 static bool allocatable_size_p (tree, bool);
126 static void prepend_one_attribute_to (struct attrib **,
127                                       enum attr_type, tree, tree, Node_Id);
128 static void prepend_attributes (Entity_Id, struct attrib **);
129 static tree elaborate_expression (Node_Id, Entity_Id, tree, bool, bool, bool);
130 static bool is_variable_size (tree);
131 static tree elaborate_expression_1 (Node_Id, Entity_Id, tree, tree,
132                                     bool, bool);
133 static tree make_packable_type (tree, bool);
134 static tree gnat_to_gnu_field (Entity_Id, tree, int, bool);
135 static tree gnat_to_gnu_param (Entity_Id, Mechanism_Type, Entity_Id, bool,
136                                bool *);
137 static bool same_discriminant_p (Entity_Id, Entity_Id);
138 static bool array_type_has_nonaliased_component (Entity_Id, tree);
139 static bool compile_time_known_address_p (Node_Id);
140 static void components_to_record (tree, Node_Id, tree, int, bool, tree *,
141                                   bool, bool, bool, bool);
142 static Uint annotate_value (tree);
143 static void annotate_rep (Entity_Id, tree);
144 static tree compute_field_positions (tree, tree, tree, tree, unsigned int);
145 static tree validate_size (Uint, tree, Entity_Id, enum tree_code, bool, bool);
146 static void set_rm_size (Uint, tree, Entity_Id);
147 static tree make_type_from_size (tree, tree, bool);
148 static unsigned int validate_alignment (Uint, Entity_Id, unsigned int);
149 static unsigned int ceil_alignment (unsigned HOST_WIDE_INT);
150 static void check_ok_for_atomic (tree, Entity_Id, bool);
151 static int compatible_signatures_p (tree ftype1, tree ftype2);
152 static void rest_of_type_decl_compilation_no_defer (tree);
153 \f
154 /* Given GNAT_ENTITY, a GNAT defining identifier node, which denotes some Ada
155    entity, return the equivalent GCC tree for that entity (a ..._DECL node)
156    and associate the ..._DECL node with the input GNAT defining identifier.
157
158    If GNAT_ENTITY is a variable or a constant declaration, GNU_EXPR gives its
159    initial value (in GCC tree form).  This is optional for a variable.  For
160    a renamed entity, GNU_EXPR gives the object being renamed.
161
162    DEFINITION is nonzero if this call is intended for a definition.  This is
163    used for separate compilation where it is necessary to know whether an
164    external declaration or a definition must be created if the GCC equivalent
165    was not created previously.  The value of 1 is normally used for a nonzero
166    DEFINITION, but a value of 2 is used in special circumstances, defined in
167    the code.  */
168
169 tree
170 gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
171 {
172   /* Contains the kind of the input GNAT node.  */
173   const Entity_Kind kind = Ekind (gnat_entity);
174   /* True if this is a type.  */
175   const bool is_type = IN (kind, Type_Kind);
176   /* For a type, contains the equivalent GNAT node to be used in gigi.  */
177   Entity_Id gnat_equiv_type = Empty;
178   /* Temporary used to walk the GNAT tree.  */
179   Entity_Id gnat_temp;
180   /* Contains the GCC DECL node which is equivalent to the input GNAT node.
181      This node will be associated with the GNAT node by calling at the end
182      of the `switch' statement.  */
183   tree gnu_decl = NULL_TREE;
184   /* Contains the GCC type to be used for the GCC node.  */
185   tree gnu_type = NULL_TREE;
186   /* Contains the GCC size tree to be used for the GCC node.  */
187   tree gnu_size = NULL_TREE;
188   /* Contains the GCC name to be used for the GCC node.  */
189   tree gnu_entity_name;
190   /* True if we have already saved gnu_decl as a GNAT association.  */
191   bool saved = false;
192   /* True if we incremented defer_incomplete_level.  */
193   bool this_deferred = false;
194   /* True if we incremented force_global.  */
195   bool this_global = false;
196   /* True if we should check to see if elaborated during processing.  */
197   bool maybe_present = false;
198   /* True if we made GNU_DECL and its type here.  */
199   bool this_made_decl = false;
200   /* True if debug info is requested for this entity.  */
201   bool debug_info_p = (Needs_Debug_Info (gnat_entity)
202                        || debug_info_level == DINFO_LEVEL_VERBOSE);
203   /* True if this entity is to be considered as imported.  */
204   bool imported_p = (Is_Imported (gnat_entity)
205                      && No (Address_Clause (gnat_entity)));
206   /* Size and alignment of the GCC node, if meaningful.  */
207   unsigned int esize = 0, align = 0;
208   /* Contains the list of attributes directly attached to the entity.  */
209   struct attrib *attr_list = NULL;
210
211   /* Since a use of an Itype is a definition, process it as such if it
212      is not in a with'ed unit.  */
213   if (!definition
214       && is_type
215       && Is_Itype (gnat_entity)
216       && !present_gnu_tree (gnat_entity)
217       && In_Extended_Main_Code_Unit (gnat_entity))
218     {
219       /* Ensure that we are in a subprogram mentioned in the Scope chain of
220          this entity, our current scope is global, or we encountered a task
221          or entry (where we can't currently accurately check scoping).  */
222       if (!current_function_decl
223           || DECL_ELABORATION_PROC_P (current_function_decl))
224         {
225           process_type (gnat_entity);
226           return get_gnu_tree (gnat_entity);
227         }
228
229       for (gnat_temp = Scope (gnat_entity);
230            Present (gnat_temp);
231            gnat_temp = Scope (gnat_temp))
232         {
233           if (Is_Type (gnat_temp))
234             gnat_temp = Underlying_Type (gnat_temp);
235
236           if (Ekind (gnat_temp) == E_Subprogram_Body)
237             gnat_temp
238               = Corresponding_Spec (Parent (Declaration_Node (gnat_temp)));
239
240           if (IN (Ekind (gnat_temp), Subprogram_Kind)
241               && Present (Protected_Body_Subprogram (gnat_temp)))
242             gnat_temp = Protected_Body_Subprogram (gnat_temp);
243
244           if (Ekind (gnat_temp) == E_Entry
245               || Ekind (gnat_temp) == E_Entry_Family
246               || Ekind (gnat_temp) == E_Task_Type
247               || (IN (Ekind (gnat_temp), Subprogram_Kind)
248                   && present_gnu_tree (gnat_temp)
249                   && (current_function_decl
250                       == gnat_to_gnu_entity (gnat_temp, NULL_TREE, 0))))
251             {
252               process_type (gnat_entity);
253               return get_gnu_tree (gnat_entity);
254             }
255         }
256
257       /* This abort means the Itype has an incorrect scope, i.e. that its
258          scope does not correspond to the subprogram it is declared in.  */
259       gcc_unreachable ();
260     }
261
262   /* If we've already processed this entity, return what we got last time.
263      If we are defining the node, we should not have already processed it.
264      In that case, we will abort below when we try to save a new GCC tree
265      for this object.  We also need to handle the case of getting a dummy
266      type when a Full_View exists.  */
267   if ((!definition || (is_type && imported_p))
268       && present_gnu_tree (gnat_entity))
269     {
270       gnu_decl = get_gnu_tree (gnat_entity);
271
272       if (TREE_CODE (gnu_decl) == TYPE_DECL
273           && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl))
274           && IN (kind, Incomplete_Or_Private_Kind)
275           && Present (Full_View (gnat_entity)))
276         {
277           gnu_decl
278             = gnat_to_gnu_entity (Full_View (gnat_entity), NULL_TREE, 0);
279           save_gnu_tree (gnat_entity, NULL_TREE, false);
280           save_gnu_tree (gnat_entity, gnu_decl, false);
281         }
282
283       return gnu_decl;
284     }
285
286   /* If this is a numeric or enumeral type, or an access type, a nonzero
287      Esize must be specified unless it was specified by the programmer.  */
288   gcc_assert (!Unknown_Esize (gnat_entity)
289               || Has_Size_Clause (gnat_entity)
290               || (!IN (kind, Numeric_Kind)
291                   && !IN (kind, Enumeration_Kind)
292                   && (!IN (kind, Access_Kind)
293                       || kind == E_Access_Protected_Subprogram_Type
294                       || kind == E_Anonymous_Access_Protected_Subprogram_Type
295                       || kind == E_Access_Subtype)));
296
297   /* The RM size must be specified for all discrete and fixed-point types.  */
298   gcc_assert (!(IN (kind, Discrete_Or_Fixed_Point_Kind)
299                 && Unknown_RM_Size (gnat_entity)));
300
301   /* If we get here, it means we have not yet done anything with this entity.
302      If we are not defining it, it must be a type or an entity that is defined
303      elsewhere or externally, otherwise we should have defined it already.  */
304   gcc_assert (definition
305               || type_annotate_only
306               || is_type
307               || kind == E_Discriminant
308               || kind == E_Component
309               || kind == E_Label
310               || (kind == E_Constant && Present (Full_View (gnat_entity)))
311               || Is_Public (gnat_entity));
312
313   /* Get the name of the entity and set up the line number and filename of
314      the original definition for use in any decl we make.  */
315   gnu_entity_name = get_entity_name (gnat_entity);
316   Sloc_to_locus (Sloc (gnat_entity), &input_location);
317
318   /* For cases when we are not defining (i.e., we are referencing from
319      another compilation unit) public entities, show we are at global level
320      for the purpose of computing scopes.  Don't do this for components or
321      discriminants since the relevant test is whether or not the record is
322      being defined.  */
323   if (!definition
324       && kind != E_Component
325       && kind != E_Discriminant
326       && Is_Public (gnat_entity)
327       && !Is_Statically_Allocated (gnat_entity))
328     force_global++, this_global = true;
329
330   /* Handle any attributes directly attached to the entity.  */
331   if (Has_Gigi_Rep_Item (gnat_entity))
332     prepend_attributes (gnat_entity, &attr_list);
333
334   /* Do some common processing for types.  */
335   if (is_type)
336     {
337       /* Compute the equivalent type to be used in gigi.  */
338       gnat_equiv_type = Gigi_Equivalent_Type (gnat_entity);
339
340       /* Machine_Attributes on types are expected to be propagated to
341          subtypes.  The corresponding Gigi_Rep_Items are only attached
342          to the first subtype though, so we handle the propagation here.  */
343       if (Base_Type (gnat_entity) != gnat_entity
344           && !Is_First_Subtype (gnat_entity)
345           && Has_Gigi_Rep_Item (First_Subtype (Base_Type (gnat_entity))))
346         prepend_attributes (First_Subtype (Base_Type (gnat_entity)),
347                             &attr_list);
348
349       /* Compute a default value for the size of the type.  */
350       if (Known_Esize (gnat_entity)
351           && UI_Is_In_Int_Range (Esize (gnat_entity)))
352         {
353           unsigned int max_esize;
354           esize = UI_To_Int (Esize (gnat_entity));
355
356           if (IN (kind, Float_Kind))
357             max_esize = fp_prec_to_size (LONG_DOUBLE_TYPE_SIZE);
358           else if (IN (kind, Access_Kind))
359             max_esize = POINTER_SIZE * 2;
360           else
361             max_esize = LONG_LONG_TYPE_SIZE;
362
363           if (esize > max_esize)
364            esize = max_esize;
365         }
366       else
367         esize = LONG_LONG_TYPE_SIZE;
368     }
369
370   switch (kind)
371     {
372     case E_Constant:
373       /* If this is a use of a deferred constant without address clause,
374          get its full definition.  */
375       if (!definition
376           && No (Address_Clause (gnat_entity))
377           && Present (Full_View (gnat_entity)))
378         {
379           gnu_decl
380             = gnat_to_gnu_entity (Full_View (gnat_entity), gnu_expr, 0);
381           saved = true;
382           break;
383         }
384
385       /* If we have an external constant that we are not defining, get the
386          expression that is was defined to represent.  We may throw that
387          expression away later if it is not a constant.  Do not retrieve the
388          expression if it is an aggregate or allocator, because in complex
389          instantiation contexts it may not be expanded  */
390       if (!definition
391           && Present (Expression (Declaration_Node (gnat_entity)))
392           && !No_Initialization (Declaration_Node (gnat_entity))
393           && (Nkind (Expression (Declaration_Node (gnat_entity)))
394               != N_Aggregate)
395           && (Nkind (Expression (Declaration_Node (gnat_entity)))
396               != N_Allocator))
397         gnu_expr = gnat_to_gnu (Expression (Declaration_Node (gnat_entity)));
398
399       /* Ignore deferred constant definitions without address clause since
400          they are processed fully in the front-end.  If No_Initialization
401          is set, this is not a deferred constant but a constant whose value
402          is built manually.  And constants that are renamings are handled
403          like variables.  */
404       if (definition
405           && !gnu_expr
406           && No (Address_Clause (gnat_entity))
407           && !No_Initialization (Declaration_Node (gnat_entity))
408           && No (Renamed_Object (gnat_entity)))
409         {
410           gnu_decl = error_mark_node;
411           saved = true;
412           break;
413         }
414
415       /* Ignore constant definitions already marked with the error node.  See
416          the N_Object_Declaration case of gnat_to_gnu for the rationale.  */
417       if (definition
418           && gnu_expr
419           && present_gnu_tree (gnat_entity)
420           && get_gnu_tree (gnat_entity) == error_mark_node)
421         {
422           maybe_present = true;
423           break;
424         }
425
426       goto object;
427
428     case E_Exception:
429       /* We used to special case VMS exceptions here to directly map them to
430          their associated condition code.  Since this code had to be masked
431          dynamically to strip off the severity bits, this caused trouble in
432          the GCC/ZCX case because the "type" pointers we store in the tables
433          have to be static.  We now don't special case here anymore, and let
434          the regular processing take place, which leaves us with a regular
435          exception data object for VMS exceptions too.  The condition code
436          mapping is taken care of by the front end and the bitmasking by the
437          runtime library.  */
438       goto object;
439
440     case E_Discriminant:
441     case E_Component:
442       {
443         /* The GNAT record where the component was defined.  */
444         Entity_Id gnat_record = Underlying_Type (Scope (gnat_entity));
445
446         /* If the variable is an inherited record component (in the case of
447            extended record types), just return the inherited entity, which
448            must be a FIELD_DECL.  Likewise for discriminants.
449            For discriminants of untagged records which have explicit
450            stored discriminants, return the entity for the corresponding
451            stored discriminant.  Also use Original_Record_Component
452            if the record has a private extension.  */
453         if (Present (Original_Record_Component (gnat_entity))
454             && Original_Record_Component (gnat_entity) != gnat_entity)
455           {
456             gnu_decl
457               = gnat_to_gnu_entity (Original_Record_Component (gnat_entity),
458                                     gnu_expr, definition);
459             saved = true;
460             break;
461           }
462
463         /* If the enclosing record has explicit stored discriminants,
464            then it is an untagged record.  If the Corresponding_Discriminant
465            is not empty then this must be a renamed discriminant and its
466            Original_Record_Component must point to the corresponding explicit
467            stored discriminant (i.e. we should have taken the previous
468            branch).  */
469         else if (Present (Corresponding_Discriminant (gnat_entity))
470                  && Is_Tagged_Type (gnat_record))
471           {
472             /* A tagged record has no explicit stored discriminants.  */
473             gcc_assert (First_Discriminant (gnat_record)
474                        == First_Stored_Discriminant (gnat_record));
475             gnu_decl
476               = gnat_to_gnu_entity (Corresponding_Discriminant (gnat_entity),
477                                     gnu_expr, definition);
478             saved = true;
479             break;
480           }
481
482         else if (Present (CR_Discriminant (gnat_entity))
483                  && type_annotate_only)
484           {
485             gnu_decl = gnat_to_gnu_entity (CR_Discriminant (gnat_entity),
486                                            gnu_expr, definition);
487             saved = true;
488             break;
489           }
490
491         /* If the enclosing record has explicit stored discriminants, then
492            it is an untagged record.  If the Corresponding_Discriminant
493            is not empty then this must be a renamed discriminant and its
494            Original_Record_Component must point to the corresponding explicit
495            stored discriminant (i.e. we should have taken the first
496            branch).  */
497         else if (Present (Corresponding_Discriminant (gnat_entity))
498                  && (First_Discriminant (gnat_record)
499                      != First_Stored_Discriminant (gnat_record)))
500           gcc_unreachable ();
501
502         /* Otherwise, if we are not defining this and we have no GCC type
503            for the containing record, make one for it.  Then we should
504            have made our own equivalent.  */
505         else if (!definition && !present_gnu_tree (gnat_record))
506           {
507             /* ??? If this is in a record whose scope is a protected
508                type and we have an Original_Record_Component, use it.
509                This is a workaround for major problems in protected type
510                handling.  */
511             Entity_Id Scop = Scope (Scope (gnat_entity));
512             if ((Is_Protected_Type (Scop)
513                  || (Is_Private_Type (Scop)
514                      && Present (Full_View (Scop))
515                      && Is_Protected_Type (Full_View (Scop))))
516                 && Present (Original_Record_Component (gnat_entity)))
517               {
518                 gnu_decl
519                   = gnat_to_gnu_entity (Original_Record_Component
520                                         (gnat_entity),
521                                         gnu_expr, 0);
522                 saved = true;
523                 break;
524               }
525
526             gnat_to_gnu_entity (Scope (gnat_entity), NULL_TREE, 0);
527             gnu_decl = get_gnu_tree (gnat_entity);
528             saved = true;
529             break;
530           }
531
532         else
533           /* Here we have no GCC type and this is a reference rather than a
534              definition.  This should never happen.  Most likely the cause is
535              reference before declaration in the gnat tree for gnat_entity.  */
536           gcc_unreachable ();
537       }
538
539     case E_Loop_Parameter:
540     case E_Out_Parameter:
541     case E_Variable:
542
543       /* Simple variables, loop variables, Out parameters, and exceptions.  */
544     object:
545       {
546         bool used_by_ref = false;
547         bool const_flag
548           = ((kind == E_Constant || kind == E_Variable)
549              && Is_True_Constant (gnat_entity)
550              && !Treat_As_Volatile (gnat_entity)
551              && (((Nkind (Declaration_Node (gnat_entity))
552                    == N_Object_Declaration)
553                   && Present (Expression (Declaration_Node (gnat_entity))))
554                  || Present (Renamed_Object (gnat_entity))));
555         bool inner_const_flag = const_flag;
556         bool static_p = Is_Statically_Allocated (gnat_entity);
557         bool mutable_p = false;
558         tree gnu_ext_name = NULL_TREE;
559         tree renamed_obj = NULL_TREE;
560         tree gnu_object_size;
561
562         if (Present (Renamed_Object (gnat_entity)) && !definition)
563           {
564             if (kind == E_Exception)
565               gnu_expr = gnat_to_gnu_entity (Renamed_Entity (gnat_entity),
566                                              NULL_TREE, 0);
567             else
568               gnu_expr = gnat_to_gnu (Renamed_Object (gnat_entity));
569           }
570
571         /* Get the type after elaborating the renamed object.  */
572         gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
573
574         /* For a debug renaming declaration, build a pure debug entity.  */
575         if (Present (Debug_Renaming_Link (gnat_entity)))
576           {
577             rtx addr;
578             gnu_decl = build_decl (VAR_DECL, gnu_entity_name, gnu_type);
579             /* The (MEM (CONST (0))) pattern is prescribed by STABS.  */
580             if (global_bindings_p ())
581               addr = gen_rtx_CONST (VOIDmode, const0_rtx);
582             else
583               addr = stack_pointer_rtx;
584             SET_DECL_RTL (gnu_decl, gen_rtx_MEM (Pmode, addr));
585             gnat_pushdecl (gnu_decl, gnat_entity);
586             break;
587           }
588
589         /* If this is a loop variable, its type should be the base type.
590            This is because the code for processing a loop determines whether
591            a normal loop end test can be done by comparing the bounds of the
592            loop against those of the base type, which is presumed to be the
593            size used for computation.  But this is not correct when the size
594            of the subtype is smaller than the type.  */
595         if (kind == E_Loop_Parameter)
596           gnu_type = get_base_type (gnu_type);
597
598         /* Reject non-renamed objects whose types are unconstrained arrays or
599            any object whose type is a dummy type or VOID_TYPE.  */
600
601         if ((TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE
602              && No (Renamed_Object (gnat_entity)))
603             || TYPE_IS_DUMMY_P (gnu_type)
604             || TREE_CODE (gnu_type) == VOID_TYPE)
605           {
606             gcc_assert (type_annotate_only);
607             if (this_global)
608               force_global--;
609             return error_mark_node;
610           }
611
612         /* If an alignment is specified, use it if valid.   Note that
613            exceptions are objects but don't have alignments.  We must do this
614            before we validate the size, since the alignment can affect the
615            size.  */
616         if (kind != E_Exception && Known_Alignment (gnat_entity))
617           {
618             gcc_assert (Present (Alignment (gnat_entity)));
619             align = validate_alignment (Alignment (gnat_entity), gnat_entity,
620                                         TYPE_ALIGN (gnu_type));
621             gnu_type = maybe_pad_type (gnu_type, NULL_TREE, align, gnat_entity,
622                                        "PAD", false, definition, true);
623           }
624
625         /* If we are defining the object, see if it has a Size value and
626            validate it if so.  If we are not defining the object and a Size
627            clause applies, simply retrieve the value.  We don't want to ignore
628            the clause and it is expected to have been validated already.  Then
629            get the new type, if any.  */
630         if (definition)
631           gnu_size = validate_size (Esize (gnat_entity), gnu_type,
632                                     gnat_entity, VAR_DECL, false,
633                                     Has_Size_Clause (gnat_entity));
634         else if (Has_Size_Clause (gnat_entity))
635           gnu_size = UI_To_gnu (Esize (gnat_entity), bitsizetype);
636
637         if (gnu_size)
638           {
639             gnu_type
640               = make_type_from_size (gnu_type, gnu_size,
641                                      Has_Biased_Representation (gnat_entity));
642
643             if (operand_equal_p (TYPE_SIZE (gnu_type), gnu_size, 0))
644               gnu_size = NULL_TREE;
645           }
646
647         /* If this object has self-referential size, it must be a record with
648            a default value.  We are supposed to allocate an object of the
649            maximum size in this case unless it is a constant with an
650            initializing expression, in which case we can get the size from
651            that.  Note that the resulting size may still be a variable, so
652            this may end up with an indirect allocation.  */
653         if (No (Renamed_Object (gnat_entity))
654             && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
655           {
656             if (gnu_expr && kind == E_Constant)
657               {
658                 tree size = TYPE_SIZE (TREE_TYPE (gnu_expr));
659                 if (CONTAINS_PLACEHOLDER_P (size))
660                   {
661                     /* If the initializing expression is itself a constant,
662                        despite having a nominal type with self-referential
663                        size, we can get the size directly from it.  */
664                     if (TREE_CODE (gnu_expr) == COMPONENT_REF
665                         && TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))
666                            == RECORD_TYPE
667                         && TYPE_IS_PADDING_P
668                            (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))
669                         && TREE_CODE (TREE_OPERAND (gnu_expr, 0)) == VAR_DECL
670                         && (TREE_READONLY (TREE_OPERAND (gnu_expr, 0))
671                             || DECL_READONLY_ONCE_ELAB
672                                (TREE_OPERAND (gnu_expr, 0))))
673                       gnu_size = DECL_SIZE (TREE_OPERAND (gnu_expr, 0));
674                     else
675                       gnu_size
676                         = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, gnu_expr);
677                   }
678                 else
679                   gnu_size = size;
680               }
681             /* We may have no GNU_EXPR because No_Initialization is
682                set even though there's an Expression.  */
683             else if (kind == E_Constant
684                      && (Nkind (Declaration_Node (gnat_entity))
685                          == N_Object_Declaration)
686                      && Present (Expression (Declaration_Node (gnat_entity))))
687               gnu_size
688                 = TYPE_SIZE (gnat_to_gnu_type
689                              (Etype
690                               (Expression (Declaration_Node (gnat_entity)))));
691             else
692               {
693                 gnu_size = max_size (TYPE_SIZE (gnu_type), true);
694                 mutable_p = true;
695               }
696           }
697
698         /* If the size is zero bytes, make it one byte since some linkers have
699            trouble with zero-sized objects.  If the object will have a
700            template, that will make it nonzero so don't bother.  Also avoid
701            doing that for an object renaming or an object with an address
702            clause, as we would lose useful information on the view size
703            (e.g. for null array slices) and we are not allocating the object
704            here anyway.  */
705         if (((gnu_size
706               && integer_zerop (gnu_size)
707               && !TREE_OVERFLOW (gnu_size))
708              || (TYPE_SIZE (gnu_type)
709                  && integer_zerop (TYPE_SIZE (gnu_type))
710                  && !TREE_OVERFLOW (TYPE_SIZE (gnu_type))))
711             && (!Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
712                 || !Is_Array_Type (Etype (gnat_entity)))
713             && No (Renamed_Object (gnat_entity))
714             && No (Address_Clause (gnat_entity)))
715           gnu_size = bitsize_unit_node;
716
717         /* If this is an object with no specified size and alignment, and
718            if either it is atomic or we are not optimizing alignment for
719            space and it is composite and not an exception, an Out parameter
720            or a reference to another object, and the size of its type is a
721            constant, set the alignment to the smallest one which is not
722            smaller than the size, with an appropriate cap.  */
723         if (!gnu_size && align == 0
724             && (Is_Atomic (gnat_entity)
725                 || (!Optimize_Alignment_Space (gnat_entity)
726                     && kind != E_Exception
727                     && kind != E_Out_Parameter
728                     && Is_Composite_Type (Etype (gnat_entity))
729                     && !Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
730                     && !imported_p
731                     && No (Renamed_Object (gnat_entity))
732                     && No (Address_Clause (gnat_entity))))
733             && TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST)
734           {
735             /* No point in jumping through all the hoops needed in order
736                to support BIGGEST_ALIGNMENT if we don't really have to.
737                So we cap to the smallest alignment that corresponds to
738                a known efficient memory access pattern of the target.  */
739             unsigned int align_cap = Is_Atomic (gnat_entity)
740                                      ? BIGGEST_ALIGNMENT
741                                      : get_mode_alignment (ptr_mode);
742
743             if (!host_integerp (TYPE_SIZE (gnu_type), 1)
744                 || compare_tree_int (TYPE_SIZE (gnu_type), align_cap) >= 0)
745               align = align_cap;
746             else
747               align = ceil_alignment (tree_low_cst (TYPE_SIZE (gnu_type), 1));
748
749             /* But make sure not to under-align the object.  */
750             if (align <= TYPE_ALIGN (gnu_type))
751               align = 0;
752
753             /* And honor the minimum valid atomic alignment, if any.  */
754 #ifdef MINIMUM_ATOMIC_ALIGNMENT
755             else if (align < MINIMUM_ATOMIC_ALIGNMENT)
756               align = MINIMUM_ATOMIC_ALIGNMENT;
757 #endif
758           }
759
760         /* If the object is set to have atomic components, find the component
761            type and validate it.
762
763            ??? Note that we ignore Has_Volatile_Components on objects; it's
764            not at all clear what to do in that case.  */
765
766         if (Has_Atomic_Components (gnat_entity))
767           {
768             tree gnu_inner = (TREE_CODE (gnu_type) == ARRAY_TYPE
769                               ? TREE_TYPE (gnu_type) : gnu_type);
770
771             while (TREE_CODE (gnu_inner) == ARRAY_TYPE
772                    && TYPE_MULTI_ARRAY_P (gnu_inner))
773               gnu_inner = TREE_TYPE (gnu_inner);
774
775             check_ok_for_atomic (gnu_inner, gnat_entity, true);
776           }
777
778         /* Now check if the type of the object allows atomic access.  Note
779            that we must test the type, even if this object has size and
780            alignment to allow such access, because we will be going
781            inside the padded record to assign to the object.  We could fix
782            this by always copying via an intermediate value, but it's not
783            clear it's worth the effort.  */
784         if (Is_Atomic (gnat_entity))
785           check_ok_for_atomic (gnu_type, gnat_entity, false);
786
787         /* If this is an aliased object with an unconstrained nominal subtype,
788            make a type that includes the template.  */
789         if (Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
790             && Is_Array_Type (Etype (gnat_entity))
791             && !type_annotate_only)
792         {
793           tree gnu_fat
794             = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity))));
795
796           gnu_type
797             = build_unc_object_type_from_ptr (gnu_fat, gnu_type,
798                                               concat_name (gnu_entity_name,
799                                                            "UNC"));
800         }
801
802 #ifdef MINIMUM_ATOMIC_ALIGNMENT
803         /* If the size is a constant and no alignment is specified, force
804            the alignment to be the minimum valid atomic alignment.  The
805            restriction on constant size avoids problems with variable-size
806            temporaries; if the size is variable, there's no issue with
807            atomic access.  Also don't do this for a constant, since it isn't
808            necessary and can interfere with constant replacement.  Finally,
809            do not do it for Out parameters since that creates an
810            size inconsistency with In parameters.  */
811         if (align == 0 && MINIMUM_ATOMIC_ALIGNMENT > TYPE_ALIGN (gnu_type)
812             && !FLOAT_TYPE_P (gnu_type)
813             && !const_flag && No (Renamed_Object (gnat_entity))
814             && !imported_p && No (Address_Clause (gnat_entity))
815             && kind != E_Out_Parameter
816             && (gnu_size ? TREE_CODE (gnu_size) == INTEGER_CST
817                 : TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST))
818           align = MINIMUM_ATOMIC_ALIGNMENT;
819 #endif
820
821         /* Make a new type with the desired size and alignment, if needed.
822            But do not take into account alignment promotions to compute the
823            size of the object.  */
824         gnu_object_size = gnu_size ? gnu_size : TYPE_SIZE (gnu_type);
825         if (gnu_size || align > 0)
826           gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity,
827                                      "PAD", false, definition,
828                                      gnu_size ? true : false);
829
830         /* If this is a renaming, avoid as much as possible to create a new
831            object.  However, in several cases, creating it is required.
832            This processing needs to be applied to the raw expression so
833            as to make it more likely to rename the underlying object.  */
834         if (Present (Renamed_Object (gnat_entity)))
835           {
836             bool create_normal_object = false;
837
838             /* If the renamed object had padding, strip off the reference
839                to the inner object and reset our type.  */
840             if ((TREE_CODE (gnu_expr) == COMPONENT_REF
841                  && TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))
842                     == RECORD_TYPE
843                  && TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0))))
844                 /* Strip useless conversions around the object.  */
845                 || (TREE_CODE (gnu_expr) == NOP_EXPR
846                     && gnat_types_compatible_p
847                        (TREE_TYPE (gnu_expr),
848                         TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))))
849               {
850                 gnu_expr = TREE_OPERAND (gnu_expr, 0);
851                 gnu_type = TREE_TYPE (gnu_expr);
852               }
853
854             /* Case 1: If this is a constant renaming stemming from a function
855                call, treat it as a normal object whose initial value is what
856                is being renamed.  RM 3.3 says that the result of evaluating a
857                function call is a constant object.  As a consequence, it can
858                be the inner object of a constant renaming.  In this case, the
859                renaming must be fully instantiated, i.e. it cannot be a mere
860                reference to (part of) an existing object.  */
861             if (const_flag)
862               {
863                 tree inner_object = gnu_expr;
864                 while (handled_component_p (inner_object))
865                   inner_object = TREE_OPERAND (inner_object, 0);
866                 if (TREE_CODE (inner_object) == CALL_EXPR)
867                   create_normal_object = true;
868               }
869
870             /* Otherwise, see if we can proceed with a stabilized version of
871                the renamed entity or if we need to make a new object.  */
872             if (!create_normal_object)
873               {
874                 tree maybe_stable_expr = NULL_TREE;
875                 bool stable = false;
876
877                 /* Case 2: If the renaming entity need not be materialized and
878                    the renamed expression is something we can stabilize, use
879                    that for the renaming.  At the global level, we can only do
880                    this if we know no SAVE_EXPRs need be made, because the
881                    expression we return might be used in arbitrary conditional
882                    branches so we must force the SAVE_EXPRs evaluation
883                    immediately and this requires a function context.  */
884                 if (!Materialize_Entity (gnat_entity)
885                     && (!global_bindings_p ()
886                         || (staticp (gnu_expr)
887                             && !TREE_SIDE_EFFECTS (gnu_expr))))
888                   {
889                     maybe_stable_expr
890                       = maybe_stabilize_reference (gnu_expr, true, &stable);
891
892                     if (stable)
893                       {
894                         gnu_decl = maybe_stable_expr;
895                         /* ??? No DECL_EXPR is created so we need to mark
896                            the expression manually lest it is shared.  */
897                         if (global_bindings_p ())
898                           mark_visited (&gnu_decl);
899                         save_gnu_tree (gnat_entity, gnu_decl, true);
900                         saved = true;
901                         break;
902                       }
903
904                     /* The stabilization failed.  Keep maybe_stable_expr
905                        untouched here to let the pointer case below know
906                        about that failure.  */
907                   }
908
909                 /* Case 3: If this is a constant renaming and creating a
910                    new object is allowed and cheap, treat it as a normal
911                    object whose initial value is what is being renamed.  */
912                 if (const_flag
913                     && !Is_Composite_Type
914                         (Underlying_Type (Etype (gnat_entity))))
915                   ;
916
917                 /* Case 4: Make this into a constant pointer to the object we
918                    are to rename and attach the object to the pointer if it is
919                    something we can stabilize.
920
921                    From the proper scope, attached objects will be referenced
922                    directly instead of indirectly via the pointer to avoid
923                    subtle aliasing problems with non-addressable entities.
924                    They have to be stable because we must not evaluate the
925                    variables in the expression every time the renaming is used.
926                    The pointer is called a "renaming" pointer in this case.
927
928                    In the rare cases where we cannot stabilize the renamed
929                    object, we just make a "bare" pointer, and the renamed
930                    entity is always accessed indirectly through it.  */
931                 else
932                   {
933                     gnu_type = build_reference_type (gnu_type);
934                     inner_const_flag = TREE_READONLY (gnu_expr);
935                     const_flag = true;
936
937                     /* If the previous attempt at stabilizing failed, there
938                        is no point in trying again and we reuse the result
939                        without attaching it to the pointer.  In this case it
940                        will only be used as the initializing expression of
941                        the pointer and thus needs no special treatment with
942                        regard to multiple evaluations.  */
943                     if (maybe_stable_expr)
944                       ;
945
946                     /* Otherwise, try to stabilize and attach the expression
947                        to the pointer if the stabilization succeeds.
948
949                        Note that this might introduce SAVE_EXPRs and we don't
950                        check whether we're at the global level or not.  This
951                        is fine since we are building a pointer initializer and
952                        neither the pointer nor the initializing expression can
953                        be accessed before the pointer elaboration has taken
954                        place in a correct program.
955
956                        These SAVE_EXPRs will be evaluated at the right place
957                        by either the evaluation of the initializer for the
958                        non-global case or the elaboration code for the global
959                        case, and will be attached to the elaboration procedure
960                        in the latter case.  */
961                     else
962                      {
963                         maybe_stable_expr
964                           = maybe_stabilize_reference (gnu_expr, true, &stable);
965
966                         if (stable)
967                           renamed_obj = maybe_stable_expr;
968
969                         /* Attaching is actually performed downstream, as soon
970                            as we have a VAR_DECL for the pointer we make.  */
971                       }
972
973                     gnu_expr
974                       = build_unary_op (ADDR_EXPR, gnu_type, maybe_stable_expr);
975
976                     gnu_size = NULL_TREE;
977                     used_by_ref = true;
978                   }
979               }
980           }
981
982         /* Make a volatile version of this object's type if we are to make
983            the object volatile.  We also interpret 13.3(19) conservatively
984            and disallow any optimizations for such a non-constant object.  */
985         if ((Treat_As_Volatile (gnat_entity)
986              || (!const_flag
987                  && (Is_Exported (gnat_entity)
988                      || Is_Imported (gnat_entity)
989                      || Present (Address_Clause (gnat_entity)))))
990             && !TYPE_VOLATILE (gnu_type))
991           gnu_type = build_qualified_type (gnu_type,
992                                            (TYPE_QUALS (gnu_type)
993                                             | TYPE_QUAL_VOLATILE));
994
995         /* If we are defining an aliased object whose nominal subtype is
996            unconstrained, the object is a record that contains both the
997            template and the object.  If there is an initializer, it will
998            have already been converted to the right type, but we need to
999            create the template if there is no initializer.  */
1000         if (definition
1001             && !gnu_expr
1002             && TREE_CODE (gnu_type) == RECORD_TYPE
1003             && (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
1004                 /* Beware that padding might have been introduced
1005                    via maybe_pad_type above.  */
1006                 || (TYPE_IS_PADDING_P (gnu_type)
1007                     && TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
1008                        == RECORD_TYPE
1009                     && TYPE_CONTAINS_TEMPLATE_P
1010                        (TREE_TYPE (TYPE_FIELDS (gnu_type))))))
1011           {
1012             tree template_field
1013               = TYPE_IS_PADDING_P (gnu_type)
1014                 ? TYPE_FIELDS (TREE_TYPE (TYPE_FIELDS (gnu_type)))
1015                 : TYPE_FIELDS (gnu_type);
1016
1017             gnu_expr
1018               = gnat_build_constructor
1019               (gnu_type,
1020                tree_cons
1021                (template_field,
1022                 build_template (TREE_TYPE (template_field),
1023                                 TREE_TYPE (TREE_CHAIN (template_field)),
1024                                 NULL_TREE),
1025                 NULL_TREE));
1026           }
1027
1028         /* Convert the expression to the type of the object except in the
1029            case where the object's type is unconstrained or the object's type
1030            is a padded record whose field is of self-referential size.  In
1031            the former case, converting will generate unnecessary evaluations
1032            of the CONSTRUCTOR to compute the size and in the latter case, we
1033            want to only copy the actual data.  */
1034         if (gnu_expr
1035             && TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
1036             && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
1037             && !(TREE_CODE (gnu_type) == RECORD_TYPE
1038                  && TYPE_IS_PADDING_P (gnu_type)
1039                  && (CONTAINS_PLACEHOLDER_P
1040                      (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type)))))))
1041           gnu_expr = convert (gnu_type, gnu_expr);
1042
1043         /* If this is a pointer and it does not have an initializing
1044            expression, initialize it to NULL, unless the object is
1045            imported.  */
1046         if (definition
1047             && (POINTER_TYPE_P (gnu_type) || TYPE_FAT_POINTER_P (gnu_type))
1048             && !Is_Imported (gnat_entity) && !gnu_expr)
1049           gnu_expr = integer_zero_node;
1050
1051         /* If we are defining the object and it has an Address clause, we must
1052            either get the address expression from the saved GCC tree for the
1053            object if it has a Freeze node, or elaborate the address expression
1054            here since the front-end has guaranteed that the elaboration has no
1055            effects in this case.  */
1056         if (definition && Present (Address_Clause (gnat_entity)))
1057           {
1058             tree gnu_address
1059               = present_gnu_tree (gnat_entity)
1060                 ? get_gnu_tree (gnat_entity)
1061                 : gnat_to_gnu (Expression (Address_Clause (gnat_entity)));
1062
1063             save_gnu_tree (gnat_entity, NULL_TREE, false);
1064
1065             /* Ignore the size.  It's either meaningless or was handled
1066                above.  */
1067             gnu_size = NULL_TREE;
1068             /* Convert the type of the object to a reference type that can
1069                alias everything as per 13.3(19).  */
1070             gnu_type
1071               = build_reference_type_for_mode (gnu_type, ptr_mode, true);
1072             gnu_address = convert (gnu_type, gnu_address);
1073             used_by_ref = true;
1074             const_flag = !Is_Public (gnat_entity)
1075               || compile_time_known_address_p (Expression (Address_Clause
1076                                                            (gnat_entity)));
1077
1078             /* If this is a deferred constant, the initializer is attached to
1079                the full view.  */
1080             if (kind == E_Constant && Present (Full_View (gnat_entity)))
1081               gnu_expr
1082                 = gnat_to_gnu
1083                     (Expression (Declaration_Node (Full_View (gnat_entity))));
1084
1085             /* If we don't have an initializing expression for the underlying
1086                variable, the initializing expression for the pointer is the
1087                specified address.  Otherwise, we have to make a COMPOUND_EXPR
1088                to assign both the address and the initial value.  */
1089             if (!gnu_expr)
1090               gnu_expr = gnu_address;
1091             else
1092               gnu_expr
1093                 = build2 (COMPOUND_EXPR, gnu_type,
1094                           build_binary_op
1095                           (MODIFY_EXPR, NULL_TREE,
1096                            build_unary_op (INDIRECT_REF, NULL_TREE,
1097                                            gnu_address),
1098                            gnu_expr),
1099                           gnu_address);
1100           }
1101
1102         /* If it has an address clause and we are not defining it, mark it
1103            as an indirect object.  Likewise for Stdcall objects that are
1104            imported.  */
1105         if ((!definition && Present (Address_Clause (gnat_entity)))
1106             || (Is_Imported (gnat_entity)
1107                 && Has_Stdcall_Convention (gnat_entity)))
1108           {
1109             /* Convert the type of the object to a reference type that can
1110                alias everything as per 13.3(19).  */
1111             gnu_type
1112               = build_reference_type_for_mode (gnu_type, ptr_mode, true);
1113             gnu_size = NULL_TREE;
1114
1115             /* No point in taking the address of an initializing expression
1116                that isn't going to be used.  */
1117             gnu_expr = NULL_TREE;
1118
1119             /* If it has an address clause whose value is known at compile
1120                time, make the object a CONST_DECL.  This will avoid a
1121                useless dereference.  */
1122             if (Present (Address_Clause (gnat_entity)))
1123               {
1124                 Node_Id gnat_address
1125                   = Expression (Address_Clause (gnat_entity));
1126
1127                 if (compile_time_known_address_p (gnat_address))
1128                   {
1129                     gnu_expr = gnat_to_gnu (gnat_address);
1130                     const_flag = true;
1131                   }
1132               }
1133
1134             used_by_ref = true;
1135           }
1136
1137         /* If we are at top level and this object is of variable size,
1138            make the actual type a hidden pointer to the real type and
1139            make the initializer be a memory allocation and initialization.
1140            Likewise for objects we aren't defining (presumed to be
1141            external references from other packages), but there we do
1142            not set up an initialization.
1143
1144            If the object's size overflows, make an allocator too, so that
1145            Storage_Error gets raised.  Note that we will never free
1146            such memory, so we presume it never will get allocated.  */
1147
1148         if (!allocatable_size_p (TYPE_SIZE_UNIT (gnu_type),
1149                                  global_bindings_p () || !definition
1150                                  || static_p)
1151             || (gnu_size
1152                 && ! allocatable_size_p (gnu_size,
1153                                          global_bindings_p () || !definition
1154                                          || static_p)))
1155           {
1156             gnu_type = build_reference_type (gnu_type);
1157             gnu_size = NULL_TREE;
1158             used_by_ref = true;
1159             const_flag = true;
1160
1161             /* In case this was a aliased object whose nominal subtype is
1162                unconstrained, the pointer above will be a thin pointer and
1163                build_allocator will automatically make the template.
1164
1165                If we have a template initializer only (that we made above),
1166                pretend there is none and rely on what build_allocator creates
1167                again anyway.  Otherwise (if we have a full initializer), get
1168                the data part and feed that to build_allocator.
1169
1170                If we are elaborating a mutable object, tell build_allocator to
1171                ignore a possibly simpler size from the initializer, if any, as
1172                we must allocate the maximum possible size in this case.  */
1173
1174             if (definition)
1175               {
1176                 tree gnu_alloc_type = TREE_TYPE (gnu_type);
1177
1178                 if (TREE_CODE (gnu_alloc_type) == RECORD_TYPE
1179                     && TYPE_CONTAINS_TEMPLATE_P (gnu_alloc_type))
1180                   {
1181                     gnu_alloc_type
1182                       = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_alloc_type)));
1183
1184                     if (TREE_CODE (gnu_expr) == CONSTRUCTOR
1185                         && 1 == VEC_length (constructor_elt,
1186                                             CONSTRUCTOR_ELTS (gnu_expr)))
1187                       gnu_expr = 0;
1188                     else
1189                       gnu_expr
1190                         = build_component_ref
1191                             (gnu_expr, NULL_TREE,
1192                              TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr))),
1193                              false);
1194                   }
1195
1196                 if (TREE_CODE (TYPE_SIZE_UNIT (gnu_alloc_type)) == INTEGER_CST
1197                     && TREE_OVERFLOW (TYPE_SIZE_UNIT (gnu_alloc_type))
1198                     && !Is_Imported (gnat_entity))
1199                   post_error ("?Storage_Error will be raised at run-time!",
1200                               gnat_entity);
1201
1202                 gnu_expr
1203                   = build_allocator (gnu_alloc_type, gnu_expr, gnu_type,
1204                                      Empty, Empty, gnat_entity, mutable_p);
1205               }
1206             else
1207               {
1208                 gnu_expr = NULL_TREE;
1209                 const_flag = false;
1210               }
1211           }
1212
1213         /* If this object would go into the stack and has an alignment larger
1214            than the largest stack alignment the back-end can honor, resort to
1215            a variable of "aligning type".  */
1216         if (!global_bindings_p () && !static_p && definition
1217             && !imported_p && TYPE_ALIGN (gnu_type) > BIGGEST_ALIGNMENT)
1218           {
1219             /* Create the new variable.  No need for extra room before the
1220                aligned field as this is in automatic storage.  */
1221             tree gnu_new_type
1222               = make_aligning_type (gnu_type, TYPE_ALIGN (gnu_type),
1223                                     TYPE_SIZE_UNIT (gnu_type),
1224                                     BIGGEST_ALIGNMENT, 0);
1225             tree gnu_new_var
1226               = create_var_decl (create_concat_name (gnat_entity, "ALIGN"),
1227                                  NULL_TREE, gnu_new_type, NULL_TREE, false,
1228                                  false, false, false, NULL, gnat_entity);
1229
1230             /* Initialize the aligned field if we have an initializer.  */
1231             if (gnu_expr)
1232               add_stmt_with_node
1233                 (build_binary_op (MODIFY_EXPR, NULL_TREE,
1234                                   build_component_ref
1235                                   (gnu_new_var, NULL_TREE,
1236                                    TYPE_FIELDS (gnu_new_type), false),
1237                                   gnu_expr),
1238                  gnat_entity);
1239
1240             /* And setup this entity as a reference to the aligned field.  */
1241             gnu_type = build_reference_type (gnu_type);
1242             gnu_expr
1243               = build_unary_op
1244                 (ADDR_EXPR, gnu_type,
1245                  build_component_ref (gnu_new_var, NULL_TREE,
1246                                       TYPE_FIELDS (gnu_new_type), false));
1247
1248             gnu_size = NULL_TREE;
1249             used_by_ref = true;
1250             const_flag = true;
1251           }
1252
1253         if (const_flag)
1254           gnu_type = build_qualified_type (gnu_type, (TYPE_QUALS (gnu_type)
1255                                                       | TYPE_QUAL_CONST));
1256
1257         /* Convert the expression to the type of the object except in the
1258            case where the object's type is unconstrained or the object's type
1259            is a padded record whose field is of self-referential size.  In
1260            the former case, converting will generate unnecessary evaluations
1261            of the CONSTRUCTOR to compute the size and in the latter case, we
1262            want to only copy the actual data.  */
1263         if (gnu_expr
1264             && TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
1265             && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
1266             && !(TREE_CODE (gnu_type) == RECORD_TYPE
1267                  && TYPE_IS_PADDING_P (gnu_type)
1268                  && (CONTAINS_PLACEHOLDER_P
1269                      (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type)))))))
1270           gnu_expr = convert (gnu_type, gnu_expr);
1271
1272         /* If this name is external or there was a name specified, use it,
1273            unless this is a VMS exception object since this would conflict
1274            with the symbol we need to export in addition.  Don't use the
1275            Interface_Name if there is an address clause (see CD30005).  */
1276         if (!Is_VMS_Exception (gnat_entity)
1277             && ((Present (Interface_Name (gnat_entity))
1278                  && No (Address_Clause (gnat_entity)))
1279                 || (Is_Public (gnat_entity)
1280                     && (!Is_Imported (gnat_entity)
1281                         || Is_Exported (gnat_entity)))))
1282           gnu_ext_name = create_concat_name (gnat_entity, NULL);
1283
1284         /* If this is constant initialized to a static constant and the
1285            object has an aggregate type, force it to be statically
1286            allocated.  This will avoid an initialization copy.  */
1287         if (!static_p && const_flag
1288             && gnu_expr && TREE_CONSTANT (gnu_expr)
1289             && AGGREGATE_TYPE_P (gnu_type)
1290             && host_integerp (TYPE_SIZE_UNIT (gnu_type), 1)
1291             && !(TREE_CODE (gnu_type) == RECORD_TYPE
1292                  && TYPE_IS_PADDING_P (gnu_type)
1293                  && !host_integerp (TYPE_SIZE_UNIT
1294                                     (TREE_TYPE (TYPE_FIELDS (gnu_type))), 1)))
1295           static_p = true;
1296
1297         gnu_decl = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
1298                                     gnu_expr, const_flag,
1299                                     Is_Public (gnat_entity),
1300                                     imported_p || !definition,
1301                                     static_p, attr_list, gnat_entity);
1302         DECL_BY_REF_P (gnu_decl) = used_by_ref;
1303         DECL_POINTS_TO_READONLY_P (gnu_decl) = used_by_ref && inner_const_flag;
1304         if (TREE_CODE (gnu_decl) == VAR_DECL && renamed_obj)
1305           {
1306             SET_DECL_RENAMED_OBJECT (gnu_decl, renamed_obj);
1307             if (global_bindings_p ())
1308               {
1309                 DECL_RENAMING_GLOBAL_P (gnu_decl) = 1;
1310                 record_global_renaming_pointer (gnu_decl);
1311               }
1312           }
1313
1314         if (definition && DECL_SIZE_UNIT (gnu_decl)
1315             && get_block_jmpbuf_decl ()
1316             && (TREE_CODE (DECL_SIZE_UNIT (gnu_decl)) != INTEGER_CST
1317                 || (flag_stack_check == GENERIC_STACK_CHECK
1318                     && compare_tree_int (DECL_SIZE_UNIT (gnu_decl),
1319                                          STACK_CHECK_MAX_VAR_SIZE) > 0)))
1320           add_stmt_with_node (build_call_1_expr
1321                               (update_setjmp_buf_decl,
1322                                build_unary_op (ADDR_EXPR, NULL_TREE,
1323                                                get_block_jmpbuf_decl ())),
1324                               gnat_entity);
1325
1326         /* If we are defining an Out parameter and we're not optimizing,
1327            create a fake PARM_DECL for debugging purposes and make it
1328            point to the VAR_DECL.  Suppress debug info for the latter
1329            but make sure it will still live on the stack so it can be
1330            accessed from within the debugger through the PARM_DECL.  */
1331         if (kind == E_Out_Parameter && definition && !optimize)
1332           {
1333             tree param = create_param_decl (gnu_entity_name, gnu_type, false);
1334             gnat_pushdecl (param, gnat_entity);
1335             SET_DECL_VALUE_EXPR (param, gnu_decl);
1336             DECL_HAS_VALUE_EXPR_P (param) = 1;
1337             if (debug_info_p)
1338               debug_info_p = false;
1339             else
1340               DECL_IGNORED_P (param) = 1;
1341             TREE_ADDRESSABLE (gnu_decl) = 1;
1342           }
1343
1344         /* If this is a public constant or we're not optimizing and we're not
1345            making a VAR_DECL for it, make one just for export or debugger use.
1346            Likewise if the address is taken or if either the object or type is
1347            aliased.  Make an external declaration for a reference, unless this
1348            is a Standard entity since there no real symbol at the object level
1349            for these.  */
1350         if (TREE_CODE (gnu_decl) == CONST_DECL
1351             && (definition || Sloc (gnat_entity) > Standard_Location)
1352             && ((Is_Public (gnat_entity) && No (Address_Clause (gnat_entity)))
1353                 || !optimize
1354                 || Address_Taken (gnat_entity)
1355                 || Is_Aliased (gnat_entity)
1356                 || Is_Aliased (Etype (gnat_entity))))
1357           {
1358             tree gnu_corr_var
1359               = create_true_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
1360                                       gnu_expr, true, Is_Public (gnat_entity),
1361                                       !definition, static_p, NULL,
1362                                       gnat_entity);
1363
1364             SET_DECL_CONST_CORRESPONDING_VAR (gnu_decl, gnu_corr_var);
1365
1366             /* As debugging information will be generated for the variable,
1367                do not generate information for the constant.  */
1368             DECL_IGNORED_P (gnu_decl) = 1;
1369           }
1370
1371         /* If this is declared in a block that contains a block with an
1372            exception handler, we must force this variable in memory to
1373            suppress an invalid optimization.  */
1374         if (Has_Nested_Block_With_Handler (Scope (gnat_entity))
1375             && Exception_Mechanism != Back_End_Exceptions)
1376           TREE_ADDRESSABLE (gnu_decl) = 1;
1377
1378         gnu_type = TREE_TYPE (gnu_decl);
1379
1380         /* Back-annotate Alignment and Esize of the object if not already
1381            known, except for when the object is actually a pointer to the
1382            real object, since alignment and size of a pointer don't have
1383            anything to do with those of the designated object.  Note that
1384            we pick the values of the type, not those of the object, to
1385            shield ourselves from low-level platform-dependent adjustments
1386            like alignment promotion.  This is both consistent with all the
1387            treatment above, where alignment and size are set on the type of
1388            the object and not on the object directly, and makes it possible
1389            to support confirming representation clauses in all cases.  */
1390
1391         if (!used_by_ref && Unknown_Alignment (gnat_entity))
1392           Set_Alignment (gnat_entity,
1393                          UI_From_Int (TYPE_ALIGN (gnu_type) / BITS_PER_UNIT));
1394
1395         if (!used_by_ref && Unknown_Esize (gnat_entity))
1396           {
1397             if (TREE_CODE (gnu_type) == RECORD_TYPE
1398                 && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
1399               gnu_object_size
1400                 = TYPE_SIZE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type))));
1401
1402             Set_Esize (gnat_entity, annotate_value (gnu_object_size));
1403           }
1404       }
1405       break;
1406
1407     case E_Void:
1408       /* Return a TYPE_DECL for "void" that we previously made.  */
1409       gnu_decl = TYPE_NAME (void_type_node);
1410       break;
1411
1412     case E_Enumeration_Type:
1413       /* A special case: for the types Character and Wide_Character in
1414          Standard, we do not list all the literals.  So if the literals
1415          are not specified, make this an unsigned type.  */
1416       if (No (First_Literal (gnat_entity)))
1417         {
1418           gnu_type = make_unsigned_type (esize);
1419           TYPE_NAME (gnu_type) = gnu_entity_name;
1420
1421           /* Set TYPE_STRING_FLAG for Character and Wide_Character types.
1422              This is needed by the DWARF-2 back-end to distinguish between
1423              unsigned integer types and character types.  */
1424           TYPE_STRING_FLAG (gnu_type) = 1;
1425           break;
1426         }
1427
1428       /* Normal case of non-character type or non-Standard character type.  */
1429       {
1430         /* Here we have a list of enumeral constants in First_Literal.
1431            We make a CONST_DECL for each and build into GNU_LITERAL_LIST
1432            the list to be placed into TYPE_FIELDS.  Each node in the list
1433            is a TREE_LIST whose TREE_VALUE is the literal name and whose
1434            TREE_PURPOSE is the value of the literal.  */
1435
1436         Entity_Id gnat_literal;
1437         tree gnu_literal_list = NULL_TREE;
1438
1439         if (Is_Unsigned_Type (gnat_entity))
1440           gnu_type = make_unsigned_type (esize);
1441         else
1442           gnu_type = make_signed_type (esize);
1443
1444         TREE_SET_CODE (gnu_type, ENUMERAL_TYPE);
1445
1446         for (gnat_literal = First_Literal (gnat_entity);
1447              Present (gnat_literal);
1448              gnat_literal = Next_Literal (gnat_literal))
1449           {
1450             tree gnu_value = UI_To_gnu (Enumeration_Rep (gnat_literal),
1451                                         gnu_type);
1452             tree gnu_literal
1453               = create_var_decl (get_entity_name (gnat_literal), NULL_TREE,
1454                                  gnu_type, gnu_value, true, false, false,
1455                                  false, NULL, gnat_literal);
1456
1457             save_gnu_tree (gnat_literal, gnu_literal, false);
1458             gnu_literal_list = tree_cons (DECL_NAME (gnu_literal),
1459                                           gnu_value, gnu_literal_list);
1460           }
1461
1462         TYPE_VALUES (gnu_type) = nreverse (gnu_literal_list);
1463
1464         /* Note that the bounds are updated at the end of this function
1465            to avoid an infinite recursion since they refer to the type.  */
1466       }
1467       break;
1468
1469     case E_Signed_Integer_Type:
1470     case E_Ordinary_Fixed_Point_Type:
1471     case E_Decimal_Fixed_Point_Type:
1472       /* For integer types, just make a signed type the appropriate number
1473          of bits.  */
1474       gnu_type = make_signed_type (esize);
1475       break;
1476
1477     case E_Modular_Integer_Type:
1478       {
1479         /* For modular types, make the unsigned type of the proper number
1480            of bits and then set up the modulus, if required.  */
1481         tree gnu_modulus, gnu_high = NULL_TREE;
1482
1483         /* Packed array types are supposed to be subtypes only.  */
1484         gcc_assert (!Is_Packed_Array_Type (gnat_entity));
1485
1486         gnu_type = make_unsigned_type (esize);
1487
1488         /* Get the modulus in this type.  If it overflows, assume it is because
1489            it is equal to 2**Esize.  Note that there is no overflow checking
1490            done on unsigned type, so we detect the overflow by looking for
1491            a modulus of zero, which is otherwise invalid.  */
1492         gnu_modulus = UI_To_gnu (Modulus (gnat_entity), gnu_type);
1493
1494         if (!integer_zerop (gnu_modulus))
1495           {
1496             TYPE_MODULAR_P (gnu_type) = 1;
1497             SET_TYPE_MODULUS (gnu_type, gnu_modulus);
1498             gnu_high = fold_build2 (MINUS_EXPR, gnu_type, gnu_modulus,
1499                                     convert (gnu_type, integer_one_node));
1500           }
1501
1502         /* If the upper bound is not maximal, make an extra subtype.  */
1503         if (gnu_high
1504             && !tree_int_cst_equal (gnu_high, TYPE_MAX_VALUE (gnu_type)))
1505           {
1506             tree gnu_subtype = make_unsigned_type (esize);
1507             TYPE_MAX_VALUE (gnu_subtype) = gnu_high;
1508             TREE_TYPE (gnu_subtype) = gnu_type;
1509             TYPE_EXTRA_SUBTYPE_P (gnu_subtype) = 1;
1510             TYPE_NAME (gnu_type) = create_concat_name (gnat_entity, "UMT");
1511             gnu_type = gnu_subtype;
1512           }
1513       }
1514       break;
1515
1516     case E_Signed_Integer_Subtype:
1517     case E_Enumeration_Subtype:
1518     case E_Modular_Integer_Subtype:
1519     case E_Ordinary_Fixed_Point_Subtype:
1520     case E_Decimal_Fixed_Point_Subtype:
1521
1522       /* For integral subtypes, we make a new INTEGER_TYPE.  Note that we do
1523          not want to call build_range_type since we would like each subtype
1524          node to be distinct.  ??? Historically this was in preparation for
1525          when memory aliasing is implemented, but that's obsolete now given
1526          the call to relate_alias_sets below.
1527
1528          The TREE_TYPE field of the INTEGER_TYPE points to the base type;
1529          this fact is used by the arithmetic conversion functions.
1530
1531          We elaborate the Ancestor_Subtype if it is not in the current unit
1532          and one of our bounds is non-static.  We do this to ensure consistent
1533          naming in the case where several subtypes share the same bounds, by
1534          elaborating the first such subtype first, thus using its name.  */
1535
1536       if (!definition
1537           && Present (Ancestor_Subtype (gnat_entity))
1538           && !In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity))
1539           && (!Compile_Time_Known_Value (Type_Low_Bound (gnat_entity))
1540               || !Compile_Time_Known_Value (Type_High_Bound (gnat_entity))))
1541         gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity), gnu_expr, 0);
1542
1543       gnu_type = make_node (INTEGER_TYPE);
1544       TREE_TYPE (gnu_type) = get_unpadded_type (Etype (gnat_entity));
1545
1546       /* This should be an unsigned type if the base type is unsigned or
1547          if the lower bound is constant and non-negative or if the type
1548          is biased.  */
1549       TYPE_UNSIGNED (gnu_type) = (Is_Unsigned_Type (Etype (gnat_entity))
1550                                   || Is_Unsigned_Type (gnat_entity)
1551                                   || Has_Biased_Representation (gnat_entity));
1552
1553       /* Set the precision to the Esize except for bit-packed arrays and
1554          subtypes of Standard.Boolean.  */
1555       if (Is_Packed_Array_Type (gnat_entity)
1556           && Is_Bit_Packed_Array (Original_Array_Type (gnat_entity)))
1557         esize = UI_To_Int (RM_Size (gnat_entity));
1558       else if (Is_Boolean_Type (gnat_entity))
1559         esize = 1;
1560
1561       TYPE_PRECISION (gnu_type) = esize;
1562
1563       TYPE_MIN_VALUE (gnu_type)
1564         = convert (TREE_TYPE (gnu_type),
1565                    elaborate_expression (Type_Low_Bound (gnat_entity),
1566                                          gnat_entity,
1567                                          get_identifier ("L"), definition, 1,
1568                                          Needs_Debug_Info (gnat_entity)));
1569
1570       TYPE_MAX_VALUE (gnu_type)
1571         = convert (TREE_TYPE (gnu_type),
1572                    elaborate_expression (Type_High_Bound (gnat_entity),
1573                                          gnat_entity,
1574                                          get_identifier ("U"), definition, 1,
1575                                          Needs_Debug_Info (gnat_entity)));
1576
1577       /* One of the above calls might have caused us to be elaborated,
1578          so don't blow up if so.  */
1579       if (present_gnu_tree (gnat_entity))
1580         {
1581           maybe_present = true;
1582           break;
1583         }
1584
1585       TYPE_BIASED_REPRESENTATION_P (gnu_type)
1586         = Has_Biased_Representation (gnat_entity);
1587
1588       layout_type (gnu_type);
1589
1590       /* Attach the TYPE_STUB_DECL in case we have a parallel type.  */
1591       TYPE_STUB_DECL (gnu_type)
1592         = create_type_stub_decl (gnu_entity_name, gnu_type);
1593
1594       /* Inherit our alias set from what we're a subtype of.  Subtypes
1595          are not different types and a pointer can designate any instance
1596          within a subtype hierarchy.  */
1597       relate_alias_sets (gnu_type, TREE_TYPE (gnu_type), ALIAS_SET_COPY);
1598
1599       /* For a packed array, make the original array type a parallel type.  */
1600       if (debug_info_p
1601           && Is_Packed_Array_Type (gnat_entity)
1602           && present_gnu_tree (Original_Array_Type (gnat_entity)))
1603         add_parallel_type (TYPE_STUB_DECL (gnu_type),
1604                            gnat_to_gnu_type
1605                            (Original_Array_Type (gnat_entity)));
1606
1607       /* If the type we are dealing with represents a bit-packed array,
1608          we need to have the bits left justified on big-endian targets
1609          and right justified on little-endian targets.  We also need to
1610          ensure that when the value is read (e.g. for comparison of two
1611          such values), we only get the good bits, since the unused bits
1612          are uninitialized.  Both goals are accomplished by wrapping up
1613          the modular type in an enclosing record type.  */
1614       if (Is_Packed_Array_Type (gnat_entity)
1615           && Is_Bit_Packed_Array (Original_Array_Type (gnat_entity)))
1616         {
1617           tree gnu_field_type, gnu_field;
1618
1619           /* Set the RM size before wrapping up the type.  */
1620           TYPE_RM_SIZE (gnu_type)
1621             = UI_To_gnu (RM_Size (gnat_entity), bitsizetype);
1622           TYPE_PACKED_ARRAY_TYPE_P (gnu_type) = 1;
1623           gnu_field_type = gnu_type;
1624
1625           gnu_type = make_node (RECORD_TYPE);
1626           TYPE_NAME (gnu_type) = create_concat_name (gnat_entity, "JM");
1627
1628           /* Propagate the alignment of the modular type to the record.
1629              This means that bit-packed arrays have "ceil" alignment for
1630              their size, which may seem counter-intuitive but makes it
1631              possible to easily overlay them on modular types.  */
1632           TYPE_ALIGN (gnu_type) = TYPE_ALIGN (gnu_field_type);
1633           TYPE_PACKED (gnu_type) = 1;
1634
1635           /* Create a stripped-down declaration of the original type, mainly
1636              for debugging.  */
1637           create_type_decl (gnu_entity_name, gnu_field_type, NULL, true,
1638                             debug_info_p, gnat_entity);
1639
1640           /* Don't notify the field as "addressable", since we won't be taking
1641              it's address and it would prevent create_field_decl from making a
1642              bitfield.  */
1643           gnu_field = create_field_decl (get_identifier ("OBJECT"),
1644                                          gnu_field_type, gnu_type, 1, 0, 0, 0);
1645
1646           /* Do not finalize it until after the parallel type is added.  */
1647           finish_record_type (gnu_type, gnu_field, 0, true);
1648           TYPE_JUSTIFIED_MODULAR_P (gnu_type) = 1;
1649
1650           relate_alias_sets (gnu_type, gnu_field_type, ALIAS_SET_COPY);
1651
1652           /* Make the original array type a parallel type.  */
1653           if (debug_info_p
1654               && present_gnu_tree (Original_Array_Type (gnat_entity)))
1655             add_parallel_type (TYPE_STUB_DECL (gnu_type),
1656                                gnat_to_gnu_type
1657                                (Original_Array_Type (gnat_entity)));
1658
1659           rest_of_record_type_compilation (gnu_type);
1660         }
1661
1662       /* If the type we are dealing with has got a smaller alignment than the
1663          natural one, we need to wrap it up in a record type and under-align
1664          the latter.  We reuse the padding machinery for this purpose.  */
1665       else if (Present (Alignment_Clause (gnat_entity))
1666                && UI_Is_In_Int_Range (Alignment (gnat_entity))
1667                && (align = UI_To_Int (Alignment (gnat_entity)) * BITS_PER_UNIT)
1668                && align < TYPE_ALIGN (gnu_type))
1669         {
1670           tree gnu_field_type, gnu_field;
1671
1672           /* Set the RM size before wrapping up the type.  */
1673           TYPE_RM_SIZE (gnu_type)
1674             = UI_To_gnu (RM_Size (gnat_entity), bitsizetype);
1675           gnu_field_type = gnu_type;
1676
1677           gnu_type = make_node (RECORD_TYPE);
1678           TYPE_NAME (gnu_type) = create_concat_name (gnat_entity, "PAD");
1679
1680           TYPE_ALIGN (gnu_type) = align;
1681           TYPE_PACKED (gnu_type) = 1;
1682
1683           /* Create a stripped-down declaration of the original type, mainly
1684              for debugging.  */
1685           create_type_decl (gnu_entity_name, gnu_field_type, NULL, true,
1686                             debug_info_p, gnat_entity);
1687
1688           /* Don't notify the field as "addressable", since we won't be taking
1689              it's address and it would prevent create_field_decl from making a
1690              bitfield.  */
1691           gnu_field = create_field_decl (get_identifier ("OBJECT"),
1692                                          gnu_field_type, gnu_type, 1, 0, 0, 0);
1693
1694           finish_record_type (gnu_type, gnu_field, 0, false);
1695           TYPE_IS_PADDING_P (gnu_type) = 1;
1696
1697           relate_alias_sets (gnu_type, gnu_field_type, ALIAS_SET_COPY);
1698         }
1699
1700       /* Otherwise reset the alignment lest we computed it above.  */
1701       else
1702         align = 0;
1703
1704       break;
1705
1706     case E_Floating_Point_Type:
1707       /* If this is a VAX floating-point type, use an integer of the proper
1708          size.  All the operations will be handled with ASM statements.  */
1709       if (Vax_Float (gnat_entity))
1710         {
1711           gnu_type = make_signed_type (esize);
1712           TYPE_VAX_FLOATING_POINT_P (gnu_type) = 1;
1713           SET_TYPE_DIGITS_VALUE (gnu_type,
1714                                  UI_To_gnu (Digits_Value (gnat_entity),
1715                                             sizetype));
1716           break;
1717         }
1718
1719       /* The type of the Low and High bounds can be our type if this is
1720          a type from Standard, so set them at the end of the function.  */
1721       gnu_type = make_node (REAL_TYPE);
1722       TYPE_PRECISION (gnu_type) = fp_size_to_prec (esize);
1723       layout_type (gnu_type);
1724       break;
1725
1726     case E_Floating_Point_Subtype:
1727       if (Vax_Float (gnat_entity))
1728         {
1729           gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
1730           break;
1731         }
1732
1733       {
1734         if (!definition
1735             && Present (Ancestor_Subtype (gnat_entity))
1736             && !In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity))
1737             && (!Compile_Time_Known_Value (Type_Low_Bound (gnat_entity))
1738                 || !Compile_Time_Known_Value (Type_High_Bound (gnat_entity))))
1739           gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity),
1740                               gnu_expr, 0);
1741
1742         gnu_type = make_node (REAL_TYPE);
1743         TREE_TYPE (gnu_type) = get_unpadded_type (Etype (gnat_entity));
1744         TYPE_PRECISION (gnu_type) = fp_size_to_prec (esize);
1745
1746         TYPE_MIN_VALUE (gnu_type)
1747           = convert (TREE_TYPE (gnu_type),
1748                      elaborate_expression (Type_Low_Bound (gnat_entity),
1749                                            gnat_entity, get_identifier ("L"),
1750                                            definition, 1,
1751                                            Needs_Debug_Info (gnat_entity)));
1752
1753         TYPE_MAX_VALUE (gnu_type)
1754           = convert (TREE_TYPE (gnu_type),
1755                      elaborate_expression (Type_High_Bound (gnat_entity),
1756                                            gnat_entity, get_identifier ("U"),
1757                                            definition, 1,
1758                                            Needs_Debug_Info (gnat_entity)));
1759
1760         /* One of the above calls might have caused us to be elaborated,
1761            so don't blow up if so.  */
1762         if (present_gnu_tree (gnat_entity))
1763           {
1764             maybe_present = true;
1765             break;
1766           }
1767
1768         layout_type (gnu_type);
1769
1770         /* Inherit our alias set from what we're a subtype of, as for
1771            integer subtypes.  */
1772         relate_alias_sets (gnu_type, TREE_TYPE (gnu_type), ALIAS_SET_COPY);
1773       }
1774     break;
1775
1776       /* Array and String Types and Subtypes
1777
1778          Unconstrained array types are represented by E_Array_Type and
1779          constrained array types are represented by E_Array_Subtype.  There
1780          are no actual objects of an unconstrained array type; all we have
1781          are pointers to that type.
1782
1783          The following fields are defined on array types and subtypes:
1784
1785                 Component_Type     Component type of the array.
1786                 Number_Dimensions  Number of dimensions (an int).
1787                 First_Index        Type of first index.  */
1788
1789     case E_String_Type:
1790     case E_Array_Type:
1791       {
1792         Entity_Id gnat_ind_subtype;
1793         Entity_Id gnat_ind_base_subtype;
1794         int ndim = Number_Dimensions (gnat_entity);
1795         int first_dim
1796           = (Convention (gnat_entity) == Convention_Fortran) ? ndim - 1 : 0;
1797         int next_dim
1798           = (Convention (gnat_entity) == Convention_Fortran) ? - 1 : 1;
1799         int index;
1800         tree gnu_template_fields = NULL_TREE;
1801         tree gnu_template_type = make_node (RECORD_TYPE);
1802         tree gnu_template_reference;
1803         tree gnu_ptr_template = build_pointer_type (gnu_template_type);
1804         tree gnu_fat_type = make_node (RECORD_TYPE);
1805         tree *gnu_index_types = (tree *) alloca (ndim * sizeof (tree));
1806         tree *gnu_temp_fields = (tree *) alloca (ndim * sizeof (tree));
1807         tree gnu_max_size = size_one_node, gnu_max_size_unit;
1808         tree gnu_comp_size, tem;
1809
1810         TYPE_NAME (gnu_template_type)
1811           = create_concat_name (gnat_entity, "XUB");
1812
1813         /* Make a node for the array.  If we are not defining the array
1814            suppress expanding incomplete types.  */
1815         gnu_type = make_node (UNCONSTRAINED_ARRAY_TYPE);
1816
1817         if (!definition)
1818           defer_incomplete_level++, this_deferred = true;
1819
1820         /* Build the fat pointer type.  Use a "void *" object instead of
1821            a pointer to the array type since we don't have the array type
1822            yet (it will reference the fat pointer via the bounds).  */
1823         tem = chainon (chainon (NULL_TREE,
1824                                 create_field_decl (get_identifier ("P_ARRAY"),
1825                                                    ptr_void_type_node,
1826                                                    gnu_fat_type, 0, 0, 0, 0)),
1827                        create_field_decl (get_identifier ("P_BOUNDS"),
1828                                           gnu_ptr_template,
1829                                           gnu_fat_type, 0, 0, 0, 0));
1830
1831         /* Make sure we can put this into a register.  */
1832         TYPE_ALIGN (gnu_fat_type) = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
1833
1834         /* Do not finalize this record type since the types of its fields
1835            are still incomplete at this point.  */
1836         finish_record_type (gnu_fat_type, tem, 0, true);
1837         TYPE_IS_FAT_POINTER_P (gnu_fat_type) = 1;
1838
1839         /* Build a reference to the template from a PLACEHOLDER_EXPR that
1840            is the fat pointer.  This will be used to access the individual
1841            fields once we build them.  */
1842         tem = build3 (COMPONENT_REF, gnu_ptr_template,
1843                       build0 (PLACEHOLDER_EXPR, gnu_fat_type),
1844                       TREE_CHAIN (TYPE_FIELDS (gnu_fat_type)), NULL_TREE);
1845         gnu_template_reference
1846           = build_unary_op (INDIRECT_REF, gnu_template_type, tem);
1847         TREE_READONLY (gnu_template_reference) = 1;
1848
1849         /* Now create the GCC type for each index and add the fields for
1850            that index to the template.  */
1851         for (index = first_dim, gnat_ind_subtype = First_Index (gnat_entity),
1852              gnat_ind_base_subtype
1853                = First_Index (Implementation_Base_Type (gnat_entity));
1854              index < ndim && index >= 0;
1855              index += next_dim,
1856              gnat_ind_subtype = Next_Index (gnat_ind_subtype),
1857              gnat_ind_base_subtype = Next_Index (gnat_ind_base_subtype))
1858           {
1859             char field_name[10];
1860             tree gnu_ind_subtype
1861               = get_unpadded_type (Base_Type (Etype (gnat_ind_subtype)));
1862             tree gnu_base_subtype
1863               = get_unpadded_type (Etype (gnat_ind_base_subtype));
1864             tree gnu_base_min
1865               = convert (sizetype, TYPE_MIN_VALUE (gnu_base_subtype));
1866             tree gnu_base_max
1867               = convert (sizetype, TYPE_MAX_VALUE (gnu_base_subtype));
1868             tree gnu_min_field, gnu_max_field, gnu_min, gnu_max;
1869
1870             /* Make the FIELD_DECLs for the minimum and maximum of this
1871                type and then make extractions of that field from the
1872                template.  */
1873             sprintf (field_name, "LB%d", index);
1874             gnu_min_field = create_field_decl (get_identifier (field_name),
1875                                                gnu_ind_subtype,
1876                                                gnu_template_type, 0, 0, 0, 0);
1877             field_name[0] = 'U';
1878             gnu_max_field = create_field_decl (get_identifier (field_name),
1879                                                gnu_ind_subtype,
1880                                                gnu_template_type, 0, 0, 0, 0);
1881
1882             Sloc_to_locus (Sloc (gnat_entity),
1883                            &DECL_SOURCE_LOCATION (gnu_min_field));
1884             Sloc_to_locus (Sloc (gnat_entity),
1885                            &DECL_SOURCE_LOCATION (gnu_max_field));
1886             gnu_temp_fields[index] = chainon (gnu_min_field, gnu_max_field);
1887
1888             /* We can't use build_component_ref here since the template
1889                type isn't complete yet.  */
1890             gnu_min = build3 (COMPONENT_REF, gnu_ind_subtype,
1891                               gnu_template_reference, gnu_min_field,
1892                               NULL_TREE);
1893             gnu_max = build3 (COMPONENT_REF, gnu_ind_subtype,
1894                               gnu_template_reference, gnu_max_field,
1895                               NULL_TREE);
1896             TREE_READONLY (gnu_min) = TREE_READONLY (gnu_max) = 1;
1897
1898             /* Make a range type with the new ranges, but using
1899                the Ada subtype.  Then we convert to sizetype.  */
1900             gnu_index_types[index]
1901               = create_index_type (convert (sizetype, gnu_min),
1902                                    convert (sizetype, gnu_max),
1903                                    build_range_type (gnu_ind_subtype,
1904                                                      gnu_min, gnu_max),
1905                                    gnat_entity);
1906             /* Update the maximum size of the array, in elements.  */
1907             gnu_max_size
1908               = size_binop (MULT_EXPR, gnu_max_size,
1909                             size_binop (PLUS_EXPR, size_one_node,
1910                                         size_binop (MINUS_EXPR, gnu_base_max,
1911                                                     gnu_base_min)));
1912
1913             TYPE_NAME (gnu_index_types[index])
1914               = create_concat_name (gnat_entity, field_name);
1915           }
1916
1917         for (index = 0; index < ndim; index++)
1918           gnu_template_fields
1919             = chainon (gnu_template_fields, gnu_temp_fields[index]);
1920
1921         /* Install all the fields into the template.  */
1922         finish_record_type (gnu_template_type, gnu_template_fields, 0, false);
1923         TYPE_READONLY (gnu_template_type) = 1;
1924
1925         /* Now make the array of arrays and update the pointer to the array
1926            in the fat pointer.  Note that it is the first field.  */
1927         tem = gnat_to_gnu_type (Component_Type (gnat_entity));
1928
1929         /* Try to get a smaller form of the component if needed.  */
1930         if ((Is_Packed (gnat_entity)
1931              || Has_Component_Size_Clause (gnat_entity))
1932             && !Is_Bit_Packed_Array (gnat_entity)
1933             && !Has_Aliased_Components (gnat_entity)
1934             && !Strict_Alignment (Component_Type (gnat_entity))
1935             && TREE_CODE (tem) == RECORD_TYPE
1936             && !TYPE_IS_FAT_POINTER_P (tem)
1937             && host_integerp (TYPE_SIZE (tem), 1))
1938           tem = make_packable_type (tem, false);
1939
1940         if (Has_Atomic_Components (gnat_entity))
1941           check_ok_for_atomic (tem, gnat_entity, true);
1942
1943         /* Get and validate any specified Component_Size, but if Packed,
1944            ignore it since the front end will have taken care of it.  */
1945         gnu_comp_size
1946           = validate_size (Component_Size (gnat_entity), tem,
1947                            gnat_entity,
1948                            (Is_Bit_Packed_Array (gnat_entity)
1949                             ? TYPE_DECL : VAR_DECL),
1950                            true, Has_Component_Size_Clause (gnat_entity));
1951
1952         /* If the component type is a RECORD_TYPE that has a self-referential
1953            size, use the maximum size.  */
1954         if (!gnu_comp_size
1955             && TREE_CODE (tem) == RECORD_TYPE
1956             && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (tem)))
1957           gnu_comp_size = max_size (TYPE_SIZE (tem), true);
1958
1959         if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity))
1960           {
1961             tree orig_tem = tem;
1962             unsigned int max_align;
1963
1964             /* If an alignment is specified, use it as a cap on the component
1965                type so that it can be honored for the whole type.  But ignore
1966                it for the original type of packed array types.  */
1967             if (No (Packed_Array_Type (gnat_entity))
1968                 && Known_Alignment (gnat_entity))
1969               max_align = validate_alignment (Alignment (gnat_entity),
1970                                               gnat_entity, 0);
1971             else
1972               max_align = 0;
1973
1974             tem = make_type_from_size (tem, gnu_comp_size, false);
1975             if (max_align > 0 && TYPE_ALIGN (tem) > max_align)
1976               tem = orig_tem;
1977             else
1978               orig_tem = tem;
1979
1980             tem = maybe_pad_type (tem, gnu_comp_size, 0, gnat_entity,
1981                                   "C_PAD", false, definition, true);
1982
1983             /* If a padding record was made, declare it now since it will
1984                never be declared otherwise.  This is necessary to ensure
1985                that its subtrees are properly marked.  */
1986             if (tem != orig_tem)
1987               create_type_decl (TYPE_NAME (tem), tem, NULL, true,
1988                                 debug_info_p, gnat_entity);
1989           }
1990
1991         if (Has_Volatile_Components (gnat_entity))
1992           tem = build_qualified_type (tem,
1993                                       TYPE_QUALS (tem) | TYPE_QUAL_VOLATILE);
1994
1995         /* If Component_Size is not already specified, annotate it with the
1996            size of the component.  */
1997         if (Unknown_Component_Size (gnat_entity))
1998           Set_Component_Size (gnat_entity, annotate_value (TYPE_SIZE (tem)));
1999
2000         gnu_max_size_unit = size_binop (MAX_EXPR, size_zero_node,
2001                                         size_binop (MULT_EXPR, gnu_max_size,
2002                                                     TYPE_SIZE_UNIT (tem)));
2003         gnu_max_size = size_binop (MAX_EXPR, bitsize_zero_node,
2004                                    size_binop (MULT_EXPR,
2005                                                convert (bitsizetype,
2006                                                         gnu_max_size),
2007                                                TYPE_SIZE (tem)));
2008
2009         for (index = ndim - 1; index >= 0; index--)
2010           {
2011             tem = build_array_type (tem, gnu_index_types[index]);
2012             TYPE_MULTI_ARRAY_P (tem) = (index > 0);
2013             if (array_type_has_nonaliased_component (gnat_entity, tem))
2014               TYPE_NONALIASED_COMPONENT (tem) = 1;
2015           }
2016
2017         /* If an alignment is specified, use it if valid.  But ignore it
2018            for the original type of packed array types.  If the alignment
2019            was requested with an explicit alignment clause, state so.  */
2020         if (No (Packed_Array_Type (gnat_entity))
2021             && Known_Alignment (gnat_entity))
2022           {
2023             TYPE_ALIGN (tem)
2024               = validate_alignment (Alignment (gnat_entity), gnat_entity,
2025                                     TYPE_ALIGN (tem));
2026             if (Present (Alignment_Clause (gnat_entity)))
2027               TYPE_USER_ALIGN (tem) = 1;
2028           }
2029
2030         TYPE_CONVENTION_FORTRAN_P (tem)
2031           = (Convention (gnat_entity) == Convention_Fortran);
2032         TREE_TYPE (TYPE_FIELDS (gnu_fat_type)) = build_pointer_type (tem);
2033
2034         /* The result type is an UNCONSTRAINED_ARRAY_TYPE that indicates the
2035            corresponding fat pointer.  */
2036         TREE_TYPE (gnu_type) = TYPE_POINTER_TO (gnu_type)
2037           = TYPE_REFERENCE_TO (gnu_type) = gnu_fat_type;
2038         SET_TYPE_MODE (gnu_type, BLKmode);
2039         TYPE_ALIGN (gnu_type) = TYPE_ALIGN (tem);
2040         SET_TYPE_UNCONSTRAINED_ARRAY (gnu_fat_type, gnu_type);
2041
2042         /* If the maximum size doesn't overflow, use it.  */
2043         if (TREE_CODE (gnu_max_size) == INTEGER_CST
2044             && !TREE_OVERFLOW (gnu_max_size))
2045           TYPE_SIZE (tem)
2046             = size_binop (MIN_EXPR, gnu_max_size, TYPE_SIZE (tem));
2047         if (TREE_CODE (gnu_max_size_unit) == INTEGER_CST
2048             && !TREE_OVERFLOW (gnu_max_size_unit))
2049           TYPE_SIZE_UNIT (tem)
2050             = size_binop (MIN_EXPR, gnu_max_size_unit,
2051                           TYPE_SIZE_UNIT (tem));
2052
2053         create_type_decl (create_concat_name (gnat_entity, "XUA"),
2054                           tem, NULL, !Comes_From_Source (gnat_entity),
2055                           debug_info_p, gnat_entity);
2056
2057         /* Give the fat pointer type a name.  */
2058         create_type_decl (create_concat_name (gnat_entity, "XUP"),
2059                           gnu_fat_type, NULL, true,
2060                           debug_info_p, gnat_entity);
2061
2062        /* Create the type to be used as what a thin pointer designates: an
2063           record type for the object and its template with the field offsets
2064           shifted to have the template at a negative offset.  */
2065         tem = build_unc_object_type (gnu_template_type, tem,
2066                                      create_concat_name (gnat_entity, "XUT"));
2067         shift_unc_components_for_thin_pointers (tem);
2068
2069         SET_TYPE_UNCONSTRAINED_ARRAY (tem, gnu_type);
2070         TYPE_OBJECT_RECORD_TYPE (gnu_type) = tem;
2071
2072         /* Give the thin pointer type a name.  */
2073         create_type_decl (create_concat_name (gnat_entity, "XUX"),
2074                           build_pointer_type (tem), NULL, true,
2075                           debug_info_p, gnat_entity);
2076       }
2077       break;
2078
2079     case E_String_Subtype:
2080     case E_Array_Subtype:
2081
2082       /* This is the actual data type for array variables.  Multidimensional
2083          arrays are implemented in the gnu tree as arrays of arrays.  Note
2084          that for the moment arrays which have sparse enumeration subtypes as
2085          index components create sparse arrays, which is obviously space
2086          inefficient but so much easier to code for now.
2087
2088          Also note that the subtype never refers to the unconstrained
2089          array type, which is somewhat at variance with Ada semantics.
2090
2091          First check to see if this is simply a renaming of the array
2092          type.  If so, the result is the array type.  */
2093
2094       gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
2095       if (!Is_Constrained (gnat_entity))
2096         break;
2097       else
2098         {
2099           Entity_Id gnat_ind_subtype;
2100           Entity_Id gnat_ind_base_subtype;
2101           int dim = Number_Dimensions (gnat_entity);
2102           int first_dim
2103             = (Convention (gnat_entity) == Convention_Fortran) ? dim - 1 : 0;
2104           int next_dim
2105             = (Convention (gnat_entity) == Convention_Fortran) ? -1 : 1;
2106           int index;
2107           tree gnu_base_type = gnu_type;
2108           tree *gnu_index_type = (tree *) alloca (dim * sizeof (tree));
2109           tree gnu_max_size = size_one_node, gnu_max_size_unit;
2110           bool need_index_type_struct = false;
2111           bool max_overflow = false;
2112
2113           /* First create the gnu types for each index.  Create types for
2114              debugging information to point to the index types if the
2115              are not integer types, have variable bounds, or are
2116              wider than sizetype.  */
2117
2118           for (index = first_dim, gnat_ind_subtype = First_Index (gnat_entity),
2119                gnat_ind_base_subtype
2120                  = First_Index (Implementation_Base_Type (gnat_entity));
2121                index < dim && index >= 0;
2122                index += next_dim,
2123                gnat_ind_subtype = Next_Index (gnat_ind_subtype),
2124                gnat_ind_base_subtype = Next_Index (gnat_ind_base_subtype))
2125             {
2126               tree gnu_index_subtype
2127                 = get_unpadded_type (Etype (gnat_ind_subtype));
2128               tree gnu_min
2129                 = convert (sizetype, TYPE_MIN_VALUE (gnu_index_subtype));
2130               tree gnu_max
2131                 = convert (sizetype, TYPE_MAX_VALUE (gnu_index_subtype));
2132               tree gnu_base_subtype
2133                 = get_unpadded_type (Etype (gnat_ind_base_subtype));
2134               tree gnu_base_min
2135                 = convert (sizetype, TYPE_MIN_VALUE (gnu_base_subtype));
2136               tree gnu_base_max
2137                 = convert (sizetype, TYPE_MAX_VALUE (gnu_base_subtype));
2138               tree gnu_base_type = get_base_type (gnu_base_subtype);
2139               tree gnu_base_base_min
2140                 = convert (sizetype, TYPE_MIN_VALUE (gnu_base_type));
2141               tree gnu_base_base_max
2142                 = convert (sizetype, TYPE_MAX_VALUE (gnu_base_type));
2143               tree gnu_high;
2144               tree gnu_this_max;
2145
2146               /* If the minimum and maximum values both overflow in
2147                  SIZETYPE, but the difference in the original type
2148                  does not overflow in SIZETYPE, ignore the overflow
2149                  indications.  */
2150               if ((TYPE_PRECISION (gnu_index_subtype)
2151                    > TYPE_PRECISION (sizetype)
2152                    || TYPE_UNSIGNED (gnu_index_subtype)
2153                       != TYPE_UNSIGNED (sizetype))
2154                   && TREE_CODE (gnu_min) == INTEGER_CST
2155                   && TREE_CODE (gnu_max) == INTEGER_CST
2156                   && TREE_OVERFLOW (gnu_min) && TREE_OVERFLOW (gnu_max)
2157                   && !TREE_OVERFLOW
2158                       (fold_build2 (MINUS_EXPR, gnu_index_subtype,
2159                                     TYPE_MAX_VALUE (gnu_index_subtype),
2160                                     TYPE_MIN_VALUE (gnu_index_subtype))))
2161                 {
2162                   TREE_OVERFLOW (gnu_min) = 0;
2163                   TREE_OVERFLOW (gnu_max) = 0;
2164                   if (tree_int_cst_lt (gnu_max, gnu_min))
2165                     {
2166                       gnu_min = size_one_node;
2167                       gnu_max = size_zero_node;
2168                     }
2169                   gnu_high = gnu_max;
2170                 }
2171
2172               /* Similarly, if the range is null, use bounds of 1..0 for
2173                  the sizetype bounds.  */
2174               else if ((TYPE_PRECISION (gnu_index_subtype)
2175                         > TYPE_PRECISION (sizetype)
2176                         || TYPE_UNSIGNED (gnu_index_subtype)
2177                            != TYPE_UNSIGNED (sizetype))
2178                        && TREE_CODE (gnu_min) == INTEGER_CST
2179                        && TREE_CODE (gnu_max) == INTEGER_CST
2180                        && (TREE_OVERFLOW (gnu_min) || TREE_OVERFLOW (gnu_max))
2181                        && tree_int_cst_lt (TYPE_MAX_VALUE (gnu_index_subtype),
2182                                            TYPE_MIN_VALUE (gnu_index_subtype)))
2183                 {
2184                   gnu_min = size_one_node;
2185                   gnu_max = size_zero_node;
2186                   gnu_high = gnu_max;
2187                 }
2188
2189               /* See if the base array type is already flat.  If it is, we
2190                  are probably compiling an ACATS test, but it will cause the
2191                  code below to malfunction if we don't handle it specially.  */
2192               else if (TREE_CODE (gnu_base_min) == INTEGER_CST
2193                        && TREE_CODE (gnu_base_max) == INTEGER_CST
2194                        && !TREE_OVERFLOW (gnu_base_min)
2195                        && !TREE_OVERFLOW (gnu_base_max)
2196                        && tree_int_cst_lt (gnu_base_max, gnu_base_min))
2197                 {
2198                   gnu_min = size_one_node;
2199                   gnu_max = size_zero_node;
2200                   gnu_high = gnu_max;
2201                 }
2202
2203               else
2204                 {
2205                   /* Now compute the size of this bound.  We need to provide
2206                      GCC with an upper bound to use but have to deal with the
2207                      "superflat" case.  There are three ways to do this.  If
2208                      we can prove that the array can never be superflat, we
2209                      can just use the high bound of the index subtype.  If we
2210                      can prove that the low bound minus one can't overflow,
2211                      we can do this as MAX (hb, lb - 1).  Otherwise, we have
2212                      to use the expression hb >= lb ? hb : lb - 1.  */
2213                   gnu_high = size_binop (MINUS_EXPR, gnu_min, size_one_node);
2214
2215                   /* If gnu_high is now an integer which overflowed, the array
2216                      cannot be superflat.  */
2217                   if (TREE_CODE (gnu_high) == INTEGER_CST
2218                       && TREE_OVERFLOW (gnu_high))
2219                     gnu_high = gnu_max;
2220
2221                   /* gnu_high cannot overflow if the subtype is unsigned since
2222                      sizetype is signed, or if it is now a constant that hasn't
2223                      overflowed.  */
2224                   else if (TYPE_UNSIGNED (gnu_base_subtype)
2225                            || TREE_CODE (gnu_high) == INTEGER_CST)
2226                     gnu_high = size_binop (MAX_EXPR, gnu_max, gnu_high);
2227
2228                   else
2229                     gnu_high
2230                       = build_cond_expr (sizetype,
2231                                          build_binary_op (GE_EXPR,
2232                                                           integer_type_node,
2233                                                           gnu_max, gnu_min),
2234                                          gnu_max, gnu_high);
2235                 }
2236
2237               gnu_index_type[index]
2238                 = create_index_type (gnu_min, gnu_high, gnu_index_subtype,
2239                                      gnat_entity);
2240
2241               /* Also compute the maximum size of the array.  Here we
2242                  see if any constraint on the index type of the base type
2243                  can be used in the case of self-referential bound on
2244                  the index type of the subtype.  We look for a non-"infinite"
2245                  and non-self-referential bound from any type involved and
2246                  handle each bound separately.  */
2247
2248               if ((TREE_CODE (gnu_min) == INTEGER_CST
2249                    && !TREE_OVERFLOW (gnu_min)
2250                    && !operand_equal_p (gnu_min, gnu_base_base_min, 0))
2251                   || !CONTAINS_PLACEHOLDER_P (gnu_min)
2252                   || !(TREE_CODE (gnu_base_min) == INTEGER_CST
2253                        && !TREE_OVERFLOW (gnu_base_min)))
2254                 gnu_base_min = gnu_min;
2255
2256               if ((TREE_CODE (gnu_max) == INTEGER_CST
2257                    && !TREE_OVERFLOW (gnu_max)
2258                    && !operand_equal_p (gnu_max, gnu_base_base_max, 0))
2259                   || !CONTAINS_PLACEHOLDER_P (gnu_max)
2260                   || !(TREE_CODE (gnu_base_max) == INTEGER_CST
2261                        && !TREE_OVERFLOW (gnu_base_max)))
2262                 gnu_base_max = gnu_max;
2263
2264               if ((TREE_CODE (gnu_base_min) == INTEGER_CST
2265                    && TREE_OVERFLOW (gnu_base_min))
2266                   || operand_equal_p (gnu_base_min, gnu_base_base_min, 0)
2267                   || (TREE_CODE (gnu_base_max) == INTEGER_CST
2268                       && TREE_OVERFLOW (gnu_base_max))
2269                   || operand_equal_p (gnu_base_max, gnu_base_base_max, 0))
2270                 max_overflow = true;
2271
2272               gnu_base_min = size_binop (MAX_EXPR, gnu_base_min, gnu_min);
2273               gnu_base_max = size_binop (MIN_EXPR, gnu_base_max, gnu_max);
2274
2275               gnu_this_max
2276                 = size_binop (MAX_EXPR,
2277                               size_binop (PLUS_EXPR, size_one_node,
2278                                           size_binop (MINUS_EXPR, gnu_base_max,
2279                                                       gnu_base_min)),
2280                               size_zero_node);
2281
2282               if (TREE_CODE (gnu_this_max) == INTEGER_CST
2283                   && TREE_OVERFLOW (gnu_this_max))
2284                 max_overflow = true;
2285
2286               gnu_max_size
2287                 = size_binop (MULT_EXPR, gnu_max_size, gnu_this_max);
2288
2289               if (!integer_onep (TYPE_MIN_VALUE (gnu_index_subtype))
2290                   || (TREE_CODE (TYPE_MAX_VALUE (gnu_index_subtype))
2291                       != INTEGER_CST)
2292                   || TREE_CODE (gnu_index_subtype) != INTEGER_TYPE
2293                   || (TREE_TYPE (gnu_index_subtype)
2294                       && (TREE_CODE (TREE_TYPE (gnu_index_subtype))
2295                           != INTEGER_TYPE))
2296                   || TYPE_BIASED_REPRESENTATION_P (gnu_index_subtype)
2297                   || (TYPE_PRECISION (gnu_index_subtype)
2298                       > TYPE_PRECISION (sizetype)))
2299                 need_index_type_struct = true;
2300             }
2301
2302           /* Then flatten: create the array of arrays.  For an array type
2303              used to implement a packed array, get the component type from
2304              the original array type since the representation clauses that
2305              can affect it are on the latter.  */
2306           if (Is_Packed_Array_Type (gnat_entity)
2307               && !Is_Bit_Packed_Array (Original_Array_Type (gnat_entity)))
2308             {
2309               gnu_type = gnat_to_gnu_type (Original_Array_Type (gnat_entity));
2310               for (index = dim - 1; index >= 0; index--)
2311                 gnu_type = TREE_TYPE (gnu_type);
2312
2313               /* One of the above calls might have caused us to be elaborated,
2314                  so don't blow up if so.  */
2315               if (present_gnu_tree (gnat_entity))
2316                 {
2317                   maybe_present = true;
2318                   break;
2319                 }
2320             }
2321           else
2322             {
2323               tree gnu_comp_size;
2324
2325               gnu_type = gnat_to_gnu_type (Component_Type (gnat_entity));
2326
2327               /* One of the above calls might have caused us to be elaborated,
2328                  so don't blow up if so.  */
2329               if (present_gnu_tree (gnat_entity))
2330                 {
2331                   maybe_present = true;
2332                   break;
2333                 }
2334
2335               /* Try to get a smaller form of the component if needed.  */
2336               if ((Is_Packed (gnat_entity)
2337                    || Has_Component_Size_Clause (gnat_entity))
2338                   && !Is_Bit_Packed_Array (gnat_entity)
2339                   && !Has_Aliased_Components (gnat_entity)
2340                   && !Strict_Alignment (Component_Type (gnat_entity))
2341                   && TREE_CODE (gnu_type) == RECORD_TYPE
2342                   && !TYPE_IS_FAT_POINTER_P (gnu_type)
2343                   && host_integerp (TYPE_SIZE (gnu_type), 1))
2344                 gnu_type = make_packable_type (gnu_type, false);
2345
2346               /* Get and validate any specified Component_Size, but if Packed,
2347                  ignore it since the front end will have taken care of it.  */
2348               gnu_comp_size
2349                 = validate_size (Component_Size (gnat_entity), gnu_type,
2350                                  gnat_entity,
2351                                  (Is_Bit_Packed_Array (gnat_entity)
2352                                   ? TYPE_DECL : VAR_DECL), true,
2353                                  Has_Component_Size_Clause (gnat_entity));
2354
2355               /* If the component type is a RECORD_TYPE that has a
2356                  self-referential size, use the maximum size.  */
2357               if (!gnu_comp_size
2358                   && TREE_CODE (gnu_type) == RECORD_TYPE
2359                   && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
2360                 gnu_comp_size = max_size (TYPE_SIZE (gnu_type), true);
2361
2362               if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity))
2363                 {
2364                   tree orig_gnu_type = gnu_type;
2365                   unsigned int max_align;
2366
2367                   /* If an alignment is specified, use it as a cap on the
2368                      component type so that it can be honored for the whole
2369                      type.  But ignore it for the original type of packed
2370                      array types.  */
2371                   if (No (Packed_Array_Type (gnat_entity))
2372                       && Known_Alignment (gnat_entity))
2373                     max_align = validate_alignment (Alignment (gnat_entity),
2374                                                     gnat_entity, 0);
2375                   else
2376                     max_align = 0;
2377
2378                   gnu_type
2379                     = make_type_from_size (gnu_type, gnu_comp_size, false);
2380                   if (max_align > 0 && TYPE_ALIGN (gnu_type) > max_align)
2381                     gnu_type = orig_gnu_type;
2382                   else
2383                     orig_gnu_type = gnu_type;
2384
2385                   gnu_type = maybe_pad_type (gnu_type, gnu_comp_size, 0,
2386                                              gnat_entity, "C_PAD", false,
2387                                              definition, true);
2388
2389                   /* If a padding record was made, declare it now since it
2390                      will never be declared otherwise.  This is necessary
2391                      to ensure that its subtrees are properly marked.  */
2392                   if (gnu_type != orig_gnu_type)
2393                     create_type_decl (TYPE_NAME (gnu_type), gnu_type, NULL,
2394                                       true, debug_info_p, gnat_entity);
2395                 }
2396
2397               if (Has_Volatile_Components (Base_Type (gnat_entity)))
2398                 gnu_type = build_qualified_type (gnu_type,
2399                                                  (TYPE_QUALS (gnu_type)
2400                                                   | TYPE_QUAL_VOLATILE));
2401             }
2402
2403           gnu_max_size_unit = size_binop (MULT_EXPR, gnu_max_size,
2404                                           TYPE_SIZE_UNIT (gnu_type));
2405           gnu_max_size = size_binop (MULT_EXPR,
2406                                      convert (bitsizetype, gnu_max_size),
2407                                      TYPE_SIZE (gnu_type));
2408
2409           for (index = dim - 1; index >= 0; index --)
2410             {
2411               gnu_type = build_array_type (gnu_type, gnu_index_type[index]);
2412               TYPE_MULTI_ARRAY_P (gnu_type) = (index > 0);
2413               if (array_type_has_nonaliased_component (gnat_entity, gnu_type))
2414                 TYPE_NONALIASED_COMPONENT (gnu_type) = 1;
2415             }
2416
2417           /* Attach the TYPE_STUB_DECL in case we have a parallel type.  */
2418           TYPE_STUB_DECL (gnu_type)
2419             = create_type_stub_decl (gnu_entity_name, gnu_type);
2420
2421           /* If we are at file level and this is a multi-dimensional array, we
2422              need to make a variable corresponding to the stride of the
2423              inner dimensions.   */
2424           if (global_bindings_p () && dim > 1)
2425             {
2426               tree gnu_str_name = get_identifier ("ST");
2427               tree gnu_arr_type;
2428
2429               for (gnu_arr_type = TREE_TYPE (gnu_type);
2430                    TREE_CODE (gnu_arr_type) == ARRAY_TYPE;
2431                    gnu_arr_type = TREE_TYPE (gnu_arr_type),
2432                    gnu_str_name = concat_name (gnu_str_name, "ST"))
2433                 {
2434                   tree eltype = TREE_TYPE (gnu_arr_type);
2435
2436                   TYPE_SIZE (gnu_arr_type)
2437                     = elaborate_expression_1 (gnat_entity, gnat_entity,
2438                                               TYPE_SIZE (gnu_arr_type),
2439                                               gnu_str_name, definition, 0);
2440
2441                   /* ??? For now, store the size as a multiple of the
2442                      alignment of the element type in bytes so that we
2443                      can see the alignment from the tree.  */
2444                   TYPE_SIZE_UNIT (gnu_arr_type)
2445                     = build_binary_op
2446                       (MULT_EXPR, sizetype,
2447                        elaborate_expression_1
2448                        (gnat_entity, gnat_entity,
2449                         build_binary_op (EXACT_DIV_EXPR, sizetype,
2450                                          TYPE_SIZE_UNIT (gnu_arr_type),
2451                                          size_int (TYPE_ALIGN (eltype)
2452                                                    / BITS_PER_UNIT)),
2453                         concat_name (gnu_str_name, "A_U"), definition, 0),
2454                        size_int (TYPE_ALIGN (eltype) / BITS_PER_UNIT));
2455
2456                   /* ??? create_type_decl is not invoked on the inner types so
2457                      the MULT_EXPR node built above will never be marked.  */
2458                   mark_visited (&TYPE_SIZE_UNIT (gnu_arr_type));
2459                 }
2460             }
2461
2462           /* If we need to write out a record type giving the names of the
2463              bounds for debugging purposes, do it now and make the record
2464              type a parallel type.  This is not needed for a packed array
2465              since the bounds are conveyed by the original array type.  */
2466           if (need_index_type_struct
2467               && debug_info_p
2468               && !Is_Packed_Array_Type (gnat_entity))
2469             {
2470               tree gnu_bound_rec = make_node (RECORD_TYPE);
2471               tree gnu_field_list = NULL_TREE;
2472               tree gnu_field;
2473
2474               TYPE_NAME (gnu_bound_rec)
2475                 = create_concat_name (gnat_entity, "XA");
2476
2477               for (index = dim - 1; index >= 0; index--)
2478                 {
2479                   tree gnu_index = TYPE_INDEX_TYPE (gnu_index_type[index]);
2480                   tree gnu_index_name = TYPE_NAME (gnu_index);
2481
2482                   if (TREE_CODE (gnu_index_name) == TYPE_DECL)
2483                     gnu_index_name = DECL_NAME (gnu_index_name);
2484
2485                   /* Make sure to reference the types themselves, and not just
2486                      their names, as the debugger may fall back on them.  */
2487                   gnu_field = create_field_decl (gnu_index_name, gnu_index,
2488                                                  gnu_bound_rec,
2489                                                  0, NULL_TREE, NULL_TREE, 0);
2490                   TREE_CHAIN (gnu_field) = gnu_field_list;
2491                   gnu_field_list = gnu_field;
2492                 }
2493
2494               finish_record_type (gnu_bound_rec, gnu_field_list, 0, false);
2495               add_parallel_type (TYPE_STUB_DECL (gnu_type), gnu_bound_rec);
2496             }
2497
2498           /* Otherwise, for a packed array, make the original array type a
2499              parallel type.  */
2500           else if (debug_info_p
2501                    && Is_Packed_Array_Type (gnat_entity)
2502                    && present_gnu_tree (Original_Array_Type (gnat_entity)))
2503             add_parallel_type (TYPE_STUB_DECL (gnu_type),
2504                                gnat_to_gnu_type
2505                                (Original_Array_Type (gnat_entity)));
2506
2507           TYPE_CONVENTION_FORTRAN_P (gnu_type)
2508             = (Convention (gnat_entity) == Convention_Fortran);
2509           TYPE_PACKED_ARRAY_TYPE_P (gnu_type)
2510             = (Is_Packed_Array_Type (gnat_entity)
2511                && Is_Bit_Packed_Array (Original_Array_Type (gnat_entity)));
2512
2513           /* If our size depends on a placeholder and the maximum size doesn't
2514              overflow, use it.  */
2515           if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
2516               && !(TREE_CODE (gnu_max_size) == INTEGER_CST
2517                    && TREE_OVERFLOW (gnu_max_size))
2518               && !(TREE_CODE (gnu_max_size_unit) == INTEGER_CST
2519                    && TREE_OVERFLOW (gnu_max_size_unit))
2520               && !max_overflow)
2521             {
2522               TYPE_SIZE (gnu_type) = size_binop (MIN_EXPR, gnu_max_size,
2523                                                  TYPE_SIZE (gnu_type));
2524               TYPE_SIZE_UNIT (gnu_type)
2525                 = size_binop (MIN_EXPR, gnu_max_size_unit,
2526                               TYPE_SIZE_UNIT (gnu_type));
2527             }
2528
2529           /* Set our alias set to that of our base type.  This gives all
2530              array subtypes the same alias set.  */
2531           relate_alias_sets (gnu_type, gnu_base_type, ALIAS_SET_COPY);
2532         }
2533
2534       /* If this is a packed type, make this type the same as the packed
2535          array type, but do some adjusting in the type first.  */
2536       if (Present (Packed_Array_Type (gnat_entity)))
2537         {
2538           Entity_Id gnat_index;
2539           tree gnu_inner_type;
2540
2541           /* First finish the type we had been making so that we output
2542              debugging information for it.  */
2543           gnu_type
2544             = build_qualified_type (gnu_type,
2545                                     (TYPE_QUALS (gnu_type)
2546                                      | (TYPE_QUAL_VOLATILE
2547                                         * Treat_As_Volatile (gnat_entity))));
2548
2549           gnu_decl
2550             = create_type_decl (gnu_entity_name, gnu_type, attr_list,
2551                                 !Comes_From_Source (gnat_entity),
2552                                 debug_info_p, gnat_entity);
2553
2554           /* Save it as our equivalent in case the call below elaborates
2555              this type again.  */
2556           save_gnu_tree (gnat_entity, gnu_decl, false);
2557
2558           gnu_decl = gnat_to_gnu_entity (Packed_Array_Type (gnat_entity),
2559                                          NULL_TREE, 0);
2560           this_made_decl = true;
2561           gnu_type = TREE_TYPE (gnu_decl);
2562           save_gnu_tree (gnat_entity, NULL_TREE, false);
2563
2564           gnu_inner_type = gnu_type;
2565           while (TREE_CODE (gnu_inner_type) == RECORD_TYPE
2566                  && (TYPE_JUSTIFIED_MODULAR_P (gnu_inner_type)
2567                      || TYPE_IS_PADDING_P (gnu_inner_type)))
2568             gnu_inner_type = TREE_TYPE (TYPE_FIELDS (gnu_inner_type));
2569
2570           /* We need to attach the index type to the type we just made so
2571              that the actual bounds can later be put into a template.  */
2572           if ((TREE_CODE (gnu_inner_type) == ARRAY_TYPE
2573                && !TYPE_ACTUAL_BOUNDS (gnu_inner_type))
2574               || (TREE_CODE (gnu_inner_type) == INTEGER_TYPE
2575                   && !TYPE_HAS_ACTUAL_BOUNDS_P (gnu_inner_type)))
2576             {
2577               if (TREE_CODE (gnu_inner_type) == INTEGER_TYPE)
2578                 {
2579                   /* The TYPE_ACTUAL_BOUNDS field is overloaded with the
2580                      TYPE_MODULUS for modular types so we make an extra
2581                      subtype if necessary.  */
2582                   if (TYPE_MODULAR_P (gnu_inner_type))
2583                     {
2584                       tree gnu_subtype = make_node (INTEGER_TYPE);
2585                       TREE_TYPE (gnu_subtype) = gnu_inner_type;
2586                       TYPE_EXTRA_SUBTYPE_P (gnu_subtype) = 1;
2587
2588                       TYPE_UNSIGNED (gnu_subtype) = 1;
2589                       TYPE_PRECISION (gnu_subtype)
2590                         = TYPE_PRECISION (gnu_inner_type);
2591                       TYPE_MIN_VALUE (gnu_subtype)
2592                         = TYPE_MIN_VALUE (gnu_inner_type);
2593                       TYPE_MAX_VALUE (gnu_subtype)
2594                         = TYPE_MAX_VALUE (gnu_inner_type);
2595                       layout_type (gnu_subtype);
2596
2597                       gnu_inner_type = gnu_subtype;
2598                     }
2599
2600                   TYPE_HAS_ACTUAL_BOUNDS_P (gnu_inner_type) = 1;
2601
2602 #ifdef ENABLE_CHECKING
2603                   /* Check for other cases of overloading.  */
2604                   gcc_assert (!TYPE_ACTUAL_BOUNDS (gnu_inner_type));
2605 #endif
2606                 }
2607
2608               /* ??? This is necessary to make sure that the container is
2609                  allocated with a null tree upfront; otherwise, it could
2610                  be allocated with an uninitialized tree that is accessed
2611                  before being set below.  See ada-tree.h for details.  */
2612               SET_TYPE_ACTUAL_BOUNDS (gnu_inner_type, NULL_TREE);
2613
2614               for (gnat_index = First_Index (gnat_entity);
2615                    Present (gnat_index); gnat_index = Next_Index (gnat_index))
2616                 SET_TYPE_ACTUAL_BOUNDS
2617                   (gnu_inner_type,
2618                    tree_cons (NULL_TREE,
2619                               get_unpadded_type (Etype (gnat_index)),
2620                               TYPE_ACTUAL_BOUNDS (gnu_inner_type)));
2621
2622               if (Convention (gnat_entity) != Convention_Fortran)
2623                 SET_TYPE_ACTUAL_BOUNDS
2624                   (gnu_inner_type,
2625                    nreverse (TYPE_ACTUAL_BOUNDS (gnu_inner_type)));
2626
2627               if (TREE_CODE (gnu_type) == RECORD_TYPE
2628                   && TYPE_JUSTIFIED_MODULAR_P (gnu_type))
2629                 TREE_TYPE (TYPE_FIELDS (gnu_type)) = gnu_inner_type;
2630             }
2631         }
2632
2633       /* Abort if packed array with no packed array type field set.  */
2634       else
2635         gcc_assert (!Is_Packed (gnat_entity));
2636
2637       break;
2638
2639     case E_String_Literal_Subtype:
2640       /* Create the type for a string literal.  */
2641       {
2642         Entity_Id gnat_full_type
2643           = (IN (Ekind (Etype (gnat_entity)), Private_Kind)
2644              && Present (Full_View (Etype (gnat_entity)))
2645              ? Full_View (Etype (gnat_entity)) : Etype (gnat_entity));
2646         tree gnu_string_type = get_unpadded_type (gnat_full_type);
2647         tree gnu_string_array_type
2648           = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_string_type))));
2649         tree gnu_string_index_type
2650           = get_base_type (TREE_TYPE (TYPE_INDEX_TYPE
2651                                       (TYPE_DOMAIN (gnu_string_array_type))));
2652         tree gnu_lower_bound
2653           = convert (gnu_string_index_type,
2654                      gnat_to_gnu (String_Literal_Low_Bound (gnat_entity)));
2655         int length = UI_To_Int (String_Literal_Length (gnat_entity));
2656         tree gnu_length = ssize_int (length - 1);
2657         tree gnu_upper_bound
2658           = build_binary_op (PLUS_EXPR, gnu_string_index_type,
2659                              gnu_lower_bound,
2660                              convert (gnu_string_index_type, gnu_length));
2661         tree gnu_index_type
2662           = create_index_type (convert (sizetype, gnu_lower_bound),
2663                                convert (sizetype, gnu_upper_bound),
2664                                build_range_type (gnu_string_index_type,
2665                                                  gnu_lower_bound,
2666                                                  gnu_upper_bound),
2667                                gnat_entity);
2668
2669         gnu_type
2670           = build_array_type (gnat_to_gnu_type (Component_Type (gnat_entity)),
2671                               gnu_index_type);
2672         if (array_type_has_nonaliased_component (gnat_entity, gnu_type))
2673           TYPE_NONALIASED_COMPONENT (gnu_type) = 1;
2674         relate_alias_sets (gnu_type, gnu_string_type, ALIAS_SET_COPY);
2675       }
2676       break;
2677
2678     /* Record Types and Subtypes
2679
2680        The following fields are defined on record types:
2681
2682                 Has_Discriminants       True if the record has discriminants
2683                 First_Discriminant      Points to head of list of discriminants
2684                 First_Entity            Points to head of list of fields
2685                 Is_Tagged_Type          True if the record is tagged
2686
2687        Implementation of Ada records and discriminated records:
2688
2689        A record type definition is transformed into the equivalent of a C
2690        struct definition.  The fields that are the discriminants which are
2691        found in the Full_Type_Declaration node and the elements of the
2692        Component_List found in the Record_Type_Definition node.  The
2693        Component_List can be a recursive structure since each Variant of
2694        the Variant_Part of the Component_List has a Component_List.
2695
2696        Processing of a record type definition comprises starting the list of
2697        field declarations here from the discriminants and the calling the
2698        function components_to_record to add the rest of the fields from the
2699        component list and return the gnu type node.  The function
2700        components_to_record will call itself recursively as it traverses
2701        the tree.  */
2702
2703     case E_Record_Type:
2704       if (Has_Complex_Representation (gnat_entity))
2705         {
2706           gnu_type
2707             = build_complex_type
2708               (get_unpadded_type
2709                (Etype (Defining_Entity
2710                        (First (Component_Items
2711                                (Component_List
2712                                 (Type_Definition
2713                                  (Declaration_Node (gnat_entity)))))))));
2714
2715           break;
2716         }
2717
2718       {
2719         Node_Id full_definition = Declaration_Node (gnat_entity);
2720         Node_Id record_definition = Type_Definition (full_definition);
2721         Entity_Id gnat_field;
2722         tree gnu_field;
2723         tree gnu_field_list = NULL_TREE;
2724         tree gnu_get_parent;
2725         /* Set PACKED in keeping with gnat_to_gnu_field.  */
2726         int packed
2727           = Is_Packed (gnat_entity)
2728             ? 1
2729             : Component_Alignment (gnat_entity) == Calign_Storage_Unit
2730               ? -1
2731               : (Known_Alignment (gnat_entity)
2732                  || (Strict_Alignment (gnat_entity)
2733                      && Known_Static_Esize (gnat_entity)))
2734                 ? -2
2735                 : 0;
2736         bool has_rep = Has_Specified_Layout (gnat_entity);
2737         bool all_rep = has_rep;
2738         bool is_extension
2739           = (Is_Tagged_Type (gnat_entity)
2740              && Nkind (record_definition) == N_Derived_Type_Definition);
2741
2742         /* See if all fields have a rep clause.  Stop when we find one
2743            that doesn't.  */
2744         for (gnat_field = First_Entity (gnat_entity);
2745              Present (gnat_field) && all_rep;
2746              gnat_field = Next_Entity (gnat_field))
2747           if ((Ekind (gnat_field) == E_Component
2748                || Ekind (gnat_field) == E_Discriminant)
2749               && No (Component_Clause (gnat_field)))
2750             all_rep = false;
2751
2752         /* If this is a record extension, go a level further to find the
2753            record definition.  Also, verify we have a Parent_Subtype.  */
2754         if (is_extension)
2755           {
2756             if (!type_annotate_only
2757                 || Present (Record_Extension_Part (record_definition)))
2758               record_definition = Record_Extension_Part (record_definition);
2759
2760             gcc_assert (type_annotate_only
2761                         || Present (Parent_Subtype (gnat_entity)));
2762           }
2763
2764         /* Make a node for the record.  If we are not defining the record,
2765            suppress expanding incomplete types.  */
2766         gnu_type = make_node (tree_code_for_record_type (gnat_entity));
2767         TYPE_NAME (gnu_type) = gnu_entity_name;
2768         TYPE_PACKED (gnu_type) = (packed != 0) || has_rep;
2769
2770         if (!definition)
2771           defer_incomplete_level++, this_deferred = true;
2772
2773         /* If both a size and rep clause was specified, put the size in
2774            the record type now so that it can get the proper mode.  */
2775         if (has_rep && Known_Esize (gnat_entity))
2776           TYPE_SIZE (gnu_type) = UI_To_gnu (Esize (gnat_entity), sizetype);
2777
2778         /* Always set the alignment here so that it can be used to
2779            set the mode, if it is making the alignment stricter.  If
2780            it is invalid, it will be checked again below.  If this is to
2781            be Atomic, choose a default alignment of a word unless we know
2782            the size and it's smaller.  */
2783         if (Known_Alignment (gnat_entity))
2784           TYPE_ALIGN (gnu_type)
2785             = validate_alignment (Alignment (gnat_entity), gnat_entity, 0);
2786         else if (Is_Atomic (gnat_entity))
2787           TYPE_ALIGN (gnu_type)
2788             = esize >= BITS_PER_WORD ? BITS_PER_WORD : ceil_alignment (esize);
2789         /* If a type needs strict alignment, the minimum size will be the
2790            type size instead of the RM size (see validate_size).  Cap the
2791            alignment, lest it causes this type size to become too large.  */
2792         else if (Strict_Alignment (gnat_entity)
2793                  && Known_Static_Esize (gnat_entity))
2794           {
2795             unsigned int raw_size = UI_To_Int (Esize (gnat_entity));
2796             unsigned int raw_align = raw_size & -raw_size;
2797             if (raw_align < BIGGEST_ALIGNMENT)
2798               TYPE_ALIGN (gnu_type) = raw_align;
2799           }
2800         else
2801           TYPE_ALIGN (gnu_type) = 0;
2802
2803         /* If we have a Parent_Subtype, make a field for the parent.  If
2804            this record has rep clauses, force the position to zero.  */
2805         if (Present (Parent_Subtype (gnat_entity)))
2806           {
2807             Entity_Id gnat_parent = Parent_Subtype (gnat_entity);
2808             tree gnu_parent;
2809
2810             /* A major complexity here is that the parent subtype will
2811                reference our discriminants in its Discriminant_Constraint
2812                list.  But those must reference the parent component of this
2813                record which is of the parent subtype we have not built yet!
2814                To break the circle we first build a dummy COMPONENT_REF which
2815                represents the "get to the parent" operation and initialize
2816                each of those discriminants to a COMPONENT_REF of the above
2817                dummy parent referencing the corresponding discriminant of the
2818                base type of the parent subtype.  */
2819             gnu_get_parent = build3 (COMPONENT_REF, void_type_node,
2820                                      build0 (PLACEHOLDER_EXPR, gnu_type),
2821                                      build_decl (FIELD_DECL, NULL_TREE,
2822                                                  void_type_node),
2823                                      NULL_TREE);
2824
2825             if (Has_Discriminants (gnat_entity))
2826               for (gnat_field = First_Stored_Discriminant (gnat_entity);
2827                    Present (gnat_field);
2828                    gnat_field = Next_Stored_Discriminant (gnat_field))
2829                 if (Present (Corresponding_Discriminant (gnat_field)))
2830                   save_gnu_tree
2831                     (gnat_field,
2832                      build3 (COMPONENT_REF,
2833                              get_unpadded_type (Etype (gnat_field)),
2834                              gnu_get_parent,
2835                              gnat_to_gnu_field_decl (Corresponding_Discriminant
2836                                                      (gnat_field)),
2837                              NULL_TREE),
2838                      true);
2839
2840             /* Then we build the parent subtype.  If it has discriminants but
2841                the type itself has unknown discriminants, this means that it
2842                doesn't contain information about how the discriminants are
2843                derived from those of the ancestor type, so it cannot be used
2844                directly.  Instead it is built by cloning the parent subtype
2845                of the underlying record view of the type, for which the above
2846                derivation of discriminants has been made explicit.  */
2847             if (Has_Discriminants (gnat_parent)
2848                 && Has_Unknown_Discriminants (gnat_entity))
2849               {
2850                 Entity_Id gnat_uview = Underlying_Record_View (gnat_entity);
2851
2852                 /* If we are defining the type, the underlying record
2853                    view must already have been elaborated at this point.
2854                    Otherwise do it now as its parent subtype cannot be
2855                    technically elaborated on its own.  */
2856                 if (definition)
2857                   gcc_assert (present_gnu_tree (gnat_uview));
2858                 else
2859                   gnat_to_gnu_entity (gnat_uview, NULL_TREE, 0);
2860
2861                 gnu_parent = gnat_to_gnu_type (Parent_Subtype (gnat_uview));
2862
2863                 /* Substitute the "get to the parent" of the type for that
2864                    of its underlying record view in the cloned type.  */
2865                 for (gnat_field = First_Stored_Discriminant (gnat_uview);
2866                      Present (gnat_field);
2867                      gnat_field = Next_Stored_Discriminant (gnat_field))
2868                   if (Present (Corresponding_Discriminant (gnat_field)))
2869                     {
2870                       tree gnu_field = gnat_to_gnu_field_decl (gnat_field);
2871                       tree gnu_ref
2872                         = build3 (COMPONENT_REF, TREE_TYPE (gnu_field),
2873                                   gnu_get_parent, gnu_field, NULL_TREE);
2874                       gnu_parent
2875                         = substitute_in_type (gnu_parent, gnu_field, gnu_ref);
2876                     }
2877               }
2878             else
2879               gnu_parent = gnat_to_gnu_type (gnat_parent);
2880
2881             /* Finally we fix up both kinds of twisted COMPONENT_REF we have
2882                initially built.  The discriminants must reference the fields
2883                of the parent subtype and not those of its base type for the
2884                placeholder machinery to properly work.  */
2885             if (Has_Discriminants (gnat_entity))
2886               for (gnat_field = First_Stored_Discriminant (gnat_entity);
2887                    Present (gnat_field);
2888                    gnat_field = Next_Stored_Discriminant (gnat_field))
2889                 if (Present (Corresponding_Discriminant (gnat_field)))
2890                   {
2891                     Entity_Id field = Empty;
2892                     for (field = First_Stored_Discriminant (gnat_parent);
2893                          Present (field);
2894                          field = Next_Stored_Discriminant (field))
2895                       if (same_discriminant_p (gnat_field, field))
2896                         break;
2897                     gcc_assert (Present (field));
2898                     TREE_OPERAND (get_gnu_tree (gnat_field), 1)
2899                       = gnat_to_gnu_field_decl (field);
2900                   }
2901
2902             /* The "get to the parent" COMPONENT_REF must be given its
2903                proper type...  */
2904             TREE_TYPE (gnu_get_parent) = gnu_parent;
2905
2906             /* ...and reference the _parent field of this record.  */
2907             gnu_field_list
2908               = create_field_decl (get_identifier
2909                                    (Get_Name_String (Name_uParent)),
2910                                    gnu_parent, gnu_type, 0,
2911                                    has_rep ? TYPE_SIZE (gnu_parent) : 0,
2912                                    has_rep ? bitsize_zero_node : 0, 1);
2913             DECL_INTERNAL_P (gnu_field_list) = 1;
2914             TREE_OPERAND (gnu_get_parent, 1) = gnu_field_list;
2915           }
2916
2917         /* Make the fields for the discriminants and put them into the record
2918            unless it's an Unchecked_Union.  */
2919         if (Has_Discriminants (gnat_entity))
2920           for (gnat_field = First_Stored_Discriminant (gnat_entity);
2921                Present (gnat_field);
2922                gnat_field = Next_Stored_Discriminant (gnat_field))
2923             {
2924               /* If this is a record extension and this discriminant
2925                  is the renaming of another discriminant, we've already
2926                  handled the discriminant above.  */
2927               if (Present (Parent_Subtype (gnat_entity))
2928                   && Present (Corresponding_Discriminant (gnat_field)))
2929                 continue;
2930
2931               gnu_field
2932                 = gnat_to_gnu_field (gnat_field, gnu_type, packed, definition);
2933
2934               /* Make an expression using a PLACEHOLDER_EXPR from the
2935                  FIELD_DECL node just created and link that with the
2936                  corresponding GNAT defining identifier.  Then add to the
2937                  list of fields.  */
2938               save_gnu_tree (gnat_field,
2939                              build3 (COMPONENT_REF, TREE_TYPE (gnu_field),
2940                                      build0 (PLACEHOLDER_EXPR,
2941                                              DECL_CONTEXT (gnu_field)),
2942                                      gnu_field, NULL_TREE),
2943                              true);
2944
2945               if (!Is_Unchecked_Union (gnat_entity))
2946                 {
2947                   TREE_CHAIN (gnu_field) = gnu_field_list;
2948                   gnu_field_list = gnu_field;
2949                 }
2950             }
2951
2952         /* Put the discriminants into the record (backwards), so we can
2953            know the appropriate discriminant to use for the names of the
2954            variants.  */
2955         TYPE_FIELDS (gnu_type) = gnu_field_list;
2956
2957         /* Add the listed fields into the record and finish it up.  */
2958         components_to_record (gnu_type, Component_List (record_definition),
2959                               gnu_field_list, packed, definition, NULL,
2960                               false, all_rep, false,
2961                               Is_Unchecked_Union (gnat_entity));
2962
2963         /* We used to remove the associations of the discriminants and
2964            _Parent for validity checking, but we may need them if there's
2965            Freeze_Node for a subtype used in this record.  */
2966         TYPE_VOLATILE (gnu_type) = Treat_As_Volatile (gnat_entity);
2967         TYPE_BY_REFERENCE_P (gnu_type) = Is_By_Reference_Type (gnat_entity);
2968
2969         /* If it is a tagged record force the type to BLKmode to insure
2970            that these objects will always be placed in memory.  Do the
2971            same thing for limited record types.  */
2972         if (Is_Tagged_Type (gnat_entity) || Is_Limited_Record (gnat_entity))
2973           SET_TYPE_MODE (gnu_type, BLKmode);
2974
2975         /* Fill in locations of fields.  */
2976         annotate_rep (gnat_entity, gnu_type);
2977
2978         /* If there are any entities in the chain corresponding to
2979            components that we did not elaborate, ensure we elaborate their
2980            types if they are Itypes.  */
2981         for (gnat_temp = First_Entity (gnat_entity);
2982              Present (gnat_temp); gnat_temp = Next_Entity (gnat_temp))
2983           if ((Ekind (gnat_temp) == E_Component
2984                || Ekind (gnat_temp) == E_Discriminant)
2985               && Is_Itype (Etype (gnat_temp))
2986               && !present_gnu_tree (gnat_temp))
2987             gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
2988       }
2989       break;
2990
2991     case E_Class_Wide_Subtype:
2992       /* If an equivalent type is present, that is what we should use.
2993          Otherwise, fall through to handle this like a record subtype
2994          since it may have constraints.  */
2995       if (gnat_equiv_type != gnat_entity)
2996         {
2997           gnu_decl = gnat_to_gnu_entity (gnat_equiv_type, NULL_TREE, 0);
2998           maybe_present = true;
2999           break;
3000         }
3001
3002       /* ... fall through ... */
3003
3004     case E_Record_Subtype:
3005
3006       /* If Cloned_Subtype is Present it means this record subtype has
3007          identical layout to that type or subtype and we should use
3008          that GCC type for this one.  The front end guarantees that
3009          the component list is shared.  */
3010       if (Present (Cloned_Subtype (gnat_entity)))
3011         {
3012           gnu_decl = gnat_to_gnu_entity (Cloned_Subtype (gnat_entity),
3013                                          NULL_TREE, 0);
3014           maybe_present = true;
3015         }
3016
3017       /* Otherwise, first ensure the base type is elaborated.  Then, if we are
3018          changing the type, make a new type with each field having the
3019          type of the field in the new subtype but having the position
3020          computed by transforming every discriminant reference according
3021          to the constraints.  We don't see any difference between
3022          private and nonprivate type here since derivations from types should
3023          have been deferred until the completion of the private type.  */
3024       else
3025         {
3026           Entity_Id gnat_base_type = Implementation_Base_Type (gnat_entity);
3027           tree gnu_base_type;
3028           tree gnu_orig_type;
3029
3030           if (!definition)
3031             defer_incomplete_level++, this_deferred = true;
3032
3033           /* Get the base type initially for its alignment and sizes.  But
3034              if it is a padded type, we do all the other work with the
3035              unpadded type.  */
3036           gnu_base_type = gnat_to_gnu_type (gnat_base_type);
3037
3038           if (TREE_CODE (gnu_base_type) == RECORD_TYPE
3039               && TYPE_IS_PADDING_P (gnu_base_type))
3040             gnu_type = gnu_orig_type = TREE_TYPE (TYPE_FIELDS (gnu_base_type));
3041           else
3042             gnu_type = gnu_orig_type = gnu_base_type;
3043
3044           if (present_gnu_tree (gnat_entity))
3045             {
3046               maybe_present = true;
3047               break;
3048             }
3049
3050           /* When the type has discriminants, and these discriminants
3051              affect the shape of what it built, factor them in.
3052
3053              If we are making a subtype of an Unchecked_Union (must be an
3054              Itype), just return the type.
3055
3056              We can't just use Is_Constrained because private subtypes without
3057              discriminants of full types with discriminants with default
3058              expressions are Is_Constrained but aren't constrained!  */
3059
3060           if (IN (Ekind (gnat_base_type), Record_Kind)
3061               && !Is_For_Access_Subtype (gnat_entity)
3062               && !Is_Unchecked_Union (gnat_base_type)
3063               && Is_Constrained (gnat_entity)
3064               && Stored_Constraint (gnat_entity) != No_Elist
3065               && Present (Discriminant_Constraint (gnat_entity)))
3066             {
3067               Entity_Id gnat_field;
3068               tree gnu_field_list = 0;
3069               tree gnu_pos_list
3070                 = compute_field_positions (gnu_orig_type, NULL_TREE,
3071                                            size_zero_node, bitsize_zero_node,
3072                                            BIGGEST_ALIGNMENT);
3073               tree gnu_subst_list
3074                 = substitution_list (gnat_entity, gnat_base_type, NULL_TREE,
3075                                      definition);
3076               tree gnu_temp;
3077
3078               gnu_type = make_node (RECORD_TYPE);
3079               TYPE_NAME (gnu_type) = gnu_entity_name;
3080               TYPE_VOLATILE (gnu_type) = Treat_As_Volatile (gnat_entity);
3081
3082               /* Set the size, alignment and alias set of the new type to
3083                  match that of the old one, doing required substitutions.
3084                  We do it this early because we need the size of the new
3085                  type below to discard old fields if necessary.  */
3086               TYPE_SIZE (gnu_type) = TYPE_SIZE (gnu_base_type);
3087               TYPE_SIZE_UNIT (gnu_type) = TYPE_SIZE_UNIT (gnu_base_type);
3088               SET_TYPE_ADA_SIZE (gnu_type, TYPE_ADA_SIZE (gnu_base_type));
3089               TYPE_ALIGN (gnu_type) = TYPE_ALIGN (gnu_base_type);
3090               relate_alias_sets (gnu_type, gnu_base_type, ALIAS_SET_COPY);
3091
3092               if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
3093                 for (gnu_temp = gnu_subst_list;
3094                      gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
3095                   TYPE_SIZE (gnu_type)
3096                     = substitute_in_expr (TYPE_SIZE (gnu_type),
3097                                           TREE_PURPOSE (gnu_temp),
3098                                           TREE_VALUE (gnu_temp));
3099
3100               if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE_UNIT (gnu_type)))
3101                 for (gnu_temp = gnu_subst_list;
3102                      gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
3103                   TYPE_SIZE_UNIT (gnu_type)
3104                     = substitute_in_expr (TYPE_SIZE_UNIT (gnu_type),
3105                                           TREE_PURPOSE (gnu_temp),
3106                                           TREE_VALUE (gnu_temp));
3107
3108               if (CONTAINS_PLACEHOLDER_P (TYPE_ADA_SIZE (gnu_type)))
3109                 for (gnu_temp = gnu_subst_list;
3110                      gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
3111                   SET_TYPE_ADA_SIZE
3112                     (gnu_type, substitute_in_expr (TYPE_ADA_SIZE (gnu_type),
3113                                                    TREE_PURPOSE (gnu_temp),
3114                                                    TREE_VALUE (gnu_temp)));
3115
3116               for (gnat_field = First_Entity (gnat_entity);
3117                    Present (gnat_field); gnat_field = Next_Entity (gnat_field))
3118                 if ((Ekind (gnat_field) == E_Component
3119                      || Ekind (gnat_field) == E_Discriminant)
3120                     && (Underlying_Type (Scope (Original_Record_Component
3121                                                 (gnat_field)))
3122                         == gnat_base_type)
3123                     && (No (Corresponding_Discriminant (gnat_field))
3124                         || !Is_Tagged_Type (gnat_base_type)))
3125                   {
3126                     tree gnu_old_field
3127                       = gnat_to_gnu_field_decl (Original_Record_Component
3128                                                 (gnat_field));
3129                     tree gnu_offset
3130                       = TREE_VALUE (purpose_member (gnu_old_field,
3131                                                     gnu_pos_list));
3132                     tree gnu_pos = TREE_PURPOSE (gnu_offset);
3133                     tree gnu_bitpos = TREE_VALUE (TREE_VALUE (gnu_offset));
3134                     tree gnu_field_type
3135                       = gnat_to_gnu_type (Etype (gnat_field));
3136                     tree gnu_size = TYPE_SIZE (gnu_field_type);
3137                     tree gnu_new_pos = NULL_TREE;
3138                     unsigned int offset_align
3139                       = tree_low_cst (TREE_PURPOSE (TREE_VALUE (gnu_offset)),
3140                                       1);
3141                     tree gnu_field;
3142
3143                     /* If there was a component clause, the field types must be
3144                        the same for the type and subtype, so copy the data from
3145                        the old field to avoid recomputation here.  Also if the
3146                        field is justified modular and the optimization in
3147                        gnat_to_gnu_field was applied.  */
3148                     if (Present (Component_Clause
3149                                  (Original_Record_Component (gnat_field)))
3150                         || (TREE_CODE (gnu_field_type) == RECORD_TYPE
3151                             && TYPE_JUSTIFIED_MODULAR_P (gnu_field_type)
3152                             && TREE_TYPE (TYPE_FIELDS (gnu_field_type))
3153                                == TREE_TYPE (gnu_old_field)))
3154                       {
3155                         gnu_size = DECL_SIZE (gnu_old_field);
3156                         gnu_field_type = TREE_TYPE (gnu_old_field);
3157                       }
3158
3159                     /* If the old field was packed and of constant size, we
3160                        have to get the old size here, as it might differ from
3161                        what the Etype conveys and the latter might overlap
3162                        onto the following field.  Try to arrange the type for
3163                        possible better packing along the way.  */
3164                     else if (DECL_PACKED (gnu_old_field)
3165                              && TREE_CODE (DECL_SIZE (gnu_old_field))
3166                                 == INTEGER_CST)
3167                       {
3168                         gnu_size = DECL_SIZE (gnu_old_field);
3169                         if (TREE_CODE (gnu_field_type) == RECORD_TYPE
3170                             && !TYPE_IS_FAT_POINTER_P (gnu_field_type)
3171                             && host_integerp (TYPE_SIZE (gnu_field_type), 1))
3172                           gnu_field_type
3173                             = make_packable_type (gnu_field_type, true);
3174                       }
3175
3176                     if (CONTAINS_PLACEHOLDER_P (gnu_pos))
3177                       for (gnu_temp = gnu_subst_list;
3178                            gnu_temp; gnu_temp = TREE_CHAIN (gnu_temp))
3179                         gnu_pos = substitute_in_expr (gnu_pos,
3180                                                       TREE_PURPOSE (gnu_temp),
3181                                                       TREE_VALUE (gnu_temp));
3182
3183                     /* If the position is now a constant, we can set it as the
3184                        position of the field when we make it.  Otherwise, we need
3185                        to deal with it specially below.  */
3186                     if (TREE_CONSTANT (gnu_pos))
3187                       {
3188                         gnu_new_pos = bit_from_pos (gnu_pos, gnu_bitpos);
3189
3190                         /* Discard old fields that are outside the new type.
3191                            This avoids confusing code scanning it to decide
3192                            how to pass it to functions on some platforms.  */
3193                         if (TREE_CODE (gnu_new_pos) == INTEGER_CST
3194                             && TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST
3195                             && !integer_zerop (gnu_size)
3196                             && !tree_int_cst_lt (gnu_new_pos,
3197                                                  TYPE_SIZE (gnu_type)))
3198                           continue;
3199                       }
3200
3201                     gnu_field
3202                       = create_field_decl
3203                         (DECL_NAME (gnu_old_field), gnu_field_type, gnu_type,
3204                          DECL_PACKED (gnu_old_field), gnu_size, gnu_new_pos,
3205                          !DECL_NONADDRESSABLE_P (gnu_old_field));
3206
3207                     if (!TREE_CONSTANT (gnu_pos))
3208                       {
3209                         normalize_offset (&gnu_pos, &gnu_bitpos, offset_align);
3210                         DECL_FIELD_OFFSET (gnu_field) = gnu_pos;
3211                         DECL_FIELD_BIT_OFFSET (gnu_field) = gnu_bitpos;
3212                         SET_DECL_OFFSET_ALIGN (gnu_field, offset_align);
3213                         DECL_SIZE (gnu_field) = gnu_size;
3214                         DECL_SIZE_UNIT (gnu_field)
3215                           = convert (sizetype,
3216                                      size_binop (CEIL_DIV_EXPR, gnu_size,
3217                                                  bitsize_unit_node));
3218                         layout_decl (gnu_field, DECL_OFFSET_ALIGN (gnu_field));
3219                       }
3220
3221                     DECL_INTERNAL_P (gnu_field)
3222                       = DECL_INTERNAL_P (gnu_old_field);
3223                     SET_DECL_ORIGINAL_FIELD
3224                       (gnu_field, (DECL_ORIGINAL_FIELD (gnu_old_field)
3225                                    ? DECL_ORIGINAL_FIELD (gnu_old_field)
3226                                    : gnu_old_field));
3227                     DECL_DISCRIMINANT_NUMBER (gnu_field)
3228                       = DECL_DISCRIMINANT_NUMBER (gnu_old_field);
3229                     TREE_THIS_VOLATILE (gnu_field)
3230                       = TREE_THIS_VOLATILE (gnu_old_field);
3231
3232                     /* To match the layout crafted in components_to_record, if
3233                        this is the _Tag field, put it before any discriminants
3234                        instead of after them as for all other fields.  */
3235                     if (Chars (gnat_field) == Name_uTag)
3236                       gnu_field_list = chainon (gnu_field_list, gnu_field);
3237                     else
3238                       {
3239                         TREE_CHAIN (gnu_field) = gnu_field_list;
3240                         gnu_field_list = gnu_field;
3241                       }
3242
3243                     save_gnu_tree (gnat_field, gnu_field, false);
3244                   }
3245
3246               /* Now go through the entities again looking for Itypes that
3247                  we have not elaborated but should (e.g., Etypes of fields
3248                  that have Original_Components).  */
3249               for (gnat_field = First_Entity (gnat_entity);
3250                    Present (gnat_field); gnat_field = Next_Entity (gnat_field))
3251                 if ((Ekind (gnat_field) == E_Discriminant
3252                      || Ekind (gnat_field) == E_Component)
3253                     && !present_gnu_tree (Etype (gnat_field)))
3254                   gnat_to_gnu_entity (Etype (gnat_field), NULL_TREE, 0);
3255
3256               /* Do not finalize it since we're going to modify it below.  */
3257               gnu_field_list = nreverse (gnu_field_list);
3258               finish_record_type (gnu_type, gnu_field_list, 2, true);
3259
3260               /* Finalize size and mode.  */
3261               TYPE_SIZE (gnu_type) = variable_size (TYPE_SIZE (gnu_type));
3262               TYPE_SIZE_UNIT (gnu_type)
3263                 = variable_size (TYPE_SIZE_UNIT (gnu_type));
3264
3265               compute_record_mode (gnu_type);
3266
3267               /* Fill in locations of fields.  */
3268               annotate_rep (gnat_entity, gnu_type);
3269
3270               /* We've built a new type, make an XVS type to show what this
3271                  is a subtype of.  Some debuggers require the XVS type to be
3272                  output first, so do it in that order.  */
3273               if (debug_info_p)
3274                 {
3275                   tree gnu_subtype_marker = make_node (RECORD_TYPE);
3276                   tree gnu_orig_name = TYPE_NAME (gnu_orig_type);
3277
3278                   if (TREE_CODE (gnu_orig_name) == TYPE_DECL)
3279                     gnu_orig_name = DECL_NAME (gnu_orig_name);
3280
3281                   TYPE_NAME (gnu_subtype_marker)
3282                     = create_concat_name (gnat_entity, "XVS");
3283                   finish_record_type (gnu_subtype_marker,
3284                                       create_field_decl (gnu_orig_name,
3285                                                          integer_type_node,
3286                                                          gnu_subtype_marker,
3287                                                          0, NULL_TREE,
3288                                                          NULL_TREE, 0),
3289                                       0, false);
3290
3291                   add_parallel_type (TYPE_STUB_DECL (gnu_type),
3292                                      gnu_subtype_marker);
3293                 }
3294
3295               /* Now we can finalize it.  */
3296               rest_of_record_type_compilation (gnu_type);
3297             }
3298
3299           /* Otherwise, go down all the components in the new type and
3300              make them equivalent to those in the base type.  */
3301           else
3302             for (gnat_temp = First_Entity (gnat_entity); Present (gnat_temp);
3303                  gnat_temp = Next_Entity (gnat_temp))
3304               if ((Ekind (gnat_temp) == E_Discriminant
3305                    && !Is_Unchecked_Union (gnat_base_type))
3306                   || Ekind (gnat_temp) == E_Component)
3307                 save_gnu_tree (gnat_temp,
3308                                gnat_to_gnu_field_decl
3309                                (Original_Record_Component (gnat_temp)), false);
3310         }
3311       break;
3312
3313     case E_Access_Subprogram_Type:
3314       /* Use the special descriptor type for dispatch tables if needed,
3315          that is to say for the Prim_Ptr of a-tags.ads and its clones.
3316          Note that we are only required to do so for static tables in
3317          order to be compatible with the C++ ABI, but Ada 2005 allows
3318          to extend library level tagged types at the local level so
3319          we do it in the non-static case as well.  */
3320       if (TARGET_VTABLE_USES_DESCRIPTORS
3321           && Is_Dispatch_Table_Entity (gnat_entity))
3322         {
3323             gnu_type = fdesc_type_node;
3324             gnu_size = TYPE_SIZE (gnu_type);
3325             break;
3326         }
3327
3328       /* ... fall through ... */
3329
3330     case E_Anonymous_Access_Subprogram_Type:
3331       /* If we are not defining this entity, and we have incomplete
3332          entities being processed above us, make a dummy type and
3333          fill it in later.  */
3334       if (!definition && defer_incomplete_level != 0)
3335         {
3336           struct incomplete *p
3337             = (struct incomplete *) xmalloc (sizeof (struct incomplete));
3338
3339           gnu_type
3340             = build_pointer_type
3341               (make_dummy_type (Directly_Designated_Type (gnat_entity)));
3342           gnu_decl = create_type_decl (gnu_entity_name, gnu_type, attr_list,
3343                                        !Comes_From_Source (gnat_entity),
3344                                        debug_info_p, gnat_entity);
3345           this_made_decl = true;
3346           gnu_type = TREE_TYPE (gnu_decl);
3347           save_gnu_tree (gnat_entity, gnu_decl, false);
3348           saved = true;
3349
3350           p->old_type = TREE_TYPE (gnu_type);
3351           p->full_type = Directly_Designated_Type (gnat_entity);
3352           p->next = defer_incomplete_list;
3353           defer_incomplete_list = p;
3354           break;
3355         }
3356
3357       /* ... fall through ... */
3358
3359     case E_Allocator_Type:
3360     case E_Access_Type:
3361     case E_Access_Attribute_Type:
3362     case E_Anonymous_Access_Type:
3363     case E_General_Access_Type:
3364       {
3365         Entity_Id gnat_desig_type = Directly_Designated_Type (gnat_entity);
3366         Entity_Id gnat_desig_equiv = Gigi_Equivalent_Type (gnat_desig_type);
3367         bool is_from_limited_with
3368           = (IN (Ekind (gnat_desig_equiv), Incomplete_Kind)
3369              && From_With_Type (gnat_desig_equiv));
3370
3371         /* Get the "full view" of this entity.  If this is an incomplete
3372            entity from a limited with, treat its non-limited view as the full
3373            view.  Otherwise, if this is an incomplete or private type, use the
3374            full view.  In the former case, we might point to a private type,
3375            in which case, we need its full view.  Also, we want to look at the
3376            actual type used for the representation, so this takes a total of
3377            three steps.  */
3378         Entity_Id gnat_desig_full_direct_first
3379           = (is_from_limited_with ? Non_Limited_View (gnat_desig_equiv)
3380              : (IN (Ekind (gnat_desig_equiv), Incomplete_Or_Private_Kind)
3381                 ? Full_View (gnat_desig_equiv) : Empty));
3382         Entity_Id gnat_desig_full_direct
3383           = ((is_from_limited_with
3384               && Present (gnat_desig_full_direct_first)
3385               && IN (Ekind (gnat_desig_full_direct_first), Private_Kind))
3386              ? Full_View (gnat_desig_full_direct_first)
3387              : gnat_desig_full_direct_first);
3388         Entity_Id gnat_desig_full
3389           = Gigi_Equivalent_Type (gnat_desig_full_direct);
3390
3391         /* This the type actually used to represent the designated type,
3392            either gnat_desig_full or gnat_desig_equiv.  */
3393         Entity_Id gnat_desig_rep;
3394
3395         /* True if this is a pointer to an unconstrained array.  */
3396         bool is_unconstrained_array;
3397
3398         /* We want to know if we'll be seeing the freeze node for any
3399            incomplete type we may be pointing to.  */
3400         bool in_main_unit
3401           = (Present (gnat_desig_full)
3402              ? In_Extended_Main_Code_Unit (gnat_desig_full)
3403              : In_Extended_Main_Code_Unit (gnat_desig_type));
3404
3405         /* True if we make a dummy type here.  */
3406         bool got_fat_p = false;
3407         /* True if the dummy is a fat pointer.  */
3408         bool made_dummy = false;
3409         tree gnu_desig_type = NULL_TREE;
3410         enum machine_mode p_mode = mode_for_size (esize, MODE_INT, 0);
3411
3412         if (!targetm.valid_pointer_mode (p_mode))
3413           p_mode = ptr_mode;
3414
3415         /* If either the designated type or its full view is an unconstrained
3416            array subtype, replace it with the type it's a subtype of.  This
3417            avoids problems with multiple copies of unconstrained array types.
3418            Likewise, if the designated type is a subtype of an incomplete
3419            record type, use the parent type to avoid order of elaboration
3420            issues.  This can lose some code efficiency, but there is no
3421            alternative.  */
3422         if (Ekind (gnat_desig_equiv) == E_Array_Subtype
3423             && ! Is_Constrained (gnat_desig_equiv))
3424           gnat_desig_equiv = Etype (gnat_desig_equiv);
3425         if (Present (gnat_desig_full)
3426             && ((Ekind (gnat_desig_full) == E_Array_Subtype
3427                  && ! Is_Constrained (gnat_desig_full))
3428                 || (Ekind (gnat_desig_full) == E_Record_Subtype
3429                     && Ekind (Etype (gnat_desig_full)) == E_Record_Type)))
3430           gnat_desig_full = Etype (gnat_desig_full);
3431
3432         /* Now set the type that actually marks the representation of
3433            the designated type and also flag whether we have a unconstrained
3434            array.  */
3435         gnat_desig_rep = gnat_desig_full ? gnat_desig_full : gnat_desig_equiv;
3436         is_unconstrained_array
3437           = (Is_Array_Type (gnat_desig_rep)
3438              && ! Is_Constrained (gnat_desig_rep));
3439
3440         /* If we are pointing to an incomplete type whose completion is an
3441            unconstrained array, make a fat pointer type.  The two types in our
3442            fields will be pointers to dummy nodes and will be replaced in
3443            update_pointer_to.  Similarly, if the type itself is a dummy type or
3444            an unconstrained array.  Also make a dummy TYPE_OBJECT_RECORD_TYPE
3445            in case we have any thin pointers to it.  */
3446         if (is_unconstrained_array
3447             && (Present (gnat_desig_full)
3448                 || (present_gnu_tree (gnat_desig_equiv)
3449                     && TYPE_IS_DUMMY_P (TREE_TYPE
3450                                         (get_gnu_tree (gnat_desig_equiv))))
3451                 || (No (gnat_desig_full) && ! in_main_unit
3452                     && defer_incomplete_level != 0
3453                     && ! present_gnu_tree (gnat_desig_equiv))
3454                 || (in_main_unit && is_from_limited_with
3455                     && Present (Freeze_Node (gnat_desig_rep)))))
3456           {
3457             tree gnu_old;
3458
3459             if (present_gnu_tree (gnat_desig_rep))
3460               gnu_old = TREE_TYPE (get_gnu_tree (gnat_desig_rep));
3461             else
3462               {
3463                 gnu_old = make_dummy_type (gnat_desig_rep);
3464
3465                 /* Show the dummy we get will be a fat pointer.  */
3466                 got_fat_p = made_dummy = true;
3467               }
3468
3469             /* If the call above got something that has a pointer, that
3470                pointer is our type.  This could have happened either
3471                because the type was elaborated or because somebody
3472                else executed the code below.  */
3473             gnu_type = TYPE_POINTER_TO (gnu_old);
3474             if (!gnu_type)
3475               {
3476                 tree gnu_template_type = make_node (ENUMERAL_TYPE);
3477                 tree gnu_ptr_template = build_pointer_type (gnu_template_type);
3478                 tree gnu_array_type = make_node (ENUMERAL_TYPE);
3479                 tree gnu_ptr_array = build_pointer_type (gnu_array_type);
3480                 tree fields;
3481
3482                 TYPE_NAME (gnu_template_type)
3483                   = create_concat_name (gnat_desig_equiv, "XUB");
3484                 TYPE_DUMMY_P (gnu_template_type) = 1;
3485
3486                 TYPE_NAME (gnu_array_type)
3487                   = create_concat_name (gnat_desig_equiv, "XUA");
3488                 TYPE_DUMMY_P (gnu_array_type) = 1;
3489
3490                 gnu_type = make_node (RECORD_TYPE);
3491                 SET_TYPE_UNCONSTRAINED_ARRAY (gnu_type, gnu_old);
3492                 TYPE_POINTER_TO (gnu_old) = gnu_type;
3493
3494                 Sloc_to_locus (Sloc (gnat_entity), &input_location);
3495                 fields
3496                   = chainon (chainon (NULL_TREE,
3497                                       create_field_decl
3498                                       (get_identifier ("P_ARRAY"),
3499                                        gnu_ptr_array,
3500                                        gnu_type, 0, 0, 0, 0)),
3501                              create_field_decl (get_identifier ("P_BOUNDS"),
3502                                                 gnu_ptr_template,
3503                                                 gnu_type, 0, 0, 0, 0));
3504
3505                 /* Make sure we can place this into a register.  */
3506                 TYPE_ALIGN (gnu_type)
3507                   = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
3508                 TYPE_IS_FAT_POINTER_P (gnu_type) = 1;
3509
3510                 /* Do not finalize this record type since the types of
3511                    its fields are incomplete.  */
3512                 finish_record_type (gnu_type, fields, 0, true);
3513
3514                 TYPE_OBJECT_RECORD_TYPE (gnu_old) = make_node (RECORD_TYPE);
3515                 TYPE_NAME (TYPE_OBJECT_RECORD_TYPE (gnu_old))
3516                   = create_concat_name (gnat_desig_equiv, "XUT");
3517                 TYPE_DUMMY_P (TYPE_OBJECT_RECORD_TYPE (gnu_old)) = 1;
3518               }
3519           }
3520
3521         /* If we already know what the full type is, use it.  */
3522         else if (Present (gnat_desig_full)
3523                  && present_gnu_tree (gnat_desig_full))
3524           gnu_desig_type = TREE_TYPE (get_gnu_tree (gnat_desig_full));
3525
3526         /* Get the type of the thing we are to point to and build a pointer
3527            to it.  If it is a reference to an incomplete or private type with a
3528            full view that is a record, make a dummy type node and get the
3529            actual type later when we have verified it is safe.  */
3530         else if ((! in_main_unit
3531                   && ! present_gnu_tree (gnat_desig_equiv)
3532                   && Present (gnat_desig_full)
3533                   && ! present_gnu_tree (gnat_desig_full)
3534                   && Is_Record_Type (gnat_desig_full))
3535                  /* Likewise if we are pointing to a record or array and we
3536                     are to defer elaborating incomplete types.  We do this
3537                     since this access type may be the full view of some
3538                     private type.  Note that the unconstrained array case is
3539                     handled above.  */
3540                  || ((! in_main_unit || imported_p)
3541                      && defer_incomplete_level != 0
3542                      && ! present_gnu_tree (gnat_desig_equiv)
3543                      && ((Is_Record_Type (gnat_desig_rep)
3544                           || Is_Array_Type (gnat_desig_rep))))
3545                  /* If this is a reference from a limited_with type back to our
3546                     main unit and there's a Freeze_Node for it, either we have
3547                     already processed the declaration and made the dummy type,
3548                     in which case we just reuse the latter, or we have not yet,
3549                     in which case we make the dummy type and it will be reused
3550                     when the declaration is processed.  In both cases, the
3551                     pointer eventually created below will be automatically
3552                     adjusted when the Freeze_Node is processed.  Note that the
3553                     unconstrained array case is handled above.  */
3554                  ||  (in_main_unit && is_from_limited_with
3555                       && Present (Freeze_Node (gnat_desig_rep))))
3556           {
3557             gnu_desig_type = make_dummy_type (gnat_desig_equiv);
3558             made_dummy = true;
3559           }
3560
3561         /* Otherwise handle the case of a pointer to itself.  */
3562         else if (gnat_desig_equiv == gnat_entity)
3563           {
3564             gnu_type
3565               = build_pointer_type_for_mode (void_type_node, p_mode,
3566                                              No_Strict_Aliasing (gnat_entity));
3567             TREE_TYPE (gnu_type) = TYPE_POINTER_TO (gnu_type) = gnu_type;
3568           }
3569
3570         /* If expansion is disabled, the equivalent type of a concurrent
3571            type is absent, so build a dummy pointer type.  */
3572         else if (type_annotate_only && No (gnat_desig_equiv))
3573           gnu_type = ptr_void_type_node;
3574
3575         /* Finally, handle the straightforward case where we can just
3576            elaborate our designated type and point to it.  */
3577         else
3578           gnu_desig_type = gnat_to_gnu_type (gnat_desig_equiv);
3579
3580         /* It is possible that a call to gnat_to_gnu_type above resolved our
3581            type.  If so, just return it.  */
3582         if (present_gnu_tree (gnat_entity))
3583           {
3584             maybe_present = true;
3585             break;
3586           }
3587
3588         /* If we have a GCC type for the designated type, possibly modify it
3589            if we are pointing only to constant objects and then make a pointer
3590            to it.  Don't do this for unconstrained arrays.  */
3591         if (!gnu_type && gnu_desig_type)
3592           {
3593             if (Is_Access_Constant (gnat_entity)
3594                 && TREE_CODE (gnu_desig_type) != UNCONSTRAINED_ARRAY_TYPE)
3595               {
3596                 gnu_desig_type
3597                   = build_qualified_type
3598                     (gnu_desig_type,
3599                      TYPE_QUALS (gnu_desig_type) | TYPE_QUAL_CONST);
3600
3601                 /* Some extra processing is required if we are building a
3602                    pointer to an incomplete type (in the GCC sense).  We might
3603                    have such a type if we just made a dummy, or directly out
3604                    of the call to gnat_to_gnu_type above if we are processing
3605                    an access type for a record component designating the
3606                    record type itself.  */
3607                 if (TYPE_MODE (gnu_desig_type) == VOIDmode)
3608                   {
3609                     /* We must ensure that the pointer to variant we make will
3610                        be processed by update_pointer_to when the initial type
3611                        is completed.  Pretend we made a dummy and let further
3612                        processing act as usual.  */
3613                     made_dummy = true;
3614
3615                     /* We must ensure that update_pointer_to will not retrieve
3616                        the dummy variant when building a properly qualified
3617                        version of the complete type.  We take advantage of the
3618                        fact that get_qualified_type is requiring TYPE_NAMEs to
3619                        match to influence build_qualified_type and then also
3620                        update_pointer_to here.  */
3621                     TYPE_NAME (gnu_desig_type)
3622                       = create_concat_name (gnat_desig_type, "INCOMPLETE_CST");
3623                   }
3624               }
3625
3626             gnu_type
3627               = build_pointer_type_for_mode (gnu_desig_type, p_mode,
3628                                              No_Strict_Aliasing (gnat_entity));
3629           }
3630
3631         /* If we are not defining this object and we made a dummy pointer,
3632            save our current definition, evaluate the actual type, and replace
3633            the tentative type we made with the actual one.  If we are to defer
3634            actually looking up the actual type, make an entry in the
3635            deferred list.  If this is from a limited with, we have to defer
3636            to the end of the current spec in two cases: first if the
3637            designated type is in the current unit and second if the access
3638            type is.  */
3639         if ((! in_main_unit || is_from_limited_with) && made_dummy)
3640           {
3641             tree gnu_old_type
3642               = TYPE_FAT_POINTER_P (gnu_type)
3643                 ? TYPE_UNCONSTRAINED_ARRAY (gnu_type) : TREE_TYPE (gnu_type);
3644
3645             if (esize == POINTER_SIZE
3646                 && (got_fat_p || TYPE_FAT_POINTER_P (gnu_type)))
3647               gnu_type
3648                 = build_pointer_type
3649                   (TYPE_OBJECT_RECORD_TYPE
3650                    (TYPE_UNCONSTRAINED_ARRAY (gnu_type)));
3651
3652             gnu_decl = create_type_decl (gnu_entity_name, gnu_type, attr_list,
3653                                          !Comes_From_Source (gnat_entity),
3654                                          debug_info_p, gnat_entity);
3655             this_made_decl = true;
3656             gnu_type = TREE_TYPE (gnu_decl);
3657             save_gnu_tree (gnat_entity, gnu_decl, false);
3658             saved = true;
3659
3660             if (defer_incomplete_level == 0
3661                 && ! (is_from_limited_with
3662                       && (in_main_unit
3663                           || In_Extended_Main_Code_Unit (gnat_entity))))
3664               update_pointer_to (TYPE_MAIN_VARIANT (gnu_old_type),
3665                                  gnat_to_gnu_type (gnat_desig_equiv));
3666
3667               /* Note that the call to gnat_to_gnu_type here might have
3668                  updated gnu_old_type directly, in which case it is not a
3669                  dummy type any more when we get into update_pointer_to.
3670
3671                  This may happen for instance when the designated type is a
3672                  record type, because their elaboration starts with an
3673                  initial node from make_dummy_type, which may yield the same
3674                  node as the one we got.
3675
3676                  Besides, variants of this non-dummy type might have been
3677                  created along the way.  update_pointer_to is expected to
3678                  properly take care of those situations.  */
3679             else
3680               {
3681                 struct incomplete *p
3682                   = (struct incomplete *) xmalloc (sizeof
3683                                                    (struct incomplete));
3684                 struct incomplete **head
3685                   = (is_from_limited_with
3686                      && (in_main_unit
3687                          || In_Extended_Main_Code_Unit (gnat_entity))
3688                      ? &defer_limited_with : &defer_incomplete_list);
3689
3690                 p->old_type = gnu_old_type;
3691                 p->full_type = gnat_desig_equiv;
3692                 p->next = *head;
3693                 *head = p;
3694               }
3695           }
3696       }
3697       break;
3698
3699     case E_Access_Protected_Subprogram_Type:
3700     case E_Anonymous_Access_Protected_Subprogram_Type:
3701       if (type_annotate_only && No (gnat_equiv_type))
3702         gnu_type = ptr_void_type_node;
3703       else
3704         {
3705           /* The runtime representation is the equivalent type.  */
3706           gnu_type = gnat_to_gnu_type (gnat_equiv_type);
3707           maybe_present = true;
3708         }
3709
3710       if (Is_Itype (Directly_Designated_Type (gnat_entity))
3711           && !present_gnu_tree (Directly_Designated_Type (gnat_entity))
3712           && No (Freeze_Node (Directly_Designated_Type (gnat_entity)))
3713           && !Is_Record_Type (Scope (Directly_Designated_Type (gnat_entity))))
3714         gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity),
3715                             NULL_TREE, 0);
3716
3717       break;
3718
3719     case E_Access_Subtype:
3720
3721       /* We treat this as identical to its base type; any constraint is
3722          meaningful only to the front end.
3723
3724          The designated type must be elaborated as well, if it does
3725          not have its own freeze node.  Designated (sub)types created
3726          for constrained components of records with discriminants are
3727          not frozen by the front end and thus not elaborated by gigi,
3728          because their use may appear before the base type is frozen,
3729          and because it is not clear that they are needed anywhere in
3730          Gigi.  With the current model, there is no correct place where
3731          they could be elaborated.  */
3732
3733       gnu_type = gnat_to_gnu_type (Etype (gnat_entity));
3734       if (Is_Itype (Directly_Designated_Type (gnat_entity))
3735           && !present_gnu_tree (Directly_Designated_Type (gnat_entity))
3736           && Is_Frozen (Directly_Designated_Type (gnat_entity))
3737           && No (Freeze_Node (Directly_Designated_Type (gnat_entity))))
3738         {
3739           /* If we are not defining this entity, and we have incomplete
3740              entities being processed above us, make a dummy type and
3741              elaborate it later.  */
3742           if (!definition && defer_incomplete_level != 0)
3743             {
3744               struct incomplete *p
3745                 = (struct incomplete *) xmalloc (sizeof (struct incomplete));
3746               tree gnu_ptr_type
3747                 = build_pointer_type
3748                   (make_dummy_type (Directly_Designated_Type (gnat_entity)));
3749
3750               p->old_type = TREE_TYPE (gnu_ptr_type);
3751               p->full_type = Directly_Designated_Type (gnat_entity);
3752               p->next = defer_incomplete_list;
3753               defer_incomplete_list = p;
3754             }
3755           else if (!IN (Ekind (Base_Type
3756                               (Directly_Designated_Type (gnat_entity))),
3757                        Incomplete_Or_Private_Kind))
3758             gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity),
3759                                 NULL_TREE, 0);
3760         }
3761
3762       maybe_present = true;
3763       break;
3764
3765     /* Subprogram Entities
3766
3767        The following access functions are defined for subprograms (functions
3768        or procedures):
3769
3770                 First_Formal    The first formal parameter.
3771                 Is_Imported     Indicates that the subprogram has appeared in
3772                                 an INTERFACE or IMPORT pragma.  For now we
3773                                 assume that the external language is C.
3774                 Is_Exported     Likewise but for an EXPORT pragma.
3775                 Is_Inlined      True if the subprogram is to be inlined.
3776
3777        In addition for function subprograms we have:
3778
3779                 Etype           Return type of the function.
3780
3781        Each parameter is first checked by calling must_pass_by_ref on its
3782        type to determine if it is passed by reference.  For parameters which
3783        are copied in, if they are Ada In Out or Out parameters, their return
3784        value becomes part of a record which becomes the return type of the
3785        function (C function - note that this applies only to Ada procedures
3786        so there is no Ada return type).  Additional code to store back the
3787        parameters will be generated on the caller side.  This transformation
3788        is done here, not in the front-end.
3789
3790        The intended result of the transformation can be seen from the
3791        equivalent source rewritings that follow:
3792
3793                                                 struct temp {int a,b};
3794        procedure P (A,B: In Out ...) is         temp P (int A,B)
3795        begin                                    {
3796          ..                                       ..
3797        end P;                                     return {A,B};
3798                                                 }
3799
3800                                                 temp t;
3801        P(X,Y);                                  t = P(X,Y);
3802                                                 X = t.a , Y = t.b;
3803
3804        For subprogram types we need to perform mainly the same conversions to
3805        GCC form that are needed for procedures and function declarations.  The
3806        only difference is that at the end, we make a type declaration instead
3807        of a function declaration.  */
3808
3809     case E_Subprogram_Type:
3810     case E_Function:
3811     case E_Procedure:
3812       {
3813         /* The first GCC parameter declaration (a PARM_DECL node).  The
3814            PARM_DECL nodes are chained through the TREE_CHAIN field, so this
3815            actually is the head of this parameter list.  */
3816         tree gnu_param_list = NULL_TREE;
3817         /* Likewise for the stub associated with an exported procedure.  */
3818         tree gnu_stub_param_list = NULL_TREE;
3819         /* The type returned by a function.  If the subprogram is a procedure
3820            this type should be void_type_node.  */
3821         tree gnu_return_type = void_type_node;
3822         /* List of fields in return type of procedure with copy-in copy-out
3823            parameters.  */
3824         tree gnu_field_list = NULL_TREE;
3825         /* Non-null for subprograms containing parameters passed by copy-in
3826            copy-out (Ada In Out or Out parameters not passed by reference),
3827            in which case it is the list of nodes used to specify the values of
3828            the in out/out parameters that are returned as a record upon
3829            procedure return.  The TREE_PURPOSE of an element of this list is
3830            a field of the record and the TREE_VALUE is the PARM_DECL
3831            corresponding to that field.  This list will be saved in the
3832            TYPE_CI_CO_LIST field of the FUNCTION_TYPE node we create.  */
3833         tree gnu_return_list = NULL_TREE;
3834         /* If an import pragma asks to map this subprogram to a GCC builtin,
3835            this is the builtin DECL node.  */
3836         tree gnu_builtin_decl = NULL_TREE;
3837         /* For the stub associated with an exported procedure.  */
3838         tree gnu_stub_type = NULL_TREE, gnu_stub_name = NULL_TREE;
3839         tree gnu_ext_name = create_concat_name (gnat_entity, NULL);
3840         Entity_Id gnat_param;
3841         bool inline_flag = Is_Inlined (gnat_entity);
3842         bool public_flag = Is_Public (gnat_entity) || imported_p;
3843         bool extern_flag
3844           = (Is_Public (gnat_entity) && !definition) || imported_p;
3845
3846        /* The semantics of "pure" in Ada essentially matches that of "const"
3847           in the back-end.  In particular, both properties are orthogonal to
3848           the "nothrow" property if the EH circuitry is explicit in the
3849           internal representation of the back-end.  If we are to completely
3850           hide the EH circuitry from it, we need to declare that calls to pure
3851           Ada subprograms that can throw have side effects since they can
3852           trigger an "abnormal" transfer of control flow; thus they can be
3853           neither "const" nor "pure" in the back-end sense.  */
3854         bool const_flag
3855           = (Exception_Mechanism == Back_End_Exceptions
3856              && Is_Pure (gnat_entity));
3857
3858         bool volatile_flag = No_Return (gnat_entity);
3859         bool returns_by_ref = false;
3860         bool returns_unconstrained = false;
3861         bool returns_by_target_ptr = false;
3862         bool has_copy_in_out = false;
3863         bool has_stub = false;
3864         int parmnum;
3865
3866         if (kind == E_Subprogram_Type && !definition)
3867           /* A parameter may refer to this type, so defer completion
3868              of any incomplete types.  */
3869           defer_incomplete_level++, this_deferred = true;
3870
3871         /* If the subprogram has an alias, it is probably inherited, so
3872            we can use the original one.  If the original "subprogram"
3873            is actually an enumeration literal, it may be the first use
3874            of its type, so we must elaborate that type now.  */
3875         if (Present (Alias (gnat_entity)))
3876           {
3877             if (Ekind (Alias (gnat_entity)) == E_Enumeration_Literal)
3878               gnat_to_gnu_entity (Etype (Alias (gnat_entity)), NULL_TREE, 0);
3879
3880             gnu_decl = gnat_to_gnu_entity (Alias (gnat_entity),
3881                                            gnu_expr, 0);
3882
3883             /* Elaborate any Itypes in the parameters of this entity.  */
3884             for (gnat_temp = First_Formal_With_Extras (gnat_entity);
3885                  Present (gnat_temp);
3886                  gnat_temp = Next_Formal_With_Extras (gnat_temp))
3887               if (Is_Itype (Etype (gnat_temp)))
3888                 gnat_to_gnu_entity (Etype (gnat_temp), NULL_TREE, 0);
3889
3890             break;
3891           }
3892
3893         /* If this subprogram is expectedly bound to a GCC builtin, fetch the
3894            corresponding DECL node.
3895
3896            We still want the parameter associations to take place because the
3897            proper generation of calls depends on it (a GNAT parameter without
3898            a corresponding GCC tree has a very specific meaning), so we don't
3899            just break here.  */
3900         if (Convention (gnat_entity) == Convention_Intrinsic)
3901           gnu_builtin_decl = builtin_decl_for (gnu_ext_name);
3902
3903         /* ??? What if we don't find the builtin node above ? warn ? err ?
3904            In the current state we neither warn nor err, and calls will just
3905            be handled as for regular subprograms.  */
3906
3907         if (kind == E_Function || kind == E_Subprogram_Type)
3908           gnu_return_type = gnat_to_gnu_type (Etype (gnat_entity));
3909
3910         /* If this function returns by reference, make the actual
3911            return type of this function the pointer and mark the decl.  */
3912         if (Returns_By_Ref (gnat_entity))
3913           {
3914             returns_by_ref = true;
3915             gnu_return_type = build_pointer_type (gnu_return_type);
3916           }
3917
3918         /* If the Mechanism is By_Reference, ensure the return type uses
3919            the machine's by-reference mechanism, which may not the same
3920            as above (e.g., it might be by passing a fake parameter).  */
3921         else if (kind == E_Function
3922                  && Mechanism (gnat_entity) == By_Reference)
3923           {
3924             TREE_ADDRESSABLE (gnu_return_type) = 1;
3925
3926             /* We expect this bit to be reset by gigi shortly, so can avoid a
3927                type node copy here.  This actually also prevents troubles with
3928                the generation of debug information for the function, because
3929                we might have issued such info for this type already, and would
3930                be attaching a distinct type node to the function if we made a
3931                copy here.  */
3932           }
3933
3934         /* If we are supposed to return an unconstrained array,
3935            actually return a fat pointer and make a note of that.  Return
3936            a pointer to an unconstrained record of variable size.  */
3937         else if (TREE_CODE (gnu_return_type) == UNCONSTRAINED_ARRAY_TYPE)
3938           {
3939             gnu_return_type = TREE_TYPE (gnu_return_type);
3940             returns_unconstrained = true;
3941           }
3942
3943         /* If the type requires a transient scope, the result is allocated
3944            on the secondary stack, so the result type of the function is
3945            just a pointer.  */
3946         else if (Requires_Transient_Scope (Etype (gnat_entity)))
3947           {
3948             gnu_return_type = build_pointer_type (gnu_return_type);
3949             returns_unconstrained = true;
3950           }
3951
3952         /* If the type is a padded type and the underlying type would not
3953            be passed by reference or this function has a foreign convention,
3954            return the underlying type.  */
3955         else if (TREE_CODE (gnu_return_type) == RECORD_TYPE
3956                  && TYPE_IS_PADDING_P (gnu_return_type)
3957                  && (!default_pass_by_ref (TREE_TYPE
3958                                            (TYPE_FIELDS (gnu_return_type)))
3959                      || Has_Foreign_Convention (gnat_entity)))
3960           gnu_return_type = TREE_TYPE (TYPE_FIELDS (gnu_return_type));
3961
3962         /* If the return type has a non-constant size, we convert the function
3963            into a procedure and its caller will pass a pointer to an object as
3964            the first parameter when we call the function.  This can happen for
3965            an unconstrained type with a maximum size or a constrained type with
3966            a size not known at compile time.  */
3967         if (TYPE_SIZE_UNIT (gnu_return_type)
3968             && !TREE_CONSTANT (TYPE_SIZE_UNIT (gnu_return_type)))
3969           {
3970             returns_by_target_ptr = true;
3971             gnu_param_list
3972               = create_param_decl (get_identifier ("TARGET"),
3973                                    build_reference_type (gnu_return_type),
3974                                    true);
3975             gnu_return_type = void_type_node;
3976           }
3977
3978         /* If the return type has a size that overflows, we cannot have
3979            a function that returns that type.  This usage doesn't make
3980            sense anyway, so give an error here.  */
3981         if (TYPE_SIZE_UNIT (gnu_return_type)
3982             && TREE_CONSTANT (TYPE_SIZE_UNIT (gnu_return_type))
3983             && TREE_OVERFLOW (TYPE_SIZE_UNIT (gnu_return_type)))
3984           {
3985             post_error ("cannot return type whose size overflows",
3986                         gnat_entity);
3987             gnu_return_type = copy_node (gnu_return_type);
3988             TYPE_SIZE (gnu_return_type) = bitsize_zero_node;
3989             TYPE_SIZE_UNIT (gnu_return_type) = size_zero_node;
3990             TYPE_MAIN_VARIANT (gnu_return_type) = gnu_return_type;
3991             TYPE_NEXT_VARIANT (gnu_return_type) = NULL_TREE;
3992           }
3993
3994         /* Look at all our parameters and get the type of
3995            each.  While doing this, build a copy-out structure if
3996            we need one.  */
3997
3998         /* Loop over the parameters and get their associated GCC tree.
3999            While doing this, build a copy-out structure if we need one.  */
4000         for (gnat_param = First_Formal_With_Extras (gnat_entity), parmnum = 0;
4001              Present (gnat_param);
4002              gnat_param = Next_Formal_With_Extras (gnat_param), parmnum++)
4003           {
4004             tree gnu_param_name = get_entity_name (gnat_param);
4005             tree gnu_param_type = gnat_to_gnu_type (Etype (gnat_param));
4006             tree gnu_param, gnu_field;
4007             bool copy_in_copy_out = false;
4008             Mechanism_Type mech = Mechanism (gnat_param);
4009
4010             /* Builtins are expanded inline and there is no real call sequence
4011                involved.  So the type expected by the underlying expander is
4012                always the type of each argument "as is".  */
4013             if (gnu_builtin_decl)
4014               mech = By_Copy;
4015             /* Handle the first parameter of a valued procedure specially.  */
4016             else if (Is_Valued_Procedure (gnat_entity) && parmnum == 0)
4017               mech = By_Copy_Return;
4018             /* Otherwise, see if a Mechanism was supplied that forced this
4019                parameter to be passed one way or another.  */
4020             else if (mech == Default
4021                      || mech == By_Copy || mech == By_Reference)
4022               ;
4023             else if (By_Descriptor_Last <= mech && mech <= By_Descriptor)
4024               mech = By_Descriptor;
4025
4026             else if (By_Short_Descriptor_Last <= mech &&
4027                      mech <= By_Short_Descriptor)
4028               mech = By_Short_Descriptor;
4029
4030             else if (mech > 0)
4031               {
4032                 if (TREE_CODE (gnu_param_type) == UNCONSTRAINED_ARRAY_TYPE
4033                     || TREE_CODE (TYPE_SIZE (gnu_param_type)) != INTEGER_CST
4034                     || 0 < compare_tree_int (TYPE_SIZE (gnu_param_type),
4035                                              mech))
4036                   mech = By_Reference;
4037                 else
4038                   mech = By_Copy;
4039               }
4040             else
4041               {
4042                 post_error ("unsupported mechanism for&", gnat_param);
4043                 mech = Default;
4044               }
4045
4046             gnu_param
4047               = gnat_to_gnu_param (gnat_param, mech, gnat_entity,
4048                                    Has_Foreign_Convention (gnat_entity),
4049                                    &copy_in_copy_out);
4050
4051             /* We are returned either a PARM_DECL or a type if no parameter
4052                needs to be passed; in either case, adjust the type.  */
4053             if (DECL_P (gnu_param))
4054               gnu_param_type = TREE_TYPE (gnu_param);
4055             else
4056               {
4057                 gnu_param_type = gnu_param;
4058                 gnu_param = NULL_TREE;
4059               }
4060
4061             if (gnu_param)
4062               {
4063                 /* If it's an exported subprogram, we build a parameter list
4064                    in parallel, in case we need to emit a stub for it.  */
4065                 if (Is_Exported (gnat_entity))
4066                   {
4067                     gnu_stub_param_list
4068                       = chainon (gnu_param, gnu_stub_param_list);
4069                     /* Change By_Descriptor parameter to By_Reference for
4070                        the internal version of an exported subprogram.  */
4071                     if (mech == By_Descriptor || mech == By_Short_Descriptor)
4072                       {
4073                         gnu_param
4074                           = gnat_to_gnu_param (gnat_param, By_Reference,
4075                                                gnat_entity, false,
4076                                                &copy_in_copy_out);
4077                         has_stub = true;
4078                       }
4079                     else
4080                       gnu_param = copy_node (gnu_param);
4081                   }
4082
4083                 gnu_param_list = chainon (gnu_param, gnu_param_list);
4084                 Sloc_to_locus (Sloc (gnat_param),
4085                                &DECL_SOURCE_LOCATION (gnu_param));
4086                 save_gnu_tree (gnat_param, gnu_param, false);
4087
4088                 /* If a parameter is a pointer, this function may modify
4089                    memory through it and thus shouldn't be considered
4090                    a const function.  Also, the memory may be modified
4091                    between two calls, so they can't be CSE'ed.  The latter
4092                    case also handles by-ref parameters.  */
4093                 if (POINTER_TYPE_P (gnu_param_type)
4094                     || TYPE_FAT_POINTER_P (gnu_param_type))
4095                   const_flag = false;
4096               }
4097
4098             if (copy_in_copy_out)
4099               {
4100                 if (!has_copy_in_out)
4101                   {
4102                     gcc_assert (TREE_CODE (gnu_return_type) == VOID_TYPE);
4103                     gnu_return_type = make_node (RECORD_TYPE);
4104                     TYPE_NAME (gnu_return_type) = get_identifier ("RETURN");
4105                     has_copy_in_out = true;
4106                   }
4107
4108                 gnu_field = create_field_decl (gnu_param_name, gnu_param_type,
4109                                                gnu_return_type, 0, 0, 0, 0);
4110                 Sloc_to_locus (Sloc (gnat_param),
4111                                &DECL_SOURCE_LOCATION (gnu_field));
4112                 TREE_CHAIN (gnu_field) = gnu_field_list;
4113                 gnu_field_list = gnu_field;
4114                 gnu_return_list = tree_cons (gnu_field, gnu_param,
4115                                              gnu_return_list);
4116               }
4117           }
4118
4119         /* Do not compute record for out parameters if subprogram is
4120            stubbed since structures are incomplete for the back-end.  */
4121         if (gnu_field_list && Convention (gnat_entity) != Convention_Stubbed)
4122           finish_record_type (gnu_return_type, nreverse (gnu_field_list),
4123                               0, false);
4124
4125         /* If we have a CICO list but it has only one entry, we convert
4126            this function into a function that simply returns that one
4127            object.  */
4128         if (list_length (gnu_return_list) == 1)
4129           gnu_return_type = TREE_TYPE (TREE_PURPOSE (gnu_return_list));
4130
4131         if (Has_Stdcall_Convention (gnat_entity))
4132           prepend_one_attribute_to
4133             (&attr_list, ATTR_MACHINE_ATTRIBUTE,
4134              get_identifier ("stdcall"), NULL_TREE,
4135              gnat_entity);
4136
4137         /* If we are on a target where stack realignment is needed for 'main'
4138            to honor GCC's implicit expectations (stack alignment greater than
4139            what the base ABI guarantees), ensure we do the same for foreign
4140            convention subprograms as they might be used as callbacks from code
4141            breaking such expectations.  Note that this applies to task entry
4142            points in particular.  */
4143         if (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
4144             && Has_Foreign_Convention (gnat_entity))
4145           prepend_one_attribute_to
4146             (&attr_list, ATTR_MACHINE_ATTRIBUTE,
4147              get_identifier ("force_align_arg_pointer"), NULL_TREE,
4148              gnat_entity);
4149
4150         /* The lists have been built in reverse.  */
4151         gnu_param_list = nreverse (gnu_param_list);
4152         if (has_stub)
4153           gnu_stub_param_list = nreverse (gnu_stub_param_list);
4154         gnu_return_list = nreverse (gnu_return_list);
4155
4156         if (Ekind (gnat_entity) == E_Function)
4157           Set_Mechanism (gnat_entity,
4158                          (returns_by_ref || returns_unconstrained
4159                           ? By_Reference : By_Copy));
4160         gnu_type
4161           = create_subprog_type (gnu_return_type, gnu_param_list,
4162                                  gnu_return_list, returns_unconstrained,
4163                                  returns_by_ref, returns_by_target_ptr);
4164
4165         if (has_stub)
4166           gnu_stub_type
4167             = create_subprog_type (gnu_return_type, gnu_stub_param_list,
4168                                    gnu_return_list, returns_unconstrained,
4169                                    returns_by_ref, returns_by_target_ptr);
4170
4171         /* A subprogram (something that doesn't return anything) shouldn't
4172            be considered const since there would be no reason for such a
4173            subprogram.  Note that procedures with Out (or In Out) parameters
4174            have already been converted into a function with a return type.  */
4175         if (TREE_CODE (gnu_return_type) == VOID_TYPE)
4176           const_flag = false;
4177
4178         gnu_type
4179           = build_qualified_type (gnu_type,
4180                                   TYPE_QUALS (gnu_type)
4181                                   | (TYPE_QUAL_CONST * const_flag)
4182                                   | (TYPE_QUAL_VOLATILE * volatile_flag));
4183
4184         Sloc_to_locus (Sloc (gnat_entity), &input_location);
4185
4186         if (has_stub)
4187           gnu_stub_type
4188             = build_qualified_type (gnu_stub_type,
4189                                     TYPE_QUALS (gnu_stub_type)
4190                                     | (TYPE_QUAL_CONST * const_flag)
4191                                     | (TYPE_QUAL_VOLATILE * volatile_flag));
4192
4193         /* If we have a builtin decl for that function, check the signatures
4194            compatibilities.  If the signatures are compatible, use the builtin
4195            decl.  If they are not, we expect the checker predicate to have
4196            posted the appropriate errors, and just continue with what we have
4197            so far.  */
4198         if (gnu_builtin_decl)
4199           {
4200             tree gnu_builtin_type = TREE_TYPE (gnu_builtin_decl);
4201
4202             if (compatible_signatures_p (gnu_type, gnu_builtin_type))
4203               {
4204                 gnu_decl = gnu_builtin_decl;
4205                 gnu_type = gnu_builtin_type;
4206                 break;
4207               }
4208           }
4209
4210         /* If there was no specified Interface_Name and the external and
4211            internal names of the subprogram are the same, only use the
4212            internal name to allow disambiguation of nested subprograms.  */
4213         if (No (Interface_Name (gnat_entity))
4214             && gnu_ext_name == gnu_entity_name)
4215           gnu_ext_name = NULL_TREE;
4216
4217         /* If we are defining the subprogram and it has an Address clause
4218            we must get the address expression from the saved GCC tree for the
4219            subprogram if it has a Freeze_Node.  Otherwise, we elaborate
4220            the address expression here since the front-end has guaranteed
4221            in that case that the elaboration has no effects.  If there is
4222            an Address clause and we are not defining the object, just
4223            make it a constant.  */
4224         if (Present (Address_Clause (gnat_entity)))
4225           {
4226             tree gnu_address = NULL_TREE;
4227
4228             if (definition)
4229               gnu_address
4230                 = (present_gnu_tree (gnat_entity)
4231                    ? get_gnu_tree (gnat_entity)
4232                    : gnat_to_gnu (Expression (Address_Clause (gnat_entity))));
4233
4234             save_gnu_tree (gnat_entity, NULL_TREE, false);
4235
4236             /* Convert the type of the object to a reference type that can
4237                alias everything as per 13.3(19).  */
4238             gnu_type
4239               = build_reference_type_for_mode (gnu_type, ptr_mode, true);
4240             if (gnu_address)
4241               gnu_address = convert (gnu_type, gnu_address);
4242
4243             gnu_decl
4244               = create_var_decl (gnu_entity_name, gnu_ext_name, gnu_type,
4245                                  gnu_address, false, Is_Public (gnat_entity),
4246                                  extern_flag, false, NULL, gnat_entity);
4247             DECL_BY_REF_P (gnu_decl) = 1;
4248           }
4249
4250         else if (kind == E_Subprogram_Type)
4251           gnu_decl = create_type_decl (gnu_entity_name, gnu_type, attr_list,
4252                                        !Comes_From_Source (gnat_entity),
4253                                        debug_info_p, gnat_entity);
4254         else
4255           {
4256             if (has_stub)
4257               {
4258                 gnu_stub_name = gnu_ext_name;
4259                 gnu_ext_name = create_concat_name (gnat_entity, "internal");
4260                 public_flag = false;
4261               }
4262
4263             gnu_decl = create_subprog_decl (gnu_entity_name, gnu_ext_name,
4264                                             gnu_type, gnu_param_list,
4265                                             inline_flag, public_flag,
4266                                             extern_flag, attr_list,
4267                                             gnat_entity);
4268             if (has_stub)
4269               {
4270                 tree gnu_stub_decl
4271                   = create_subprog_decl (gnu_entity_name, gnu_stub_name,
4272                                          gnu_stub_type, gnu_stub_param_list,
4273                                          inline_flag, true,
4274                                          extern_flag, attr_list,
4275                                          gnat_entity);
4276                 SET_DECL_FUNCTION_STUB (gnu_decl, gnu_stub_decl);
4277               }
4278
4279             /* This is unrelated to the stub built right above.  */
4280             DECL_STUBBED_P (gnu_decl)
4281               = Convention (gnat_entity) == Convention_Stubbed;
4282           }
4283       }
4284       break;
4285
4286     case E_Incomplete_Type:
4287     case E_Incomplete_Subtype:
4288     case E_Private_Type:
4289     case E_Private_Subtype:
4290     case E_Limited_Private_Type:
4291     case E_Limited_Private_Subtype:
4292     case E_Record_Type_With_Private:
4293     case E_Record_Subtype_With_Private:
4294       {
4295         /* Get the "full view" of this entity.  If this is an incomplete
4296            entity from a limited with, treat its non-limited view as the
4297            full view.  Otherwise, use either the full view or the underlying
4298            full view, whichever is present.  This is used in all the tests
4299            below.  */
4300         Entity_Id full_view
4301           = (IN (Ekind (gnat_entity), Incomplete_Kind)
4302              && From_With_Type (gnat_entity))
4303             ? Non_Limited_View (gnat_entity)
4304             : Present (Full_View (gnat_entity))
4305               ? Full_View (gnat_entity)
4306               : Underlying_Full_View (gnat_entity);
4307
4308         /* If this is an incomplete type with no full view, it must be a Taft
4309            Amendment type, in which case we return a dummy type.  Otherwise,
4310            just get the type from its Etype.  */
4311         if (No (full_view))
4312           {
4313             if (kind == E_Incomplete_Type)
4314               {
4315                 gnu_type = make_dummy_type (gnat_entity);
4316                 gnu_decl = TYPE_STUB_DECL (gnu_type);
4317               }
4318             else
4319               {
4320                 gnu_decl = gnat_to_gnu_entity (Etype (gnat_entity),
4321                                                NULL_TREE, 0);
4322                 maybe_present = true;
4323               }
4324             break;
4325           }
4326
4327         /* If we already made a type for the full view, reuse it.  */
4328         else if (present_gnu_tree (full_view))
4329           {
4330             gnu_decl = get_gnu_tree (full_view);
4331             break;
4332           }
4333
4334         /* Otherwise, if we are not defining the type now, get the type
4335            from the full view.  But always get the type from the full view
4336            for define on use types, since otherwise we won't see them!  */
4337         else if (!definition
4338                  || (Is_Itype (full_view)
4339                    && No (Freeze_Node (gnat_entity)))
4340                  || (Is_Itype (gnat_entity)
4341                    && No (Freeze_Node (full_view))))
4342           {
4343             gnu_decl = gnat_to_gnu_entity (full_view, NULL_TREE, 0);
4344             maybe_present = true;
4345             break;
4346           }
4347
4348         /* For incomplete types, make a dummy type entry which will be
4349            replaced later.  Save it as the full declaration's type so
4350            we can do any needed updates when we see it.  */
4351         gnu_type = make_dummy_type (gnat_entity);
4352         gnu_decl = TYPE_STUB_DECL (gnu_type);
4353         save_gnu_tree (full_view, gnu_decl, 0);
4354         break;
4355       }
4356
4357       /* Simple class_wide types are always viewed as their root_type
4358          by Gigi unless an Equivalent_Type is specified.  */
4359     case E_Class_Wide_Type:
4360       gnu_decl = gnat_to_gnu_entity (gnat_equiv_type, NULL_TREE, 0);
4361       maybe_present = true;
4362       break;
4363
4364     case E_Task_Type:
4365     case E_Task_Subtype:
4366     case E_Protected_Type:
4367     case E_Protected_Subtype:
4368       if (type_annotate_only && No (gnat_equiv_type))
4369         gnu_type = void_type_node;
4370       else
4371         gnu_type = gnat_to_gnu_type (gnat_equiv_type);
4372
4373       maybe_present = true;
4374       break;
4375
4376     case E_Label:
4377       gnu_decl = create_label_decl (gnu_entity_name);
4378       break;
4379
4380     case E_Block:
4381     case E_Loop:
4382       /* Nothing at all to do here, so just return an ERROR_MARK and claim
4383          we've already saved it, so we don't try to.  */
4384       gnu_decl = error_mark_node;
4385       saved = true;
4386       break;
4387
4388     default:
4389       gcc_unreachable ();
4390     }
4391
4392   /* If we had a case where we evaluated another type and it might have
4393      defined this one, handle it here.  */
4394   if (maybe_present && present_gnu_tree (gnat_entity))
4395     {
4396       gnu_decl = get_gnu_tree (gnat_entity);
4397       saved = true;
4398     }
4399
4400   /* If we are processing a type and there is either no decl for it or
4401      we just made one, do some common processing for the type, such as
4402      handling alignment and possible padding.  */
4403   if (is_type && (!gnu_decl || this_made_decl))
4404     {
4405       if (Is_Tagged_Type (gnat_entity)
4406           || Is_Class_Wide_Equivalent_Type (gnat_entity))
4407         TYPE_ALIGN_OK (gnu_type) = 1;
4408
4409       if (AGGREGATE_TYPE_P (gnu_type) && Is_By_Reference_Type (gnat_entity))
4410         TYPE_BY_REFERENCE_P (gnu_type) = 1;
4411
4412       /* ??? Don't set the size for a String_Literal since it is either
4413          confirming or we don't handle it properly (if the low bound is
4414          non-constant).  */
4415       if (!gnu_size && kind != E_String_Literal_Subtype)
4416         gnu_size = validate_size (Esize (gnat_entity), gnu_type, gnat_entity,
4417                                   TYPE_DECL, false,
4418                                   Has_Size_Clause (gnat_entity));
4419
4420       /* If a size was specified, see if we can make a new type of that size
4421          by rearranging the type, for example from a fat to a thin pointer.  */
4422       if (gnu_size)
4423         {
4424           gnu_type
4425             = make_type_from_size (gnu_type, gnu_size,
4426                                    Has_Biased_Representation (gnat_entity));
4427
4428           if (operand_equal_p (TYPE_SIZE (gnu_type), gnu_size, 0)
4429               && operand_equal_p (rm_size (gnu_type), gnu_size, 0))
4430             gnu_size = 0;
4431         }
4432
4433       /* If the alignment hasn't already been processed and this is
4434          not an unconstrained array, see if an alignment is specified.
4435          If not, we pick a default alignment for atomic objects.  */
4436       if (align != 0 || TREE_CODE (gnu_type) == UNCONSTRAINED_ARRAY_TYPE)
4437         ;
4438       else if (Known_Alignment (gnat_entity))
4439         {
4440           align = validate_alignment (Alignment (gnat_entity), gnat_entity,
4441                                       TYPE_ALIGN (gnu_type));
4442
4443           /* Warn on suspiciously large alignments.  This should catch
4444              errors about the (alignment,byte)/(size,bit) discrepancy.  */
4445           if (align > BIGGEST_ALIGNMENT && Has_Alignment_Clause (gnat_entity))
4446             {
4447               tree size;
4448
4449               /* If a size was specified, take it into account.  Otherwise
4450                  use the RM size for records as the type size has already
4451                  been adjusted to the alignment.  */
4452               if (gnu_size)
4453                 size = gnu_size;
4454               else if ((TREE_CODE (gnu_type) == RECORD_TYPE
4455                         || TREE_CODE (gnu_type) == UNION_TYPE
4456                         || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
4457                        && !TYPE_IS_FAT_POINTER_P (gnu_type))
4458                 size = rm_size (gnu_type);
4459               else
4460                 size = TYPE_SIZE (gnu_type);
4461
4462               /* Consider an alignment as suspicious if the alignment/size
4463                  ratio is greater or equal to the byte/bit ratio.  */
4464               if (host_integerp (size, 1)
4465                   && align >= TREE_INT_CST_LOW (size) * BITS_PER_UNIT)
4466                 post_error_ne ("?suspiciously large alignment specified for&",
4467                                Expression (Alignment_Clause (gnat_entity)),
4468                                gnat_entity);
4469             }
4470         }
4471       else if (Is_Atomic (gnat_entity) && !gnu_size
4472                && host_integerp (TYPE_SIZE (gnu_type), 1)
4473                && integer_pow2p (TYPE_SIZE (gnu_type)))
4474         align = MIN (BIGGEST_ALIGNMENT,
4475                      tree_low_cst (TYPE_SIZE (gnu_type), 1));
4476       else if (Is_Atomic (gnat_entity) && gnu_size
4477                && host_integerp (gnu_size, 1)
4478                && integer_pow2p (gnu_size))
4479         align = MIN (BIGGEST_ALIGNMENT, tree_low_cst (gnu_size, 1));
4480
4481       /* See if we need to pad the type.  If we did, and made a record,
4482          the name of the new type may be changed.  So get it back for
4483          us when we make the new TYPE_DECL below.  */
4484       if (gnu_size || align > 0)
4485         gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity,
4486                                    "PAD", true, definition, false);
4487
4488       if (TREE_CODE (gnu_type) == RECORD_TYPE
4489           && TYPE_IS_PADDING_P (gnu_type))
4490         {
4491           gnu_entity_name = TYPE_NAME (gnu_type);
4492           if (TREE_CODE (gnu_entity_name) == TYPE_DECL)
4493             gnu_entity_name = DECL_NAME (gnu_entity_name);
4494         }
4495
4496       set_rm_size (RM_Size (gnat_entity), gnu_type, gnat_entity);
4497
4498       /* If we are at global level, GCC will have applied variable_size to
4499          the type, but that won't have done anything.  So, if it's not
4500          a constant or self-referential, call elaborate_expression_1 to
4501          make a variable for the size rather than calculating it each time.
4502          Handle both the RM size and the actual size.  */
4503       if (global_bindings_p ()
4504           && TYPE_SIZE (gnu_type)
4505           && !TREE_CONSTANT (TYPE_SIZE (gnu_type))
4506           && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type)))
4507         {
4508           if (TREE_CODE (gnu_type) == RECORD_TYPE
4509               && operand_equal_p (TYPE_ADA_SIZE (gnu_type),
4510                                   TYPE_SIZE (gnu_type), 0))
4511             {
4512               TYPE_SIZE (gnu_type)
4513                 = elaborate_expression_1 (gnat_entity, gnat_entity,
4514                                           TYPE_SIZE (gnu_type),
4515                                           get_identifier ("SIZE"),
4516                                           definition, 0);
4517               SET_TYPE_ADA_SIZE (gnu_type, TYPE_SIZE (gnu_type));
4518             }
4519           else
4520             {
4521               TYPE_SIZE (gnu_type)
4522                 = elaborate_expression_1 (gnat_entity, gnat_entity,
4523                                           TYPE_SIZE (gnu_type),
4524                                           get_identifier ("SIZE"),
4525                                           definition, 0);
4526
4527               /* ??? For now, store the size as a multiple of the alignment
4528                  in bytes so that we can see the alignment from the tree.  */
4529               TYPE_SIZE_UNIT (gnu_type)
4530                 = build_binary_op
4531                   (MULT_EXPR, sizetype,
4532                    elaborate_expression_1
4533                    (gnat_entity, gnat_entity,
4534                     build_binary_op (EXACT_DIV_EXPR, sizetype,
4535                                      TYPE_SIZE_UNIT (gnu_type),
4536                                      size_int (TYPE_ALIGN (gnu_type)
4537                                                / BITS_PER_UNIT)),
4538                     get_identifier ("SIZE_A_UNIT"),
4539                     definition, 0),
4540                    size_int (TYPE_ALIGN (gnu_type) / BITS_PER_UNIT));
4541
4542               if (TREE_CODE (gnu_type) == RECORD_TYPE)
4543                 SET_TYPE_ADA_SIZE
4544                   (gnu_type,
4545                    elaborate_expression_1 (gnat_entity,
4546                                            gnat_entity,
4547                                            TYPE_ADA_SIZE (gnu_type),
4548                                            get_identifier ("RM_SIZE"),
4549                                            definition, 0));
4550                  }
4551         }
4552
4553       /* If this is a record type or subtype, call elaborate_expression_1 on
4554          any field position.  Do this for both global and local types.
4555          Skip any fields that we haven't made trees for to avoid problems with
4556          class wide types.  */
4557       if (IN (kind, Record_Kind))
4558         for (gnat_temp = First_Entity (gnat_entity); Present (gnat_temp);
4559              gnat_temp = Next_Entity (gnat_temp))
4560           if (Ekind (gnat_temp) == E_Component && present_gnu_tree (gnat_temp))
4561             {
4562               tree gnu_field = get_gnu_tree (gnat_temp);
4563
4564               /* ??? Unfortunately, GCC needs to be able to prove the
4565                  alignment of this offset and if it's a variable, it can't.
4566                  In GCC 3.4, we'll use DECL_OFFSET_ALIGN in some way, but
4567                  right now, we have to put in an explicit multiply and
4568                  divide by that value.  */
4569               if (!CONTAINS_PLACEHOLDER_P (DECL_FIELD_OFFSET (gnu_field)))
4570                 {
4571                 DECL_FIELD_OFFSET (gnu_field)
4572                   = build_binary_op
4573                     (MULT_EXPR, sizetype,
4574                      elaborate_expression_1
4575                      (gnat_temp, gnat_temp,
4576                       build_binary_op (EXACT_DIV_EXPR, sizetype,
4577                                        DECL_FIELD_OFFSET (gnu_field),
4578                                        size_int (DECL_OFFSET_ALIGN (gnu_field)
4579                                                  / BITS_PER_UNIT)),
4580                       get_identifier ("OFFSET"),
4581                       definition, 0),
4582                      size_int (DECL_OFFSET_ALIGN (gnu_field) / BITS_PER_UNIT));
4583
4584                 /* ??? The context of gnu_field is not necessarily gnu_type so
4585                    the MULT_EXPR node built above may not be marked by the call
4586                    to create_type_decl below.  */
4587                 if (global_bindings_p ())
4588                   mark_visited (&DECL_FIELD_OFFSET (gnu_field));
4589                 }
4590             }
4591
4592       gnu_type = build_qualified_type (gnu_type,
4593                                        (TYPE_QUALS (gnu_type)
4594                                         | (TYPE_QUAL_VOLATILE
4595                                            * Treat_As_Volatile (gnat_entity))));
4596
4597       if (Is_Atomic (gnat_entity))
4598         check_ok_for_atomic (gnu_type, gnat_entity, false);
4599
4600       if (Present (Alignment_Clause (gnat_entity)))
4601         TYPE_USER_ALIGN (gnu_type) = 1;
4602
4603       if (Universal_Aliasing (gnat_entity))
4604         TYPE_UNIVERSAL_ALIASING_P (TYPE_MAIN_VARIANT (gnu_type)) = 1;
4605
4606       if (!gnu_decl)
4607         gnu_decl = create_type_decl (gnu_entity_name, gnu_type, attr_list,
4608                                      !Comes_From_Source (gnat_entity),
4609                                      debug_info_p, gnat_entity);
4610       else
4611         TREE_TYPE (gnu_decl) = gnu_type;
4612     }
4613
4614   if (is_type && !TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl)))
4615     {
4616       gnu_type = TREE_TYPE (gnu_decl);
4617
4618       /* If this is a derived type, relate its alias set to that of its parent
4619          to avoid troubles when a call to an inherited primitive is inlined in
4620          a context where a derived object is accessed.  The inlined code works
4621          on the parent view so the resulting code may access the same object
4622          using both the parent and the derived alias sets, which thus have to
4623          conflict.  As the same issue arises with component references, the
4624          parent alias set also has to conflict with composite types enclosing
4625          derived components.  For instance, if we have:
4626
4627             type D is new T;
4628             type R is record
4629                Component : D;
4630             end record;
4631
4632          we want T to conflict with both D and R, in addition to R being a
4633          superset of D by record/component construction.
4634
4635          One way to achieve this is to perform an alias set copy from the
4636          parent to the derived type.  This is not quite appropriate, though,
4637          as we don't want separate derived types to conflict with each other:
4638
4639             type I1 is new Integer;
4640             type I2 is new Integer;
4641
4642          We want I1 and I2 to both conflict with Integer but we do not want
4643          I1 to conflict with I2, and an alias set copy on derivation would
4644          have that effect.
4645
4646          The option chosen is to make the alias set of the derived type a
4647          superset of that of its parent type.  It trivially fulfills the
4648          simple requirement for the Integer derivation example above, and
4649          the component case as well by superset transitivity:
4650
4651                    superset      superset
4652                 R ----------> D ----------> T
4653
4654          The language rules ensure the parent type is already frozen here.  */
4655       if (Is_Derived_Type (gnat_entity))
4656         {
4657           tree gnu_parent_type = gnat_to_gnu_type (Etype (gnat_entity));
4658           relate_alias_sets (gnu_type, gnu_parent_type, ALIAS_SET_SUPERSET);
4659         }
4660
4661       /* Back-annotate the Alignment of the type if not already in the
4662          tree.  Likewise for sizes.  */
4663       if (Unknown_Alignment (gnat_entity))
4664         {
4665           unsigned int double_align, align;
4666           bool is_capped_double, align_clause;
4667
4668           /* If the default alignment of "double" or larger scalar types is
4669              specifically capped and this is not an array with an alignment
4670              clause on the component type, return the cap.  */
4671           if ((double_align = double_float_alignment) > 0)
4672             is_capped_double
4673               = is_double_float_or_array (gnat_entity, &align_clause);
4674           else if ((double_align = double_scalar_alignment) > 0)
4675             is_capped_double
4676               = is_double_scalar_or_array (gnat_entity, &align_clause);
4677           else
4678             is_capped_double = align_clause = false;
4679
4680           if (is_capped_double && !align_clause)
4681             align = double_align;
4682           else
4683             align = TYPE_ALIGN (gnu_type) / BITS_PER_UNIT;
4684
4685           Set_Alignment (gnat_entity, UI_From_Int (align));
4686         }
4687
4688       if (Unknown_Esize (gnat_entity) && TYPE_SIZE (gnu_type))
4689         {
4690           /* If the size is self-referential, we annotate the maximum
4691              value of that size.  */
4692           tree gnu_size = TYPE_SIZE (gnu_type);
4693
4694           if (CONTAINS_PLACEHOLDER_P (gnu_size))
4695             gnu_size = max_size (gnu_size, true);
4696
4697           Set_Esize (gnat_entity, annotate_value (gnu_size));
4698
4699           if (type_annotate_only && Is_Tagged_Type (gnat_entity))
4700             {
4701               /* In this mode the tag and the parent components are not
4702                  generated by the front-end, so the sizes must be adjusted
4703                  explicitly now.  */
4704               int size_offset, new_size;
4705
4706               if (Is_Derived_Type (gnat_entity))
4707                 {
4708                   size_offset
4709                     = UI_To_Int (Esize (Etype (Base_Type (gnat_entity))));
4710                   Set_Alignment (gnat_entity,
4711                                  Alignment (Etype (Base_Type (gnat_entity))));
4712                 }
4713               else
4714                 size_offset = POINTER_SIZE;
4715
4716               new_size = UI_To_Int (Esize (gnat_entity)) + size_offset;
4717               Set_Esize (gnat_entity,
4718                          UI_From_Int (((new_size + (POINTER_SIZE - 1))
4719                                        / POINTER_SIZE) * POINTER_SIZE));
4720               Set_RM_Size (gnat_entity, Esize (gnat_entity));
4721             }
4722         }
4723
4724       if (Unknown_RM_Size (gnat_entity) && rm_size (gnu_type))
4725         Set_RM_Size (gnat_entity, annotate_value (rm_size (gnu_type)));
4726     }
4727
4728   if (!Comes_From_Source (gnat_entity) && DECL_P (gnu_decl))
4729     DECL_ARTIFICIAL (gnu_decl) = 1;
4730
4731   if (!debug_info_p && DECL_P (gnu_decl)
4732       && TREE_CODE (gnu_decl) != FUNCTION_DECL
4733       && No (Renamed_Object (gnat_entity)))
4734     DECL_IGNORED_P (gnu_decl) = 1;
4735
4736   /* If we haven't already, associate the ..._DECL node that we just made with
4737      the input GNAT entity node.  */
4738   if (!saved)
4739     save_gnu_tree (gnat_entity, gnu_decl, false);
4740
4741   /* If this is an enumeration or floating-point type, we were not able to set
4742      the bounds since they refer to the type.  These are always static.  */
4743   if ((kind == E_Enumeration_Type && Present (First_Literal (gnat_entity)))
4744       || (kind == E_Floating_Point_Type && !Vax_Float (gnat_entity)))
4745     {
4746       tree gnu_scalar_type = gnu_type;
4747
4748       /* If this is a padded type, we need to use the underlying type.  */
4749       if (TREE_CODE (gnu_scalar_type) == RECORD_TYPE
4750           && TYPE_IS_PADDING_P (gnu_scalar_type))
4751         gnu_scalar_type = TREE_TYPE (TYPE_FIELDS (gnu_scalar_type));
4752
4753       /* If this is a floating point type and we haven't set a floating
4754          point type yet, use this in the evaluation of the bounds.  */
4755       if (!longest_float_type_node && kind == E_Floating_Point_Type)
4756         longest_float_type_node = gnu_scalar_type;
4757
4758       TYPE_MIN_VALUE (gnu_scalar_type)
4759         = gnat_to_gnu (Type_Low_Bound (gnat_entity));
4760       TYPE_MAX_VALUE (gnu_scalar_type)
4761         = gnat_to_gnu (Type_High_Bound (gnat_entity));
4762
4763       /* For enumeration types, write full debugging information.  */
4764       if (kind == E_Enumeration_Type)
4765         {
4766           /* Since this has both a typedef and a tag, avoid outputting
4767              the name twice.  */
4768           DECL_ARTIFICIAL (gnu_decl) = 1;
4769           rest_of_type_decl_compilation (gnu_decl);
4770         }
4771     }
4772
4773   /* If we deferred processing of incomplete types, re-enable it.  If there
4774      were no other disables and we have some to process, do so.  */
4775   if (this_deferred && --defer_incomplete_level == 0)
4776     {
4777       if (defer_incomplete_list)
4778         {
4779           struct incomplete *incp, *next;
4780
4781           /* We are back to level 0 for the deferring of incomplete types.
4782              But processing these incomplete types below may itself require
4783              deferring, so preserve what we have and restart from scratch.  */
4784           incp = defer_incomplete_list;
4785           defer_incomplete_list = NULL;
4786
4787           /* For finalization, however, all types must be complete so we
4788              cannot do the same because deferred incomplete types may end up
4789              referencing each other.  Process them all recursively first.  */
4790           defer_finalize_level++;
4791
4792           for (; incp; incp = next)
4793             {
4794               next = incp->next;
4795
4796               if (incp->old_type)
4797                 update_pointer_to (TYPE_MAIN_VARIANT (incp->old_type),
4798                                    gnat_to_gnu_type (incp->full_type));
4799               free (incp);
4800             }
4801
4802           defer_finalize_level--;
4803         }
4804
4805       /* All the deferred incomplete types have been processed so we can
4806          now proceed with the finalization of the deferred types.  */
4807       if (defer_finalize_level == 0 && defer_finalize_list)
4808         {
4809           unsigned int i;
4810           tree t;
4811
4812           for (i = 0; VEC_iterate (tree, defer_finalize_list, i, t); i++)
4813             rest_of_type_decl_compilation_no_defer (t);
4814
4815           VEC_free (tree, heap, defer_finalize_list);
4816         }
4817     }
4818
4819   /* If we are not defining this type, see if it's in the incomplete list.
4820      If so, handle that list entry now.  */
4821   else if (!definition)
4822     {
4823       struct incomplete *incp;
4824
4825       for (incp = defer_incomplete_list; incp; incp = incp->next)
4826         if (incp->old_type && incp->full_type == gnat_entity)
4827           {
4828             update_pointer_to (TYPE_MAIN_VARIANT (incp->old_type),
4829                                TREE_TYPE (gnu_decl));
4830             incp->old_type = NULL_TREE;
4831           }
4832     }
4833
4834   if (this_global)
4835     force_global--;
4836
4837   /* If this is a packed array type whose original array type is itself
4838      an Itype without freeze node, make sure the latter is processed.  */
4839   if (Is_Packed_Array_Type (gnat_entity)
4840       && Is_Itype (Original_Array_Type (gnat_entity))
4841       && No (Freeze_Node (Original_Array_Type (gnat_entity)))
4842       && !present_gnu_tree (Original_Array_Type (gnat_entity)))
4843     gnat_to_gnu_entity (Original_Array_Type (gnat_entity), NULL_TREE, 0);
4844
4845   return gnu_decl;
4846 }
4847
4848 /* Similar, but if the returned value is a COMPONENT_REF, return the
4849    FIELD_DECL.  */
4850
4851 tree
4852 gnat_to_gnu_field_decl (Entity_Id gnat_entity)
4853 {
4854   tree gnu_field = gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
4855
4856   if (TREE_CODE (gnu_field) == COMPONENT_REF)
4857     gnu_field = TREE_OPERAND (gnu_field, 1);
4858
4859   return gnu_field;
4860 }
4861
4862 /* Similar, but GNAT_ENTITY is assumed to refer to a GNAT type.  Return
4863    the GCC type corresponding to that entity.  */
4864
4865 tree
4866 gnat_to_gnu_type (Entity_Id gnat_entity)
4867 {
4868   tree gnu_decl;
4869
4870   /* The back end never attempts to annotate generic types.  */
4871   if (Is_Generic_Type (gnat_entity) && type_annotate_only)
4872      return void_type_node;
4873
4874   gnu_decl = gnat_to_gnu_entity (gnat_entity, NULL_TREE, 0);
4875   gcc_assert (TREE_CODE (gnu_decl) == TYPE_DECL);
4876
4877   return TREE_TYPE (gnu_decl);
4878 }
4879
4880 /* Similar, but GNAT_ENTITY is assumed to refer to a GNAT type.  Return
4881    the unpadded version of the GCC type corresponding to that entity.  */
4882
4883 tree
4884 get_unpadded_type (Entity_Id gnat_entity)
4885 {
4886   tree type = gnat_to_gnu_type (gnat_entity);
4887
4888   if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
4889     type = TREE_TYPE (TYPE_FIELDS (type));
4890
4891   return type;
4892 }
4893 \f
4894 /* Wrap up compilation of DECL, a TYPE_DECL, possibly deferring it.
4895    Every TYPE_DECL generated for a type definition must be passed
4896    to this function once everything else has been done for it.  */
4897
4898 void
4899 rest_of_type_decl_compilation (tree decl)
4900 {
4901   /* We need to defer finalizing the type if incomplete types
4902      are being deferred or if they are being processed.  */
4903   if (defer_incomplete_level || defer_finalize_level)
4904     VEC_safe_push (tree, heap, defer_finalize_list, decl);
4905   else
4906     rest_of_type_decl_compilation_no_defer (decl);
4907 }
4908
4909 /* Same as above but without deferring the compilation.  This
4910    function should not be invoked directly on a TYPE_DECL.  */
4911
4912 static void
4913 rest_of_type_decl_compilation_no_defer (tree decl)
4914 {
4915   const int toplev = global_bindings_p ();
4916   tree t = TREE_TYPE (decl);
4917
4918   rest_of_decl_compilation (decl, toplev, 0);
4919
4920   /* Now process all the variants.  This is needed for STABS.  */
4921   for (t = TYPE_MAIN_VARIANT (t); t; t = TYPE_NEXT_VARIANT (t))
4922     {
4923       if (t == TREE_TYPE (decl))
4924         continue;
4925
4926       if (!TYPE_STUB_DECL (t))
4927         TYPE_STUB_DECL (t) = create_type_stub_decl (DECL_NAME (decl), t);
4928
4929       rest_of_type_compilation (t, toplev);
4930     }
4931 }
4932
4933 /* Finalize any From_With_Type incomplete types.  We do this after processing
4934    our compilation unit and after processing its spec, if this is a body.  */
4935
4936 void
4937 finalize_from_with_types (void)
4938 {
4939   struct incomplete *incp = defer_limited_with;
4940   struct incomplete *next;
4941
4942   defer_limited_with = 0;
4943   for (; incp; incp = next)
4944     {
4945       next = incp->next;
4946
4947       if (incp->old_type != 0)
4948         update_pointer_to (TYPE_MAIN_VARIANT (incp->old_type),
4949                            gnat_to_gnu_type (incp->full_type));
4950       free (incp);
4951     }
4952 }
4953
4954 /* Return the equivalent type to be used for GNAT_ENTITY, if it's a
4955    kind of type (such E_Task_Type) that has a different type which Gigi
4956    uses for its representation.  If the type does not have a special type
4957    for its representation, return GNAT_ENTITY.  If a type is supposed to
4958    exist, but does not, abort unless annotating types, in which case
4959    return Empty.  If GNAT_ENTITY is Empty, return Empty.  */
4960
4961 Entity_Id
4962 Gigi_Equivalent_Type (Entity_Id gnat_entity)
4963 {
4964   Entity_Id gnat_equiv = gnat_entity;
4965
4966   if (No (gnat_entity))
4967     return gnat_entity;
4968
4969   switch (Ekind (gnat_entity))
4970     {
4971     case E_Class_Wide_Subtype:
4972       if (Present (Equivalent_Type (gnat_entity)))
4973         gnat_equiv = Equivalent_Type (gnat_entity);
4974       break;
4975
4976     case E_Access_Protected_Subprogram_Type:
4977     case E_Anonymous_Access_Protected_Subprogram_Type:
4978       gnat_equiv = Equivalent_Type (gnat_entity);
4979       break;
4980
4981     case E_Class_Wide_Type:
4982       gnat_equiv = ((Present (Equivalent_Type (gnat_entity)))
4983                     ? Equivalent_Type (gnat_entity)
4984                     : Root_Type (gnat_entity));
4985       break;
4986
4987     case E_Task_Type:
4988     case E_Task_Subtype:
4989     case E_Protected_Type:
4990     case E_Protected_Subtype:
4991       gnat_equiv = Corresponding_Record_Type (gnat_entity);
4992       break;
4993
4994     default:
4995       break;
4996     }
4997
4998   gcc_assert (Present (gnat_equiv) || type_annotate_only);
4999   return gnat_equiv;
5000 }
5001
5002 /* Return a GCC tree for a parameter corresponding to GNAT_PARAM and
5003    using MECH as its passing mechanism, to be placed in the parameter
5004    list built for GNAT_SUBPROG.  Assume a foreign convention for the
5005    latter if FOREIGN is true.  Also set CICO to true if the parameter
5006    must use the copy-in copy-out implementation mechanism.
5007
5008    The returned tree is a PARM_DECL, except for those cases where no
5009    parameter needs to be actually passed to the subprogram; the type
5010    of this "shadow" parameter is then returned instead.  */
5011
5012 static tree
5013 gnat_to_gnu_param (Entity_Id gnat_param, Mechanism_Type mech,
5014                    Entity_Id gnat_subprog, bool foreign, bool *cico)
5015 {
5016   tree gnu_param_name = get_entity_name (gnat_param);
5017   tree gnu_param_type = gnat_to_gnu_type (Etype (gnat_param));
5018   tree gnu_param_type_alt = NULL_TREE;
5019   bool in_param = (Ekind (gnat_param) == E_In_Parameter);
5020   /* The parameter can be indirectly modified if its address is taken.  */
5021   bool ro_param = in_param && !Address_Taken (gnat_param);
5022   bool by_return = false, by_component_ptr = false, by_ref = false;
5023   tree gnu_param;
5024
5025   /* Copy-return is used only for the first parameter of a valued procedure.
5026      It's a copy mechanism for which a parameter is never allocated.  */
5027   if (mech == By_Copy_Return)
5028     {
5029       gcc_assert (Ekind (gnat_param) == E_Out_Parameter);
5030       mech = By_Copy;
5031       by_return = true;
5032     }
5033
5034   /* If this is either a foreign function or if the underlying type won't
5035      be passed by reference, strip off possible padding type.  */
5036   if (TREE_CODE (gnu_param_type) == RECORD_TYPE
5037       && TYPE_IS_PADDING_P (gnu_param_type))
5038     {
5039       tree unpadded_type = TREE_TYPE (TYPE_FIELDS (gnu_param_type));
5040
5041       if (mech == By_Reference
5042           || foreign
5043           || (!must_pass_by_ref (unpadded_type)
5044               && (mech == By_Copy || !default_pass_by_ref (unpadded_type))))
5045         gnu_param_type = unpadded_type;
5046     }
5047
5048   /* If this is a read-only parameter, make a variant of the type that is
5049      read-only.  ??? However, if this is an unconstrained array, that type
5050      can be very complex, so skip it for now.  Likewise for any other
5051      self-referential type.  */
5052   if (ro_param
5053       && TREE_CODE (gnu_param_type) != UNCONSTRAINED_ARRAY_TYPE
5054       && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_param_type)))
5055     gnu_param_type = build_qualified_type (gnu_param_type,
5056                                            (TYPE_QUALS (gnu_param_type)
5057                                             | TYPE_QUAL_CONST));
5058
5059   /* For foreign conventions, pass arrays as pointers to the element type.
5060      First check for unconstrained array and get the underlying array.  */
5061   if (foreign && TREE_CODE (gnu_param_type) == UNCONSTRAINED_ARRAY_TYPE)
5062     gnu_param_type
5063       = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_param_type))));
5064
5065   /* VMS descriptors are themselves passed by reference.  */
5066   if (mech == By_Short_Descriptor ||
5067       (mech == By_Descriptor && TARGET_ABI_OPEN_VMS && !TARGET_MALLOC64))
5068     gnu_param_type
5069       = build_pointer_type (build_vms_descriptor32 (gnu_param_type,
5070                                                     Mechanism (gnat_param),
5071                                                     gnat_subprog));
5072   else if (mech == By_Descriptor)
5073     {
5074       /* Build both a 32-bit and 64-bit descriptor, one of which will be
5075          chosen in fill_vms_descriptor.  */
5076       gnu_param_type_alt
5077         = build_pointer_type (build_vms_descriptor32 (gnu_param_type,
5078                                                       Mechanism (gnat_param),
5079                                                       gnat_subprog));
5080       gnu_param_type
5081         = build_pointer_type (build_vms_descriptor (gnu_param_type,
5082                                                     Mechanism (gnat_param),
5083                                                     gnat_subprog));
5084     }
5085
5086   /* Arrays are passed as pointers to element type for foreign conventions.  */
5087   else if (foreign
5088            && mech != By_Copy
5089            && TREE_CODE (gnu_param_type) == ARRAY_TYPE)
5090     {
5091       /* Strip off any multi-dimensional entries, then strip
5092          off the last array to get the component type.  */
5093       while (TREE_CODE (TREE_TYPE (gnu_param_type)) == ARRAY_TYPE
5094              && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_param_type)))
5095         gnu_param_type = TREE_TYPE (gnu_param_type);
5096
5097       by_component_ptr = true;
5098       gnu_param_type = TREE_TYPE (gnu_param_type);
5099
5100       if (ro_param)
5101         gnu_param_type = build_qualified_type (gnu_param_type,
5102                                                (TYPE_QUALS (gnu_param_type)
5103                                                 | TYPE_QUAL_CONST));
5104
5105       gnu_param_type = build_pointer_type (gnu_param_type);
5106     }
5107
5108   /* Fat pointers are passed as thin pointers for foreign conventions.  */
5109   else if (foreign && TYPE_FAT_POINTER_P (gnu_param_type))
5110     gnu_param_type
5111       = make_type_from_size (gnu_param_type, size_int (POINTER_SIZE), 0);
5112
5113   /* If we must pass or were requested to pass by reference, do so.
5114      If we were requested to pass by copy, do so.
5115      Otherwise, for foreign conventions, pass In Out or Out parameters
5116      or aggregates by reference.  For COBOL and Fortran, pass all
5117      integer and FP types that way too.  For Convention Ada, use
5118      the standard Ada default.  */
5119   else if (must_pass_by_ref (gnu_param_type)
5120            || mech == By_Reference
5121            || (mech != By_Copy
5122                && ((foreign
5123                     && (!in_param || AGGREGATE_TYPE_P (gnu_param_type)))
5124                    || (foreign
5125                        && (Convention (gnat_subprog) == Convention_Fortran
5126                            || Convention (gnat_subprog) == Convention_COBOL)
5127                        && (INTEGRAL_TYPE_P (gnu_param_type)
5128                            || FLOAT_TYPE_P (gnu_param_type)))
5129                    || (!foreign
5130                        && default_pass_by_ref (gnu_param_type)))))
5131     {
5132       gnu_param_type = build_reference_type (gnu_param_type);
5133       by_ref = true;
5134     }
5135
5136   /* Pass In Out or Out parameters using copy-in copy-out mechanism.  */
5137   else if (!in_param)
5138     *cico = true;
5139
5140   if (mech == By_Copy && (by_ref || by_component_ptr))
5141     post_error ("?cannot pass & by copy", gnat_param);
5142
5143   /* If this is an Out parameter that isn't passed by reference and isn't
5144      a pointer or aggregate, we don't make a PARM_DECL for it.  Instead,
5145      it will be a VAR_DECL created when we process the procedure, so just
5146      return its type.  For the special parameter of a valued procedure,
5147      never pass it in.
5148
5149      An exception is made to cover the RM-6.4.1 rule requiring "by copy"
5150      Out parameters with discriminants or implicit initial values to be
5151      handled like In Out parameters.  These type are normally built as
5152      aggregates, hence passed by reference, except for some packed arrays
5153      which end up encoded in special integer types.
5154
5155      The exception we need to make is then for packed arrays of records
5156      with discriminants or implicit initial values.  We have no light/easy
5157      way to check for the latter case, so we merely check for packed arrays
5158      of records.  This may lead to useless copy-in operations, but in very
5159      rare cases only, as these would be exceptions in a set of already
5160      exceptional situations.  */
5161   if (Ekind (gnat_param) == E_Out_Parameter
5162       && !by_ref
5163       && (by_return
5164           || (mech != By_Descriptor
5165               && mech != By_Short_Descriptor
5166               && !POINTER_TYPE_P (gnu_param_type)
5167               && !AGGREGATE_TYPE_P (gnu_param_type)))
5168       && !(Is_Array_Type (Etype (gnat_param))
5169            && Is_Packed (Etype (gnat_param))
5170            && Is_Composite_Type (Component_Type (Etype (gnat_param)))))
5171     return gnu_param_type;
5172
5173   gnu_param = create_param_decl (gnu_param_name, gnu_param_type,
5174                                  ro_param || by_ref || by_component_ptr);
5175   DECL_BY_REF_P (gnu_param) = by_ref;
5176   DECL_BY_COMPONENT_PTR_P (gnu_param) = by_component_ptr;
5177   DECL_BY_DESCRIPTOR_P (gnu_param) = (mech == By_Descriptor ||
5178                                       mech == By_Short_Descriptor);
5179   DECL_POINTS_TO_READONLY_P (gnu_param)
5180     = (ro_param && (by_ref || by_component_ptr));
5181
5182   /* Save the alternate descriptor type, if any.  */
5183   if (gnu_param_type_alt)
5184     SET_DECL_PARM_ALT_TYPE (gnu_param, gnu_param_type_alt);
5185
5186   /* If no Mechanism was specified, indicate what we're using, then
5187      back-annotate it.  */
5188   if (mech == Default)
5189     mech = (by_ref || by_component_ptr) ? By_Reference : By_Copy;
5190
5191   Set_Mechanism (gnat_param, mech);
5192   return gnu_param;
5193 }
5194
5195 /* Return true if DISCR1 and DISCR2 represent the same discriminant.  */
5196
5197 static bool
5198 same_discriminant_p (Entity_Id discr1, Entity_Id discr2)
5199 {
5200   while (Present (Corresponding_Discriminant (discr1)))
5201     discr1 = Corresponding_Discriminant (discr1);
5202
5203   while (Present (Corresponding_Discriminant (discr2)))
5204     discr2 = Corresponding_Discriminant (discr2);
5205
5206   return
5207     Original_Record_Component (discr1) == Original_Record_Component (discr2);
5208 }
5209
5210 /* Return true if the array type specified by GNAT_TYPE and GNU_TYPE has
5211    a non-aliased component in the back-end sense.  */
5212
5213 static bool
5214 array_type_has_nonaliased_component (Entity_Id gnat_type, tree gnu_type)
5215 {
5216   /* If the type below this is a multi-array type, then
5217      this does not have aliased components.  */
5218   if (TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE
5219       && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type)))
5220     return true;
5221
5222   if (Has_Aliased_Components (gnat_type))
5223     return false;
5224
5225   return type_for_nonaliased_component_p (TREE_TYPE (gnu_type));
5226 }
5227
5228 /* Return true if GNAT_ADDRESS is a value known at compile-time.  */
5229
5230 static bool
5231 compile_time_known_address_p (Node_Id gnat_address)
5232 {
5233   /* Catch System'To_Address.  */
5234   if (Nkind (gnat_address) == N_Unchecked_Type_Conversion)
5235     gnat_address = Expression (gnat_address);
5236
5237   return Compile_Time_Known_Value (gnat_address);
5238 }
5239 \f
5240 /* Given GNAT_ENTITY, elaborate all expressions that are required to
5241    be elaborated at the point of its definition, but do nothing else.  */
5242
5243 void
5244 elaborate_entity (Entity_Id gnat_entity)
5245 {
5246   switch (Ekind (gnat_entity))
5247     {
5248     case E_Signed_Integer_Subtype:
5249     case E_Modular_Integer_Subtype:
5250     case E_Enumeration_Subtype:
5251     case E_Ordinary_Fixed_Point_Subtype:
5252     case E_Decimal_Fixed_Point_Subtype:
5253     case E_Floating_Point_Subtype:
5254       {
5255         Node_Id gnat_lb = Type_Low_Bound (gnat_entity);
5256         Node_Id gnat_hb = Type_High_Bound (gnat_entity);
5257
5258         /* ??? Tests to avoid Constraint_Error in static expressions
5259            are needed until after the front stops generating bogus
5260            conversions on bounds of real types.  */
5261         if (!Raises_Constraint_Error (gnat_lb))
5262           elaborate_expression (gnat_lb, gnat_entity, get_identifier ("L"),
5263                                 1, 0, Needs_Debug_Info (gnat_entity));
5264         if (!Raises_Constraint_Error (gnat_hb))
5265           elaborate_expression (gnat_hb, gnat_entity, get_identifier ("U"),
5266                                 1, 0, Needs_Debug_Info (gnat_entity));
5267       break;
5268       }
5269
5270     case E_Record_Type:
5271       {
5272         Node_Id full_definition = Declaration_Node (gnat_entity);
5273         Node_Id record_definition = Type_Definition (full_definition);
5274
5275         /* If this is a record extension, go a level further to find the
5276            record definition.  */
5277         if (Nkind (record_definition) == N_Derived_Type_Definition)
5278           record_definition = Record_Extension_Part (record_definition);
5279       }
5280       break;
5281
5282     case E_Record_Subtype:
5283     case E_Private_Subtype:
5284     case E_Limited_Private_Subtype:
5285     case E_Record_Subtype_With_Private:
5286       if (Is_Constrained (gnat_entity)
5287           && Has_Discriminants (Base_Type (gnat_entity))
5288           && Present (Discriminant_Constraint (gnat_entity)))
5289         {
5290           Node_Id gnat_discriminant_expr;
5291           Entity_Id gnat_field;
5292
5293           for (gnat_field = First_Discriminant (Base_Type (gnat_entity)),
5294                gnat_discriminant_expr
5295                = First_Elmt (Discriminant_Constraint (gnat_entity));
5296                Present (gnat_field);
5297                gnat_field = Next_Discriminant (gnat_field),
5298                gnat_discriminant_expr = Next_Elmt (gnat_discriminant_expr))
5299             /* ??? For now, ignore access discriminants.  */
5300             if (!Is_Access_Type (Etype (Node (gnat_discriminant_expr))))
5301               elaborate_expression (Node (gnat_discriminant_expr),
5302                                     gnat_entity,
5303                                     get_entity_name (gnat_field), 1, 0, 0);
5304         }
5305       break;
5306
5307     }
5308 }
5309 \f
5310 /* Mark GNAT_ENTITY as going out of scope at this point.  Recursively mark
5311    any entities on its entity chain similarly.  */
5312
5313 void
5314 mark_out_of_scope (Entity_Id gnat_entity)
5315 {
5316   Entity_Id gnat_sub_entity;
5317   unsigned int kind = Ekind (gnat_entity);
5318
5319   /* If this has an entity list, process all in the list.  */
5320   if (IN (kind, Class_Wide_Kind) || IN (kind, Concurrent_Kind)
5321       || IN (kind, Private_Kind)
5322       || kind == E_Block || kind == E_Entry || kind == E_Entry_Family
5323       || kind == E_Function || kind == E_Generic_Function
5324       || kind == E_Generic_Package || kind == E_Generic_Procedure
5325       || kind == E_Loop || kind == E_Operator || kind == E_Package
5326       || kind == E_Package_Body || kind == E_Procedure
5327       || kind == E_Record_Type || kind == E_Record_Subtype
5328       || kind == E_Subprogram_Body || kind == E_Subprogram_Type)
5329     for (gnat_sub_entity = First_Entity (gnat_entity);
5330          Present (gnat_sub_entity);
5331          gnat_sub_entity = Next_Entity (gnat_sub_entity))
5332       if (Scope (gnat_sub_entity) == gnat_entity
5333           && gnat_sub_entity != gnat_entity)
5334         mark_out_of_scope (gnat_sub_entity);
5335
5336   /* Now clear this if it has been defined, but only do so if it isn't
5337      a subprogram or parameter.  We could refine this, but it isn't
5338      worth it.  If this is statically allocated, it is supposed to
5339      hang around out of cope.  */
5340   if (present_gnu_tree (gnat_entity) && !Is_Statically_Allocated (gnat_entity)
5341       && kind != E_Procedure && kind != E_Function && !IN (kind, Formal_Kind))
5342     {
5343       save_gnu_tree (gnat_entity, NULL_TREE, true);
5344       save_gnu_tree (gnat_entity, error_mark_node, true);
5345     }
5346 }
5347 \f
5348 /* Relate the alias sets of GNU_NEW_TYPE and GNU_OLD_TYPE according to OP.
5349    If this is a multi-dimensional array type, do this recursively.
5350
5351    OP may be
5352    - ALIAS_SET_COPY:     the new set is made a copy of the old one.
5353    - ALIAS_SET_SUPERSET: the new set is made a superset of the old one.
5354    - ALIAS_SET_SUBSET:   the new set is made a subset of the old one.  */
5355
5356 static void
5357 relate_alias_sets (tree gnu_new_type, tree gnu_old_type, enum alias_set_op op)
5358 {
5359   /* Remove any padding from GNU_OLD_TYPE.  It doesn't matter in the case
5360      of a one-dimensional array, since the padding has the same alias set
5361      as the field type, but if it's a multi-dimensional array, we need to
5362      see the inner types.  */
5363   while (TREE_CODE (gnu_old_type) == RECORD_TYPE
5364          && (TYPE_JUSTIFIED_MODULAR_P (gnu_old_type)
5365              || TYPE_IS_PADDING_P (gnu_old_type)))
5366     gnu_old_type = TREE_TYPE (TYPE_FIELDS (gnu_old_type));
5367
5368   /* Unconstrained array types are deemed incomplete and would thus be given
5369      alias set 0.  Retrieve the underlying array type.  */
5370   if (TREE_CODE (gnu_old_type) == UNCONSTRAINED_ARRAY_TYPE)
5371     gnu_old_type
5372       = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_old_type))));
5373   if (TREE_CODE (gnu_new_type) == UNCONSTRAINED_ARRAY_TYPE)
5374     gnu_new_type
5375       = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_new_type))));
5376
5377   if (TREE_CODE (gnu_new_type) == ARRAY_TYPE
5378       && TREE_CODE (TREE_TYPE (gnu_new_type)) == ARRAY_TYPE
5379       && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_new_type)))
5380     relate_alias_sets (TREE_TYPE (gnu_new_type), TREE_TYPE (gnu_old_type), op);
5381
5382   switch (op)
5383     {
5384     case ALIAS_SET_COPY:
5385       /* The alias set shouldn't be copied between array types with different
5386          aliasing settings because this can break the aliasing relationship
5387          between the array type and its element type.  */
5388 #ifndef ENABLE_CHECKING
5389       if (flag_strict_aliasing)
5390 #endif
5391         gcc_assert (!(TREE_CODE (gnu_new_type) == ARRAY_TYPE
5392                       && TREE_CODE (gnu_old_type) == ARRAY_TYPE
5393                       && TYPE_NONALIASED_COMPONENT (gnu_new_type)
5394                          != TYPE_NONALIASED_COMPONENT (gnu_old_type)));
5395
5396       TYPE_ALIAS_SET (gnu_new_type) = get_alias_set (gnu_old_type);
5397       break;
5398
5399     case ALIAS_SET_SUBSET:
5400     case ALIAS_SET_SUPERSET:
5401       {
5402         alias_set_type old_set = get_alias_set (gnu_old_type);
5403         alias_set_type new_set = get_alias_set (gnu_new_type);
5404
5405         /* Do nothing if the alias sets conflict.  This ensures that we
5406            never call record_alias_subset several times for the same pair
5407            or at all for alias set 0.  */
5408         if (!alias_sets_conflict_p (old_set, new_set))
5409           {
5410             if (op == ALIAS_SET_SUBSET)
5411               record_alias_subset (old_set, new_set);
5412             else
5413               record_alias_subset (new_set, old_set);
5414           }
5415       }
5416       break;
5417
5418     default:
5419       gcc_unreachable ();
5420     }
5421
5422   record_component_aliases (gnu_new_type);
5423 }
5424 \f
5425 /* Return a TREE_LIST describing the substitutions needed to reflect
5426    discriminant substitutions from GNAT_SUBTYPE to GNAT_TYPE and add
5427    them to GNU_LIST.  If GNAT_TYPE is not specified, use the base type
5428    of GNAT_SUBTYPE.  The substitutions can be in any order.  TREE_PURPOSE
5429    gives the tree for the discriminant and TREE_VALUES is the replacement
5430    value.  They are in the form of operands to substitute_in_expr.
5431    DEFINITION is as in gnat_to_gnu_entity.  */
5432
5433 static tree
5434 substitution_list (Entity_Id gnat_subtype, Entity_Id gnat_type,
5435                    tree gnu_list, bool definition)
5436 {
5437   Entity_Id gnat_discrim;
5438   Node_Id gnat_value;
5439
5440   if (No (gnat_type))
5441     gnat_type = Implementation_Base_Type (gnat_subtype);
5442
5443   if (Has_Discriminants (gnat_type))
5444     for (gnat_discrim = First_Stored_Discriminant (gnat_type),
5445          gnat_value = First_Elmt (Stored_Constraint (gnat_subtype));
5446          Present (gnat_discrim);
5447          gnat_discrim = Next_Stored_Discriminant (gnat_discrim),
5448          gnat_value = Next_Elmt (gnat_value))
5449       /* Ignore access discriminants.  */
5450       if (!Is_Access_Type (Etype (Node (gnat_value))))
5451         gnu_list = tree_cons (gnat_to_gnu_field_decl (gnat_discrim),
5452                               elaborate_expression
5453                               (Node (gnat_value), gnat_subtype,
5454                                get_entity_name (gnat_discrim), definition,
5455                                1, 0),
5456                               gnu_list);
5457
5458   return gnu_list;
5459 }
5460 \f
5461 /* Return true if the size represented by GNU_SIZE can be handled by an
5462    allocation.  If STATIC_P is true, consider only what can be done with a
5463    static allocation.  */
5464
5465 static bool
5466 allocatable_size_p (tree gnu_size, bool static_p)
5467 {
5468   HOST_WIDE_INT our_size;
5469
5470   /* If this is not a static allocation, the only case we want to forbid
5471      is an overflowing size.  That will be converted into a raise a
5472      Storage_Error.  */
5473   if (!static_p)
5474     return !(TREE_CODE (gnu_size) == INTEGER_CST
5475              && TREE_OVERFLOW (gnu_size));
5476
5477   /* Otherwise, we need to deal with both variable sizes and constant
5478      sizes that won't fit in a host int.  We use int instead of HOST_WIDE_INT
5479      since assemblers may not like very large sizes.  */
5480   if (!host_integerp (gnu_size, 1))
5481     return false;
5482
5483   our_size = tree_low_cst (gnu_size, 1);
5484   return (int) our_size == our_size;
5485 }
5486 \f
5487 /* Prepend to ATTR_LIST an entry for an attribute with provided TYPE,
5488    NAME, ARGS and ERROR_POINT.  */
5489
5490 static void
5491 prepend_one_attribute_to (struct attrib ** attr_list,
5492                           enum attr_type attr_type,
5493                           tree attr_name,
5494                           tree attr_args,
5495                           Node_Id attr_error_point)
5496 {
5497   struct attrib * attr = (struct attrib *) xmalloc (sizeof (struct attrib));
5498
5499   attr->type = attr_type;
5500   attr->name = attr_name;
5501   attr->args = attr_args;
5502   attr->error_point = attr_error_point;
5503
5504   attr->next = *attr_list;
5505   *attr_list = attr;
5506 }
5507
5508 /* Prepend to ATTR_LIST the list of attributes for GNAT_ENTITY, if any.  */
5509
5510 static void
5511 prepend_attributes (Entity_Id gnat_entity, struct attrib ** attr_list)
5512 {
5513   Node_Id gnat_temp;
5514
5515   for (gnat_temp = First_Rep_Item (gnat_entity); Present (gnat_temp);
5516        gnat_temp = Next_Rep_Item (gnat_temp))
5517     if (Nkind (gnat_temp) == N_Pragma)
5518       {
5519         tree gnu_arg0 = NULL_TREE, gnu_arg1 = NULL_TREE;
5520         Node_Id gnat_assoc = Pragma_Argument_Associations (gnat_temp);
5521         enum attr_type etype;
5522
5523         if (Present (gnat_assoc) && Present (First (gnat_assoc))
5524             && Present (Next (First (gnat_assoc)))
5525             && (Nkind (Expression (Next (First (gnat_assoc))))
5526                 == N_String_Literal))
5527           {
5528             gnu_arg0 = get_identifier (TREE_STRING_POINTER
5529                                        (gnat_to_gnu
5530                                         (Expression (Next
5531                                                      (First (gnat_assoc))))));
5532             if (Present (Next (Next (First (gnat_assoc))))
5533                 && (Nkind (Expression (Next (Next (First (gnat_assoc)))))
5534                     == N_String_Literal))
5535               gnu_arg1 = get_identifier (TREE_STRING_POINTER
5536                                          (gnat_to_gnu
5537                                           (Expression
5538                                            (Next (Next
5539                                                   (First (gnat_assoc)))))));
5540           }
5541
5542         switch (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_temp))))
5543           {
5544           case Pragma_Machine_Attribute:
5545             etype = ATTR_MACHINE_ATTRIBUTE;
5546             break;
5547
5548           case Pragma_Linker_Alias:
5549             etype = ATTR_LINK_ALIAS;
5550             break;
5551
5552           case Pragma_Linker_Section:
5553             etype = ATTR_LINK_SECTION;
5554             break;
5555
5556           case Pragma_Linker_Constructor:
5557             etype = ATTR_LINK_CONSTRUCTOR;
5558             break;
5559
5560           case Pragma_Linker_Destructor:
5561             etype = ATTR_LINK_DESTRUCTOR;
5562             break;
5563
5564           case Pragma_Weak_External:
5565             etype = ATTR_WEAK_EXTERNAL;
5566             break;
5567
5568           case Pragma_Thread_Local_Storage:
5569             etype = ATTR_THREAD_LOCAL_STORAGE;
5570             break;
5571
5572           default:
5573             continue;
5574           }
5575
5576
5577         /* Prepend to the list now.  Make a list of the argument we might
5578            have, as GCC expects it.  */
5579         prepend_one_attribute_to
5580           (attr_list,
5581            etype, gnu_arg0,
5582            (gnu_arg1 != NULL_TREE)
5583            ? build_tree_list (NULL_TREE, gnu_arg1) : NULL_TREE,
5584            Present (Next (First (gnat_assoc)))
5585            ? Expression (Next (First (gnat_assoc))) : gnat_temp);
5586       }
5587 }
5588 \f
5589 /* Called when we need to protect a variable object using a save_expr.  */
5590
5591 tree
5592 maybe_variable (tree gnu_operand)
5593 {
5594   if (TREE_CONSTANT (gnu_operand) || TREE_READONLY (gnu_operand)
5595       || TREE_CODE (gnu_operand) == SAVE_EXPR
5596       || TREE_CODE (gnu_operand) == NULL_EXPR)
5597     return gnu_operand;
5598
5599   if (TREE_CODE (gnu_operand) == UNCONSTRAINED_ARRAY_REF)
5600     {
5601       tree gnu_result = build1 (UNCONSTRAINED_ARRAY_REF,
5602                                 TREE_TYPE (gnu_operand),
5603                                 variable_size (TREE_OPERAND (gnu_operand, 0)));
5604
5605       TREE_READONLY (gnu_result) = TREE_STATIC (gnu_result)
5606         = TYPE_READONLY (TREE_TYPE (TREE_TYPE (gnu_operand)));
5607       return gnu_result;
5608     }
5609   else
5610     return variable_size (gnu_operand);
5611 }
5612 \f
5613 /* Given a GNAT tree GNAT_EXPR, for an expression which is a value within a
5614    type definition (either a bound or a discriminant value) for GNAT_ENTITY,
5615    return the GCC tree to use for that expression.  GNU_NAME is the
5616    qualification to use if an external name is appropriate and DEFINITION is
5617    true if this is a definition of GNAT_ENTITY.  If NEED_VALUE is true, we
5618    need a result.  Otherwise, we are just elaborating this for side-effects.
5619    If NEED_DEBUG is true we need the symbol for debugging purposes even if it
5620    isn't needed for code generation.  */
5621
5622 static tree
5623 elaborate_expression (Node_Id gnat_expr, Entity_Id gnat_entity,
5624                       tree gnu_name, bool definition, bool need_value,
5625                       bool need_debug)
5626 {
5627   tree gnu_expr;
5628
5629   /* If we already elaborated this expression (e.g., it was involved
5630      in the definition of a private type), use the old value.  */
5631   if (present_gnu_tree (gnat_expr))
5632     return get_gnu_tree (gnat_expr);
5633
5634   /* If we don't need a value and this is static or a discriminant, we
5635      don't need to do anything.  */
5636   else if (!need_value
5637            && (Is_OK_Static_Expression (gnat_expr)
5638                || (Nkind (gnat_expr) == N_Identifier
5639                    && Ekind (Entity (gnat_expr)) == E_Discriminant)))
5640     return 0;
5641
5642   /* Otherwise, convert this tree to its GCC equivalent.  */
5643   gnu_expr
5644     = elaborate_expression_1 (gnat_expr, gnat_entity, gnat_to_gnu (gnat_expr),
5645                               gnu_name, definition, need_debug);
5646
5647   /* Save the expression in case we try to elaborate this entity again.  Since
5648      it's not a DECL, don't check it.  Don't save if it's a discriminant.  */
5649   if (!CONTAINS_PLACEHOLDER_P (gnu_expr))
5650     save_gnu_tree (gnat_expr, gnu_expr, true);
5651
5652   return need_value ? gnu_expr : error_mark_node;
5653 }
5654
5655 /* Similar, but take a GNU expression.  */
5656
5657 static tree
5658 elaborate_expression_1 (Node_Id gnat_expr, Entity_Id gnat_entity,
5659                         tree gnu_expr, tree gnu_name, bool definition,
5660                         bool need_debug)
5661 {
5662   tree gnu_decl = NULL_TREE;
5663   /* Skip any conversions and simple arithmetics to see if the expression
5664      is a read-only variable.
5665      ??? This really should remain read-only, but we have to think about
5666      the typing of the tree here.  */
5667   tree gnu_inner_expr
5668     = skip_simple_arithmetic (remove_conversions (gnu_expr, true));
5669   bool expr_global = Is_Public (gnat_entity) || global_bindings_p ();
5670   bool expr_variable;
5671
5672   /* In most cases, we won't see a naked FIELD_DECL here because a
5673      discriminant reference will have been replaced with a COMPONENT_REF
5674      when the type is being elaborated.  However, there are some cases
5675      involving child types where we will.  So convert it to a COMPONENT_REF
5676      here.  We have to hope it will be at the highest level of the
5677      expression in these cases.  */
5678   if (TREE_CODE (gnu_expr) == FIELD_DECL)
5679     gnu_expr = build3 (COMPONENT_REF, TREE_TYPE (gnu_expr),
5680                        build0 (PLACEHOLDER_EXPR, DECL_CONTEXT (gnu_expr)),
5681                        gnu_expr, NULL_TREE);
5682
5683   /* If GNU_EXPR is neither a placeholder nor a constant, nor a variable
5684      that is read-only, make a variable that is initialized to contain the
5685      bound when the package containing the definition is elaborated.  If
5686      this entity is defined at top level and a bound or discriminant value
5687      isn't a constant or a reference to a discriminant, replace the bound
5688      by the variable; otherwise use a SAVE_EXPR if needed.  Note that we
5689      rely here on the fact that an expression cannot contain both the
5690      discriminant and some other variable.  */
5691
5692   expr_variable = (!CONSTANT_CLASS_P (gnu_expr)
5693                    && !(TREE_CODE (gnu_inner_expr) == VAR_DECL
5694                         && (TREE_READONLY (gnu_inner_expr)
5695                             || DECL_READONLY_ONCE_ELAB (gnu_inner_expr)))
5696                    && !CONTAINS_PLACEHOLDER_P (gnu_expr));
5697
5698   /* If this is a static expression or contains a discriminant, we don't
5699      need the variable for debugging (and can't elaborate anyway if a
5700      discriminant).  */
5701   if (need_debug
5702       && (Is_OK_Static_Expression (gnat_expr)
5703           || CONTAINS_PLACEHOLDER_P (gnu_expr)))
5704     need_debug = false;
5705
5706   /* Now create the variable if we need it.  */
5707   if (need_debug || (expr_variable && expr_global))
5708     gnu_decl
5709       = create_var_decl (create_concat_name (gnat_entity,
5710                                              IDENTIFIER_POINTER (gnu_name)),
5711                          NULL_TREE, TREE_TYPE (gnu_expr), gnu_expr,
5712                          !need_debug, Is_Public (gnat_entity),
5713                          !definition, false, NULL, gnat_entity);
5714
5715   /* We only need to use this variable if we are in global context since GCC
5716      can do the right thing in the local case.  */
5717   if (expr_global && expr_variable)
5718     return gnu_decl;
5719   else if (!expr_variable)
5720     return gnu_expr;
5721   else
5722     return maybe_variable (gnu_expr);
5723 }
5724 \f
5725 /* Create a record type that contains a SIZE bytes long field of TYPE with a
5726    starting bit position so that it is aligned to ALIGN bits, and leaving at
5727    least ROOM bytes free before the field.  BASE_ALIGN is the alignment the
5728    record is guaranteed to get.  */
5729
5730 tree
5731 make_aligning_type (tree type, unsigned int align, tree size,
5732                     unsigned int base_align, int room)
5733 {
5734   /* We will be crafting a record type with one field at a position set to be
5735      the next multiple of ALIGN past record'address + room bytes.  We use a
5736      record placeholder to express record'address.  */
5737
5738   tree record_type = make_node (RECORD_TYPE);
5739   tree record = build0 (PLACEHOLDER_EXPR, record_type);
5740
5741   tree record_addr_st
5742     = convert (sizetype, build_unary_op (ADDR_EXPR, NULL_TREE, record));
5743
5744   /* The diagram below summarizes the shape of what we manipulate:
5745
5746                     <--------- pos ---------->
5747                 {  +------------+-------------+-----------------+
5748       record  =>{  |############|     ...     | field (type)    |
5749                 {  +------------+-------------+-----------------+
5750                    |<-- room -->|<- voffset ->|<---- size ----->|
5751                    o            o
5752                    |            |
5753                    record_addr  vblock_addr
5754
5755      Every length is in sizetype bytes there, except "pos" which has to be
5756      set as a bit position in the GCC tree for the record.  */
5757
5758   tree room_st = size_int (room);
5759   tree vblock_addr_st = size_binop (PLUS_EXPR, record_addr_st, room_st);
5760   tree voffset_st, pos, field;
5761
5762   tree name = TYPE_NAME (type);
5763
5764   if (TREE_CODE (name) == TYPE_DECL)
5765     name = DECL_NAME (name);
5766
5767   TYPE_NAME (record_type) = concat_name (name, "_ALIGN");
5768
5769   /* Compute VOFFSET and then POS.  The next byte position multiple of some
5770      alignment after some address is obtained by "and"ing the alignment minus
5771      1 with the two's complement of the address.   */
5772
5773   voffset_st = size_binop (BIT_AND_EXPR,
5774                            size_diffop (size_zero_node, vblock_addr_st),
5775                            ssize_int ((align / BITS_PER_UNIT) - 1));
5776
5777   /* POS = (ROOM + VOFFSET) * BIT_PER_UNIT, in bitsizetype.  */
5778
5779   pos = size_binop (MULT_EXPR,
5780                     convert (bitsizetype,
5781                              size_binop (PLUS_EXPR, room_st, voffset_st)),
5782                     bitsize_unit_node);
5783
5784   /* Craft the GCC record representation.  We exceptionally do everything
5785      manually here because 1) our generic circuitry is not quite ready to
5786      handle the complex position/size expressions we are setting up, 2) we
5787      have a strong simplifying factor at hand: we know the maximum possible
5788      value of voffset, and 3) we have to set/reset at least the sizes in
5789      accordance with this maximum value anyway, as we need them to convey
5790      what should be "alloc"ated for this type.
5791
5792      Use -1 as the 'addressable' indication for the field to prevent the
5793      creation of a bitfield.  We don't need one, it would have damaging
5794      consequences on the alignment computation, and create_field_decl would
5795      make one without this special argument, for instance because of the
5796      complex position expression.  */
5797
5798   field = create_field_decl (get_identifier ("F"), type, record_type,
5799                              1, size, pos, -1);
5800   TYPE_FIELDS (record_type) = field;
5801
5802   TYPE_ALIGN (record_type) = base_align;
5803   TYPE_USER_ALIGN (record_type) = 1;
5804
5805   TYPE_SIZE (record_type)
5806     = size_binop (PLUS_EXPR,
5807                   size_binop (MULT_EXPR, convert (bitsizetype, size),
5808                               bitsize_unit_node),
5809                   bitsize_int (align + room * BITS_PER_UNIT));
5810   TYPE_SIZE_UNIT (record_type)
5811     = size_binop (PLUS_EXPR, size,
5812                   size_int (room + align / BITS_PER_UNIT));
5813
5814   SET_TYPE_MODE (record_type, BLKmode);
5815
5816   relate_alias_sets (record_type, type, ALIAS_SET_COPY);
5817   return record_type;
5818 }
5819 \f
5820 /* Return the result of rounding T up to ALIGN.  */
5821
5822 static inline unsigned HOST_WIDE_INT
5823 round_up_to_align (unsigned HOST_WIDE_INT t, unsigned int align)
5824 {
5825   t += align - 1;
5826   t /= align;
5827   t *= align;
5828   return t;
5829 }
5830
5831 /* TYPE is a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE that is being used
5832    as the field type of a packed record if IN_RECORD is true, or as the
5833    component type of a packed array if IN_RECORD is false.  See if we can
5834    rewrite it either as a type that has a non-BLKmode, which we can pack
5835    tighter in the packed record case, or as a smaller type.  If so, return
5836    the new type.  If not, return the original type.  */
5837
5838 static tree
5839 make_packable_type (tree type, bool in_record)
5840 {
5841   unsigned HOST_WIDE_INT size = tree_low_cst (TYPE_SIZE (type), 1);
5842   unsigned HOST_WIDE_INT new_size;
5843   tree new_type, old_field, field_list = NULL_TREE;
5844
5845   /* No point in doing anything if the size is zero.  */
5846   if (size == 0)
5847     return type;
5848
5849   new_type = make_node (TREE_CODE (type));
5850
5851   /* Copy the name and flags from the old type to that of the new.
5852      Note that we rely on the pointer equality created here for
5853      TYPE_NAME to look through conversions in various places.  */
5854   TYPE_NAME (new_type) = TYPE_NAME (type);
5855   TYPE_JUSTIFIED_MODULAR_P (new_type) = TYPE_JUSTIFIED_MODULAR_P (type);
5856   TYPE_CONTAINS_TEMPLATE_P (new_type) = TYPE_CONTAINS_TEMPLATE_P (type);
5857   if (TREE_CODE (type) == RECORD_TYPE)
5858     TYPE_IS_PADDING_P (new_type) = TYPE_IS_PADDING_P (type);
5859
5860   /* If we are in a record and have a small size, set the alignment to
5861      try for an integral mode.  Otherwise set it to try for a smaller
5862      type with BLKmode.  */
5863   if (in_record && size <= MAX_FIXED_MODE_SIZE)
5864     {
5865       TYPE_ALIGN (new_type) = ceil_alignment (size);
5866       new_size = round_up_to_align (size, TYPE_ALIGN (new_type));
5867     }
5868   else
5869     {
5870       unsigned HOST_WIDE_INT align;
5871
5872       /* Do not try to shrink the size if the RM size is not constant.  */
5873       if (TYPE_CONTAINS_TEMPLATE_P (type)
5874           || !host_integerp (TYPE_ADA_SIZE (type), 1))
5875         return type;
5876
5877       /* Round the RM size up to a unit boundary to get the minimal size
5878          for a BLKmode record.  Give up if it's already the size.  */
5879       new_size = TREE_INT_CST_LOW (TYPE_ADA_SIZE (type));
5880       new_size = round_up_to_align (new_size, BITS_PER_UNIT);
5881       if (new_size == size)
5882         return type;
5883
5884       align = new_size & -new_size;
5885       TYPE_ALIGN (new_type) = MIN (TYPE_ALIGN (type), align);
5886     }
5887
5888   TYPE_USER_ALIGN (new_type) = 1;
5889
5890   /* Now copy the fields, keeping the position and size as we don't want
5891      to change the layout by propagating the packedness downwards.  */
5892   for (old_field = TYPE_FIELDS (type); old_field;
5893        old_field = TREE_CHAIN (old_field))
5894     {
5895       tree new_field_type = TREE_TYPE (old_field);
5896       tree new_field, new_size;
5897
5898       if ((TREE_CODE (new_field_type) == RECORD_TYPE
5899            || TREE_CODE (new_field_type) == UNION_TYPE
5900            || TREE_CODE (new_field_type) == QUAL_UNION_TYPE)
5901           && !TYPE_IS_FAT_POINTER_P (new_field_type)
5902           && host_integerp (TYPE_SIZE (new_field_type), 1))
5903         new_field_type = make_packable_type (new_field_type, true);
5904
5905       /* However, for the last field in a not already packed record type
5906          that is of an aggregate type, we need to use the RM size in the
5907          packable version of the record type, see finish_record_type.  */
5908       if (!TREE_CHAIN (old_field)
5909           && !TYPE_PACKED (type)
5910           && (TREE_CODE (new_field_type) == RECORD_TYPE
5911               || TREE_CODE (new_field_type) == UNION_TYPE
5912               || TREE_CODE (new_field_type) == QUAL_UNION_TYPE)
5913           && !TYPE_IS_FAT_POINTER_P (new_field_type)
5914           && !TYPE_CONTAINS_TEMPLATE_P (new_field_type)
5915           && TYPE_ADA_SIZE (new_field_type))
5916         new_size = TYPE_ADA_SIZE (new_field_type);
5917       else
5918         new_size = DECL_SIZE (old_field);
5919
5920       new_field = create_field_decl (DECL_NAME (old_field), new_field_type,
5921                                      new_type, TYPE_PACKED (type), new_size,
5922                                      bit_position (old_field),
5923                                      !DECL_NONADDRESSABLE_P (old_field));
5924
5925       DECL_INTERNAL_P (new_field) = DECL_INTERNAL_P (old_field);
5926       SET_DECL_ORIGINAL_FIELD
5927         (new_field, (DECL_ORIGINAL_FIELD (old_field)
5928                      ? DECL_ORIGINAL_FIELD (old_field) : old_field));
5929
5930       if (TREE_CODE (new_type) == QUAL_UNION_TYPE)
5931         DECL_QUALIFIER (new_field) = DECL_QUALIFIER (old_field);
5932
5933       TREE_CHAIN (new_field) = field_list;
5934       field_list = new_field;
5935     }
5936
5937   finish_record_type (new_type, nreverse (field_list), 2, true);
5938   relate_alias_sets (new_type, type, ALIAS_SET_COPY);
5939
5940   /* If this is a padding record, we never want to make the size smaller
5941      than what was specified.  For QUAL_UNION_TYPE, also copy the size.  */
5942   if ((TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
5943       || TREE_CODE (type) == QUAL_UNION_TYPE)
5944     {
5945       TYPE_SIZE (new_type) = TYPE_SIZE (type);
5946       TYPE_SIZE_UNIT (new_type) = TYPE_SIZE_UNIT (type);
5947     }
5948   else
5949     {
5950       TYPE_SIZE (new_type) = bitsize_int (new_size);
5951       TYPE_SIZE_UNIT (new_type)
5952         = size_int ((new_size + BITS_PER_UNIT - 1) / BITS_PER_UNIT);
5953     }
5954
5955   if (!TYPE_CONTAINS_TEMPLATE_P (type))
5956     SET_TYPE_ADA_SIZE (new_type, TYPE_ADA_SIZE (type));
5957
5958   compute_record_mode (new_type);
5959
5960   /* Try harder to get a packable type if necessary, for example
5961      in case the record itself contains a BLKmode field.  */
5962   if (in_record && TYPE_MODE (new_type) == BLKmode)
5963     SET_TYPE_MODE (new_type,
5964                    mode_for_size_tree (TYPE_SIZE (new_type), MODE_INT, 1));
5965
5966   /* If neither the mode nor the size has shrunk, return the old type.  */
5967   if (TYPE_MODE (new_type) == BLKmode && new_size >= size)
5968     return type;
5969
5970   return new_type;
5971 }
5972 \f
5973 /* Ensure that TYPE has SIZE and ALIGN.  Make and return a new padded type
5974    if needed.  We have already verified that SIZE and TYPE are large enough.
5975
5976    GNAT_ENTITY and NAME_TRAILER are used to name the resulting record and
5977    to issue a warning.
5978
5979    IS_USER_TYPE is true if we must complete the original type.
5980
5981    DEFINITION is true if this type is being defined.
5982
5983    SAME_RM_SIZE is true if the RM size of the resulting type is to be set
5984    to SIZE too; otherwise, it's set to the RM size of the original type.  */
5985
5986 tree
5987 maybe_pad_type (tree type, tree size, unsigned int align,
5988                 Entity_Id gnat_entity, const char *name_trailer,
5989                 bool is_user_type, bool definition, bool same_rm_size)
5990 {
5991   tree orig_rm_size = same_rm_size ? NULL_TREE : rm_size (type);
5992   tree orig_size = TYPE_SIZE (type);
5993   unsigned int orig_align = align;
5994   tree record, field;
5995
5996   /* If TYPE is a padded type, see if it agrees with any size and alignment
5997      we were given.  If so, return the original type.  Otherwise, strip
5998      off the padding, since we will either be returning the inner type
5999      or repadding it.  If no size or alignment is specified, use that of
6000      the original padded type.  */
6001   if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type))
6002     {
6003       if ((!size
6004            || operand_equal_p (round_up (size,
6005                                          MAX (align, TYPE_ALIGN (type))),
6006                                round_up (TYPE_SIZE (type),
6007                                          MAX (align, TYPE_ALIGN (type))),
6008                                0))
6009           && (align == 0 || align == TYPE_ALIGN (type)))
6010         return type;
6011
6012       if (!size)
6013         size = TYPE_SIZE (type);
6014       if (align == 0)
6015         align = TYPE_ALIGN (type);
6016
6017       type = TREE_TYPE (TYPE_FIELDS (type));
6018       orig_size = TYPE_SIZE (type);
6019     }
6020
6021   /* If the size is either not being changed or is being made smaller (which
6022      is not done here and is only valid for bitfields anyway), show the size
6023      isn't changing.  Likewise, clear the alignment if it isn't being
6024      changed.  Then return if we aren't doing anything.  */
6025   if (size
6026       && (operand_equal_p (size, orig_size, 0)
6027           || (TREE_CODE (orig_size) == INTEGER_CST
6028               && tree_int_cst_lt (size, orig_size))))
6029     size = NULL_TREE;
6030
6031   if (align == TYPE_ALIGN (type))
6032     align = 0;
6033
6034   if (align == 0 && !size)
6035     return type;
6036
6037   /* If requested, complete the original type and give it a name.  */
6038   if (is_user_type)
6039     create_type_decl (get_entity_name (gnat_entity), type,
6040                       NULL, !Comes_From_Source (gnat_entity),
6041                       !(TYPE_NAME (type)
6042                         && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
6043                         && DECL_IGNORED_P (TYPE_NAME (type))),
6044                       gnat_entity);
6045
6046   /* We used to modify the record in place in some cases, but that could
6047      generate incorrect debugging information.  So make a new record
6048      type and name.  */
6049   record = make_node (RECORD_TYPE);
6050   TYPE_IS_PADDING_P (record) = 1;
6051
6052   if (Present (gnat_entity))
6053     TYPE_NAME (record) = create_concat_name (gnat_entity, name_trailer);
6054
6055   TYPE_VOLATILE (record)
6056     = Present (gnat_entity) && Treat_As_Volatile (gnat_entity);
6057
6058   TYPE_ALIGN (record) = align;
6059   if (orig_align)
6060     TYPE_USER_ALIGN (record) = align;
6061
6062   TYPE_SIZE (record) = size ? size : orig_size;
6063   TYPE_SIZE_UNIT (record)
6064     = convert (sizetype,
6065                size_binop (CEIL_DIV_EXPR, TYPE_SIZE (record),
6066                            bitsize_unit_node));
6067
6068   /* If we are changing the alignment and the input type is a record with
6069      BLKmode and a small constant size, try to make a form that has an
6070      integral mode.  This might allow the padding record to also have an
6071      integral mode, which will be much more efficient.  There is no point
6072      in doing so if a size is specified unless it is also a small constant
6073      size and it is incorrect to do so if we cannot guarantee that the mode
6074      will be naturally aligned since the field must always be addressable.
6075
6076      ??? This might not always be a win when done for a stand-alone object:
6077      since the nominal and the effective type of the object will now have
6078      different modes, a VIEW_CONVERT_EXPR will be required for converting
6079      between them and it might be hard to overcome afterwards, including
6080      at the RTL level when the stand-alone object is accessed as a whole.  */
6081   if (align != 0
6082       && TREE_CODE (type) == RECORD_TYPE
6083       && TYPE_MODE (type) == BLKmode
6084       && TREE_CODE (orig_size) == INTEGER_CST
6085       && !TREE_OVERFLOW (orig_size)
6086       && compare_tree_int (orig_size, MAX_FIXED_MODE_SIZE) <= 0
6087       && (!size
6088           || (TREE_CODE (size) == INTEGER_CST
6089               && compare_tree_int (size, MAX_FIXED_MODE_SIZE) <= 0)))
6090     {
6091       tree packable_type = make_packable_type (type, true);
6092       if (TYPE_MODE (packable_type) != BLKmode
6093           && align >= TYPE_ALIGN (packable_type))
6094         type = packable_type;
6095     }
6096
6097   /* Now create the field with the original size.  */
6098   field  = create_field_decl (get_identifier ("F"), type, record, 0,
6099                               orig_size, bitsize_zero_node, 1);
6100   DECL_INTERNAL_P (field) = 1;
6101
6102   /* Do not finalize it until after the auxiliary record is built.  */
6103   finish_record_type (record, field, 1, true);
6104
6105   /* Set the same size for its RM size if requested; otherwise reuse
6106      the RM size of the original type.  */
6107   SET_TYPE_ADA_SIZE (record, same_rm_size ? size : orig_rm_size);
6108
6109   /* Unless debugging information isn't being written for the input type,
6110      write a record that shows what we are a subtype of and also make a
6111      variable that indicates our size, if still variable.  */
6112   if (TYPE_NAME (record)
6113       && AGGREGATE_TYPE_P (type)
6114       && TREE_CODE (orig_size) != INTEGER_CST
6115       && !(TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
6116            && DECL_IGNORED_P (TYPE_NAME (type))))
6117     {
6118       tree marker = make_node (RECORD_TYPE);
6119       tree name = TYPE_NAME (record);
6120       tree orig_name = TYPE_NAME (type);
6121
6122       if (TREE_CODE (name) == TYPE_DECL)
6123         name = DECL_NAME (name);
6124
6125       if (TREE_CODE (orig_name) == TYPE_DECL)
6126         orig_name = DECL_NAME (orig_name);
6127
6128       TYPE_NAME (marker) = concat_name (name, "XVS");
6129       finish_record_type (marker,
6130                           create_field_decl (orig_name, integer_type_node,
6131                                              marker, 0, NULL_TREE, NULL_TREE,
6132                                              0),
6133                           0, false);
6134
6135       add_parallel_type (TYPE_STUB_DECL (record), marker);
6136
6137       if (size && TREE_CODE (size) != INTEGER_CST && definition)
6138         create_var_decl (concat_name (name, "XVZ"), NULL_TREE, sizetype,
6139                          TYPE_SIZE_UNIT (record), false, false, false,
6140                          false, NULL, gnat_entity);
6141     }
6142
6143   rest_of_record_type_compilation (record);
6144
6145   /* If the size was widened explicitly, maybe give a warning.  Take the
6146      original size as the maximum size of the input if there was an
6147      unconstrained record involved and round it up to the specified alignment,
6148      if one was specified.  */
6149   if (CONTAINS_PLACEHOLDER_P (orig_size))
6150     orig_size = max_size (orig_size, true);
6151
6152   if (align)
6153     orig_size = round_up (orig_size, align);
6154
6155   if (size && Present (gnat_entity)
6156       && !operand_equal_p (size, orig_size, 0)
6157       && !(TREE_CODE (size) == INTEGER_CST
6158            && TREE_CODE (orig_size) == INTEGER_CST
6159            && tree_int_cst_lt (size, orig_size)))
6160     {
6161       Node_Id gnat_error_node = Empty;
6162
6163       if (Is_Packed_Array_Type (gnat_entity))
6164         gnat_entity = Original_Array_Type (gnat_entity);
6165
6166       if ((Ekind (gnat_entity) == E_Component
6167            || Ekind (gnat_entity) == E_Discriminant)
6168           && Present (Component_Clause (gnat_entity)))
6169         gnat_error_node = Last_Bit (Component_Clause (gnat_entity));
6170       else if (Present (Size_Clause (gnat_entity)))
6171         gnat_error_node = Expression (Size_Clause (gnat_entity));
6172
6173       /* Generate message only for entities that come from source, since
6174          if we have an entity created by expansion, the message will be
6175          generated for some other corresponding source entity.  */
6176       if (Comes_From_Source (gnat_entity) && Present (gnat_error_node))
6177         post_error_ne_tree ("{^ }bits of & unused?", gnat_error_node,
6178                             gnat_entity,
6179                             size_diffop (size, orig_size));
6180
6181       else if (*name_trailer == 'C' && !Is_Internal (gnat_entity))
6182         post_error_ne_tree ("component of& padded{ by ^ bits}?",
6183                             gnat_entity, gnat_entity,
6184                             size_diffop (size, orig_size));
6185     }
6186
6187   return record;
6188 }
6189 \f
6190 /* Given a GNU tree and a GNAT list of choices, generate an expression to test
6191    the value passed against the list of choices.  */
6192
6193 tree
6194 choices_to_gnu (tree operand, Node_Id choices)
6195 {
6196   Node_Id choice;
6197   Node_Id gnat_temp;
6198   tree result = integer_zero_node;
6199   tree this_test, low = 0, high = 0, single = 0;
6200
6201   for (choice = First (choices); Present (choice); choice = Next (choice))
6202     {
6203       switch (Nkind (choice))
6204         {
6205         case N_Range:
6206           low = gnat_to_gnu (Low_Bound (choice));
6207           high = gnat_to_gnu (High_Bound (choice));
6208
6209           /* There's no good type to use here, so we might as well use
6210              integer_type_node.  */
6211           this_test
6212             = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
6213                                build_binary_op (GE_EXPR, integer_type_node,
6214                                                 operand, low),
6215                                build_binary_op (LE_EXPR, integer_type_node,
6216                                                 operand, high));
6217
6218           break;
6219
6220         case N_Subtype_Indication:
6221           gnat_temp = Range_Expression (Constraint (choice));
6222           low = gnat_to_gnu (Low_Bound (gnat_temp));
6223           high = gnat_to_gnu (High_Bound (gnat_temp));
6224
6225           this_test
6226             = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
6227                                build_binary_op (GE_EXPR, integer_type_node,
6228                                                 operand, low),
6229                                build_binary_op (LE_EXPR, integer_type_node,
6230                                                 operand, high));
6231           break;
6232
6233         case N_Identifier:
6234         case N_Expanded_Name:
6235           /* This represents either a subtype range, an enumeration
6236              literal, or a constant  Ekind says which.  If an enumeration
6237              literal or constant, fall through to the next case.  */
6238           if (Ekind (Entity (choice)) != E_Enumeration_Literal
6239               && Ekind (Entity (choice)) != E_Constant)
6240             {
6241               tree type = gnat_to_gnu_type (Entity (choice));
6242
6243               low = TYPE_MIN_VALUE (type);
6244               high = TYPE_MAX_VALUE (type);
6245
6246               this_test
6247                 = build_binary_op (TRUTH_ANDIF_EXPR, integer_type_node,
6248                                    build_binary_op (GE_EXPR, integer_type_node,
6249                                                     operand, low),
6250                                    build_binary_op (LE_EXPR, integer_type_node,
6251                                                     operand, high));
6252               break;
6253             }
6254
6255           /* ... fall through ... */
6256
6257         case N_Character_Literal:
6258         case N_Integer_Literal:
6259           single = gnat_to_gnu (choice);
6260           this_test = build_binary_op (EQ_EXPR, integer_type_node, operand,
6261                                        single);
6262           break;
6263
6264         case N_Others_Choice:
6265           this_test = integer_one_node;
6266           break;
6267
6268         default:
6269           gcc_unreachable ();
6270         }
6271
6272       result = build_binary_op (TRUTH_ORIF_EXPR, integer_type_node,
6273                                 result, this_test);
6274     }
6275
6276   return result;
6277 }
6278 \f
6279 /* Adjust PACKED setting as passed to gnat_to_gnu_field for a field of
6280    type FIELD_TYPE to be placed in RECORD_TYPE.  Return the result.  */
6281
6282 static int
6283 adjust_packed (tree field_type, tree record_type, int packed)
6284 {
6285   /* If the field contains an item of variable size, we cannot pack it
6286      because we cannot create temporaries of non-fixed size in case
6287      we need to take the address of the field.  See addressable_p and
6288      the notes on the addressability issues for further details.  */
6289   if (is_variable_size (field_type))
6290     return 0;
6291
6292   /* If the alignment of the record is specified and the field type
6293      is over-aligned, request Storage_Unit alignment for the field.  */
6294   if (packed == -2)
6295     {
6296       if (TYPE_ALIGN (field_type) > TYPE_ALIGN (record_type))
6297         return -1;
6298       else
6299         return 0;
6300     }
6301
6302   return packed;
6303 }
6304
6305 /* Return a GCC tree for a field corresponding to GNAT_FIELD to be
6306    placed in GNU_RECORD_TYPE.
6307
6308    PACKED is 1 if the enclosing record is packed, -1 if the enclosing
6309    record has Component_Alignment of Storage_Unit, -2 if the enclosing
6310    record has a specified alignment.
6311
6312    DEFINITION is true if this field is for a record being defined.  */
6313
6314 static tree
6315 gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed,
6316                    bool definition)
6317 {
6318   tree gnu_field_id = get_entity_name (gnat_field);
6319   tree gnu_field_type = gnat_to_gnu_type (Etype (gnat_field));
6320   tree gnu_field, gnu_size, gnu_pos;
6321   bool needs_strict_alignment
6322     = (Is_Aliased (gnat_field) || Strict_Alignment (Etype (gnat_field))
6323        || Treat_As_Volatile (gnat_field));
6324
6325   /* If this field requires strict alignment, we cannot pack it because
6326      it would very likely be under-aligned in the record.  */
6327   if (needs_strict_alignment)
6328     packed = 0;
6329   else
6330     packed = adjust_packed (gnu_field_type, gnu_record_type, packed);
6331
6332   /* If a size is specified, use it.  Otherwise, if the record type is packed,
6333      use the official RM size.  See "Handling of Type'Size Values" in Einfo
6334      for further details.  */
6335   if (Known_Static_Esize (gnat_field))
6336     gnu_size = validate_size (Esize (gnat_field), gnu_field_type,
6337                               gnat_field, FIELD_DECL, false, true);
6338   else if (packed == 1)
6339     gnu_size = validate_size (RM_Size (Etype (gnat_field)), gnu_field_type,
6340                               gnat_field, FIELD_DECL, false, true);
6341   else
6342     gnu_size = NULL_TREE;
6343
6344   /* If we have a specified size that's smaller than that of the field type,
6345      or a position is specified, and the field type is a record, see if we can
6346      get either an integral mode form of the type or a smaller form.  If we
6347      can, show a size was specified for the field if there wasn't one already,
6348      so we know to make this a bitfield and avoid making things wider.
6349
6350      Doing this is first useful if the record is packed because we may then
6351      place the field at a non-byte-aligned position and so achieve tighter
6352      packing.
6353
6354      This is in addition *required* if the field shares a byte with another
6355      field and the front-end lets the back-end handle the references, because
6356      GCC does not handle BLKmode bitfields properly.
6357
6358      We avoid the transformation if it is not required or potentially useful,
6359      as it might entail an increase of the field's alignment and have ripple
6360      effects on the outer record type.  A typical case is a field known to be
6361      byte aligned and not to share a byte with another field.
6362
6363      Besides, we don't even look the possibility of a transformation in cases
6364      known to be in error already, for instance when an invalid size results
6365      from a component clause.  */
6366
6367   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
6368       && !TYPE_IS_FAT_POINTER_P (gnu_field_type)
6369       && host_integerp (TYPE_SIZE (gnu_field_type), 1)
6370       && (packed == 1
6371           || (gnu_size
6372               && (tree_int_cst_lt (gnu_size, TYPE_SIZE (gnu_field_type))
6373                   || Present (Component_Clause (gnat_field))))))
6374     {
6375       /* See what the alternate type and size would be.  */
6376       tree gnu_packable_type = make_packable_type (gnu_field_type, true);
6377
6378       bool has_byte_aligned_clause
6379         = Present (Component_Clause (gnat_field))
6380           && (UI_To_Int (Component_Bit_Offset (gnat_field))
6381               % BITS_PER_UNIT == 0);
6382
6383       /* Compute whether we should avoid the substitution.  */
6384       bool reject
6385         /* There is no point substituting if there is no change...  */
6386         = (gnu_packable_type == gnu_field_type)
6387          /* ... nor when the field is known to be byte aligned and not to
6388             share a byte with another field.  */
6389           || (has_byte_aligned_clause
6390               && value_factor_p (gnu_size, BITS_PER_UNIT))
6391          /* The size of an aliased field must be an exact multiple of the
6392             type's alignment, which the substitution might increase.  Reject
6393             substitutions that would so invalidate a component clause when the
6394             specified position is byte aligned, as the change would have no
6395             real benefit from the packing standpoint anyway.  */
6396           || (Is_Aliased (gnat_field)
6397               && has_byte_aligned_clause
6398               && !value_factor_p (gnu_size, TYPE_ALIGN (gnu_packable_type)));
6399
6400       /* Substitute unless told otherwise.  */
6401       if (!reject)
6402         {
6403           gnu_field_type = gnu_packable_type;
6404
6405           if (!gnu_size)
6406             gnu_size = rm_size (gnu_field_type);
6407         }
6408     }
6409
6410   /* If we are packing the record and the field is BLKmode, round the
6411      size up to a byte boundary.  */
6412   if (packed && TYPE_MODE (gnu_field_type) == BLKmode && gnu_size)
6413     gnu_size = round_up (gnu_size, BITS_PER_UNIT);
6414
6415   if (Present (Component_Clause (gnat_field)))
6416     {
6417       gnu_pos = UI_To_gnu (Component_Bit_Offset (gnat_field), bitsizetype);
6418       gnu_size = validate_size (Esize (gnat_field), gnu_field_type,
6419                                 gnat_field, FIELD_DECL, false, true);
6420
6421       /* Ensure the position does not overlap with the parent subtype,
6422          if there is one.  */
6423       if (Present (Parent_Subtype (Underlying_Type (Scope (gnat_field)))))
6424         {
6425           tree gnu_parent
6426             = gnat_to_gnu_type (Parent_Subtype
6427                                 (Underlying_Type (Scope (gnat_field))));
6428
6429           if (TREE_CODE (TYPE_SIZE (gnu_parent)) == INTEGER_CST
6430               && tree_int_cst_lt (gnu_pos, TYPE_SIZE (gnu_parent)))
6431             {
6432               post_error_ne_tree
6433                 ("offset of& must be beyond parent{, minimum allowed is ^}",
6434                  First_Bit (Component_Clause (gnat_field)), gnat_field,
6435                  TYPE_SIZE_UNIT (gnu_parent));
6436             }
6437         }
6438
6439       /* If this field needs strict alignment, ensure the record is
6440          sufficiently aligned and that that position and size are
6441          consistent with the alignment.  */
6442       if (needs_strict_alignment)
6443         {
6444           TYPE_ALIGN (gnu_record_type)
6445             = MAX (TYPE_ALIGN (gnu_record_type), TYPE_ALIGN (gnu_field_type));
6446
6447           if (gnu_size
6448               && !operand_equal_p (gnu_size, TYPE_SIZE (gnu_field_type), 0))
6449             {
6450               if (Is_Atomic (gnat_field) || Is_Atomic (Etype (gnat_field)))
6451                 post_error_ne_tree
6452                   ("atomic field& must be natural size of type{ (^)}",
6453                    Last_Bit (Component_Clause (gnat_field)), gnat_field,
6454                    TYPE_SIZE (gnu_field_type));
6455
6456               else if (Is_Aliased (gnat_field))
6457                 post_error_ne_tree
6458                   ("size of aliased field& must be ^ bits",
6459                    Last_Bit (Component_Clause (gnat_field)), gnat_field,
6460                    TYPE_SIZE (gnu_field_type));
6461
6462               else if (Strict_Alignment (Etype (gnat_field)))
6463                 post_error_ne_tree
6464                   ("size of & with aliased or tagged components not ^ bits",
6465                    Last_Bit (Component_Clause (gnat_field)), gnat_field,
6466                    TYPE_SIZE (gnu_field_type));
6467
6468               gnu_size = NULL_TREE;
6469             }
6470
6471           if (!integer_zerop (size_binop
6472                               (TRUNC_MOD_EXPR, gnu_pos,
6473                                bitsize_int (TYPE_ALIGN (gnu_field_type)))))
6474             {
6475               if (Is_Aliased (gnat_field))
6476                 post_error_ne_num
6477                   ("position of aliased field& must be multiple of ^ bits",
6478                    First_Bit (Component_Clause (gnat_field)), gnat_field,
6479                    TYPE_ALIGN (gnu_field_type));
6480
6481               else if (Treat_As_Volatile (gnat_field))
6482                 post_error_ne_num
6483                   ("position of volatile field& must be multiple of ^ bits",
6484                    First_Bit (Component_Clause (gnat_field)), gnat_field,
6485                    TYPE_ALIGN (gnu_field_type));
6486
6487               else if (Strict_Alignment (Etype (gnat_field)))
6488                 post_error_ne_num
6489   ("position of & with aliased or tagged components not multiple of ^ bits",
6490                    First_Bit (Component_Clause (gnat_field)), gnat_field,
6491                    TYPE_ALIGN (gnu_field_type));
6492
6493               else
6494                 gcc_unreachable ();
6495
6496               gnu_pos = NULL_TREE;
6497             }
6498         }
6499
6500       if (Is_Atomic (gnat_field))
6501         check_ok_for_atomic (gnu_field_type, gnat_field, false);
6502     }
6503
6504   /* If the record has rep clauses and this is the tag field, make a rep
6505      clause for it as well.  */
6506   else if (Has_Specified_Layout (Scope (gnat_field))
6507            && Chars (gnat_field) == Name_uTag)
6508     {
6509       gnu_pos = bitsize_zero_node;
6510       gnu_size = TYPE_SIZE (gnu_field_type);
6511     }
6512
6513   else
6514     gnu_pos = NULL_TREE;
6515
6516   /* We need to make the size the maximum for the type if it is
6517      self-referential and an unconstrained type.  In that case, we can't
6518      pack the field since we can't make a copy to align it.  */
6519   if (TREE_CODE (gnu_field_type) == RECORD_TYPE
6520       && !gnu_size
6521       && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_field_type))
6522       && !Is_Constrained (Underlying_Type (Etype (gnat_field))))
6523     {
6524       gnu_size = max_size (TYPE_SIZE (gnu_field_type), true);
6525       packed = 0;
6526     }
6527
6528   /* If a size is specified, adjust the field's type to it.  */
6529   if (gnu_size)
6530     {
6531       /* If the field's type is justified modular, we would need to remove
6532          the wrapper to (better) meet the layout requirements.  However we
6533          can do so only if the field is not aliased to preserve the unique
6534          layout and if the prescribed size is not greater than that of the
6535          packed array to preserve the justification.  */
6536       if (!needs_strict_alignment
6537           && TREE_CODE (gnu_field_type) == RECORD_TYPE
6538           && TYPE_JUSTIFIED_MODULAR_P (gnu_field_type)
6539           && tree_int_cst_compare (gnu_size, TYPE_ADA_SIZE (gnu_field_type))
6540                <= 0)
6541         gnu_field_type = TREE_TYPE (TYPE_FIELDS (gnu_field_type));
6542
6543       gnu_field_type
6544         = make_type_from_size (gnu_field_type, gnu_size,
6545                                Has_Biased_Representation (gnat_field));
6546       gnu_field_type = maybe_pad_type (gnu_field_type, gnu_size, 0, gnat_field,
6547                                        "PAD", false, definition, true);
6548     }
6549
6550   /* Otherwise (or if there was an error), don't specify a position.  */
6551   else
6552     gnu_pos = NULL_TREE;
6553
6554   gcc_assert (TREE_CODE (gnu_field_type) != RECORD_TYPE
6555               || !TYPE_CONTAINS_TEMPLATE_P (gnu_field_type));
6556
6557   /* Now create the decl for the field.  */
6558   gnu_field = create_field_decl (gnu_field_id, gnu_field_type, gnu_record_type,
6559                                  packed, gnu_size, gnu_pos,
6560                                  Is_Aliased (gnat_field));
6561   Sloc_to_locus (Sloc (gnat_field), &DECL_SOURCE_LOCATION (gnu_field));
6562   TREE_THIS_VOLATILE (gnu_field) = Treat_As_Volatile (gnat_field);
6563
6564   if (Ekind (gnat_field) == E_Discriminant)
6565     DECL_DISCRIMINANT_NUMBER (gnu_field)
6566       = UI_To_gnu (Discriminant_Number (gnat_field), sizetype);
6567
6568   return gnu_field;
6569 }
6570 \f
6571 /* Return true if TYPE is a type with variable size, a padding type with a
6572    field of variable size or is a record that has a field such a field.  */
6573
6574 static bool
6575 is_variable_size (tree type)
6576 {
6577   tree field;
6578
6579   if (!TREE_CONSTANT (TYPE_SIZE (type)))
6580     return true;
6581
6582   if (TREE_CODE (type) == RECORD_TYPE
6583       && TYPE_IS_PADDING_P (type)
6584       && !TREE_CONSTANT (DECL_SIZE (TYPE_FIELDS (type))))
6585     return true;
6586
6587   if (TREE_CODE (type) != RECORD_TYPE
6588       && TREE_CODE (type) != UNION_TYPE
6589       && TREE_CODE (type) != QUAL_UNION_TYPE)
6590     return false;
6591
6592   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6593     if (is_variable_size (TREE_TYPE (field)))
6594       return true;
6595
6596   return false;
6597 }
6598 \f
6599 /* qsort comparer for the bit positions of two record components.  */
6600
6601 static int
6602 compare_field_bitpos (const PTR rt1, const PTR rt2)
6603 {
6604   const_tree const field1 = * (const_tree const *) rt1;
6605   const_tree const field2 = * (const_tree const *) rt2;
6606   const int ret
6607     = tree_int_cst_compare (bit_position (field1), bit_position (field2));
6608
6609   return ret ? ret : (int) (DECL_UID (field1) - DECL_UID (field2));
6610 }
6611
6612 /* Return a GCC tree for a record type given a GNAT Component_List and a chain
6613    of GCC trees for fields that are in the record and have already been
6614    processed.  When called from gnat_to_gnu_entity during the processing of a
6615    record type definition, the GCC nodes for the discriminants will be on
6616    the chain.  The other calls to this function are recursive calls from
6617    itself for the Component_List of a variant and the chain is empty.
6618
6619    PACKED is 1 if this is for a packed record, -1 if this is for a record
6620    with Component_Alignment of Storage_Unit, -2 if this is for a record
6621    with a specified alignment.
6622
6623    DEFINITION is true if we are defining this record.
6624
6625    P_GNU_REP_LIST, if nonzero, is a pointer to a list to which each field
6626    with a rep clause is to be added.  If it is nonzero, that is all that
6627    should be done with such fields.
6628
6629    CANCEL_ALIGNMENT, if true, means the alignment should be zeroed before
6630    laying out the record.  This means the alignment only serves to force fields
6631    to be bitfields, but not require the record to be that aligned.  This is
6632    used for variants.
6633
6634    ALL_REP, if true, means a rep clause was found for all the fields.  This
6635    simplifies the logic since we know we're not in the mixed case.
6636
6637    DO_NOT_FINALIZE, if true, means that the record type is expected to be
6638    modified afterwards so it will not be sent to the back-end for finalization.
6639
6640    UNCHECKED_UNION, if true, means that we are building a type for a record
6641    with a Pragma Unchecked_Union.
6642
6643    The processing of the component list fills in the chain with all of the
6644    fields of the record and then the record type is finished.  */
6645
6646 static void
6647 components_to_record (tree gnu_record_type, Node_Id component_list,
6648                       tree gnu_field_list, int packed, bool definition,
6649                       tree *p_gnu_rep_list, bool cancel_alignment,
6650                       bool all_rep, bool do_not_finalize, bool unchecked_union)
6651 {
6652   Node_Id component_decl;
6653   Entity_Id gnat_field;
6654   Node_Id variant_part;
6655   tree gnu_our_rep_list = NULL_TREE;
6656   tree gnu_field, gnu_last;
6657   bool layout_with_rep = false;
6658   bool all_rep_and_size = all_rep && TYPE_SIZE (gnu_record_type);
6659
6660   /* For each variable within each component declaration create a GCC field
6661      and add it to the list, skipping any pragmas in the list.  */
6662   if (Present (Component_Items (component_list)))
6663     for (component_decl = First_Non_Pragma (Component_Items (component_list));
6664          Present (component_decl);
6665          component_decl = Next_Non_Pragma (component_decl))
6666       {
6667         gnat_field = Defining_Entity (component_decl);
6668
6669         if (Chars (gnat_field) == Name_uParent)
6670           gnu_field = tree_last (TYPE_FIELDS (gnu_record_type));
6671         else
6672           {
6673             gnu_field = gnat_to_gnu_field (gnat_field, gnu_record_type,
6674                                            packed, definition);
6675
6676             /* If this is the _Tag field, put it before any discriminants,
6677                instead of after them as is the case for all other fields.  */
6678             if (Chars (gnat_field) == Name_uTag)
6679               gnu_field_list = chainon (gnu_field_list, gnu_field);
6680             else
6681               {
6682                 TREE_CHAIN (gnu_field) = gnu_field_list;
6683                 gnu_field_list = gnu_field;
6684               }
6685           }
6686
6687         save_gnu_tree (gnat_field, gnu_field, false);
6688       }
6689
6690   /* At the end of the component list there may be a variant part.  */
6691   variant_part = Variant_Part (component_list);
6692
6693   /* We create a QUAL_UNION_TYPE for the variant part since the variants are
6694      mutually exclusive and should go in the same memory.  To do this we need
6695      to treat each variant as a record whose elements are created from the
6696      component list for the variant.  So here we create the records from the
6697      lists for the variants and put them all into the QUAL_UNION_TYPE.
6698      If this is an Unchecked_Union, we make a UNION_TYPE instead or
6699      use GNU_RECORD_TYPE if there are no fields so far.  */
6700   if (Present (variant_part))
6701     {
6702       Node_Id gnat_discr = Name (variant_part), variant;
6703       tree gnu_discr = gnat_to_gnu (gnat_discr);
6704       tree gnu_name = TYPE_NAME (gnu_record_type);
6705       tree gnu_var_name
6706         = concat_name (get_identifier (Get_Name_String (Chars (gnat_discr))),
6707                        "XVN");
6708       tree gnu_union_type, gnu_union_name, gnu_union_field;
6709       tree gnu_variant_list = NULL_TREE;
6710
6711       if (TREE_CODE (gnu_name) == TYPE_DECL)
6712         gnu_name = DECL_NAME (gnu_name);
6713
6714       gnu_union_name
6715         = concat_name (gnu_name, IDENTIFIER_POINTER (gnu_var_name));
6716
6717       /* Reuse an enclosing union if all fields are in the variant part
6718          and there is no representation clause on the record, to match
6719          the layout of C unions.  There is an associated check below.  */
6720       if (!gnu_field_list
6721           && TREE_CODE (gnu_record_type) == UNION_TYPE
6722           && !TYPE_PACKED (gnu_record_type))
6723         gnu_union_type = gnu_record_type;
6724       else
6725         {
6726           gnu_union_type
6727             = make_node (unchecked_union ? UNION_TYPE : QUAL_UNION_TYPE);
6728
6729           TYPE_NAME (gnu_union_type) = gnu_union_name;
6730           TYPE_ALIGN (gnu_union_type) = 0;
6731           TYPE_PACKED (gnu_union_type) = TYPE_PACKED (gnu_record_type);
6732         }
6733
6734       for (variant = First_Non_Pragma (Variants (variant_part));
6735            Present (variant);
6736            variant = Next_Non_Pragma (variant))
6737         {
6738           tree gnu_variant_type = make_node (RECORD_TYPE);
6739           tree gnu_inner_name;
6740           tree gnu_qual;
6741
6742           Get_Variant_Encoding (variant);
6743           gnu_inner_name = get_identifier_with_length (Name_Buffer, Name_Len);
6744           TYPE_NAME (gnu_variant_type)
6745             = concat_name (gnu_union_name,
6746                            IDENTIFIER_POINTER (gnu_inner_name));
6747
6748           /* Set the alignment of the inner type in case we need to make
6749              inner objects into bitfields, but then clear it out
6750              so the record actually gets only the alignment required.  */
6751           TYPE_ALIGN (gnu_variant_type) = TYPE_ALIGN (gnu_record_type);
6752           TYPE_PACKED (gnu_variant_type) = TYPE_PACKED (gnu_record_type);
6753
6754           /* Similarly, if the outer record has a size specified and all fields
6755              have record rep clauses, we can propagate the size into the
6756              variant part.  */
6757           if (all_rep_and_size)
6758             {
6759               TYPE_SIZE (gnu_variant_type) = TYPE_SIZE (gnu_record_type);
6760               TYPE_SIZE_UNIT (gnu_variant_type)
6761                 = TYPE_SIZE_UNIT (gnu_record_type);
6762             }
6763
6764           /* Create the record type for the variant.  Note that we defer
6765              finalizing it until after we are sure to actually use it.  */
6766           components_to_record (gnu_variant_type, Component_List (variant),
6767                                 NULL_TREE, packed, definition,
6768                                 &gnu_our_rep_list, !all_rep_and_size, all_rep,
6769                                 true, unchecked_union);
6770
6771           gnu_qual = choices_to_gnu (gnu_discr, Discrete_Choices (variant));
6772
6773           Set_Present_Expr (variant, annotate_value (gnu_qual));
6774
6775           /* If this is an Unchecked_Union and we have exactly one field,
6776              use this field directly to match the layout of C unions.  */
6777           if (unchecked_union
6778               && TYPE_FIELDS (gnu_variant_type)
6779               && !TREE_CHAIN (TYPE_FIELDS (gnu_variant_type)))
6780             gnu_field = TYPE_FIELDS (gnu_variant_type);
6781           else
6782             {
6783               /* Deal with packedness like in gnat_to_gnu_field.  */
6784               int field_packed
6785                 = adjust_packed (gnu_variant_type, gnu_record_type, packed);
6786
6787               /* Finalize the record type now.  We used to throw away
6788                  empty records but we no longer do that because we need
6789                  them to generate complete debug info for the variant;
6790                  otherwise, the union type definition will be lacking
6791                  the fields associated with these empty variants.  */
6792               rest_of_record_type_compilation (gnu_variant_type);
6793
6794               gnu_field = create_field_decl (gnu_inner_name, gnu_variant_type,
6795                                              gnu_union_type, field_packed,
6796                                              (all_rep_and_size
6797                                               ? TYPE_SIZE (gnu_variant_type)
6798                                               : 0),
6799                                              (all_rep_and_size
6800                                               ? bitsize_zero_node : 0),
6801                                              0);
6802
6803               DECL_INTERNAL_P (gnu_field) = 1;
6804
6805               if (!unchecked_union)
6806                 DECL_QUALIFIER (gnu_field) = gnu_qual;
6807             }
6808
6809           TREE_CHAIN (gnu_field) = gnu_variant_list;
6810           gnu_variant_list = gnu_field;
6811         }
6812
6813       /* Only make the QUAL_UNION_TYPE if there are any non-empty variants.  */
6814       if (gnu_variant_list)
6815         {
6816           int union_field_packed;
6817
6818           if (all_rep_and_size)
6819             {
6820               TYPE_SIZE (gnu_union_type) = TYPE_SIZE (gnu_record_type);
6821               TYPE_SIZE_UNIT (gnu_union_type)
6822                 = TYPE_SIZE_UNIT (gnu_record_type);
6823             }
6824
6825           finish_record_type (gnu_union_type, nreverse (gnu_variant_list),
6826                               all_rep_and_size ? 1 : 0, false);
6827
6828           /* If GNU_UNION_TYPE is our record type, it means we must have an
6829              Unchecked_Union with no fields.  Verify that and, if so, just
6830              return.  */
6831           if (gnu_union_type == gnu_record_type)
6832             {
6833               gcc_assert (unchecked_union
6834                           && !gnu_field_list
6835                           && !gnu_our_rep_list);
6836               return;
6837             }
6838
6839           /* Deal with packedness like in gnat_to_gnu_field.  */
6840           union_field_packed
6841             = adjust_packed (gnu_union_type, gnu_record_type, packed);
6842
6843           gnu_union_field
6844             = create_field_decl (gnu_var_name, gnu_union_type, gnu_record_type,
6845                                  union_field_packed,
6846                                  all_rep ? TYPE_SIZE (gnu_union_type) : 0,
6847                                  all_rep ? bitsize_zero_node : 0, 0);
6848
6849           DECL_INTERNAL_P (gnu_union_field) = 1;
6850           TREE_CHAIN (gnu_union_field) = gnu_field_list;
6851           gnu_field_list = gnu_union_field;
6852         }
6853     }
6854
6855   /* Scan GNU_FIELD_LIST and see if any fields have rep clauses.  If they
6856      do, pull them out and put them into GNU_OUR_REP_LIST.  We have to do this
6857      in a separate pass since we want to handle the discriminants but can't
6858      play with them until we've used them in debugging data above.
6859
6860      ??? Note: if we then reorder them, debugging information will be wrong,
6861      but there's nothing that can be done about this at the moment.  */
6862   for (gnu_field = gnu_field_list, gnu_last = NULL_TREE; gnu_field; )
6863     {
6864       if (DECL_FIELD_OFFSET (gnu_field))
6865         {
6866           tree gnu_next = TREE_CHAIN (gnu_field);
6867
6868           if (!gnu_last)
6869             gnu_field_list = gnu_next;
6870           else
6871             TREE_CHAIN (gnu_last) = gnu_next;
6872
6873           TREE_CHAIN (gnu_field) = gnu_our_rep_list;
6874           gnu_our_rep_list = gnu_field;
6875           gnu_field = gnu_next;
6876         }
6877       else
6878         {
6879           gnu_last = gnu_field;
6880           gnu_field = TREE_CHAIN (gnu_field);
6881         }
6882     }
6883
6884   /* If we have any items in our rep'ed field list, it is not the case that all
6885      the fields in the record have rep clauses, and P_REP_LIST is nonzero,
6886      set it and ignore the items.  */
6887   if (gnu_our_rep_list && p_gnu_rep_list && !all_rep)
6888     *p_gnu_rep_list = chainon (*p_gnu_rep_list, gnu_our_rep_list);
6889   else if (gnu_our_rep_list)
6890     {
6891       /* Otherwise, sort the fields by bit position and put them into their
6892          own record if we have any fields without rep clauses.  */
6893       tree gnu_rep_type
6894         = (gnu_field_list ? make_node (RECORD_TYPE) : gnu_record_type);
6895       int len = list_length (gnu_our_rep_list);
6896       tree *gnu_arr = (tree *) alloca (sizeof (tree) * len);
6897       int i;
6898
6899       for (i = 0, gnu_field = gnu_our_rep_list; gnu_field;
6900            gnu_field = TREE_CHAIN (gnu_field), i++)
6901         gnu_arr[i] = gnu_field;
6902
6903       qsort (gnu_arr, len, sizeof (tree), compare_field_bitpos);
6904
6905       /* Put the fields in the list in order of increasing position, which
6906          means we start from the end.  */
6907       gnu_our_rep_list = NULL_TREE;
6908       for (i = len - 1; i >= 0; i--)
6909         {
6910           TREE_CHAIN (gnu_arr[i]) = gnu_our_rep_list;
6911           gnu_our_rep_list = gnu_arr[i];
6912           DECL_CONTEXT (gnu_arr[i]) = gnu_rep_type;
6913         }
6914
6915       if (gnu_field_list)
6916         {
6917           finish_record_type (gnu_rep_type, gnu_our_rep_list, 1, false);
6918           gnu_field = create_field_decl (get_identifier ("REP"), gnu_rep_type,
6919                                          gnu_record_type, 0, 0, 0, 1);
6920           DECL_INTERNAL_P (gnu_field) = 1;
6921           gnu_field_list = chainon (gnu_field_list, gnu_field);
6922         }
6923       else
6924         {
6925           layout_with_rep = true;
6926           gnu_field_list = nreverse (gnu_our_rep_list);
6927         }
6928     }
6929
6930   if (cancel_alignment)
6931     TYPE_ALIGN (gnu_record_type) = 0;
6932
6933   finish_record_type (gnu_record_type, nreverse (gnu_field_list),
6934                       layout_with_rep ? 1 : 0, do_not_finalize);
6935 }
6936 \f
6937 /* Given GNU_SIZE, a GCC tree representing a size, return a Uint to be
6938    placed into an Esize, Component_Bit_Offset, or Component_Size value
6939    in the GNAT tree.  */
6940
6941 static Uint
6942 annotate_value (tree gnu_size)
6943 {
6944   int len = TREE_CODE_LENGTH (TREE_CODE (gnu_size));
6945   TCode tcode;
6946   Node_Ref_Or_Val ops[3], ret;
6947   int i;
6948   int size;
6949   struct tree_int_map **h = NULL;
6950
6951   /* See if we've already saved the value for this node.  */
6952   if (EXPR_P (gnu_size))
6953     {
6954       struct tree_int_map in;
6955       if (!annotate_value_cache)
6956         annotate_value_cache = htab_create_ggc (512, tree_int_map_hash,
6957                                                 tree_int_map_eq, 0);
6958       in.base.from = gnu_size;
6959       h = (struct tree_int_map **)
6960             htab_find_slot (annotate_value_cache, &in, INSERT);
6961
6962       if (*h)
6963         return (Node_Ref_Or_Val) (*h)->to;
6964     }
6965
6966   /* If we do not return inside this switch, TCODE will be set to the
6967      code to use for a Create_Node operand and LEN (set above) will be
6968      the number of recursive calls for us to make.  */
6969
6970   switch (TREE_CODE (gnu_size))
6971     {
6972     case INTEGER_CST:
6973       if (TREE_OVERFLOW (gnu_size))
6974         return No_Uint;
6975
6976       /* This may have come from a conversion from some smaller type,
6977          so ensure this is in bitsizetype.  */
6978       gnu_size = convert (bitsizetype, gnu_size);
6979
6980       /* For negative values, use NEGATE_EXPR of the supplied value.  */
6981       if (tree_int_cst_sgn (gnu_size) < 0)
6982         {
6983           /* The ridiculous code below is to handle the case of the largest
6984              negative integer.  */
6985           tree negative_size = size_diffop (bitsize_zero_node, gnu_size);
6986           bool adjust = false;
6987           tree temp;
6988
6989           if (TREE_OVERFLOW (negative_size))
6990             {
6991               negative_size
6992                 = size_binop (MINUS_EXPR, bitsize_zero_node,
6993                               size_binop (PLUS_EXPR, gnu_size,
6994                                           bitsize_one_node));
6995               adjust = true;
6996             }
6997
6998           temp = build1 (NEGATE_EXPR, bitsizetype, negative_size);
6999           if (adjust)
7000             temp = build2 (MINUS_EXPR, bitsizetype, temp, bitsize_one_node);
7001
7002           return annotate_value (temp);
7003         }
7004
7005       if (!host_integerp (gnu_size, 1))
7006         return No_Uint;
7007
7008       size = tree_low_cst (gnu_size, 1);
7009
7010       /* This peculiar test is to make sure that the size fits in an int
7011          on machines where HOST_WIDE_INT is not "int".  */
7012       if (tree_low_cst (gnu_size, 1) == size)
7013         return UI_From_Int (size);
7014       else
7015         return No_Uint;
7016
7017     case COMPONENT_REF:
7018       /* The only case we handle here is a simple discriminant reference.  */
7019       if (TREE_CODE (TREE_OPERAND (gnu_size, 0)) == PLACEHOLDER_EXPR
7020           && TREE_CODE (TREE_OPERAND (gnu_size, 1)) == FIELD_DECL
7021           && DECL_DISCRIMINANT_NUMBER (TREE_OPERAND (gnu_size, 1)))
7022         return Create_Node (Discrim_Val,
7023                             annotate_value (DECL_DISCRIMINANT_NUMBER
7024                                             (TREE_OPERAND (gnu_size, 1))),
7025                             No_Uint, No_Uint);
7026       else
7027         return No_Uint;
7028
7029     CASE_CONVERT:   case NON_LVALUE_EXPR:
7030       return annotate_value (TREE_OPERAND (gnu_size, 0));
7031
7032       /* Now just list the operations we handle.  */
7033     case COND_EXPR:             tcode = Cond_Expr; break;
7034     case PLUS_EXPR:             tcode = Plus_Expr; break;
7035     case MINUS_EXPR:            tcode = Minus_Expr; break;
7036     case MULT_EXPR:             tcode = Mult_Expr; break;
7037     case TRUNC_DIV_EXPR:        tcode = Trunc_Div_Expr; break;
7038     case CEIL_DIV_EXPR:         tcode = Ceil_Div_Expr; break;
7039     case FLOOR_DIV_EXPR:        tcode = Floor_Div_Expr; break;
7040     case TRUNC_MOD_EXPR:        tcode = Trunc_Mod_Expr; break;
7041     case CEIL_MOD_EXPR:         tcode = Ceil_Mod_Expr; break;
7042     case FLOOR_MOD_EXPR:        tcode = Floor_Mod_Expr; break;
7043     case EXACT_DIV_EXPR:        tcode = Exact_Div_Expr; break;
7044     case NEGATE_EXPR:           tcode = Negate_Expr; break;
7045     case MIN_EXPR:              tcode = Min_Expr; break;
7046     case MAX_EXPR:              tcode = Max_Expr; break;
7047     case ABS_EXPR:              tcode = Abs_Expr; break;
7048     case TRUTH_ANDIF_EXPR:      tcode = Truth_Andif_Expr; break;
7049     case TRUTH_ORIF_EXPR:       tcode = Truth_Orif_Expr; break;
7050     case TRUTH_AND_EXPR:        tcode = Truth_And_Expr; break;
7051     case TRUTH_OR_EXPR:         tcode = Truth_Or_Expr; break;
7052     case TRUTH_XOR_EXPR:        tcode = Truth_Xor_Expr; break;
7053     case TRUTH_NOT_EXPR:        tcode = Truth_Not_Expr; break;
7054     case BIT_AND_EXPR:          tcode = Bit_And_Expr; break;
7055     case LT_EXPR:               tcode = Lt_Expr; break;
7056     case LE_EXPR:               tcode = Le_Expr; break;
7057     case GT_EXPR:               tcode = Gt_Expr; break;
7058     case GE_EXPR:               tcode = Ge_Expr; break;
7059     case EQ_EXPR:               tcode = Eq_Expr; break;
7060     case NE_EXPR:               tcode = Ne_Expr; break;
7061
7062     default:
7063       return No_Uint;
7064     }
7065
7066   /* Now get each of the operands that's relevant for this code.  If any
7067      cannot be expressed as a repinfo node, say we can't.  */
7068   for (i = 0; i < 3; i++)
7069     ops[i] = No_Uint;
7070
7071   for (i = 0; i < len; i++)
7072     {
7073       ops[i] = annotate_value (TREE_OPERAND (gnu_size, i));
7074       if (ops[i] == No_Uint)
7075         return No_Uint;
7076     }
7077
7078   ret = Create_Node (tcode, ops[0], ops[1], ops[2]);
7079
7080   /* Save the result in the cache.  */
7081   if (h)
7082     {
7083       *h = GGC_NEW (struct tree_int_map);
7084       (*h)->base.from = gnu_size;
7085       (*h)->to = ret;
7086     }
7087
7088   return ret;
7089 }
7090
7091 /* Given GNAT_ENTITY, a record type, and GNU_TYPE, its corresponding
7092    GCC type, set Component_Bit_Offset and Esize to the position and size
7093    used by Gigi.  */
7094
7095 static void
7096 annotate_rep (Entity_Id gnat_entity, tree gnu_type)
7097 {
7098   tree gnu_list;
7099   tree gnu_entry;
7100   Entity_Id gnat_field;
7101
7102   /* We operate by first making a list of all fields and their positions
7103      (we can get the sizes easily at any time) by a recursive call
7104      and then update all the sizes into the tree.  */
7105   gnu_list = compute_field_positions (gnu_type, NULL_TREE,
7106                                       size_zero_node, bitsize_zero_node,
7107                                       BIGGEST_ALIGNMENT);
7108
7109   for (gnat_field = First_Entity (gnat_entity); Present (gnat_field);
7110        gnat_field = Next_Entity (gnat_field))
7111     if ((Ekind (gnat_field) == E_Component
7112          || (Ekind (gnat_field) == E_Discriminant
7113              && !Is_Unchecked_Union (Scope (gnat_field)))))
7114       {
7115         tree parent_offset = bitsize_zero_node;
7116
7117         gnu_entry = purpose_member (gnat_to_gnu_field_decl (gnat_field),
7118                                     gnu_list);
7119
7120         if (gnu_entry)
7121           {
7122             if (type_annotate_only && Is_Tagged_Type (gnat_entity))
7123               {
7124                 /* In this mode the tag and parent components have not been
7125                    generated, so we add the appropriate offset to each
7126                    component.  For a component appearing in the current
7127                    extension, the offset is the size of the parent.  */
7128             if (Is_Derived_Type (gnat_entity)
7129                 && Original_Record_Component (gnat_field) == gnat_field)
7130               parent_offset
7131                 = UI_To_gnu (Esize (Etype (Base_Type (gnat_entity))),
7132                              bitsizetype);
7133             else
7134               parent_offset = bitsize_int (POINTER_SIZE);
7135               }
7136
7137           Set_Component_Bit_Offset
7138             (gnat_field,
7139              annotate_value
7140              (size_binop (PLUS_EXPR,
7141                           bit_from_pos (TREE_PURPOSE (TREE_VALUE (gnu_entry)),
7142                                         TREE_VALUE (TREE_VALUE
7143                                                     (TREE_VALUE (gnu_entry)))),
7144                           parent_offset)));
7145
7146             Set_Esize (gnat_field,
7147                        annotate_value (DECL_SIZE (TREE_PURPOSE (gnu_entry))));
7148           }
7149         else if (Is_Tagged_Type (gnat_entity)
7150                  && Is_Derived_Type (gnat_entity))
7151           {
7152             /* If there is no gnu_entry, this is an inherited component whose
7153                position is the same as in the parent type.  */
7154             Set_Component_Bit_Offset
7155               (gnat_field,
7156                Component_Bit_Offset (Original_Record_Component (gnat_field)));
7157             Set_Esize (gnat_field,
7158                        Esize (Original_Record_Component (gnat_field)));
7159           }
7160       }
7161 }
7162
7163 /* Scan all fields in GNU_TYPE and build entries where TREE_PURPOSE is the
7164    FIELD_DECL and TREE_VALUE a TREE_LIST with TREE_PURPOSE being the byte
7165    position and TREE_VALUE being a TREE_LIST with TREE_PURPOSE the value to be
7166    placed into DECL_OFFSET_ALIGN and TREE_VALUE the bit position.  GNU_POS is
7167    to be added to the position, GNU_BITPOS to the bit position, OFFSET_ALIGN is
7168    the present value of DECL_OFFSET_ALIGN and GNU_LIST is a list of the entries
7169    so far.  */
7170
7171 static tree
7172 compute_field_positions (tree gnu_type, tree gnu_list, tree gnu_pos,
7173                          tree gnu_bitpos, unsigned int offset_align)
7174 {
7175   tree gnu_field;
7176   tree gnu_result = gnu_list;
7177
7178   for (gnu_field = TYPE_FIELDS (gnu_type); gnu_field;
7179        gnu_field = TREE_CHAIN (gnu_field))
7180     {
7181       tree gnu_our_bitpos = size_binop (PLUS_EXPR, gnu_bitpos,
7182                                         DECL_FIELD_BIT_OFFSET (gnu_field));
7183       tree gnu_our_offset = size_binop (PLUS_EXPR, gnu_pos,
7184                                         DECL_FIELD_OFFSET (gnu_field));
7185       unsigned int our_offset_align
7186         = MIN (offset_align, DECL_OFFSET_ALIGN (gnu_field));
7187
7188       gnu_result
7189         = tree_cons (gnu_field,
7190                      tree_cons (gnu_our_offset,
7191                                 tree_cons (size_int (our_offset_align),
7192                                            gnu_our_bitpos, NULL_TREE),
7193                                 NULL_TREE),
7194                      gnu_result);
7195
7196       if (DECL_INTERNAL_P (gnu_field))
7197         gnu_result
7198           = compute_field_positions (TREE_TYPE (gnu_field), gnu_result,
7199                                      gnu_our_offset, gnu_our_bitpos,
7200                                      our_offset_align);
7201     }
7202
7203   return gnu_result;
7204 }
7205 \f
7206 /* UINT_SIZE is a Uint giving the specified size for an object of GNU_TYPE
7207    corresponding to GNAT_OBJECT.  If size is valid, return a tree corresponding
7208    to its value.  Otherwise return 0.  KIND is VAR_DECL is we are specifying
7209    the size for an object, TYPE_DECL for the size of a type, and FIELD_DECL
7210    for the size of a field.  COMPONENT_P is true if we are being called
7211    to process the Component_Size of GNAT_OBJECT.  This is used for error
7212    message handling and to indicate to use the object size of GNU_TYPE.
7213    ZERO_OK is true if a size of zero is permitted; if ZERO_OK is false,
7214    it means that a size of zero should be treated as an unspecified size.  */
7215
7216 static tree
7217 validate_size (Uint uint_size, tree gnu_type, Entity_Id gnat_object,
7218                enum tree_code kind, bool component_p, bool zero_ok)
7219 {
7220   Node_Id gnat_error_node;
7221   tree type_size, size;
7222
7223   if (kind == VAR_DECL
7224       /* If a type needs strict alignment, a component of this type in
7225          a packed record cannot be packed and thus uses the type size.  */
7226       || (kind == TYPE_DECL && Strict_Alignment (gnat_object)))
7227     type_size = TYPE_SIZE (gnu_type);
7228   else
7229     type_size = rm_size (gnu_type);
7230
7231   /* Find the node to use for errors.  */
7232   if ((Ekind (gnat_object) == E_Component
7233        || Ekind (gnat_object) == E_Discriminant)
7234       && Present (Component_Clause (gnat_object)))
7235     gnat_error_node = Last_Bit (Component_Clause (gnat_object));
7236   else if (Present (Size_Clause (gnat_object)))
7237     gnat_error_node = Expression (Size_Clause (gnat_object));
7238   else
7239     gnat_error_node = gnat_object;
7240
7241   /* Return 0 if no size was specified, either because Esize was not Present
7242      or the specified size was zero.  */
7243   if (No (uint_size) || uint_size == No_Uint)
7244     return NULL_TREE;
7245
7246   /* Get the size as a tree.  Issue an error if a size was specified but
7247      cannot be represented in sizetype.  */
7248   size = UI_To_gnu (uint_size, bitsizetype);
7249   if (TREE_OVERFLOW (size))
7250     {
7251       post_error_ne (component_p ? "component size of & is too large"
7252                      : "size of & is too large",
7253                      gnat_error_node, gnat_object);
7254       return NULL_TREE;
7255     }
7256
7257   /* Ignore a negative size since that corresponds to our back-annotation.
7258      Also ignore a zero size if it is not permitted.  */
7259   if (tree_int_cst_sgn (size) < 0 || (integer_zerop (size) && !zero_ok))
7260     return NULL_TREE;
7261
7262   /* The size of objects is always a multiple of a byte.  */
7263   if (kind == VAR_DECL
7264       && !integer_zerop (size_binop (TRUNC_MOD_EXPR, size, bitsize_unit_node)))
7265     {
7266       if (component_p)
7267         post_error_ne ("component size for& is not a multiple of Storage_Unit",
7268                        gnat_error_node, gnat_object);
7269       else
7270         post_error_ne ("size for& is not a multiple of Storage_Unit",
7271                        gnat_error_node, gnat_object);
7272       return NULL_TREE;
7273     }
7274
7275   /* If this is an integral type or a packed array type, the front-end has
7276      verified the size, so we need not do it here (which would entail
7277      checking against the bounds).  However, if this is an aliased object,
7278      it may not be smaller than the type of the object.  */
7279   if ((INTEGRAL_TYPE_P (gnu_type) || TYPE_IS_PACKED_ARRAY_TYPE_P (gnu_type))
7280       && !(kind == VAR_DECL && Is_Aliased (gnat_object)))
7281     return size;
7282
7283   /* If the object is a record that contains a template, add the size of
7284      the template to the specified size.  */
7285   if (TREE_CODE (gnu_type) == RECORD_TYPE
7286       && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
7287     size = size_binop (PLUS_EXPR, DECL_SIZE (TYPE_FIELDS (gnu_type)), size);
7288
7289   /* Modify the size of the type to be that of the maximum size if it has a
7290      discriminant.  */
7291   if (type_size && CONTAINS_PLACEHOLDER_P (type_size))
7292     type_size = max_size (type_size, true);
7293
7294   /* If this is an access type or a fat pointer, the minimum size is that given
7295      by the smallest integral mode that's valid for pointers.  */
7296   if ((TREE_CODE (gnu_type) == POINTER_TYPE) || TYPE_FAT_POINTER_P (gnu_type))
7297     {
7298       enum machine_mode p_mode;
7299
7300       for (p_mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
7301            !targetm.valid_pointer_mode (p_mode);
7302            p_mode = GET_MODE_WIDER_MODE (p_mode))
7303         ;
7304
7305       type_size = bitsize_int (GET_MODE_BITSIZE (p_mode));
7306     }
7307
7308   /* If the size of the object is a constant, the new size must not be
7309      smaller.  */
7310   if (TREE_CODE (type_size) != INTEGER_CST
7311       || TREE_OVERFLOW (type_size)
7312       || tree_int_cst_lt (size, type_size))
7313     {
7314       if (component_p)
7315         post_error_ne_tree
7316           ("component size for& too small{, minimum allowed is ^}",
7317            gnat_error_node, gnat_object, type_size);
7318       else
7319         post_error_ne_tree ("size for& too small{, minimum allowed is ^}",
7320                             gnat_error_node, gnat_object, type_size);
7321
7322       if (kind == VAR_DECL && !component_p
7323           && TREE_CODE (rm_size (gnu_type)) == INTEGER_CST
7324           && !tree_int_cst_lt (size, rm_size (gnu_type)))
7325         post_error_ne_tree_2
7326           ("\\size of ^ is not a multiple of alignment (^ bits)",
7327            gnat_error_node, gnat_object, rm_size (gnu_type),
7328            TYPE_ALIGN (gnu_type));
7329
7330       else if (INTEGRAL_TYPE_P (gnu_type))
7331         post_error_ne ("\\size would be legal if & were not aliased!",
7332                        gnat_error_node, gnat_object);
7333
7334       return NULL_TREE;
7335     }
7336
7337   return size;
7338 }
7339 \f
7340 /* Similarly, but both validate and process a value of RM size.  This
7341    routine is only called for types.  */
7342
7343 static void
7344 set_rm_size (Uint uint_size, tree gnu_type, Entity_Id gnat_entity)
7345 {
7346   /* Only issue an error if a Value_Size clause was explicitly given.
7347      Otherwise, we'd be duplicating an error on the Size clause.  */
7348   Node_Id gnat_attr_node
7349     = Get_Attribute_Definition_Clause (gnat_entity, Attr_Value_Size);
7350   tree old_size = rm_size (gnu_type), size;
7351
7352   /* Do nothing if no size was specified, either because RM size was not
7353      Present or if the specified size was zero.  */
7354   if (No (uint_size) || uint_size == No_Uint)
7355     return;
7356
7357   /* Get the size as a tree.  Issue an error if a size was specified but
7358      cannot be represented in sizetype.  */
7359   size = UI_To_gnu (uint_size, bitsizetype);
7360   if (TREE_OVERFLOW (size))
7361     {
7362       if (Present (gnat_attr_node))
7363         post_error_ne ("Value_Size of & is too large", gnat_attr_node,
7364                        gnat_entity);
7365       return;
7366     }
7367
7368   /* Ignore a negative size since that corresponds to our back-annotation.
7369      Also ignore a zero size unless a Value_Size clause exists, or a size
7370      clause exists, or this is an integer type, in which case the front-end
7371      will have always set it.  */
7372   if (tree_int_cst_sgn (size) < 0
7373       || (integer_zerop (size)
7374           && No (gnat_attr_node)
7375           && !Has_Size_Clause (gnat_entity)
7376           && !Is_Discrete_Or_Fixed_Point_Type (gnat_entity)))
7377     return;
7378
7379   /* If the old size is self-referential, get the maximum size.  */
7380   if (CONTAINS_PLACEHOLDER_P (old_size))
7381     old_size = max_size (old_size, true);
7382
7383   /* If the size of the object is a constant, the new size must not be
7384      smaller (the front-end checks this for scalar types).  */
7385   if (TREE_CODE (old_size) != INTEGER_CST
7386       || TREE_OVERFLOW (old_size)
7387       || (AGGREGATE_TYPE_P (gnu_type) && tree_int_cst_lt (size, old_size)))
7388     {
7389       if (Present (gnat_attr_node))
7390         post_error_ne_tree
7391           ("Value_Size for& too small{, minimum allowed is ^}",
7392            gnat_attr_node, gnat_entity, old_size);
7393       return;
7394     }
7395
7396   /* Otherwise, set the RM size proper for numerical types...  */
7397   if ((TREE_CODE (gnu_type) == INTEGER_TYPE
7398        && Is_Discrete_Or_Fixed_Point_Type (gnat_entity))
7399       || (TREE_CODE (gnu_type) == ENUMERAL_TYPE
7400           || TREE_CODE (gnu_type) == BOOLEAN_TYPE))
7401     TYPE_RM_SIZE (gnu_type) = size;
7402
7403   /* ...or the Ada size for record and union types.  */
7404   else if ((TREE_CODE (gnu_type) == RECORD_TYPE
7405             || TREE_CODE (gnu_type) == UNION_TYPE
7406             || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
7407            && !TYPE_IS_FAT_POINTER_P (gnu_type))
7408     SET_TYPE_ADA_SIZE (gnu_type, size);
7409 }
7410 \f
7411 /* Given a type TYPE, return a new type whose size is appropriate for SIZE.
7412    If TYPE is the best type, return it.  Otherwise, make a new type.  We
7413    only support new integral and pointer types.  FOR_BIASED is true if
7414    we are making a biased type.  */
7415
7416 static tree
7417 make_type_from_size (tree type, tree size_tree, bool for_biased)
7418 {
7419   unsigned HOST_WIDE_INT size;
7420   bool biased_p;
7421   tree new_type;
7422
7423   /* If size indicates an error, just return TYPE to avoid propagating
7424      the error.  Likewise if it's too large to represent.  */
7425   if (!size_tree || !host_integerp (size_tree, 1))
7426     return type;
7427
7428   size = tree_low_cst (size_tree, 1);
7429
7430   switch (TREE_CODE (type))
7431     {
7432     case INTEGER_TYPE:
7433     case ENUMERAL_TYPE:
7434     case BOOLEAN_TYPE:
7435       biased_p = (TREE_CODE (type) == INTEGER_TYPE
7436                   && TYPE_BIASED_REPRESENTATION_P (type));
7437
7438       /* Only do something if the type is not a packed array type and
7439          doesn't already have the proper size.  */
7440       if (TYPE_PACKED_ARRAY_TYPE_P (type)
7441           || (TYPE_PRECISION (type) == size && biased_p == for_biased))
7442         break;
7443
7444       biased_p |= for_biased;
7445       if (size > LONG_LONG_TYPE_SIZE)
7446         size = LONG_LONG_TYPE_SIZE;
7447
7448       if (TYPE_UNSIGNED (type) || biased_p)
7449         new_type = make_unsigned_type (size);
7450       else
7451         new_type = make_signed_type (size);
7452       TREE_TYPE (new_type) = TREE_TYPE (type) ? TREE_TYPE (type) : type;
7453       TYPE_MIN_VALUE (new_type)
7454         = convert (TREE_TYPE (new_type), TYPE_MIN_VALUE (type));
7455       TYPE_MAX_VALUE (new_type)
7456         = convert (TREE_TYPE (new_type), TYPE_MAX_VALUE (type));
7457       /* Propagate the name to avoid creating a fake subrange type.  */
7458       if (TYPE_NAME (type))
7459         {
7460           if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
7461             TYPE_NAME (new_type) = DECL_NAME (TYPE_NAME (type));
7462           else
7463             TYPE_NAME (new_type) = TYPE_NAME (type);
7464         }
7465       TYPE_BIASED_REPRESENTATION_P (new_type) = biased_p;
7466       TYPE_RM_SIZE (new_type) = bitsize_int (size);
7467       return new_type;
7468
7469     case RECORD_TYPE:
7470       /* Do something if this is a fat pointer, in which case we
7471          may need to return the thin pointer.  */
7472       if (TYPE_IS_FAT_POINTER_P (type) && size < POINTER_SIZE * 2)
7473         {
7474           enum machine_mode p_mode = mode_for_size (size, MODE_INT, 0);
7475           if (!targetm.valid_pointer_mode (p_mode))
7476             p_mode = ptr_mode;
7477           return
7478             build_pointer_type_for_mode
7479               (TYPE_OBJECT_RECORD_TYPE (TYPE_UNCONSTRAINED_ARRAY (type)),
7480                p_mode, 0);
7481         }
7482       break;
7483
7484     case POINTER_TYPE:
7485       /* Only do something if this is a thin pointer, in which case we
7486          may need to return the fat pointer.  */
7487       if (TYPE_THIN_POINTER_P (type) && size >= POINTER_SIZE * 2)
7488         return
7489           build_pointer_type (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)));
7490       break;
7491
7492     default:
7493       break;
7494     }
7495
7496   return type;
7497 }
7498 \f
7499 /* ALIGNMENT is a Uint giving the alignment specified for GNAT_ENTITY,
7500    a type or object whose present alignment is ALIGN.  If this alignment is
7501    valid, return it.  Otherwise, give an error and return ALIGN.  */
7502
7503 static unsigned int
7504 validate_alignment (Uint alignment, Entity_Id gnat_entity, unsigned int align)
7505 {
7506   unsigned int max_allowed_alignment = get_target_maximum_allowed_alignment ();
7507   unsigned int new_align;
7508   Node_Id gnat_error_node;
7509
7510   /* Don't worry about checking alignment if alignment was not specified
7511      by the source program and we already posted an error for this entity.  */
7512   if (Error_Posted (gnat_entity) && !Has_Alignment_Clause (gnat_entity))
7513     return align;
7514
7515   /* Post the error on the alignment clause if any.  */
7516   if (Present (Alignment_Clause (gnat_entity)))
7517     gnat_error_node = Expression (Alignment_Clause (gnat_entity));
7518   else
7519     gnat_error_node = gnat_entity;
7520
7521   /* Within GCC, an alignment is an integer, so we must make sure a value is
7522      specified that fits in that range.  Also, there is an upper bound to
7523      alignments we can support/allow.  */
7524   if (!UI_Is_In_Int_Range (alignment)
7525       || ((new_align = UI_To_Int (alignment)) > max_allowed_alignment))
7526     post_error_ne_num ("largest supported alignment for& is ^",
7527                        gnat_error_node, gnat_entity, max_allowed_alignment);
7528   else if (!(Present (Alignment_Clause (gnat_entity))
7529              && From_At_Mod (Alignment_Clause (gnat_entity)))
7530            && new_align * BITS_PER_UNIT < align)
7531     {
7532       unsigned int double_align;
7533       bool is_capped_double, align_clause;
7534
7535       /* If the default alignment of "double" or larger scalar types is
7536          specifically capped and the new alignment is above the cap, do
7537          not post an error and change the alignment only if there is an
7538          alignment clause; this makes it possible to have the associated
7539          GCC type overaligned by default for performance reasons.  */
7540       if ((double_align = double_float_alignment) > 0)
7541         {
7542           Entity_Id gnat_type
7543             = Is_Type (gnat_entity) ? gnat_entity : Etype (gnat_entity);
7544           is_capped_double
7545             = is_double_float_or_array (gnat_type, &align_clause);
7546         }
7547       else if ((double_align = double_scalar_alignment) > 0)
7548         {
7549           Entity_Id gnat_type
7550             = Is_Type (gnat_entity) ? gnat_entity : Etype (gnat_entity);
7551           is_capped_double
7552             = is_double_scalar_or_array (gnat_type, &align_clause);
7553         }
7554       else
7555         is_capped_double = align_clause = false;
7556
7557       if (is_capped_double && new_align >= double_align)
7558         {
7559           if (align_clause)
7560             align = new_align * BITS_PER_UNIT;
7561         }
7562       else
7563         {
7564           if (is_capped_double)
7565             align = double_align * BITS_PER_UNIT;
7566
7567           post_error_ne_num ("alignment for& must be at least ^",
7568                              gnat_error_node, gnat_entity,
7569                              align / BITS_PER_UNIT);
7570         }
7571     }
7572   else
7573     {
7574       new_align = (new_align > 0 ? new_align * BITS_PER_UNIT : 1);
7575       if (new_align > align)
7576         align = new_align;
7577     }
7578
7579   return align;
7580 }
7581
7582 /* Return the smallest alignment not less than SIZE.  */
7583
7584 static unsigned int
7585 ceil_alignment (unsigned HOST_WIDE_INT size)
7586 {
7587   return (unsigned int) 1 << (floor_log2 (size - 1) + 1);
7588 }
7589 \f
7590 /* Verify that OBJECT, a type or decl, is something we can implement
7591    atomically.  If not, give an error for GNAT_ENTITY.  COMP_P is true
7592    if we require atomic components.  */
7593
7594 static void
7595 check_ok_for_atomic (tree object, Entity_Id gnat_entity, bool comp_p)
7596 {
7597   Node_Id gnat_error_point = gnat_entity;
7598   Node_Id gnat_node;
7599   enum machine_mode mode;
7600   unsigned int align;
7601   tree size;
7602
7603   /* There are three case of what OBJECT can be.  It can be a type, in which
7604      case we take the size, alignment and mode from the type.  It can be a
7605      declaration that was indirect, in which case the relevant values are
7606      that of the type being pointed to, or it can be a normal declaration,
7607      in which case the values are of the decl.  The code below assumes that
7608      OBJECT is either a type or a decl.  */
7609   if (TYPE_P (object))
7610     {
7611       mode = TYPE_MODE (object);
7612       align = TYPE_ALIGN (object);
7613       size = TYPE_SIZE (object);
7614     }
7615   else if (DECL_BY_REF_P (object))
7616     {
7617       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (object)));
7618       align = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (object)));
7619       size = TYPE_SIZE (TREE_TYPE (TREE_TYPE (object)));
7620     }
7621   else
7622     {
7623       mode = DECL_MODE (object);
7624       align = DECL_ALIGN (object);
7625       size = DECL_SIZE (object);
7626     }
7627
7628   /* Consider all floating-point types atomic and any types that that are
7629      represented by integers no wider than a machine word.  */
7630   if (GET_MODE_CLASS (mode) == MODE_FLOAT
7631       || ((GET_MODE_CLASS (mode) == MODE_INT
7632            || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
7633           && GET_MODE_BITSIZE (mode) <= BITS_PER_WORD))
7634     return;
7635
7636   /* For the moment, also allow anything that has an alignment equal
7637      to its size and which is smaller than a word.  */
7638   if (size && TREE_CODE (size) == INTEGER_CST
7639       && compare_tree_int (size, align) == 0
7640       && align <= BITS_PER_WORD)
7641     return;
7642
7643   for (gnat_node = First_Rep_Item (gnat_entity); Present (gnat_node);
7644        gnat_node = Next_Rep_Item (gnat_node))
7645     {
7646       if (!comp_p && Nkind (gnat_node) == N_Pragma
7647           && (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_node)))
7648               == Pragma_Atomic))
7649         gnat_error_point = First (Pragma_Argument_Associations (gnat_node));
7650       else if (comp_p && Nkind (gnat_node) == N_Pragma
7651                && (Get_Pragma_Id (Chars (Pragma_Identifier (gnat_node)))
7652                    == Pragma_Atomic_Components))
7653         gnat_error_point = First (Pragma_Argument_Associations (gnat_node));
7654     }
7655
7656   if (comp_p)
7657     post_error_ne ("atomic access to component of & cannot be guaranteed",
7658                    gnat_error_point, gnat_entity);
7659   else
7660     post_error_ne ("atomic access to & cannot be guaranteed",
7661                    gnat_error_point, gnat_entity);
7662 }
7663 \f
7664 /* Check if FTYPE1 and FTYPE2, two potentially different function type nodes,
7665    have compatible signatures so that a call using one type may be safely
7666    issued if the actual target function type is the other.  Return 1 if it is
7667    the case, 0 otherwise, and post errors on the incompatibilities.
7668
7669    This is used when an Ada subprogram is mapped onto a GCC builtin, to ensure
7670    that calls to the subprogram will have arguments suitable for the later
7671    underlying builtin expansion.  */
7672
7673 static int
7674 compatible_signatures_p (tree ftype1, tree ftype2)
7675 {
7676   /* As of now, we only perform very trivial tests and consider it's the
7677      programmer's responsibility to ensure the type correctness in the Ada
7678      declaration, as in the regular Import cases.
7679
7680      Mismatches typically result in either error messages from the builtin
7681      expander, internal compiler errors, or in a real call sequence.  This
7682      should be refined to issue diagnostics helping error detection and
7683      correction.  */
7684
7685   /* Almost fake test, ensuring a use of each argument.  */
7686   if (ftype1 == ftype2)
7687     return 1;
7688
7689   return 1;
7690 }
7691 \f
7692 /* Given a type T, a FIELD_DECL F, and a replacement value R, return a
7693    type with all size expressions that contain F in a PLACEHOLDER_EXPR
7694    updated by replacing F with R.
7695
7696    The function doesn't update the layout of the type, i.e. it assumes
7697    that the substitution is purely formal.  That's why the replacement
7698    value R must itself contain a PLACEHOLDER_EXPR.  */
7699
7700 tree
7701 substitute_in_type (tree t, tree f, tree r)
7702 {
7703   tree new;
7704
7705   gcc_assert (CONTAINS_PLACEHOLDER_P (r));
7706
7707   switch (TREE_CODE (t))
7708     {
7709     case INTEGER_TYPE:
7710     case ENUMERAL_TYPE:
7711     case BOOLEAN_TYPE:
7712       if (CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (t))
7713           || CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (t)))
7714         {
7715           tree low = SUBSTITUTE_IN_EXPR (TYPE_MIN_VALUE (t), f, r);
7716           tree high = SUBSTITUTE_IN_EXPR (TYPE_MAX_VALUE (t), f, r);
7717
7718           if (low == TYPE_MIN_VALUE (t) && high == TYPE_MAX_VALUE (t))
7719             return t;
7720
7721           new = copy_type (t);
7722           TYPE_MIN_VALUE (new) = low;
7723           TYPE_MAX_VALUE (new) = high;
7724           if (TYPE_INDEX_TYPE (t))
7725             SET_TYPE_INDEX_TYPE
7726               (new, substitute_in_type (TYPE_INDEX_TYPE (t), f, r));
7727           return new;
7728         }
7729
7730       return t;
7731
7732     case REAL_TYPE:
7733       if (CONTAINS_PLACEHOLDER_P (TYPE_MIN_VALUE (t))
7734           || CONTAINS_PLACEHOLDER_P (TYPE_MAX_VALUE (t)))
7735         {
7736           tree low = SUBSTITUTE_IN_EXPR (TYPE_MIN_VALUE (t), f, r);
7737           tree high = SUBSTITUTE_IN_EXPR (TYPE_MAX_VALUE (t), f, r);
7738
7739           if (low == TYPE_MIN_VALUE (t) && high == TYPE_MAX_VALUE (t))
7740             return t;
7741
7742           new = copy_type (t);
7743           TYPE_MIN_VALUE (new) = low;
7744           TYPE_MAX_VALUE (new) = high;
7745           return new;
7746         }
7747
7748       return t;
7749
7750     case COMPLEX_TYPE:
7751       new = substitute_in_type (TREE_TYPE (t), f, r);
7752       if (new == TREE_TYPE (t))
7753         return t;
7754
7755       return build_complex_type (new);
7756
7757     case OFFSET_TYPE:
7758     case METHOD_TYPE:
7759     case FUNCTION_TYPE:
7760     case LANG_TYPE:
7761       /* These should never show up here.  */
7762       gcc_unreachable ();
7763
7764     case ARRAY_TYPE:
7765       {
7766         tree component = substitute_in_type (TREE_TYPE (t), f, r);
7767         tree domain = substitute_in_type (TYPE_DOMAIN (t), f, r);
7768
7769         if (component == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
7770           return t;
7771
7772         new = build_array_type (component, domain);
7773         TYPE_ALIGN (new) = TYPE_ALIGN (t);
7774         TYPE_USER_ALIGN (new) = TYPE_USER_ALIGN (t);
7775         SET_TYPE_MODE (new, TYPE_MODE (t));
7776         TYPE_SIZE (new) = SUBSTITUTE_IN_EXPR (TYPE_SIZE (t), f, r);
7777         TYPE_SIZE_UNIT (new) = SUBSTITUTE_IN_EXPR (TYPE_SIZE_UNIT (t), f, r);
7778         TYPE_NONALIASED_COMPONENT (new) = TYPE_NONALIASED_COMPONENT (t);
7779         TYPE_MULTI_ARRAY_P (new) = TYPE_MULTI_ARRAY_P (t);
7780         TYPE_CONVENTION_FORTRAN_P (new) = TYPE_CONVENTION_FORTRAN_P (t);
7781         return new;
7782       }
7783
7784     case RECORD_TYPE:
7785     case UNION_TYPE:
7786     case QUAL_UNION_TYPE:
7787       {
7788         bool changed_field = false;
7789         tree field;
7790
7791         /* Start out with no fields, make new fields, and chain them
7792            in.  If we haven't actually changed the type of any field,
7793            discard everything we've done and return the old type.  */
7794         new = copy_type (t);
7795         TYPE_FIELDS (new) = NULL_TREE;
7796
7797         for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
7798           {
7799             tree new_field = copy_node (field), new_n;
7800
7801             new_n = substitute_in_type (TREE_TYPE (field), f, r);
7802             if (new_n != TREE_TYPE (field))
7803               {
7804                 TREE_TYPE (new_field) = new_n;
7805                 changed_field = true;
7806               }
7807
7808             new_n = SUBSTITUTE_IN_EXPR (DECL_FIELD_OFFSET (field), f, r);
7809             if (new_n != DECL_FIELD_OFFSET (field))
7810               {
7811                 DECL_FIELD_OFFSET (new_field) = new_n;
7812                 changed_field = true;
7813               }
7814
7815             /* Do the substitution inside the qualifier, if any.  */
7816             if (TREE_CODE (t) == QUAL_UNION_TYPE)
7817               {
7818                 new_n = SUBSTITUTE_IN_EXPR (DECL_QUALIFIER (field), f, r);
7819                 if (new_n != DECL_QUALIFIER (field))
7820                   {
7821                     DECL_QUALIFIER (new_field) = new_n;
7822                     changed_field = true;
7823                   }
7824               }
7825
7826             DECL_CONTEXT (new_field) = new;
7827             SET_DECL_ORIGINAL_FIELD (new_field,
7828                                      (DECL_ORIGINAL_FIELD (field)
7829                                       ? DECL_ORIGINAL_FIELD (field) : field));
7830
7831             TREE_CHAIN (new_field) = TYPE_FIELDS (new);
7832             TYPE_FIELDS (new) = new_field;
7833           }
7834
7835         if (!changed_field)
7836           return t;
7837
7838         TYPE_FIELDS (new) = nreverse (TYPE_FIELDS (new));
7839         TYPE_SIZE (new) = SUBSTITUTE_IN_EXPR (TYPE_SIZE (t), f, r);
7840         TYPE_SIZE_UNIT (new) = SUBSTITUTE_IN_EXPR (TYPE_SIZE_UNIT (t), f, r);
7841         SET_TYPE_ADA_SIZE (new, SUBSTITUTE_IN_EXPR (TYPE_ADA_SIZE (t), f, r));
7842         return new;
7843       }
7844
7845     default:
7846       return t;
7847     }
7848 }
7849 \f
7850 /* Return the RM size of GNU_TYPE.  This is the actual number of bits
7851    needed to represent the object.  */
7852
7853 tree
7854 rm_size (tree gnu_type)
7855 {
7856   /* For integer types, this is the precision.  */
7857   if (INTEGRAL_TYPE_P (gnu_type) && TYPE_RM_SIZE (gnu_type))
7858     return TYPE_RM_SIZE (gnu_type);
7859
7860   /* Return the RM size of the actual data plus the size of the template.  */
7861   if (TREE_CODE (gnu_type) == RECORD_TYPE
7862       && TYPE_CONTAINS_TEMPLATE_P (gnu_type))
7863     return
7864       size_binop (PLUS_EXPR,
7865                   rm_size (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)))),
7866                   DECL_SIZE (TYPE_FIELDS (gnu_type)));
7867
7868   /* For record types, we store the size explicitly.  */
7869   if ((TREE_CODE (gnu_type) == RECORD_TYPE
7870        || TREE_CODE (gnu_type) == UNION_TYPE
7871        || TREE_CODE (gnu_type) == QUAL_UNION_TYPE)
7872       && !TYPE_IS_FAT_POINTER_P (gnu_type)
7873       && TYPE_ADA_SIZE (gnu_type))
7874     return TYPE_ADA_SIZE (gnu_type);
7875
7876   /* For other types, this is just the size.  */
7877   return TYPE_SIZE (gnu_type);
7878 }
7879 \f
7880 /* Return the name to be used for GNAT_ENTITY.  If a type, create a
7881    fully-qualified name, possibly with type information encoding.
7882    Otherwise, return the name.  */
7883
7884 tree
7885 get_entity_name (Entity_Id gnat_entity)
7886 {
7887   Get_Encoded_Name (gnat_entity);
7888   return get_identifier_with_length (Name_Buffer, Name_Len);
7889 }
7890
7891 /* Return an identifier representing the external name to be used for
7892    GNAT_ENTITY.  If SUFFIX is specified, the name is followed by "___"
7893    and the specified suffix.  */
7894
7895 tree
7896 create_concat_name (Entity_Id gnat_entity, const char *suffix)
7897 {
7898   Entity_Kind kind = Ekind (gnat_entity);
7899
7900   if (suffix)
7901     {
7902       String_Template temp = {1, strlen (suffix)};
7903       Fat_Pointer fp = {suffix, &temp};
7904       Get_External_Name_With_Suffix (gnat_entity, fp);
7905     }
7906   else
7907     Get_External_Name (gnat_entity, 0);
7908
7909   /* A variable using the Stdcall convention lives in a DLL.  We adjust
7910      its name to use the jump table, the _imp__NAME contains the address
7911      for the NAME variable.  */
7912   if ((kind == E_Variable || kind == E_Constant)
7913       && Has_Stdcall_Convention (gnat_entity))
7914     {
7915       const int len = 6 + Name_Len;
7916       char *new_name = (char *) alloca (len + 1);
7917       strcpy (new_name, "_imp__");
7918       strcat (new_name, Name_Buffer);
7919       return get_identifier_with_length (new_name, len);
7920     }
7921
7922   return get_identifier_with_length (Name_Buffer, Name_Len);
7923 }
7924
7925 /* Given GNU_NAME, an IDENTIFIER_NODE containing a name and SUFFIX, a
7926    string, return a new IDENTIFIER_NODE that is the concatenation of
7927    the name followed by "___" and the specified suffix.  */
7928
7929 tree
7930 concat_name (tree gnu_name, const char *suffix)
7931 {
7932   const int len = IDENTIFIER_LENGTH (gnu_name) + 3 + strlen (suffix);
7933   char *new_name = (char *) alloca (len + 1);
7934   strcpy (new_name, IDENTIFIER_POINTER (gnu_name));
7935   strcat (new_name, "___");
7936   strcat (new_name, suffix);
7937   return get_identifier_with_length (new_name, len);
7938 }
7939
7940 #include "gt-ada-decl.h"