1 /****************************************************************************
3 * GNAT COMPILER COMPONENTS *
7 * C Implementation File *
10 * Copyright (C) 1992-2002, Free Software Foundation, Inc. *
12 * GNAT is free software; you can redistribute it and/or modify it under *
13 * terms of the GNU General Public License as published by the Free Soft- *
14 * ware Foundation; either version 2, or (at your option) any later ver- *
15 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
16 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
17 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
18 * for more details. You should have received a copy of the GNU General *
19 * Public License distributed with GNAT; see file COPYING. If not, write *
20 * to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, *
21 * MA 02111-1307, USA. *
23 * GNAT was originally developed by the GNAT team at New York University. *
24 * It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). *
26 ****************************************************************************/
53 /* Setting this to 1 suppresses hashing of types. */
54 extern int debug_no_type_hash
;
56 /* Provide default values for the macros controlling stack checking.
57 This is copied from GCC's expr.h. */
59 #ifndef STACK_CHECK_BUILTIN
60 #define STACK_CHECK_BUILTIN 0
62 #ifndef STACK_CHECK_PROBE_INTERVAL
63 #define STACK_CHECK_PROBE_INTERVAL 4096
65 #ifndef STACK_CHECK_MAX_FRAME_SIZE
66 #define STACK_CHECK_MAX_FRAME_SIZE \
67 (STACK_CHECK_PROBE_INTERVAL - UNITS_PER_WORD)
69 #ifndef STACK_CHECK_MAX_VAR_SIZE
70 #define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100)
73 /* These two variables are used to defer recursively expanding incomplete
74 types while we are processing a record or subprogram type. */
76 static int defer_incomplete_level
= 0;
77 static struct incomplete
79 struct incomplete
*next
;
82 } *defer_incomplete_list
= 0;
84 static tree substitution_list
PARAMS ((Entity_Id
, Entity_Id
,
86 static int allocatable_size_p
PARAMS ((tree
, int));
87 static struct attrib
*build_attr_list
PARAMS ((Entity_Id
));
88 static tree elaborate_expression
PARAMS ((Node_Id
, Entity_Id
, tree
,
90 static tree elaborate_expression_1
PARAMS ((Node_Id
, Entity_Id
, tree
,
92 static tree make_packable_type
PARAMS ((tree
));
93 static tree maybe_pad_type
PARAMS ((tree
, tree
, unsigned int,
94 Entity_Id
, const char *, int,
96 static tree gnat_to_gnu_field
PARAMS ((Entity_Id
, tree
, int, int));
97 static void components_to_record
PARAMS ((tree
, Node_Id
, tree
, int,
98 int, tree
*, int, int));
99 static int compare_field_bitpos
PARAMS ((const PTR
, const PTR
));
100 static Uint annotate_value
PARAMS ((tree
));
101 static void annotate_rep
PARAMS ((Entity_Id
, tree
));
102 static tree compute_field_positions
PARAMS ((tree
, tree
, tree
, tree
,
104 static tree validate_size
PARAMS ((Uint
, tree
, Entity_Id
,
105 enum tree_code
, int, int));
106 static void set_rm_size
PARAMS ((Uint
, tree
, Entity_Id
));
107 static tree make_type_from_size
PARAMS ((tree
, tree
, int));
108 static unsigned int validate_alignment
PARAMS ((Uint
, Entity_Id
,
110 static void check_ok_for_atomic
PARAMS ((tree
, Entity_Id
, int));
112 /* Given GNAT_ENTITY, an entity in the incoming GNAT tree, return a
113 GCC type corresponding to that entity. GNAT_ENTITY is assumed to
114 refer to an Ada type. */
117 gnat_to_gnu_type (gnat_entity
)
118 Entity_Id gnat_entity
;
122 /* Convert the ada entity type into a GCC TYPE_DECL node. */
123 gnu_decl
= gnat_to_gnu_entity (gnat_entity
, NULL_TREE
, 0);
124 if (TREE_CODE (gnu_decl
) != TYPE_DECL
)
127 return TREE_TYPE (gnu_decl
);
130 /* Given GNAT_ENTITY, a GNAT defining identifier node, which denotes some Ada
131 entity, this routine returns the equivalent GCC tree for that entity
132 (an ..._DECL node) and associates the ..._DECL node with the input GNAT
135 If GNAT_ENTITY is a variable or a constant declaration, GNU_EXPR gives its
136 initial value (in GCC tree form). This is optional for variables.
137 For renamed entities, GNU_EXPR gives the object being renamed.
139 DEFINITION is nonzero if this call is intended for a definition. This is
140 used for separate compilation where it necessary to know whether an
141 external declaration or a definition should be created if the GCC equivalent
142 was not created previously. The value of 1 is normally used for a non-zero
143 DEFINITION, but a value of 2 is used in special circumstances, defined in
147 gnat_to_gnu_entity (gnat_entity
, gnu_expr
, definition
)
148 Entity_Id gnat_entity
;
154 /* Contains the gnu XXXX_DECL tree node which is equivalent to the input
155 GNAT tree. This node will be associated with the GNAT node by calling
156 the save_gnu_tree routine at the end of the `switch' statement. */
158 /* Nonzero if we have already saved gnu_decl as a gnat association. */
160 /* Nonzero if we incremented defer_incomplete_level. */
161 int this_deferred
= 0;
162 /* Nonzero if we incremented force_global. */
164 /* Nonzero if we should check to see if elaborated during processing. */
165 int maybe_present
= 0;
166 /* Nonzero if we made GNU_DECL and its type here. */
167 int this_made_decl
= 0;
168 struct attrib
*attr_list
= 0;
169 int debug_info_p
= (Needs_Debug_Info (gnat_entity
)
170 || debug_info_level
== DINFO_LEVEL_VERBOSE
);
171 Entity_Kind kind
= Ekind (gnat_entity
);
174 = ((Known_Esize (gnat_entity
)
175 && UI_Is_In_Int_Range (Esize (gnat_entity
)))
176 ? MIN (UI_To_Int (Esize (gnat_entity
)),
177 IN (kind
, Float_Kind
)
178 ? LONG_DOUBLE_TYPE_SIZE
179 : IN (kind
, Access_Kind
) ? POINTER_SIZE
* 2
180 : LONG_LONG_TYPE_SIZE
)
181 : LONG_LONG_TYPE_SIZE
);
184 = ((Is_Imported (gnat_entity
) && No (Address_Clause (gnat_entity
)))
185 || From_With_Type (gnat_entity
));
186 unsigned int align
= 0;
188 /* Since a use of an Itype is a definition, process it as such if it
189 is not in a with'ed unit. */
191 if (! definition
&& Is_Itype (gnat_entity
)
192 && ! present_gnu_tree (gnat_entity
)
193 && In_Extended_Main_Code_Unit (gnat_entity
))
195 /* Ensure that we are in a subprogram mentioned in the Scope
196 chain of this entity, our current scope is global,
197 or that we encountered a task or entry (where we can't currently
198 accurately check scoping). */
199 if (current_function_decl
== 0
200 || DECL_ELABORATION_PROC_P (current_function_decl
))
202 process_type (gnat_entity
);
203 return get_gnu_tree (gnat_entity
);
206 for (gnat_temp
= Scope (gnat_entity
);
207 Present (gnat_temp
); gnat_temp
= Scope (gnat_temp
))
209 if (Is_Type (gnat_temp
))
210 gnat_temp
= Underlying_Type (gnat_temp
);
212 if (Ekind (gnat_temp
) == E_Subprogram_Body
)
214 = Corresponding_Spec (Parent (Declaration_Node (gnat_temp
)));
216 if (IN (Ekind (gnat_temp
), Subprogram_Kind
)
217 && Present (Protected_Body_Subprogram (gnat_temp
)))
218 gnat_temp
= Protected_Body_Subprogram (gnat_temp
);
220 if (Ekind (gnat_temp
) == E_Entry
221 || Ekind (gnat_temp
) == E_Entry_Family
222 || Ekind (gnat_temp
) == E_Task_Type
223 || (IN (Ekind (gnat_temp
), Subprogram_Kind
)
224 && present_gnu_tree (gnat_temp
)
225 && (current_function_decl
226 == gnat_to_gnu_entity (gnat_temp
, NULL_TREE
, 0))))
228 process_type (gnat_entity
);
229 return get_gnu_tree (gnat_entity
);
233 /* gigi abort 122 means that the entity "gnat_entity" has an incorrect
234 scope, i.e. that its scope does not correspond to the subprogram
235 in which it is declared */
239 /* If this is entity 0, something went badly wrong. */
240 if (gnat_entity
== 0)
243 /* If we've already processed this entity, return what we got last time.
244 If we are defining the node, we should not have already processed it.
245 In that case, we will abort below when we try to save a new GCC tree for
246 this object. We also need to handle the case of getting a dummy type
247 when a Full_View exists. */
249 if (present_gnu_tree (gnat_entity
)
251 || (Is_Type (gnat_entity
) && imported_p
)))
253 gnu_decl
= get_gnu_tree (gnat_entity
);
255 if (TREE_CODE (gnu_decl
) == TYPE_DECL
256 && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl
))
257 && IN (kind
, Incomplete_Or_Private_Kind
)
258 && Present (Full_View (gnat_entity
)))
260 gnu_decl
= gnat_to_gnu_entity (Full_View (gnat_entity
),
263 save_gnu_tree (gnat_entity
, NULL_TREE
, 0);
264 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
270 /* If this is a numeric or enumeral type, or an access type, a nonzero
271 Esize must be specified unless it was specified by the programmer. */
272 if ((IN (kind
, Numeric_Kind
) || IN (kind
, Enumeration_Kind
)
273 || (IN (kind
, Access_Kind
)
274 && kind
!= E_Access_Protected_Subprogram_Type
275 && kind
!= E_Access_Subtype
))
276 && Unknown_Esize (gnat_entity
)
277 && ! Has_Size_Clause (gnat_entity
))
280 /* Likewise, RM_Size must be specified for all discrete and fixed-point
282 if (IN (kind
, Discrete_Or_Fixed_Point_Kind
)
283 && Unknown_RM_Size (gnat_entity
))
286 /* Get the name of the entity and set up the line number and filename of
287 the original definition for use in any decl we make. */
289 gnu_entity_id
= get_entity_name (gnat_entity
);
290 set_lineno (gnat_entity
, 0);
292 /* If we get here, it means we have not yet done anything with this
293 entity. If we are not defining it here, it must be external,
294 otherwise we should have defined it already. */
295 if (! definition
&& ! Is_Public (gnat_entity
)
296 && ! type_annotate_only
297 && kind
!= E_Discriminant
&& kind
!= E_Component
299 && ! (kind
== E_Constant
&& Present (Full_View (gnat_entity
)))
301 && !IN (kind
, Type_Kind
)
306 /* For cases when we are not defining (i.e., we are referencing from
307 another compilation unit) Public entities, show we are at global level
308 for the purpose of computing sizes. Don't do this for components or
309 discriminants since the relevant test is whether or not the record is
311 if (! definition
&& Is_Public (gnat_entity
)
312 && ! Is_Statically_Allocated (gnat_entity
)
313 && kind
!= E_Discriminant
&& kind
!= E_Component
)
314 force_global
++, this_global
= 1;
316 /* Handle any attributes. */
317 if (Has_Gigi_Rep_Item (gnat_entity
))
318 attr_list
= build_attr_list (gnat_entity
);
323 /* If this is a use of a deferred constant, get its full
325 if (! definition
&& Present (Full_View (gnat_entity
)))
327 gnu_decl
= gnat_to_gnu_entity (Full_View (gnat_entity
),
328 gnu_expr
, definition
);
333 /* If we have an external constant that we are not defining,
334 get the expression that is was defined to represent. We
335 may throw that expression away later if it is not a
338 && Present (Expression (Declaration_Node (gnat_entity
)))
339 && ! No_Initialization (Declaration_Node (gnat_entity
)))
340 gnu_expr
= gnat_to_gnu (Expression (Declaration_Node (gnat_entity
)));
342 /* Ignore deferred constant definitions; they are processed fully in the
343 front-end. For deferred constant references, get the full
344 definition. On the other hand, constants that are renamings are
345 handled like variable renamings. If No_Initialization is set, this is
346 not a deferred constant but a constant whose value is built
349 if (definition
&& gnu_expr
== 0
350 && ! No_Initialization (Declaration_Node (gnat_entity
))
351 && No (Renamed_Object (gnat_entity
)))
353 gnu_decl
= error_mark_node
;
357 else if (! definition
&& IN (kind
, Incomplete_Or_Private_Kind
)
358 && Present (Full_View (gnat_entity
)))
360 gnu_decl
= gnat_to_gnu_entity (Full_View (gnat_entity
),
369 /* If this is not a VMS exception, treat it as a normal object.
370 Otherwise, make an object at the specific address of character
371 type, point to it, and convert it to integer, and mask off
373 if (! Is_VMS_Exception (gnat_entity
))
376 /* Allocate the global object that we use to get the value of the
378 gnu_decl
= create_var_decl (gnu_entity_id
,
379 (Present (Interface_Name (gnat_entity
))
380 ? create_concat_name (gnat_entity
, 0)
382 char_type_node
, NULL_TREE
, 0, 0, 1, 1,
385 /* Now return the expression giving the desired value. */
387 = build_binary_op (BIT_AND_EXPR
, integer_type_node
,
388 convert (integer_type_node
,
389 build_unary_op (ADDR_EXPR
, NULL_TREE
,
391 build_unary_op (NEGATE_EXPR
, integer_type_node
,
392 build_int_2 (7, 0)));
394 save_gnu_tree (gnat_entity
, gnu_decl
, 1);
401 /* The GNAT record where the component was defined. */
402 Entity_Id gnat_record
= Underlying_Type (Scope (gnat_entity
));
404 /* If the variable is an inherited record component (in the case of
405 extended record types), just return the inherited entity, which
406 must be a FIELD_DECL. Likewise for discriminants.
407 For discriminants of untagged records which have explicit
408 girder discriminants, return the entity for the corresponding
409 girder discriminant. Also use Original_Record_Component
410 if the record has a private extension. */
412 if ((Base_Type (gnat_record
) == gnat_record
413 || Ekind (Scope (gnat_entity
)) == E_Record_Subtype_With_Private
414 || Ekind (Scope (gnat_entity
)) == E_Record_Type_With_Private
)
415 && Present (Original_Record_Component (gnat_entity
))
416 && Original_Record_Component (gnat_entity
) != gnat_entity
)
419 = gnat_to_gnu_entity (Original_Record_Component (gnat_entity
),
420 gnu_expr
, definition
);
425 /* If the enclosing record has explicit girder discriminants,
426 then it is an untagged record. If the Corresponding_Discriminant
427 is not empty then this must be a renamed discriminant and its
428 Original_Record_Component must point to the corresponding explicit
429 girder discriminant (i.e., we should have taken the previous
432 else if (Present (Corresponding_Discriminant (gnat_entity
))
433 && Is_Tagged_Type (gnat_record
))
435 /* A tagged record has no explicit girder discriminants. */
437 if (First_Discriminant (gnat_record
)
438 != First_Girder_Discriminant (gnat_record
))
442 = gnat_to_gnu_entity (Corresponding_Discriminant (gnat_entity
),
443 gnu_expr
, definition
);
448 /* If the enclosing record has explicit girder discriminants,
449 then it is an untagged record. If the Corresponding_Discriminant
450 is not empty then this must be a renamed discriminant and its
451 Original_Record_Component must point to the corresponding explicit
452 girder discriminant (i.e., we should have taken the first
455 else if (Present (Corresponding_Discriminant (gnat_entity
))
456 && (First_Discriminant (gnat_record
)
457 != First_Girder_Discriminant (gnat_record
)))
460 /* Otherwise, if we are not defining this and we have no GCC type
461 for the containing record, make one for it. Then we should
462 have made our own equivalent. */
463 else if (! definition
&& ! present_gnu_tree (gnat_record
))
465 /* ??? If this is in a record whose scope is a protected
466 type and we have an Original_Record_Component, use it.
467 This is a workaround for major problems in protected type
469 if (Is_Protected_Type (Scope (Scope (gnat_entity
)))
470 && Present (Original_Record_Component (gnat_entity
)))
473 = gnat_to_gnu_entity (Original_Record_Component
475 gnu_expr
, definition
);
480 gnat_to_gnu_entity (Scope (gnat_entity
), NULL_TREE
, 0);
481 gnu_decl
= get_gnu_tree (gnat_entity
);
486 /* Here we have no GCC type and this is a reference rather than a
487 definition. This should never happen. Most likely the cause is a
488 reference before declaration in the gnat tree for gnat_entity. */
493 case E_Loop_Parameter
:
494 case E_Out_Parameter
:
497 /* Simple variables, loop variables, OUT parameters, and exceptions. */
502 = ((kind
== E_Constant
|| kind
== E_Variable
)
503 && ! Is_Statically_Allocated (gnat_entity
)
504 && Is_True_Constant (gnat_entity
)
505 && (((Nkind (Declaration_Node (gnat_entity
))
506 == N_Object_Declaration
)
507 && Present (Expression (Declaration_Node (gnat_entity
))))
508 || Present (Renamed_Object (gnat_entity
))));
509 int inner_const_flag
= const_flag
;
510 int static_p
= Is_Statically_Allocated (gnat_entity
);
511 tree gnu_ext_name
= NULL_TREE
;
513 if (Present (Renamed_Object (gnat_entity
)) && ! definition
)
515 if (kind
== E_Exception
)
516 gnu_expr
= gnat_to_gnu_entity (Renamed_Entity (gnat_entity
),
519 gnu_expr
= gnat_to_gnu (Renamed_Object (gnat_entity
));
522 /* Get the type after elaborating the renamed object. */
523 gnu_type
= gnat_to_gnu_type (Etype (gnat_entity
));
525 /* If this is a loop variable, its type should be the base type.
526 This is because the code for processing a loop determines whether
527 a normal loop end test can be done by comparing the bounds of the
528 loop against those of the base type, which is presumed to be the
529 size used for computation. But this is not correct when the size
530 of the subtype is smaller than the type. */
531 if (kind
== E_Loop_Parameter
)
532 gnu_type
= get_base_type (gnu_type
);
534 /* Reject non-renamed objects whose types are unconstrained arrays or
535 any object whose type is a dummy type or VOID_TYPE. */
537 if ((TREE_CODE (gnu_type
) == UNCONSTRAINED_ARRAY_TYPE
538 && No (Renamed_Object (gnat_entity
)))
539 || TYPE_IS_DUMMY_P (gnu_type
)
540 || TREE_CODE (gnu_type
) == VOID_TYPE
)
542 if (type_annotate_only
)
543 return error_mark_node
;
548 /* If we are defining the object, see if it has a Size value and
549 validate it if so. Then get the new type, if any. */
551 gnu_size
= validate_size (Esize (gnat_entity
), gnu_type
,
552 gnat_entity
, VAR_DECL
, 0,
553 Has_Size_Clause (gnat_entity
));
558 = make_type_from_size (gnu_type
, gnu_size
,
559 Has_Biased_Representation (gnat_entity
));
561 if (operand_equal_p (TYPE_SIZE (gnu_type
), gnu_size
, 0))
565 /* If this object has self-referential size, it must be a record with
566 a default value. We are supposed to allocate an object of the
567 maximum size in this case unless it is a constant with an
568 initializing expression, in which case we can get the size from
569 that. Note that the resulting size may still be a variable, so
570 this may end up with an indirect allocation. */
572 if (No (Renamed_Object (gnat_entity
))
573 && TREE_CODE (TYPE_SIZE (gnu_type
)) != INTEGER_CST
574 && contains_placeholder_p (TYPE_SIZE (gnu_type
)))
576 if (gnu_expr
!= 0 && kind
== E_Constant
)
578 gnu_size
= TYPE_SIZE (TREE_TYPE (gnu_expr
));
579 if (TREE_CODE (gnu_size
) != INTEGER_CST
580 && contains_placeholder_p (gnu_size
))
582 gnu_size
= TYPE_SIZE (TREE_TYPE (gnu_expr
));
583 if (TREE_CODE (gnu_size
) != INTEGER_CST
584 && contains_placeholder_p (gnu_size
))
585 gnu_size
= build (WITH_RECORD_EXPR
, bitsizetype
,
590 /* We may have no GNU_EXPR because No_Initialization is
591 set even though there's an Expression. */
592 else if (kind
== E_Constant
593 && (Nkind (Declaration_Node (gnat_entity
))
594 == N_Object_Declaration
)
595 && Present (Expression (Declaration_Node (gnat_entity
))))
597 = TYPE_SIZE (gnat_to_gnu_type
599 (Expression (Declaration_Node (gnat_entity
)))));
601 gnu_size
= max_size (TYPE_SIZE (gnu_type
), 1);
604 /* If the size is zero bytes, make it one byte since some linkers
605 have trouble with zero-sized objects. But if this will have a
606 template, that will make it nonzero. */
607 if (((gnu_size
!= 0 && integer_zerop (gnu_size
))
608 || (TYPE_SIZE (gnu_type
) != 0
609 && integer_zerop (TYPE_SIZE (gnu_type
))))
610 && (! Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity
))
611 || ! Is_Array_Type (Etype (gnat_entity
))))
612 gnu_size
= bitsize_unit_node
;
614 /* If an alignment is specified, use it if valid. Note that
615 exceptions are objects but don't have alignments. */
616 if (kind
!= E_Exception
&& Known_Alignment (gnat_entity
))
618 if (No (Alignment (gnat_entity
)))
622 = validate_alignment (Alignment (gnat_entity
), gnat_entity
,
623 TYPE_ALIGN (gnu_type
));
626 /* If this is an atomic object with no specified size and alignment,
627 but where the size of the type is a constant, set the alignment to
628 the lowest power of two greater than the size, or to the
629 biggest meaningful alignment, whichever is smaller. */
631 if (Is_Atomic (gnat_entity
) && gnu_size
== 0 && align
== 0
632 && TREE_CODE (TYPE_SIZE (gnu_type
)) == INTEGER_CST
)
634 if (! host_integerp (TYPE_SIZE (gnu_type
), 1)
635 || 0 <= compare_tree_int (TYPE_SIZE (gnu_type
),
637 align
= BIGGEST_ALIGNMENT
;
639 align
= ((unsigned int) 1
640 << (floor_log2 (tree_low_cst
641 (TYPE_SIZE (gnu_type
), 1) - 1)
645 #ifdef MINIMUM_ATOMIC_ALIGNMENT
646 /* If the size is a constant and no alignment is specified, force
647 the alignment to be the minimum valid atomic alignment. The
648 restriction on constant size avoids problems with variable-size
649 temporaries; if the size is variable, there's no issue with
650 atomic access. Also don't do this for a constant, since it isn't
651 necessary and can interfere with constant replacement. Finally,
652 do not do it for Out parameters since that creates an
653 size inconsistency with In parameters. */
654 if (align
== 0 && MINIMUM_ATOMIC_ALIGNMENT
> TYPE_ALIGN (gnu_type
)
655 && ! FLOAT_TYPE_P (gnu_type
)
656 && ! const_flag
&& No (Renamed_Object (gnat_entity
))
657 && ! imported_p
&& No (Address_Clause (gnat_entity
))
658 && kind
!= E_Out_Parameter
659 && (gnu_size
!= 0 ? TREE_CODE (gnu_size
) == INTEGER_CST
660 : TREE_CODE (TYPE_SIZE (gnu_type
)) == INTEGER_CST
))
661 align
= MINIMUM_ATOMIC_ALIGNMENT
;
664 /* If the object is set to have atomic components, find the component
665 type and validate it.
667 ??? Note that we ignore Has_Volatile_Components on objects; it's
668 not at all clear what to do in that case. */
670 if (Has_Atomic_Components (gnat_entity
))
673 = (TREE_CODE (gnu_type
) == ARRAY_TYPE
674 ? TREE_TYPE (gnu_type
) : gnu_type
);
676 while (TREE_CODE (gnu_inner
) == ARRAY_TYPE
677 && TYPE_MULTI_ARRAY_P (gnu_inner
))
678 gnu_inner
= TREE_TYPE (gnu_inner
);
680 check_ok_for_atomic (gnu_inner
, gnat_entity
, 1);
683 /* Now check if the type of the object allows atomic access. Note
684 that we must test the type, even if this object has size and
685 alignment to allow such access, because we will be going
686 inside the padded record to assign to the object. We could fix
687 this by always copying via an intermediate value, but it's not
688 clear it's worth the effort. */
689 if (Is_Atomic (gnat_entity
))
690 check_ok_for_atomic (gnu_type
, gnat_entity
, 0);
692 /* Make a new type with the desired size and alignment, if needed. */
693 gnu_type
= maybe_pad_type (gnu_type
, gnu_size
, align
,
694 gnat_entity
, "PAD", 0, definition
, 1);
696 /* Make a volatile version of this object's type if we are to
697 make the object volatile. Note that 13.3(19) says that we
698 should treat other types of objects as volatile as well. */
699 if ((Is_Volatile (gnat_entity
)
700 || Is_Exported (gnat_entity
)
701 || Is_Imported (gnat_entity
)
702 || Present (Address_Clause (gnat_entity
)))
703 && ! TYPE_VOLATILE (gnu_type
))
704 gnu_type
= build_qualified_type (gnu_type
,
705 (TYPE_QUALS (gnu_type
)
706 | TYPE_QUAL_VOLATILE
));
708 /* If this is an aliased object with an unconstrained nominal subtype,
709 make a type that includes the template. */
710 if (Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity
))
711 && Is_Array_Type (Etype (gnat_entity
))
712 && ! type_annotate_only
)
715 = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity
))));
717 = TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_fat
))));
720 = build_unc_object_type (gnu_temp_type
, gnu_type
,
721 concat_id_with_name (gnu_entity_id
,
725 /* Convert the expression to the type of the object except in the
726 case where the object's type is unconstrained or the object's type
727 is a padded record whose field is of self-referential size. In
728 the former case, converting will generate unnecessary evaluations
729 of the CONSTRUCTOR to compute the size and in the latter case, we
730 want to only copy the actual data. */
732 && TREE_CODE (gnu_type
) != UNCONSTRAINED_ARRAY_TYPE
733 && ! (TREE_CODE (TYPE_SIZE (gnu_type
)) != INTEGER_CST
734 && contains_placeholder_p (TYPE_SIZE (gnu_type
)))
735 && ! (TREE_CODE (gnu_type
) == RECORD_TYPE
736 && TYPE_IS_PADDING_P (gnu_type
)
737 && (contains_placeholder_p
738 (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type
)))))))
739 gnu_expr
= convert (gnu_type
, gnu_expr
);
741 /* See if this is a renaming. If this is a constant renaming,
742 treat it as a normal variable whose initial value is what
743 is being renamed. We cannot do this if the type is
744 unconstrained or class-wide.
746 Otherwise, if what we are renaming is a reference, we can simply
747 return a stabilized version of that reference, after forcing
748 any SAVE_EXPRs to be evaluated. But, if this is at global level,
749 we can only do this if we know no SAVE_EXPRs will be made.
750 Otherwise, make this into a constant pointer to the object we are
753 if (Present (Renamed_Object (gnat_entity
)))
755 /* If the renamed object had padding, strip off the reference
756 to the inner object and reset our type. */
757 if (TREE_CODE (gnu_expr
) == COMPONENT_REF
758 && (TREE_CODE (TREE_TYPE (TREE_OPERAND (gnu_expr
, 0)))
760 && (TYPE_IS_PADDING_P
761 (TREE_TYPE (TREE_OPERAND (gnu_expr
, 0)))))
763 gnu_expr
= TREE_OPERAND (gnu_expr
, 0);
764 gnu_type
= TREE_TYPE (gnu_expr
);
768 && TREE_CODE (gnu_type
) != UNCONSTRAINED_ARRAY_TYPE
769 && TYPE_MODE (gnu_type
) != BLKmode
770 && Ekind (Etype (gnat_entity
)) != E_Class_Wide_Type
771 && !Is_Array_Type (Etype (gnat_entity
)))
774 /* If this is a declaration or reference, we can just use that
775 declaration or reference as this entity. */
776 else if ((DECL_P (gnu_expr
)
777 || TREE_CODE_CLASS (TREE_CODE (gnu_expr
)) == 'r')
778 && ! Materialize_Entity (gnat_entity
)
779 && (! global_bindings_p ()
780 || (staticp (gnu_expr
)
781 && ! TREE_SIDE_EFFECTS (gnu_expr
))))
783 set_lineno (gnat_entity
, ! global_bindings_p ());
784 gnu_decl
= gnat_stabilize_reference (gnu_expr
, 1);
785 save_gnu_tree (gnat_entity
, gnu_decl
, 1);
788 if (! global_bindings_p ())
789 expand_expr_stmt (build1 (CONVERT_EXPR
, void_type_node
,
795 inner_const_flag
= TREE_READONLY (gnu_expr
);
797 gnu_type
= build_reference_type (gnu_type
);
798 gnu_expr
= build_unary_op (ADDR_EXPR
, gnu_type
, gnu_expr
);
804 /* If this is an aliased object whose nominal subtype is unconstrained,
805 the object is a record that contains both the template and
806 the object. If there is an initializer, it will have already
807 been converted to the right type, but we need to create the
808 template if there is no initializer. */
809 else if (definition
&& TREE_CODE (gnu_type
) == RECORD_TYPE
810 && TYPE_CONTAINS_TEMPLATE_P (gnu_type
)
816 (TYPE_FIELDS (gnu_type
),
818 (TREE_TYPE (TYPE_FIELDS (gnu_type
)),
819 TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type
))),
823 /* If this is a pointer and it does not have an initializing
824 expression, initialize it to NULL. */
826 && (POINTER_TYPE_P (gnu_type
) || TYPE_FAT_POINTER_P (gnu_type
))
828 gnu_expr
= integer_zero_node
;
830 /* If we are defining the object and it has an Address clause we must
831 get the address expression from the saved GCC tree for the
832 object if the object has a Freeze_Node. Otherwise, we elaborate
833 the address expression here since the front-end has guaranteed
834 in that case that the elaboration has no effects. Note that
835 only the latter mechanism is currently in use. */
836 if (definition
&& Present (Address_Clause (gnat_entity
)))
839 = (present_gnu_tree (gnat_entity
) ? get_gnu_tree (gnat_entity
)
840 : gnat_to_gnu (Expression (Address_Clause (gnat_entity
))));
842 save_gnu_tree (gnat_entity
, NULL_TREE
, 0);
844 /* Ignore the size. It's either meaningless or was handled
847 gnu_type
= build_reference_type (gnu_type
);
848 gnu_address
= convert (gnu_type
, gnu_address
);
850 const_flag
= ! Is_Public (gnat_entity
);
852 /* If we don't have an initializing expression for the underlying
853 variable, the initializing expression for the pointer is the
854 specified address. Otherwise, we have to make a COMPOUND_EXPR
855 to assign both the address and the initial value. */
857 gnu_expr
= gnu_address
;
860 = build (COMPOUND_EXPR
, gnu_type
,
862 (MODIFY_EXPR
, NULL_TREE
,
863 build_unary_op (INDIRECT_REF
, NULL_TREE
,
869 /* If it has an address clause and we are not defining it, mark it
870 as an indirect object. Likewise for Stdcall objects that are
872 if ((! definition
&& Present (Address_Clause (gnat_entity
)))
873 || (Is_Imported (gnat_entity
)
874 && Convention (gnat_entity
) == Convention_Stdcall
))
876 gnu_type
= build_reference_type (gnu_type
);
881 /* If we are at top level and this object is of variable size,
882 make the actual type a hidden pointer to the real type and
883 make the initializer be a memory allocation and initialization.
884 Likewise for objects we aren't defining (presumed to be
885 external references from other packages), but there we do
886 not set up an initialization.
888 If the object's size overflows, make an allocator too, so that
889 Storage_Error gets raised. Note that we will never free
890 such memory, so we presume it never will get allocated. */
892 if (! allocatable_size_p (TYPE_SIZE_UNIT (gnu_type
),
893 global_bindings_p () || ! definition
896 && ! allocatable_size_p (gnu_size
,
897 global_bindings_p () || ! definition
900 gnu_type
= build_reference_type (gnu_type
);
905 /* Get the data part of GNU_EXPR in case this was a
906 aliased object whose nominal subtype is unconstrained.
907 In that case the pointer above will be a thin pointer and
908 build_allocator will automatically make the template and
909 constructor already made above. */
913 tree gnu_alloc_type
= TREE_TYPE (gnu_type
);
915 if (TREE_CODE (gnu_alloc_type
) == RECORD_TYPE
916 && TYPE_CONTAINS_TEMPLATE_P (gnu_alloc_type
))
919 = TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_alloc_type
)));
921 = build_component_ref
922 (gnu_expr
, NULL_TREE
,
923 TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (gnu_expr
))));
926 if (TREE_CODE (TYPE_SIZE_UNIT (gnu_alloc_type
)) == INTEGER_CST
927 && TREE_CONSTANT_OVERFLOW (TYPE_SIZE_UNIT (gnu_alloc_type
))
928 && ! Is_Imported (gnat_entity
))
929 post_error ("Storage_Error will be raised at run-time?",
932 gnu_expr
= build_allocator (gnu_alloc_type
, gnu_expr
,
942 /* If this object would go into the stack and has an alignment
943 larger than the default largest alignment, make a variable
944 to hold the "aligning type" with a modified initial value,
945 if any, then point to it and make that the value of this
946 variable, which is now indirect. */
948 if (! global_bindings_p () && ! static_p
&& definition
949 && ! imported_p
&& TYPE_ALIGN (gnu_type
) > BIGGEST_ALIGNMENT
)
952 = make_aligning_type (gnu_type
, TYPE_ALIGN (gnu_type
),
953 TYPE_SIZE_UNIT (gnu_type
));
958 = build_constructor (gnu_new_type
,
959 tree_cons (TYPE_FIELDS (gnu_new_type
),
960 gnu_expr
, NULL_TREE
));
961 set_lineno (gnat_entity
, 1);
963 = create_var_decl (create_concat_name (gnat_entity
, "ALIGN"),
964 NULL_TREE
, gnu_new_type
, gnu_expr
,
967 gnu_type
= build_reference_type (gnu_type
);
970 (ADDR_EXPR
, gnu_type
,
971 build_component_ref (gnu_new_var
, NULL_TREE
,
972 TYPE_FIELDS (gnu_new_type
)));
979 /* Convert the expression to the type of the object except in the
980 case where the object's type is unconstrained or the object's type
981 is a padded record whose field is of self-referential size. In
982 the former case, converting will generate unnecessary evaluations
983 of the CONSTRUCTOR to compute the size and in the latter case, we
984 want to only copy the actual data. */
986 && TREE_CODE (gnu_type
) != UNCONSTRAINED_ARRAY_TYPE
987 && ! (TREE_CODE (TYPE_SIZE (gnu_type
)) != INTEGER_CST
988 && contains_placeholder_p (TYPE_SIZE (gnu_type
)))
989 && ! (TREE_CODE (gnu_type
) == RECORD_TYPE
990 && TYPE_IS_PADDING_P (gnu_type
)
991 && (contains_placeholder_p
992 (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type
)))))))
993 gnu_expr
= convert (gnu_type
, gnu_expr
);
995 /* This name is external or there was a name specified, use it.
996 Don't use the Interface_Name if there is an address clause.
998 if ((Present (Interface_Name (gnat_entity
))
999 && No (Address_Clause (gnat_entity
)))
1000 || (Is_Public (gnat_entity
)
1001 && (! Is_Imported (gnat_entity
) || Is_Exported (gnat_entity
))))
1002 gnu_ext_name
= create_concat_name (gnat_entity
, 0);
1005 gnu_type
= build_qualified_type (gnu_type
, (TYPE_QUALS (gnu_type
)
1006 | TYPE_QUAL_CONST
));
1008 /* If this is constant initialized to a static constant and the
1009 object has an aggregrate type, force it to be statically
1011 if (const_flag
&& gnu_expr
&& TREE_CONSTANT (gnu_expr
)
1012 && host_integerp (TYPE_SIZE_UNIT (gnu_type
), 1)
1013 && (AGGREGATE_TYPE_P (gnu_type
)
1014 && ! (TREE_CODE (gnu_type
) == RECORD_TYPE
1015 && TYPE_IS_PADDING_P (gnu_type
))))
1018 set_lineno (gnat_entity
, ! global_bindings_p ());
1019 gnu_decl
= create_var_decl (gnu_entity_id
, gnu_ext_name
, gnu_type
,
1020 gnu_expr
, const_flag
,
1021 Is_Public (gnat_entity
),
1022 imported_p
|| !definition
,
1023 static_p
, attr_list
);
1025 DECL_BY_REF_P (gnu_decl
) = used_by_ref
;
1026 DECL_POINTS_TO_READONLY_P (gnu_decl
) = used_by_ref
&& inner_const_flag
;
1028 if (definition
&& DECL_SIZE (gnu_decl
) != 0
1029 && gnu_block_stack
!= 0
1030 && TREE_VALUE (gnu_block_stack
) != 0
1031 && (TREE_CODE (DECL_SIZE (gnu_decl
)) != INTEGER_CST
1032 || (flag_stack_check
&& ! STACK_CHECK_BUILTIN
1033 && 0 < compare_tree_int (DECL_SIZE_UNIT (gnu_decl
),
1034 STACK_CHECK_MAX_VAR_SIZE
))))
1035 update_setjmp_buf (TREE_VALUE (gnu_block_stack
));
1037 /* If this is a public constant or we're not optimizing and we're not
1038 making a VAR_DECL for it, make one just for export or debugger
1039 use. Likewise if the address is taken or if the object or type is
1041 if (definition
&& TREE_CODE (gnu_decl
) == CONST_DECL
1042 && (Is_Public (gnat_entity
)
1044 || Address_Taken (gnat_entity
)
1045 || Is_Aliased (gnat_entity
)
1046 || Is_Aliased (Etype (gnat_entity
))))
1047 DECL_CONST_CORRESPONDING_VAR (gnu_decl
)
1048 = create_var_decl (gnu_entity_id
, gnu_ext_name
, gnu_type
,
1049 gnu_expr
, 0, Is_Public (gnat_entity
), 0,
1052 /* If this is declared in a block that contains an block with an
1053 exception handler, we must force this variable in memory to
1054 suppress an invalid optimization. */
1055 if (Has_Nested_Block_With_Handler (Scope (gnat_entity
))
1056 && Exception_Mechanism
!= GCC_ZCX
)
1058 gnat_mark_addressable (gnu_decl
);
1059 flush_addressof (gnu_decl
);
1062 /* Back-annotate the Alignment of the object if not already in the
1063 tree. Likewise for Esize if the object is of a constant size.
1064 But if the "object" is actually a pointer to an object, the
1065 alignment and size are the same as teh type, so don't back-annotate
1066 the values for the pointer. */
1067 if (! used_by_ref
&& Unknown_Alignment (gnat_entity
))
1068 Set_Alignment (gnat_entity
,
1069 UI_From_Int (DECL_ALIGN (gnu_decl
) / BITS_PER_UNIT
));
1071 if (! used_by_ref
&& Unknown_Esize (gnat_entity
)
1072 && DECL_SIZE (gnu_decl
) != 0)
1074 tree gnu_back_size
= DECL_SIZE (gnu_decl
);
1076 if (TREE_CODE (TREE_TYPE (gnu_decl
)) == RECORD_TYPE
1077 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_decl
)))
1079 = TYPE_SIZE (TREE_TYPE (TREE_CHAIN
1080 (TYPE_FIELDS (TREE_TYPE (gnu_decl
)))));
1082 Set_Esize (gnat_entity
, annotate_value (gnu_back_size
));
1088 /* Return a TYPE_DECL for "void" that we previously made. */
1089 gnu_decl
= void_type_decl_node
;
1092 case E_Enumeration_Type
:
1093 /* A special case, for the types Character and Wide_Character in
1094 Standard, we do not list all the literals. So if the literals
1095 are not specified, make this an unsigned type. */
1096 if (No (First_Literal (gnat_entity
)))
1098 gnu_type
= make_unsigned_type (esize
);
1102 /* Normal case of non-character type, or non-Standard character type */
1104 /* Here we have a list of enumeral constants in First_Literal.
1105 We make a CONST_DECL for each and build into GNU_LITERAL_LIST
1106 the list to be places into TYPE_FIELDS. Each node in the list
1107 is a TREE_LIST node whose TREE_VALUE is the literal name
1108 and whose TREE_PURPOSE is the value of the literal.
1110 Esize contains the number of bits needed to represent the enumeral
1111 type, Type_Low_Bound also points to the first literal and
1112 Type_High_Bound points to the last literal. */
1114 Entity_Id gnat_literal
;
1115 tree gnu_literal_list
= NULL_TREE
;
1117 if (Is_Unsigned_Type (gnat_entity
))
1118 gnu_type
= make_unsigned_type (esize
);
1120 gnu_type
= make_signed_type (esize
);
1122 TREE_SET_CODE (gnu_type
, ENUMERAL_TYPE
);
1124 for (gnat_literal
= First_Literal (gnat_entity
);
1125 Present (gnat_literal
);
1126 gnat_literal
= Next_Literal (gnat_literal
))
1128 tree gnu_value
= UI_To_gnu (Enumeration_Rep (gnat_literal
),
1131 = create_var_decl (get_entity_name (gnat_literal
),
1132 0, gnu_type
, gnu_value
, 1, 0, 0, 0, 0);
1134 save_gnu_tree (gnat_literal
, gnu_literal
, 0);
1135 gnu_literal_list
= tree_cons (DECL_NAME (gnu_literal
),
1136 gnu_value
, gnu_literal_list
);
1139 TYPE_FIELDS (gnu_type
) = nreverse (gnu_literal_list
);
1141 /* Note that the bounds are updated at the end of this function
1142 because to avoid an infinite recursion when we get the bounds of
1143 this type, since those bounds are objects of this type. */
1147 case E_Signed_Integer_Type
:
1148 case E_Ordinary_Fixed_Point_Type
:
1149 case E_Decimal_Fixed_Point_Type
:
1150 /* For integer types, just make a signed type the appropriate number
1152 gnu_type
= make_signed_type (esize
);
1155 case E_Modular_Integer_Type
:
1156 /* For modular types, make the unsigned type of the proper number of
1157 bits and then set up the modulus, if required. */
1159 enum machine_mode mode
;
1163 if (Is_Packed_Array_Type (gnat_entity
))
1164 esize
= UI_To_Int (RM_Size (gnat_entity
));
1166 /* Find the smallest mode at least ESIZE bits wide and make a class
1169 for (mode
= GET_CLASS_NARROWEST_MODE (MODE_INT
);
1170 GET_MODE_BITSIZE (mode
) < esize
;
1171 mode
= GET_MODE_WIDER_MODE (mode
))
1174 gnu_type
= make_unsigned_type (GET_MODE_BITSIZE (mode
));
1175 TYPE_PACKED_ARRAY_TYPE_P (gnu_type
)
1176 = Is_Packed_Array_Type (gnat_entity
);
1178 /* Get the modulus in this type. If it overflows, assume it is because
1179 it is equal to 2**Esize. Note that there is no overflow checking
1180 done on unsigned type, so we detect the overflow by looking for
1181 a modulus of zero, which is otherwise invalid. */
1182 gnu_modulus
= UI_To_gnu (Modulus (gnat_entity
), gnu_type
);
1184 if (! integer_zerop (gnu_modulus
))
1186 TYPE_MODULAR_P (gnu_type
) = 1;
1187 TYPE_MODULUS (gnu_type
) = gnu_modulus
;
1188 gnu_high
= fold (build (MINUS_EXPR
, gnu_type
, gnu_modulus
,
1189 convert (gnu_type
, integer_one_node
)));
1192 /* If we have to set TYPE_PRECISION different from its natural value,
1193 make a subtype to do do. Likewise if there is a modulus and
1194 it is not one greater than TYPE_MAX_VALUE. */
1195 if (TYPE_PRECISION (gnu_type
) != esize
1196 || (TYPE_MODULAR_P (gnu_type
)
1197 && ! tree_int_cst_equal (TYPE_MAX_VALUE (gnu_type
), gnu_high
)))
1199 tree gnu_subtype
= make_node (INTEGER_TYPE
);
1201 TYPE_NAME (gnu_type
) = create_concat_name (gnat_entity
, "UMT");
1202 TREE_TYPE (gnu_subtype
) = gnu_type
;
1203 TYPE_MIN_VALUE (gnu_subtype
) = TYPE_MIN_VALUE (gnu_type
);
1204 TYPE_MAX_VALUE (gnu_subtype
)
1205 = TYPE_MODULAR_P (gnu_type
)
1206 ? gnu_high
: TYPE_MAX_VALUE (gnu_type
);
1207 TYPE_PRECISION (gnu_subtype
) = esize
;
1208 TREE_UNSIGNED (gnu_subtype
) = 1;
1209 TYPE_EXTRA_SUBTYPE_P (gnu_subtype
) = 1;
1210 TYPE_PACKED_ARRAY_TYPE_P (gnu_subtype
)
1211 = Is_Packed_Array_Type (gnat_entity
);
1212 layout_type (gnu_subtype
);
1214 gnu_type
= gnu_subtype
;
1219 case E_Signed_Integer_Subtype
:
1220 case E_Enumeration_Subtype
:
1221 case E_Modular_Integer_Subtype
:
1222 case E_Ordinary_Fixed_Point_Subtype
:
1223 case E_Decimal_Fixed_Point_Subtype
:
1225 /* For integral subtypes, we make a new INTEGER_TYPE. Note
1226 that we do not want to call build_range_type since we would
1227 like each subtype node to be distinct. This will be important
1228 when memory aliasing is implemented.
1230 The TREE_TYPE field of the INTEGER_TYPE we make points to the
1231 parent type; this fact is used by the arithmetic conversion
1234 We elaborate the Ancestor_Subtype if it is not in the current
1235 unit and one of our bounds is non-static. We do this to ensure
1236 consistent naming in the case where several subtypes share the same
1237 bounds by always elaborating the first such subtype first, thus
1241 && Present (Ancestor_Subtype (gnat_entity
))
1242 && ! In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity
))
1243 && (! Compile_Time_Known_Value (Type_Low_Bound (gnat_entity
))
1244 || ! Compile_Time_Known_Value (Type_High_Bound (gnat_entity
))))
1245 gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity
),
1246 gnu_expr
, definition
);
1248 gnu_type
= make_node (INTEGER_TYPE
);
1249 if (Is_Packed_Array_Type (gnat_entity
))
1252 esize
= UI_To_Int (RM_Size (gnat_entity
));
1253 TYPE_PACKED_ARRAY_TYPE_P (gnu_type
) = 1;
1256 TYPE_PRECISION (gnu_type
) = esize
;
1257 TREE_TYPE (gnu_type
) = get_unpadded_type (Etype (gnat_entity
));
1259 TYPE_MIN_VALUE (gnu_type
)
1260 = convert (TREE_TYPE (gnu_type
),
1261 elaborate_expression (Type_Low_Bound (gnat_entity
),
1263 get_identifier ("L"), definition
, 1,
1264 Needs_Debug_Info (gnat_entity
)));
1266 TYPE_MAX_VALUE (gnu_type
)
1267 = convert (TREE_TYPE (gnu_type
),
1268 elaborate_expression (Type_High_Bound (gnat_entity
),
1270 get_identifier ("U"), definition
, 1,
1271 Needs_Debug_Info (gnat_entity
)));
1273 /* One of the above calls might have caused us to be elaborated,
1274 so don't blow up if so. */
1275 if (present_gnu_tree (gnat_entity
))
1281 TYPE_BIASED_REPRESENTATION_P (gnu_type
)
1282 = Has_Biased_Representation (gnat_entity
);
1284 /* This should be an unsigned type if the lower bound is constant
1285 and non-negative or if the base type is unsigned; a signed type
1287 TREE_UNSIGNED (gnu_type
)
1288 = (TREE_UNSIGNED (TREE_TYPE (gnu_type
))
1289 || (TREE_CODE (TYPE_MIN_VALUE (gnu_type
)) == INTEGER_CST
1290 && TREE_INT_CST_HIGH (TYPE_MIN_VALUE (gnu_type
)) >= 0)
1291 || TYPE_BIASED_REPRESENTATION_P (gnu_type
)
1292 || Is_Unsigned_Type (gnat_entity
));
1294 layout_type (gnu_type
);
1296 if (Is_Packed_Array_Type (gnat_entity
) && BYTES_BIG_ENDIAN
)
1298 tree gnu_field_type
= gnu_type
;
1301 TYPE_RM_SIZE_INT (gnu_field_type
)
1302 = UI_To_gnu (RM_Size (gnat_entity
), bitsizetype
);
1303 gnu_type
= make_node (RECORD_TYPE
);
1304 TYPE_NAME (gnu_type
) = create_concat_name (gnat_entity
, "LJM");
1305 TYPE_ALIGN (gnu_type
) = TYPE_ALIGN (gnu_field_type
);
1306 TYPE_PACKED (gnu_type
) = 1;
1307 gnu_field
= create_field_decl (get_identifier ("OBJECT"),
1308 gnu_field_type
, gnu_type
, 1, 0, 0, 1),
1309 finish_record_type (gnu_type
, gnu_field
, 0, 0);
1310 TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_type
) = 1;
1311 TYPE_ADA_SIZE (gnu_type
) = bitsize_int (esize
);
1316 case E_Floating_Point_Type
:
1317 /* If this is a VAX floating-point type, use an integer of the proper
1318 size. All the operations will be handled with ASM statements. */
1319 if (Vax_Float (gnat_entity
))
1321 gnu_type
= make_signed_type (esize
);
1322 TYPE_VAX_FLOATING_POINT_P (gnu_type
) = 1;
1323 TYPE_DIGITS_VALUE (gnu_type
)
1324 = UI_To_Int (Digits_Value (gnat_entity
));
1328 /* The type of the Low and High bounds can be our type if this is
1329 a type from Standard, so set them at the end of the function. */
1330 gnu_type
= make_node (REAL_TYPE
);
1331 TYPE_PRECISION (gnu_type
) = esize
;
1332 layout_type (gnu_type
);
1335 case E_Floating_Point_Subtype
:
1336 if (Vax_Float (gnat_entity
))
1338 gnu_type
= gnat_to_gnu_type (Etype (gnat_entity
));
1343 enum machine_mode mode
;
1346 && Present (Ancestor_Subtype (gnat_entity
))
1347 && ! In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity
))
1348 && (! Compile_Time_Known_Value (Type_Low_Bound (gnat_entity
))
1349 || ! Compile_Time_Known_Value (Type_High_Bound (gnat_entity
))))
1350 gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity
),
1351 gnu_expr
, definition
);
1353 for (mode
= GET_CLASS_NARROWEST_MODE (MODE_FLOAT
);
1354 (GET_MODE_WIDER_MODE (mode
) != VOIDmode
1355 && GET_MODE_BITSIZE (GET_MODE_WIDER_MODE (mode
)) <= esize
);
1356 mode
= GET_MODE_WIDER_MODE (mode
))
1359 gnu_type
= make_node (REAL_TYPE
);
1360 TREE_TYPE (gnu_type
) = get_unpadded_type (Etype (gnat_entity
));
1361 TYPE_PRECISION (gnu_type
) = GET_MODE_BITSIZE (mode
);
1363 TYPE_MIN_VALUE (gnu_type
)
1364 = convert (TREE_TYPE (gnu_type
),
1365 elaborate_expression (Type_Low_Bound (gnat_entity
),
1366 gnat_entity
, get_identifier ("L"),
1368 Needs_Debug_Info (gnat_entity
)));
1370 TYPE_MAX_VALUE (gnu_type
)
1371 = convert (TREE_TYPE (gnu_type
),
1372 elaborate_expression (Type_High_Bound (gnat_entity
),
1373 gnat_entity
, get_identifier ("U"),
1375 Needs_Debug_Info (gnat_entity
)));
1377 /* One of the above calls might have caused us to be elaborated,
1378 so don't blow up if so. */
1379 if (present_gnu_tree (gnat_entity
))
1385 layout_type (gnu_type
);
1389 /* Array and String Types and Subtypes
1391 Unconstrained array types are represented by E_Array_Type and
1392 constrained array types are represented by E_Array_Subtype. There
1393 are no actual objects of an unconstrained array type; all we have
1394 are pointers to that type.
1396 The following fields are defined on array types and subtypes:
1398 Component_Type Component type of the array.
1399 Number_Dimensions Number of dimensions (an int).
1400 First_Index Type of first index. */
1405 tree gnu_template_fields
= NULL_TREE
;
1406 tree gnu_template_type
= make_node (RECORD_TYPE
);
1407 tree gnu_ptr_template
= build_pointer_type (gnu_template_type
);
1408 tree gnu_fat_type
= make_node (RECORD_TYPE
);
1409 int ndim
= Number_Dimensions (gnat_entity
);
1411 = (Convention (gnat_entity
) == Convention_Fortran
) ? ndim
- 1 : 0;
1413 = (Convention (gnat_entity
) == Convention_Fortran
) ? - 1 : 1;
1414 tree
*gnu_index_types
= (tree
*) alloca (ndim
* sizeof (tree
*));
1415 tree
*gnu_temp_fields
= (tree
*) alloca (ndim
* sizeof (tree
*));
1416 tree gnu_comp_size
= 0;
1417 tree gnu_max_size
= size_one_node
;
1418 tree gnu_max_size_unit
;
1420 Entity_Id gnat_ind_subtype
;
1421 Entity_Id gnat_ind_base_subtype
;
1422 tree gnu_template_reference
;
1425 TYPE_NAME (gnu_template_type
)
1426 = create_concat_name (gnat_entity
, "XUB");
1427 TYPE_NAME (gnu_fat_type
) = create_concat_name (gnat_entity
, "XUP");
1428 TYPE_IS_FAT_POINTER_P (gnu_fat_type
) = 1;
1429 TREE_READONLY (gnu_template_type
) = 1;
1431 /* Make a node for the array. If we are not defining the array
1432 suppress expanding incomplete types and save the node as the type
1434 gnu_type
= make_node (UNCONSTRAINED_ARRAY_TYPE
);
1437 defer_incomplete_level
++;
1438 this_deferred
= this_made_decl
= 1;
1439 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
1440 ! Comes_From_Source (gnat_entity
),
1442 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
1446 /* Build the fat pointer type. Use a "void *" object instead of
1447 a pointer to the array type since we don't have the array type
1448 yet (it will reference the fat pointer via the bounds). */
1449 tem
= chainon (chainon (NULL_TREE
,
1450 create_field_decl (get_identifier ("P_ARRAY"),
1452 gnu_fat_type
, 0, 0, 0, 0)),
1453 create_field_decl (get_identifier ("P_BOUNDS"),
1455 gnu_fat_type
, 0, 0, 0, 0));
1457 /* Make sure we can put this into a register. */
1458 TYPE_ALIGN (gnu_fat_type
) = MIN (BIGGEST_ALIGNMENT
, 2 * POINTER_SIZE
);
1459 finish_record_type (gnu_fat_type
, tem
, 0, 1);
1461 /* Build a reference to the template from a PLACEHOLDER_EXPR that
1462 is the fat pointer. This will be used to access the individual
1463 fields once we build them. */
1464 tem
= build (COMPONENT_REF
, gnu_ptr_template
,
1465 build (PLACEHOLDER_EXPR
, gnu_fat_type
),
1466 TREE_CHAIN (TYPE_FIELDS (gnu_fat_type
)));
1467 gnu_template_reference
1468 = build_unary_op (INDIRECT_REF
, gnu_template_type
, tem
);
1469 TREE_READONLY (gnu_template_reference
) = 1;
1471 /* Now create the GCC type for each index and add the fields for
1472 that index to the template. */
1473 for (index
= firstdim
, gnat_ind_subtype
= First_Index (gnat_entity
),
1474 gnat_ind_base_subtype
1475 = First_Index (Implementation_Base_Type (gnat_entity
));
1476 index
< ndim
&& index
>= 0;
1478 gnat_ind_subtype
= Next_Index (gnat_ind_subtype
),
1479 gnat_ind_base_subtype
= Next_Index (gnat_ind_base_subtype
))
1481 char field_name
[10];
1482 tree gnu_ind_subtype
1483 = get_unpadded_type (Base_Type (Etype (gnat_ind_subtype
)));
1484 tree gnu_base_subtype
1485 = get_unpadded_type (Etype (gnat_ind_base_subtype
));
1487 = convert (sizetype
, TYPE_MIN_VALUE (gnu_base_subtype
));
1489 = convert (sizetype
, TYPE_MAX_VALUE (gnu_base_subtype
));
1490 tree gnu_min_field
, gnu_max_field
, gnu_min
, gnu_max
;
1492 /* Make the FIELD_DECLs for the minimum and maximum of this
1493 type and then make extractions of that field from the
1495 set_lineno (gnat_entity
, 0);
1496 sprintf (field_name
, "LB%d", index
);
1497 gnu_min_field
= create_field_decl (get_identifier (field_name
),
1499 gnu_template_type
, 0, 0, 0, 0);
1500 field_name
[0] = 'U';
1501 gnu_max_field
= create_field_decl (get_identifier (field_name
),
1503 gnu_template_type
, 0, 0, 0, 0);
1505 gnu_temp_fields
[index
] = chainon (gnu_min_field
, gnu_max_field
);
1507 /* We can't use build_component_ref here since the template
1508 type isn't complete yet. */
1509 gnu_min
= build (COMPONENT_REF
, gnu_ind_subtype
,
1510 gnu_template_reference
, gnu_min_field
);
1511 gnu_max
= build (COMPONENT_REF
, gnu_ind_subtype
,
1512 gnu_template_reference
, gnu_max_field
);
1513 TREE_READONLY (gnu_min
) = TREE_READONLY (gnu_max
) = 1;
1515 /* Make a range type with the new ranges, but using
1516 the Ada subtype. Then we convert to sizetype. */
1517 gnu_index_types
[index
]
1518 = create_index_type (convert (sizetype
, gnu_min
),
1519 convert (sizetype
, gnu_max
),
1520 build_range_type (gnu_ind_subtype
,
1522 /* Update the maximum size of the array, in elements. */
1524 = size_binop (MULT_EXPR
, gnu_max_size
,
1525 size_binop (PLUS_EXPR
, size_one_node
,
1526 size_binop (MINUS_EXPR
, gnu_base_max
,
1529 TYPE_NAME (gnu_index_types
[index
])
1530 = create_concat_name (gnat_entity
, field_name
);
1533 for (index
= 0; index
< ndim
; index
++)
1535 = chainon (gnu_template_fields
, gnu_temp_fields
[index
]);
1537 /* Install all the fields into the template. */
1538 finish_record_type (gnu_template_type
, gnu_template_fields
, 0, 0);
1539 TREE_READONLY (gnu_template_type
) = 1;
1541 /* Now make the array of arrays and update the pointer to the array
1542 in the fat pointer. Note that it is the first field. */
1544 tem
= gnat_to_gnu_type (Component_Type (gnat_entity
));
1546 /* Get and validate any specified Component_Size, but if Packed,
1547 ignore it since the front end will have taken care of it. Also,
1548 allow sizes not a multiple of Storage_Unit if packed. */
1550 = validate_size (Component_Size (gnat_entity
), tem
,
1552 (Is_Bit_Packed_Array (gnat_entity
)
1553 ? TYPE_DECL
: VAR_DECL
), 1,
1554 Has_Component_Size_Clause (gnat_entity
));
1556 if (Has_Atomic_Components (gnat_entity
))
1557 check_ok_for_atomic (tem
, gnat_entity
, 1);
1559 /* If the component type is a RECORD_TYPE that has a self-referential
1560 size, use the maxium size. */
1561 if (gnu_comp_size
== 0 && TREE_CODE (tem
) == RECORD_TYPE
1562 && TREE_CODE (TYPE_SIZE (tem
)) != INTEGER_CST
1563 && contains_placeholder_p (TYPE_SIZE (tem
)))
1564 gnu_comp_size
= max_size (TYPE_SIZE (tem
), 1);
1566 if (! Is_Bit_Packed_Array (gnat_entity
) && gnu_comp_size
!= 0)
1568 tem
= make_type_from_size (tem
, gnu_comp_size
, 0);
1569 tem
= maybe_pad_type (tem
, gnu_comp_size
, 0, gnat_entity
,
1570 "C_PAD", 0, definition
, 1);
1573 if (Has_Volatile_Components (gnat_entity
))
1574 tem
= build_qualified_type (tem
,
1575 TYPE_QUALS (tem
) | TYPE_QUAL_VOLATILE
);
1577 /* If Component_Size is not already specified, annotate it with the
1578 size of the component. */
1579 if (Unknown_Component_Size (gnat_entity
))
1580 Set_Component_Size (gnat_entity
, annotate_value (TYPE_SIZE (tem
)));
1582 gnu_max_size_unit
= size_binop (MAX_EXPR
, size_zero_node
,
1583 size_binop (MULT_EXPR
, gnu_max_size
,
1584 TYPE_SIZE_UNIT (tem
)));
1585 gnu_max_size
= size_binop (MAX_EXPR
, bitsize_zero_node
,
1586 size_binop (MULT_EXPR
,
1587 convert (bitsizetype
,
1591 for (index
= ndim
- 1; index
>= 0; index
--)
1593 tem
= build_array_type (tem
, gnu_index_types
[index
]);
1594 TYPE_MULTI_ARRAY_P (tem
) = (index
> 0);
1595 TYPE_NONALIASED_COMPONENT (tem
)
1596 = ! Has_Aliased_Components (gnat_entity
);
1599 /* If an alignment is specified, use it if valid. But ignore it for
1600 types that represent the unpacked base type for packed arrays. */
1601 if (No (Packed_Array_Type (gnat_entity
))
1602 && Known_Alignment (gnat_entity
))
1604 if (No (Alignment (gnat_entity
)))
1608 = validate_alignment (Alignment (gnat_entity
), gnat_entity
,
1612 TYPE_CONVENTION_FORTRAN_P (tem
)
1613 = (Convention (gnat_entity
) == Convention_Fortran
);
1614 TREE_TYPE (TYPE_FIELDS (gnu_fat_type
)) = build_pointer_type (tem
);
1616 /* The result type is an UNCONSTRAINED_ARRAY_TYPE that indicates the
1617 corresponding fat pointer. */
1618 TREE_TYPE (gnu_type
) = TYPE_POINTER_TO (gnu_type
)
1619 = TYPE_REFERENCE_TO (gnu_type
) = gnu_fat_type
;
1620 TYPE_MODE (gnu_type
) = BLKmode
;
1621 TYPE_ALIGN (gnu_type
) = TYPE_ALIGN (tem
);
1622 TYPE_UNCONSTRAINED_ARRAY (gnu_fat_type
) = gnu_type
;
1624 /* If the maximum size doesn't overflow, use it. */
1625 if (TREE_CODE (gnu_max_size
) == INTEGER_CST
1626 && ! TREE_OVERFLOW (gnu_max_size
))
1628 = size_binop (MIN_EXPR
, gnu_max_size
, TYPE_SIZE (tem
));
1629 if (TREE_CODE (gnu_max_size_unit
) == INTEGER_CST
1630 && ! TREE_OVERFLOW (gnu_max_size_unit
))
1631 TYPE_SIZE_UNIT (tem
)
1632 = size_binop (MIN_EXPR
, gnu_max_size_unit
,
1633 TYPE_SIZE_UNIT (tem
));
1635 create_type_decl (create_concat_name (gnat_entity
, "XUA"),
1636 tem
, 0, ! Comes_From_Source (gnat_entity
),
1638 rest_of_type_compilation (gnu_fat_type
, global_bindings_p ());
1640 /* Create a record type for the object and its template and
1641 set the template at a negative offset. */
1642 tem
= build_unc_object_type (gnu_template_type
, tem
,
1643 create_concat_name (gnat_entity
, "XUT"));
1644 DECL_FIELD_OFFSET (TYPE_FIELDS (tem
))
1645 = size_binop (MINUS_EXPR
, size_zero_node
,
1646 byte_position (TREE_CHAIN (TYPE_FIELDS (tem
))));
1647 DECL_FIELD_OFFSET (TREE_CHAIN (TYPE_FIELDS (tem
))) = size_zero_node
;
1648 DECL_FIELD_BIT_OFFSET (TREE_CHAIN (TYPE_FIELDS (tem
)))
1649 = bitsize_zero_node
;
1650 TYPE_UNCONSTRAINED_ARRAY (tem
) = gnu_type
;
1651 TYPE_OBJECT_RECORD_TYPE (gnu_type
) = tem
;
1653 /* Give the thin pointer type a name. */
1654 create_type_decl (create_concat_name (gnat_entity
, "XUX"),
1655 build_pointer_type (tem
), 0,
1656 ! Comes_From_Source (gnat_entity
), debug_info_p
);
1660 case E_String_Subtype
:
1661 case E_Array_Subtype
:
1663 /* This is the actual data type for array variables. Multidimensional
1664 arrays are implemented in the gnu tree as arrays of arrays. Note
1665 that for the moment arrays which have sparse enumeration subtypes as
1666 index components create sparse arrays, which is obviously space
1667 inefficient but so much easier to code for now.
1669 Also note that the subtype never refers to the unconstrained
1670 array type, which is somewhat at variance with Ada semantics.
1672 First check to see if this is simply a renaming of the array
1673 type. If so, the result is the array type. */
1675 gnu_type
= gnat_to_gnu_type (Etype (gnat_entity
));
1676 if (! Is_Constrained (gnat_entity
))
1681 int array_dim
= Number_Dimensions (gnat_entity
);
1683 = ((Convention (gnat_entity
) == Convention_Fortran
)
1684 ? array_dim
- 1 : 0);
1686 = (Convention (gnat_entity
) == Convention_Fortran
) ? -1 : 1;
1687 Entity_Id gnat_ind_subtype
;
1688 Entity_Id gnat_ind_base_subtype
;
1689 tree gnu_base_type
= gnu_type
;
1690 tree
*gnu_index_type
= (tree
*) alloca (array_dim
* sizeof (tree
*));
1691 tree gnu_comp_size
= 0;
1692 tree gnu_max_size
= size_one_node
;
1693 tree gnu_max_size_unit
;
1694 int need_index_type_struct
= 0;
1695 int max_overflow
= 0;
1697 /* First create the gnu types for each index. Create types for
1698 debugging information to point to the index types if the
1699 are not integer types, have variable bounds, or are
1700 wider than sizetype. */
1702 for (index
= first_dim
, gnat_ind_subtype
= First_Index (gnat_entity
),
1703 gnat_ind_base_subtype
1704 = First_Index (Implementation_Base_Type (gnat_entity
));
1705 index
< array_dim
&& index
>= 0;
1707 gnat_ind_subtype
= Next_Index (gnat_ind_subtype
),
1708 gnat_ind_base_subtype
= Next_Index (gnat_ind_base_subtype
))
1710 tree gnu_index_subtype
1711 = get_unpadded_type (Etype (gnat_ind_subtype
));
1713 = convert (sizetype
, TYPE_MIN_VALUE (gnu_index_subtype
));
1715 = convert (sizetype
, TYPE_MAX_VALUE (gnu_index_subtype
));
1716 tree gnu_base_subtype
1717 = get_unpadded_type (Etype (gnat_ind_base_subtype
));
1719 = convert (sizetype
, TYPE_MIN_VALUE (gnu_base_subtype
));
1721 = convert (sizetype
, TYPE_MAX_VALUE (gnu_base_subtype
));
1722 tree gnu_base_type
= get_base_type (gnu_base_subtype
);
1723 tree gnu_base_base_min
1724 = convert (sizetype
, TYPE_MIN_VALUE (gnu_base_type
));
1725 tree gnu_base_base_max
1726 = convert (sizetype
, TYPE_MAX_VALUE (gnu_base_type
));
1730 /* If the minimum and maximum values both overflow in
1731 SIZETYPE, but the difference in the original type
1732 does not overflow in SIZETYPE, ignore the overflow
1734 if ((TYPE_PRECISION (gnu_index_subtype
)
1735 > TYPE_PRECISION (sizetype
))
1736 && TREE_CODE (gnu_min
) == INTEGER_CST
1737 && TREE_CODE (gnu_max
) == INTEGER_CST
1738 && TREE_OVERFLOW (gnu_min
) && TREE_OVERFLOW (gnu_max
)
1740 (fold (build (MINUS_EXPR
, gnu_index_subtype
,
1741 TYPE_MAX_VALUE (gnu_index_subtype
),
1742 TYPE_MIN_VALUE (gnu_index_subtype
))))))
1743 TREE_OVERFLOW (gnu_min
) = TREE_OVERFLOW (gnu_max
)
1744 = TREE_CONSTANT_OVERFLOW (gnu_min
)
1745 = TREE_CONSTANT_OVERFLOW (gnu_max
) = 0;
1747 /* Similarly, if the range is null, use bounds of 1..0 for
1748 the sizetype bounds. */
1749 else if ((TYPE_PRECISION (gnu_index_subtype
)
1750 > TYPE_PRECISION (sizetype
))
1751 && TREE_CODE (gnu_min
) == INTEGER_CST
1752 && TREE_CODE (gnu_max
) == INTEGER_CST
1753 && (TREE_OVERFLOW (gnu_min
) || TREE_OVERFLOW (gnu_max
))
1754 && tree_int_cst_lt (TYPE_MAX_VALUE (gnu_index_subtype
),
1755 TYPE_MIN_VALUE (gnu_index_subtype
)))
1756 gnu_min
= size_one_node
, gnu_max
= size_zero_node
;
1758 /* Now compute the size of this bound. We need to provide
1759 GCC with an upper bound to use but have to deal with the
1760 "superflat" case. There are three ways to do this. If we
1761 can prove that the array can never be superflat, we can
1762 just use the high bound of the index subtype. If we can
1763 prove that the low bound minus one can't overflow, we
1764 can do this as MAX (hb, lb - 1). Otherwise, we have to use
1765 the expression hb >= lb ? hb : lb - 1. */
1766 gnu_high
= size_binop (MINUS_EXPR
, gnu_min
, size_one_node
);
1768 /* See if the base array type is already flat. If it is, we
1769 are probably compiling an ACVC test, but it will cause the
1770 code below to malfunction if we don't handle it specially. */
1771 if (TREE_CODE (gnu_base_min
) == INTEGER_CST
1772 && TREE_CODE (gnu_base_max
) == INTEGER_CST
1773 && ! TREE_CONSTANT_OVERFLOW (gnu_base_min
)
1774 && ! TREE_CONSTANT_OVERFLOW (gnu_base_max
)
1775 && tree_int_cst_lt (gnu_base_max
, gnu_base_min
))
1776 gnu_high
= size_zero_node
, gnu_min
= size_one_node
;
1778 /* If gnu_high is now an integer which overflowed, the array
1779 cannot be superflat. */
1780 else if (TREE_CODE (gnu_high
) == INTEGER_CST
1781 && TREE_OVERFLOW (gnu_high
))
1783 else if (TREE_UNSIGNED (gnu_base_subtype
)
1784 || TREE_CODE (gnu_high
) == INTEGER_CST
)
1785 gnu_high
= size_binop (MAX_EXPR
, gnu_max
, gnu_high
);
1789 (sizetype
, build_binary_op (GE_EXPR
, integer_type_node
,
1793 gnu_index_type
[index
]
1794 = create_index_type (gnu_min
, gnu_high
, gnu_index_subtype
);
1796 /* Also compute the maximum size of the array. Here we
1797 see if any constraint on the index type of the base type
1798 can be used in the case of self-referential bound on
1799 the index type of the subtype. We look for a non-"infinite"
1800 and non-self-referential bound from any type involved and
1801 handle each bound separately. */
1803 if ((TREE_CODE (gnu_min
) == INTEGER_CST
1804 && ! TREE_OVERFLOW (gnu_min
)
1805 && ! operand_equal_p (gnu_min
, gnu_base_base_min
, 0))
1806 || (TREE_CODE (gnu_min
) != INTEGER_CST
1807 && ! contains_placeholder_p (gnu_min
)))
1808 gnu_base_min
= gnu_min
;
1810 if ((TREE_CODE (gnu_max
) == INTEGER_CST
1811 && ! TREE_OVERFLOW (gnu_max
)
1812 && ! operand_equal_p (gnu_max
, gnu_base_base_max
, 0))
1813 || (TREE_CODE (gnu_max
) != INTEGER_CST
1814 && ! contains_placeholder_p (gnu_max
)))
1815 gnu_base_max
= gnu_max
;
1817 if ((TREE_CODE (gnu_base_min
) == INTEGER_CST
1818 && TREE_CONSTANT_OVERFLOW (gnu_base_min
))
1819 || operand_equal_p (gnu_base_min
, gnu_base_base_min
, 0)
1820 || (TREE_CODE (gnu_base_max
) == INTEGER_CST
1821 && TREE_CONSTANT_OVERFLOW (gnu_base_max
))
1822 || operand_equal_p (gnu_base_max
, gnu_base_base_max
, 0))
1825 gnu_base_min
= size_binop (MAX_EXPR
, gnu_base_min
, gnu_min
);
1826 gnu_base_max
= size_binop (MIN_EXPR
, gnu_base_max
, gnu_max
);
1829 = size_binop (MAX_EXPR
,
1830 size_binop (PLUS_EXPR
, size_one_node
,
1831 size_binop (MINUS_EXPR
, gnu_base_max
,
1835 if (TREE_CODE (gnu_this_max
) == INTEGER_CST
1836 && TREE_CONSTANT_OVERFLOW (gnu_this_max
))
1840 = size_binop (MULT_EXPR
, gnu_max_size
, gnu_this_max
);
1842 if (! integer_onep (TYPE_MIN_VALUE (gnu_index_subtype
))
1843 || (TREE_CODE (TYPE_MAX_VALUE (gnu_index_subtype
))
1845 || TREE_CODE (gnu_index_subtype
) != INTEGER_TYPE
1846 || (TREE_TYPE (gnu_index_subtype
) != 0
1847 && (TREE_CODE (TREE_TYPE (gnu_index_subtype
))
1849 || TYPE_BIASED_REPRESENTATION_P (gnu_index_subtype
)
1850 || (TYPE_PRECISION (gnu_index_subtype
)
1851 > TYPE_PRECISION (sizetype
)))
1852 need_index_type_struct
= 1;
1855 /* Then flatten: create the array of arrays. */
1857 gnu_type
= gnat_to_gnu_type (Component_Type (gnat_entity
));
1859 /* One of the above calls might have caused us to be elaborated,
1860 so don't blow up if so. */
1861 if (present_gnu_tree (gnat_entity
))
1867 /* Get and validate any specified Component_Size, but if Packed,
1868 ignore it since the front end will have taken care of it. Also,
1869 allow sizes not a multiple of Storage_Unit if packed. */
1871 = validate_size (Component_Size (gnat_entity
), gnu_type
,
1873 (Is_Bit_Packed_Array (gnat_entity
)
1874 ? TYPE_DECL
: VAR_DECL
),
1875 1, Has_Component_Size_Clause (gnat_entity
));
1877 /* If the component type is a RECORD_TYPE that has a self-referential
1878 size, use the maxium size. */
1879 if (gnu_comp_size
== 0 && TREE_CODE (gnu_type
) == RECORD_TYPE
1880 && TREE_CODE (TYPE_SIZE (gnu_type
)) != INTEGER_CST
1881 && contains_placeholder_p (TYPE_SIZE (gnu_type
)))
1882 gnu_comp_size
= max_size (TYPE_SIZE (gnu_type
), 1);
1884 if (! Is_Bit_Packed_Array (gnat_entity
) && gnu_comp_size
!= 0)
1886 gnu_type
= make_type_from_size (gnu_type
, gnu_comp_size
, 0);
1887 gnu_type
= maybe_pad_type (gnu_type
, gnu_comp_size
, 0,
1888 gnat_entity
, "C_PAD", 0,
1892 if (Has_Volatile_Components (Base_Type (gnat_entity
)))
1893 gnu_type
= build_qualified_type (gnu_type
,
1894 (TYPE_QUALS (gnu_type
)
1895 | TYPE_QUAL_VOLATILE
));
1897 gnu_max_size_unit
= size_binop (MULT_EXPR
, gnu_max_size
,
1898 TYPE_SIZE_UNIT (gnu_type
));
1899 gnu_max_size
= size_binop (MULT_EXPR
,
1900 convert (bitsizetype
, gnu_max_size
),
1901 TYPE_SIZE (gnu_type
));
1903 /* We don't want any array types shared for two reasons: first,
1904 we want to keep differently-named types distinct; second,
1905 setting TYPE_MULTI_ARRAY_TYPE of one type can clobber
1907 debug_no_type_hash
= 1;
1908 for (index
= array_dim
- 1; index
>= 0; index
--)
1910 gnu_type
= build_array_type (gnu_type
, gnu_index_type
[index
]);
1911 TYPE_MULTI_ARRAY_P (gnu_type
) = (index
> 0);
1912 TYPE_NONALIASED_COMPONENT (gnu_type
)
1913 = ! Has_Aliased_Components (gnat_entity
);
1916 /* If we are at file level and this is a multi-dimensional array, we
1917 need to make a variable corresponding to the stride of the
1918 inner dimensions. */
1919 if (global_bindings_p () && array_dim
> 1)
1921 tree gnu_str_name
= get_identifier ("ST");
1924 for (gnu_arr_type
= TREE_TYPE (gnu_type
);
1925 TREE_CODE (gnu_arr_type
) == ARRAY_TYPE
;
1926 gnu_arr_type
= TREE_TYPE (gnu_arr_type
),
1927 gnu_str_name
= concat_id_with_name (gnu_str_name
, "ST"))
1929 TYPE_SIZE (gnu_arr_type
)
1930 = elaborate_expression_1 (gnat_entity
, gnat_entity
,
1931 TYPE_SIZE (gnu_arr_type
),
1932 gnu_str_name
, definition
, 0);
1933 TYPE_SIZE_UNIT (gnu_arr_type
)
1934 = elaborate_expression_1
1935 (gnat_entity
, gnat_entity
, TYPE_SIZE_UNIT (gnu_arr_type
),
1936 concat_id_with_name (gnu_str_name
, "U"), definition
, 0);
1940 /* If we need to write out a record type giving the names of
1941 the bounds, do it now. */
1942 if (need_index_type_struct
&& debug_info_p
)
1944 tree gnu_bound_rec_type
= make_node (RECORD_TYPE
);
1945 tree gnu_field_list
= 0;
1948 TYPE_NAME (gnu_bound_rec_type
)
1949 = create_concat_name (gnat_entity
, "XA");
1951 for (index
= array_dim
- 1; index
>= 0; index
--)
1954 = TYPE_NAME (TYPE_INDEX_TYPE (gnu_index_type
[index
]));
1956 if (TREE_CODE (gnu_type_name
) == TYPE_DECL
)
1957 gnu_type_name
= DECL_NAME (gnu_type_name
);
1959 gnu_field
= create_field_decl (gnu_type_name
,
1962 0, NULL_TREE
, NULL_TREE
, 0);
1963 TREE_CHAIN (gnu_field
) = gnu_field_list
;
1964 gnu_field_list
= gnu_field
;
1967 finish_record_type (gnu_bound_rec_type
, gnu_field_list
, 0, 0);
1970 debug_no_type_hash
= 0;
1971 TYPE_CONVENTION_FORTRAN_P (gnu_type
)
1972 = (Convention (gnat_entity
) == Convention_Fortran
);
1974 /* If our size depends on a placeholder and the maximum size doesn't
1975 overflow, use it. */
1976 if (TREE_CODE (TYPE_SIZE (gnu_type
)) != INTEGER_CST
1977 && contains_placeholder_p (TYPE_SIZE (gnu_type
))
1978 && ! (TREE_CODE (gnu_max_size
) == INTEGER_CST
1979 && TREE_OVERFLOW (gnu_max_size
))
1980 && ! (TREE_CODE (gnu_max_size_unit
) == INTEGER_CST
1981 && TREE_OVERFLOW (gnu_max_size_unit
))
1984 TYPE_SIZE (gnu_type
) = size_binop (MIN_EXPR
, gnu_max_size
,
1985 TYPE_SIZE (gnu_type
));
1986 TYPE_SIZE_UNIT (gnu_type
)
1987 = size_binop (MIN_EXPR
, gnu_max_size_unit
,
1988 TYPE_SIZE_UNIT (gnu_type
));
1991 /* Set our alias set to that of our base type. This gives all
1992 array subtypes the same alias set. */
1993 TYPE_ALIAS_SET (gnu_type
) = get_alias_set (gnu_base_type
);
1994 record_component_aliases (gnu_type
);
1997 /* If this is a packed type, make this type the same as the packed
1998 array type, but do some adjusting in the type first. */
2000 if (Present (Packed_Array_Type (gnat_entity
)))
2002 Entity_Id gnat_index
;
2003 tree gnu_inner_type
;
2005 /* First finish the type we had been making so that we output
2006 debugging information for it */
2007 gnu_type
= build_qualified_type (gnu_type
,
2008 (TYPE_QUALS (gnu_type
)
2009 | (TYPE_QUAL_VOLATILE
2010 * Is_Volatile (gnat_entity
))));
2011 set_lineno (gnat_entity
, 0);
2012 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
2013 ! Comes_From_Source (gnat_entity
),
2015 if (! Comes_From_Source (gnat_entity
))
2016 DECL_ARTIFICIAL (gnu_decl
) = 1;
2018 /* Save it as our equivalent in case the call below elaborates
2020 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
2022 gnu_decl
= gnat_to_gnu_entity (Packed_Array_Type (gnat_entity
),
2025 gnu_inner_type
= gnu_type
= TREE_TYPE (gnu_decl
);
2026 save_gnu_tree (gnat_entity
, NULL_TREE
, 0);
2028 while (TREE_CODE (gnu_inner_type
) == RECORD_TYPE
2029 && (TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_inner_type
)
2030 || TYPE_IS_PADDING_P (gnu_inner_type
)))
2031 gnu_inner_type
= TREE_TYPE (TYPE_FIELDS (gnu_inner_type
));
2033 /* We need to point the type we just made to our index type so
2034 the actual bounds can be put into a template. */
2036 if ((TREE_CODE (gnu_inner_type
) == ARRAY_TYPE
2037 && TYPE_ACTUAL_BOUNDS (gnu_inner_type
) == 0)
2038 || (TREE_CODE (gnu_inner_type
) == INTEGER_TYPE
2039 && ! TYPE_HAS_ACTUAL_BOUNDS_P (gnu_inner_type
)))
2041 if (TREE_CODE (gnu_inner_type
) == INTEGER_TYPE
)
2043 /* The TYPE_ACTUAL_BOUNDS field is also used for the modulus.
2044 If it is, we need to make another type. */
2045 if (TYPE_MODULAR_P (gnu_inner_type
))
2049 gnu_subtype
= make_node (INTEGER_TYPE
);
2051 TREE_TYPE (gnu_subtype
) = gnu_inner_type
;
2052 TYPE_MIN_VALUE (gnu_subtype
)
2053 = TYPE_MIN_VALUE (gnu_inner_type
);
2054 TYPE_MAX_VALUE (gnu_subtype
)
2055 = TYPE_MAX_VALUE (gnu_inner_type
);
2056 TYPE_PRECISION (gnu_subtype
)
2057 = TYPE_PRECISION (gnu_inner_type
);
2058 TREE_UNSIGNED (gnu_subtype
)
2059 = TREE_UNSIGNED (gnu_inner_type
);
2060 TYPE_EXTRA_SUBTYPE_P (gnu_subtype
) = 1;
2061 layout_type (gnu_subtype
);
2063 gnu_inner_type
= gnu_subtype
;
2066 TYPE_HAS_ACTUAL_BOUNDS_P (gnu_inner_type
) = 1;
2069 TYPE_ACTUAL_BOUNDS (gnu_inner_type
) = NULL_TREE
;
2071 for (gnat_index
= First_Index (gnat_entity
);
2072 Present (gnat_index
); gnat_index
= Next_Index (gnat_index
))
2073 TYPE_ACTUAL_BOUNDS (gnu_inner_type
)
2074 = tree_cons (NULL_TREE
,
2075 get_unpadded_type (Etype (gnat_index
)),
2076 TYPE_ACTUAL_BOUNDS (gnu_inner_type
));
2078 if (Convention (gnat_entity
) != Convention_Fortran
)
2079 TYPE_ACTUAL_BOUNDS (gnu_inner_type
)
2080 = nreverse (TYPE_ACTUAL_BOUNDS (gnu_inner_type
));
2082 if (TREE_CODE (gnu_type
) == RECORD_TYPE
2083 && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_type
))
2084 TREE_TYPE (TYPE_FIELDS (gnu_type
)) = gnu_inner_type
;
2088 /* Abort if packed array with no packed array type field set. */
2089 else if (Is_Packed (gnat_entity
))
2094 case E_String_Literal_Subtype
:
2095 /* Create the type for a string literal. */
2097 Entity_Id gnat_full_type
2098 = (IN (Ekind (Etype (gnat_entity
)), Private_Kind
)
2099 && Present (Full_View (Etype (gnat_entity
)))
2100 ? Full_View (Etype (gnat_entity
)) : Etype (gnat_entity
));
2101 tree gnu_string_type
= get_unpadded_type (gnat_full_type
);
2102 tree gnu_string_array_type
2103 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_string_type
))));
2104 tree gnu_string_index_type
2105 = TREE_TYPE (TYPE_INDEX_TYPE (TYPE_DOMAIN (gnu_string_array_type
)));
2106 tree gnu_lower_bound
2107 = convert (gnu_string_index_type
,
2108 gnat_to_gnu (String_Literal_Low_Bound (gnat_entity
)));
2109 int length
= UI_To_Int (String_Literal_Length (gnat_entity
));
2110 tree gnu_length
= ssize_int (length
- 1);
2111 tree gnu_upper_bound
2112 = build_binary_op (PLUS_EXPR
, gnu_string_index_type
,
2114 convert (gnu_string_index_type
, gnu_length
));
2116 = build_range_type (gnu_string_index_type
,
2117 gnu_lower_bound
, gnu_upper_bound
);
2119 = create_index_type (convert (sizetype
,
2120 TYPE_MIN_VALUE (gnu_range_type
)),
2122 TYPE_MAX_VALUE (gnu_range_type
)),
2126 = build_array_type (gnat_to_gnu_type (Component_Type (gnat_entity
)),
2131 /* Record Types and Subtypes
2133 The following fields are defined on record types:
2135 Has_Discriminants True if the record has discriminants
2136 First_Discriminant Points to head of list of discriminants
2137 First_Entity Points to head of list of fields
2138 Is_Tagged_Type True if the record is tagged
2140 Implementation of Ada records and discriminated records:
2142 A record type definition is transformed into the equivalent of a C
2143 struct definition. The fields that are the discriminants which are
2144 found in the Full_Type_Declaration node and the elements of the
2145 Component_List found in the Record_Type_Definition node. The
2146 Component_List can be a recursive structure since each Variant of
2147 the Variant_Part of the Component_List has a Component_List.
2149 Processing of a record type definition comprises starting the list of
2150 field declarations here from the discriminants and the calling the
2151 function components_to_record to add the rest of the fields from the
2152 component list and return the gnu type node. The function
2153 components_to_record will call itself recursively as it traverses
2157 if (Has_Complex_Representation (gnat_entity
))
2160 = build_complex_type
2162 (Etype (Defining_Entity
2163 (First (Component_Items
2166 (Declaration_Node (gnat_entity
)))))))));
2173 Node_Id full_definition
= Declaration_Node (gnat_entity
);
2174 Node_Id record_definition
= Type_Definition (full_definition
);
2175 Entity_Id gnat_field
;
2177 tree gnu_field_list
= NULL_TREE
;
2178 tree gnu_get_parent
;
2179 int packed
= (Is_Packed (gnat_entity
) ? 1
2180 : (Component_Alignment (gnat_entity
)
2181 == Calign_Storage_Unit
) ? -1
2183 int has_rep
= Has_Specified_Layout (gnat_entity
);
2184 int all_rep
= has_rep
;
2186 = (Is_Tagged_Type (gnat_entity
)
2187 && Nkind (record_definition
) == N_Derived_Type_Definition
);
2189 /* See if all fields have a rep clause. Stop when we find one
2191 for (gnat_field
= First_Entity (gnat_entity
);
2192 Present (gnat_field
) && all_rep
;
2193 gnat_field
= Next_Entity (gnat_field
))
2194 if ((Ekind (gnat_field
) == E_Component
2195 || Ekind (gnat_field
) == E_Discriminant
)
2196 && No (Component_Clause (gnat_field
)))
2199 /* If this is a record extension, go a level further to find the
2200 record definition. Also, verify we have a Parent_Subtype. */
2203 if (! type_annotate_only
2204 || Present (Record_Extension_Part (record_definition
)))
2205 record_definition
= Record_Extension_Part (record_definition
);
2207 if (! type_annotate_only
&& No (Parent_Subtype (gnat_entity
)))
2211 /* Make a node for the record. If we are not defining the record,
2212 suppress expanding incomplete types and save the node as the type
2213 for GNAT_ENTITY. We use the same RECORD_TYPE as was made
2214 for a dummy type and then show it's no longer a dummy. */
2215 gnu_type
= make_dummy_type (gnat_entity
);
2216 TYPE_DUMMY_P (gnu_type
) = 0;
2217 if (TREE_CODE (TYPE_NAME (gnu_type
)) == TYPE_DECL
&& debug_info_p
)
2218 DECL_IGNORED_P (TYPE_NAME (gnu_type
)) = 0;
2220 TYPE_ALIGN (gnu_type
) = 0;
2221 TYPE_PACKED (gnu_type
) = packed
!= 0 || has_rep
;
2225 defer_incomplete_level
++;
2227 set_lineno (gnat_entity
, 0);
2228 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
2229 ! Comes_From_Source (gnat_entity
),
2231 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
2232 this_made_decl
= saved
= 1;
2235 /* If both a size and rep clause was specified, put the size in
2236 the record type now so that it can get the proper mode. */
2237 if (has_rep
&& Known_Esize (gnat_entity
))
2238 TYPE_SIZE (gnu_type
) = UI_To_gnu (Esize (gnat_entity
), sizetype
);
2240 /* Always set the alignment here so that it can be used to
2241 set the mode, if it is making the alignment stricter. If
2242 it is invalid, it will be checked again below. If this is to
2243 be Atomic, choose a default alignment of a word. */
2245 if (Known_Alignment (gnat_entity
))
2246 TYPE_ALIGN (gnu_type
)
2247 = validate_alignment (Alignment (gnat_entity
), gnat_entity
, 0);
2248 else if (Is_Atomic (gnat_entity
))
2249 TYPE_ALIGN (gnu_type
) = BITS_PER_WORD
;
2251 /* If we have a Parent_Subtype, make a field for the parent. If
2252 this record has rep clauses, force the position to zero. */
2253 if (Present (Parent_Subtype (gnat_entity
)))
2257 /* A major complexity here is that the parent subtype will
2258 reference our discriminants. But those must reference
2259 the parent component of this record. So here we will
2260 initialize each of those components to a COMPONENT_REF.
2261 The first operand of that COMPONENT_REF is another
2262 COMPONENT_REF which will be filled in below, once
2263 the parent type can be safely built. */
2265 gnu_get_parent
= build (COMPONENT_REF
, void_type_node
,
2266 build (PLACEHOLDER_EXPR
, gnu_type
),
2267 build_decl (FIELD_DECL
, NULL_TREE
,
2270 if (Has_Discriminants (gnat_entity
))
2271 for (gnat_field
= First_Girder_Discriminant (gnat_entity
);
2272 Present (gnat_field
);
2273 gnat_field
= Next_Girder_Discriminant (gnat_field
))
2274 if (Present (Corresponding_Discriminant (gnat_field
)))
2277 build (COMPONENT_REF
,
2278 get_unpadded_type (Etype (gnat_field
)),
2280 gnat_to_gnu_entity (Corresponding_Discriminant
2285 gnu_parent
= gnat_to_gnu_type (Parent_Subtype (gnat_entity
));
2288 = create_field_decl (get_identifier
2289 (Get_Name_String (Name_uParent
)),
2290 gnu_parent
, gnu_type
, 0,
2291 has_rep
? TYPE_SIZE (gnu_parent
) : 0,
2292 has_rep
? bitsize_zero_node
: 0, 1);
2293 DECL_INTERNAL_P (gnu_field_list
) = 1;
2295 TREE_TYPE (gnu_get_parent
) = gnu_parent
;
2296 TREE_OPERAND (gnu_get_parent
, 1) = gnu_field_list
;
2299 /* Add the fields for the discriminants into the record. */
2300 if (! Is_Unchecked_Union (gnat_entity
)
2301 && Has_Discriminants (gnat_entity
))
2302 for (gnat_field
= First_Girder_Discriminant (gnat_entity
);
2303 Present (gnat_field
);
2304 gnat_field
= Next_Girder_Discriminant (gnat_field
))
2306 /* If this is a record extension and this discriminant
2307 is the renaming of another discriminant, we've already
2308 handled the discriminant above. */
2309 if (Present (Parent_Subtype (gnat_entity
))
2310 && Present (Corresponding_Discriminant (gnat_field
)))
2314 = gnat_to_gnu_field (gnat_field
, gnu_type
, packed
, definition
);
2316 /* Make an expression using a PLACEHOLDER_EXPR from the
2317 FIELD_DECL node just created and link that with the
2318 corresponding GNAT defining identifier. Then add to the
2320 save_gnu_tree (gnat_field
,
2321 build (COMPONENT_REF
, TREE_TYPE (gnu_field
),
2322 build (PLACEHOLDER_EXPR
,
2323 DECL_CONTEXT (gnu_field
)),
2327 TREE_CHAIN (gnu_field
) = gnu_field_list
;
2328 gnu_field_list
= gnu_field
;
2331 /* Put the discriminants into the record (backwards), so we can
2332 know the appropriate discriminant to use for the names of the
2334 TYPE_FIELDS (gnu_type
) = gnu_field_list
;
2336 /* Add the listed fields into the record and finish up. */
2337 components_to_record (gnu_type
, Component_List (record_definition
),
2338 gnu_field_list
, packed
, definition
, 0,
2341 TYPE_DUMMY_P (gnu_type
) = 0;
2342 TYPE_VOLATILE (gnu_type
) = Is_Volatile (gnat_entity
);
2343 TYPE_BY_REFERENCE_P (gnu_type
) = Is_By_Reference_Type (gnat_entity
);
2345 /* If this is an extension type, reset the tree for any
2346 inherited discriminants. Also remove the PLACEHOLDER_EXPR
2347 for non-inherited discriminants. */
2348 if (! Is_Unchecked_Union (gnat_entity
)
2349 && Has_Discriminants (gnat_entity
))
2350 for (gnat_field
= First_Girder_Discriminant (gnat_entity
);
2351 Present (gnat_field
);
2352 gnat_field
= Next_Girder_Discriminant (gnat_field
))
2354 if (Present (Parent_Subtype (gnat_entity
))
2355 && Present (Corresponding_Discriminant (gnat_field
)))
2356 save_gnu_tree (gnat_field
, NULL_TREE
, 0);
2359 gnu_field
= get_gnu_tree (gnat_field
);
2360 save_gnu_tree (gnat_field
, NULL_TREE
, 0);
2361 save_gnu_tree (gnat_field
, TREE_OPERAND (gnu_field
, 1), 0);
2365 /* If it is a tagged record force the type to BLKmode to insure
2366 that these objects will always be placed in memory. Do the
2367 same thing for limited record types. */
2369 if (Is_Tagged_Type (gnat_entity
) || Is_Limited_Record (gnat_entity
))
2370 TYPE_MODE (gnu_type
) = BLKmode
;
2372 /* Fill in locations of fields. */
2373 annotate_rep (gnat_entity
, gnu_type
);
2375 /* If there are any entities in the chain corresponding to
2376 components that we did not elaborate, ensure we elaborate their
2377 types if they are Itypes. */
2378 for (gnat_temp
= First_Entity (gnat_entity
);
2379 Present (gnat_temp
); gnat_temp
= Next_Entity (gnat_temp
))
2380 if ((Ekind (gnat_temp
) == E_Component
2381 || Ekind (gnat_temp
) == E_Discriminant
)
2382 && Is_Itype (Etype (gnat_temp
))
2383 && ! present_gnu_tree (gnat_temp
))
2384 gnat_to_gnu_entity (Etype (gnat_temp
), NULL_TREE
, 0);
2388 case E_Class_Wide_Subtype
:
2389 /* If an equivalent type is present, that is what we should use.
2390 Otherwise, fall through to handle this like a record subtype
2391 since it may have constraints. */
2393 if (Present (Equivalent_Type (gnat_entity
)))
2395 gnu_type
= gnat_to_gnu_type (Equivalent_Type (gnat_entity
));
2400 /* ... fall through ... */
2402 case E_Record_Subtype
:
2404 /* If Cloned_Subtype is Present it means this record subtype has
2405 identical layout to that type or subtype and we should use
2406 that GCC type for this one. The front end guarantees that
2407 the component list is shared. */
2408 if (Present (Cloned_Subtype (gnat_entity
)))
2410 gnu_decl
= gnat_to_gnu_entity (Cloned_Subtype (gnat_entity
),
2415 /* Otherwise, first ensure the base type is elaborated. Then, if we are
2416 changing the type, make a new type with each field having the
2417 type of the field in the new subtype but having the position
2418 computed by transforming every discriminant reference according
2419 to the constraints. We don't see any difference between
2420 private and nonprivate type here since derivations from types should
2421 have been deferred until the completion of the private type. */
2424 Entity_Id gnat_base_type
= Implementation_Base_Type (gnat_entity
);
2429 defer_incomplete_level
++, this_deferred
= 1;
2431 /* Get the base type initially for its alignment and sizes. But
2432 if it is a padded type, we do all the other work with the
2434 gnu_type
= gnu_orig_type
= gnu_base_type
2435 = gnat_to_gnu_type (gnat_base_type
);
2437 if (TREE_CODE (gnu_type
) == RECORD_TYPE
2438 && TYPE_IS_PADDING_P (gnu_type
))
2439 gnu_type
= gnu_orig_type
= TREE_TYPE (TYPE_FIELDS (gnu_type
));
2441 if (present_gnu_tree (gnat_entity
))
2447 /* When the type has discriminants, and these discriminants
2448 affect the shape of what it built, factor them in.
2450 If we are making a subtype of an Unchecked_Union (must be an
2451 Itype), just return the type.
2453 We can't just use Is_Constrained because private subtypes without
2454 discriminants of full types with discriminants with default
2455 expressions are Is_Constrained but aren't constrained! */
2457 if (IN (Ekind (gnat_base_type
), Record_Kind
)
2458 && ! Is_For_Access_Subtype (gnat_entity
)
2459 && ! Is_Unchecked_Union (gnat_base_type
)
2460 && Is_Constrained (gnat_entity
)
2461 && Girder_Constraint (gnat_entity
) != No_Elist
2462 && Present (Discriminant_Constraint (gnat_entity
)))
2464 Entity_Id gnat_field
;
2465 Entity_Id gnat_root_type
;
2466 tree gnu_field_list
= 0;
2468 = compute_field_positions (gnu_orig_type
, NULL_TREE
,
2469 size_zero_node
, bitsize_zero_node
,
2472 = substitution_list (gnat_entity
, gnat_base_type
, NULL_TREE
,
2476 /* If this is a derived type, we may be seeing fields from any
2477 original records, so add those positions and discriminant
2478 substitutions to our lists. */
2479 for (gnat_root_type
= gnat_base_type
;
2480 Underlying_Type (Etype (gnat_root_type
)) != gnat_root_type
;
2481 gnat_root_type
= Underlying_Type (Etype (gnat_root_type
)))
2484 = compute_field_positions
2485 (gnat_to_gnu_type (Etype (gnat_root_type
)),
2486 gnu_pos_list
, size_zero_node
, bitsize_zero_node
,
2489 if (Present (Parent_Subtype (gnat_root_type
)))
2491 = substitution_list (Parent_Subtype (gnat_root_type
),
2492 Empty
, gnu_subst_list
, definition
);
2495 gnu_type
= make_node (RECORD_TYPE
);
2496 TYPE_NAME (gnu_type
) = gnu_entity_id
;
2497 TYPE_STUB_DECL (gnu_type
)
2498 = pushdecl (build_decl (TYPE_DECL
, NULL_TREE
, gnu_type
));
2499 TYPE_ALIGN (gnu_type
) = TYPE_ALIGN (gnu_base_type
);
2501 for (gnat_field
= First_Entity (gnat_entity
);
2502 Present (gnat_field
); gnat_field
= Next_Entity (gnat_field
))
2503 if (Ekind (gnat_field
) == E_Component
2504 || Ekind (gnat_field
) == E_Discriminant
)
2507 = gnat_to_gnu_entity
2508 (Original_Record_Component (gnat_field
), NULL_TREE
, 0);
2510 = TREE_VALUE (purpose_member (gnu_old_field
,
2512 tree gnu_pos
= TREE_PURPOSE (gnu_offset
);
2513 tree gnu_bitpos
= TREE_VALUE (TREE_VALUE (gnu_offset
));
2515 = gnat_to_gnu_type (Etype (gnat_field
));
2516 tree gnu_size
= TYPE_SIZE (gnu_field_type
);
2517 tree gnu_new_pos
= 0;
2518 unsigned int offset_align
2519 = tree_low_cst (TREE_PURPOSE (TREE_VALUE (gnu_offset
)),
2523 /* If there was a component clause, the field types must be
2524 the same for the type and subtype, so copy the data from
2525 the old field to avoid recomputation here. */
2526 if (Present (Component_Clause
2527 (Original_Record_Component (gnat_field
))))
2529 gnu_size
= DECL_SIZE (gnu_old_field
);
2530 gnu_field_type
= TREE_TYPE (gnu_old_field
);
2533 /* If this was a bitfield, get the size from the old field.
2534 Also ensure the type can be placed into a bitfield. */
2535 else if (DECL_BIT_FIELD (gnu_old_field
))
2537 gnu_size
= DECL_SIZE (gnu_old_field
);
2538 if (TYPE_MODE (gnu_field_type
) == BLKmode
2539 && TREE_CODE (gnu_field_type
) == RECORD_TYPE
2540 && host_integerp (TYPE_SIZE (gnu_field_type
), 1))
2541 gnu_field_type
= make_packable_type (gnu_field_type
);
2544 if (TREE_CODE (gnu_pos
) != INTEGER_CST
2545 && contains_placeholder_p (gnu_pos
))
2546 for (gnu_temp
= gnu_subst_list
;
2547 gnu_temp
; gnu_temp
= TREE_CHAIN (gnu_temp
))
2548 gnu_pos
= substitute_in_expr (gnu_pos
,
2549 TREE_PURPOSE (gnu_temp
),
2550 TREE_VALUE (gnu_temp
));
2552 /* If the size is now a constant, we can set it as the
2553 size of the field when we make it. Otherwise, we need
2554 to deal with it specially. */
2555 if (TREE_CONSTANT (gnu_pos
))
2556 gnu_new_pos
= bit_from_pos (gnu_pos
, gnu_bitpos
);
2560 (DECL_NAME (gnu_old_field
), gnu_field_type
, gnu_type
,
2561 0, gnu_size
, gnu_new_pos
,
2562 ! DECL_NONADDRESSABLE_P (gnu_old_field
));
2564 if (! TREE_CONSTANT (gnu_pos
))
2566 normalize_offset (&gnu_pos
, &gnu_bitpos
, offset_align
);
2567 DECL_FIELD_OFFSET (gnu_field
) = gnu_pos
;
2568 DECL_FIELD_BIT_OFFSET (gnu_field
) = gnu_bitpos
;
2569 SET_DECL_OFFSET_ALIGN (gnu_field
, offset_align
);
2570 DECL_SIZE (gnu_field
) = gnu_size
;
2571 DECL_SIZE_UNIT (gnu_field
)
2572 = convert (sizetype
,
2573 size_binop (CEIL_DIV_EXPR
, gnu_size
,
2574 bitsize_unit_node
));
2575 layout_decl (gnu_field
, DECL_OFFSET_ALIGN (gnu_field
));
2578 DECL_INTERNAL_P (gnu_field
)
2579 = DECL_INTERNAL_P (gnu_old_field
);
2580 DECL_ORIGINAL_FIELD (gnu_field
)
2581 = DECL_ORIGINAL_FIELD (gnu_old_field
) != 0
2582 ? DECL_ORIGINAL_FIELD (gnu_old_field
) : gnu_old_field
;
2583 DECL_DISCRIMINANT_NUMBER (gnu_field
)
2584 = DECL_DISCRIMINANT_NUMBER (gnu_old_field
);
2585 TREE_THIS_VOLATILE (gnu_field
)
2586 = TREE_THIS_VOLATILE (gnu_old_field
);
2587 TREE_CHAIN (gnu_field
) = gnu_field_list
;
2588 gnu_field_list
= gnu_field
;
2589 save_gnu_tree (gnat_field
, gnu_field
, 0);
2592 finish_record_type (gnu_type
, nreverse (gnu_field_list
), 1, 0);
2594 /* Now set the size, alignment and alias set of the new type to
2595 match that of the old one, doing any substitutions, as
2597 TYPE_ALIAS_SET (gnu_type
) = get_alias_set (gnu_base_type
);
2598 TYPE_ALIGN (gnu_type
) = TYPE_ALIGN (gnu_base_type
);
2599 TYPE_SIZE (gnu_type
) = TYPE_SIZE (gnu_base_type
);
2600 TYPE_SIZE_UNIT (gnu_type
) = TYPE_SIZE_UNIT (gnu_base_type
);
2601 TYPE_ADA_SIZE (gnu_type
) = TYPE_ADA_SIZE (gnu_base_type
);
2603 if (TREE_CODE (TYPE_SIZE (gnu_type
)) != INTEGER_CST
2604 && contains_placeholder_p (TYPE_SIZE (gnu_type
)))
2605 for (gnu_temp
= gnu_subst_list
;
2606 gnu_temp
; gnu_temp
= TREE_CHAIN (gnu_temp
))
2607 TYPE_SIZE (gnu_type
)
2608 = substitute_in_expr (TYPE_SIZE (gnu_type
),
2609 TREE_PURPOSE (gnu_temp
),
2610 TREE_VALUE (gnu_temp
));
2612 if (TREE_CODE (TYPE_SIZE_UNIT (gnu_type
)) != INTEGER_CST
2613 && contains_placeholder_p (TYPE_SIZE_UNIT (gnu_type
)))
2614 for (gnu_temp
= gnu_subst_list
;
2615 gnu_temp
; gnu_temp
= TREE_CHAIN (gnu_temp
))
2616 TYPE_SIZE_UNIT (gnu_type
)
2617 = substitute_in_expr (TYPE_SIZE_UNIT (gnu_type
),
2618 TREE_PURPOSE (gnu_temp
),
2619 TREE_VALUE (gnu_temp
));
2621 if (TYPE_ADA_SIZE (gnu_type
) != 0
2622 && TREE_CODE (TYPE_ADA_SIZE (gnu_type
)) != INTEGER_CST
2623 && contains_placeholder_p (TYPE_ADA_SIZE (gnu_type
)))
2624 for (gnu_temp
= gnu_subst_list
;
2625 gnu_temp
; gnu_temp
= TREE_CHAIN (gnu_temp
))
2626 TYPE_ADA_SIZE (gnu_type
)
2627 = substitute_in_expr (TYPE_ADA_SIZE (gnu_type
),
2628 TREE_PURPOSE (gnu_temp
),
2629 TREE_VALUE (gnu_temp
));
2631 /* Recompute the mode of this record type now that we know its
2633 compute_record_mode (gnu_type
);
2635 /* Fill in locations of fields. */
2636 annotate_rep (gnat_entity
, gnu_type
);
2639 /* If we've made a new type, record it and make an XVS type to show
2640 what this is a subtype of. Some debuggers require the XVS
2641 type to be output first, so do it in that order. */
2642 if (gnu_type
!= gnu_orig_type
)
2646 tree gnu_subtype_marker
= make_node (RECORD_TYPE
);
2647 tree gnu_orig_name
= TYPE_NAME (gnu_orig_type
);
2649 if (TREE_CODE (gnu_orig_name
) == TYPE_DECL
)
2650 gnu_orig_name
= DECL_NAME (gnu_orig_name
);
2652 TYPE_NAME (gnu_subtype_marker
)
2653 = create_concat_name (gnat_entity
, "XVS");
2654 finish_record_type (gnu_subtype_marker
,
2655 create_field_decl (gnu_orig_name
,
2663 TYPE_VOLATILE (gnu_type
) = Is_Volatile (gnat_entity
);
2664 TYPE_NAME (gnu_type
) = gnu_entity_id
;
2665 TYPE_STUB_DECL (gnu_type
)
2666 = pushdecl (build_decl (TYPE_DECL
, TYPE_NAME (gnu_type
),
2668 DECL_ARTIFICIAL (TYPE_STUB_DECL (gnu_type
)) = 1;
2669 DECL_IGNORED_P (TYPE_STUB_DECL (gnu_type
)) = ! debug_info_p
;
2670 rest_of_type_compilation (gnu_type
, global_bindings_p ());
2673 /* Otherwise, go down all the components in the new type and
2674 make them equivalent to those in the base type. */
2676 for (gnat_temp
= First_Entity (gnat_entity
); Present (gnat_temp
);
2677 gnat_temp
= Next_Entity (gnat_temp
))
2678 if ((Ekind (gnat_temp
) == E_Discriminant
2679 && ! Is_Unchecked_Union (gnat_base_type
))
2680 || Ekind (gnat_temp
) == E_Component
)
2681 save_gnu_tree (gnat_temp
,
2683 (Original_Record_Component (gnat_temp
)), 0);
2687 case E_Access_Subprogram_Type
:
2688 /* If we are not defining this entity, and we have incomplete
2689 entities being processed above us, make a dummy type and
2690 fill it in later. */
2691 if (! definition
&& defer_incomplete_level
!= 0)
2693 struct incomplete
*p
2694 = (struct incomplete
*) xmalloc (sizeof (struct incomplete
));
2697 = build_pointer_type
2698 (make_dummy_type (Directly_Designated_Type (gnat_entity
)));
2699 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
2700 ! Comes_From_Source (gnat_entity
),
2702 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
2703 this_made_decl
= saved
= 1;
2705 p
->old_type
= TREE_TYPE (gnu_type
);
2706 p
->full_type
= Directly_Designated_Type (gnat_entity
);
2707 p
->next
= defer_incomplete_list
;
2708 defer_incomplete_list
= p
;
2712 /* ... fall through ... */
2714 case E_Allocator_Type
:
2716 case E_Access_Attribute_Type
:
2717 case E_Anonymous_Access_Type
:
2718 case E_General_Access_Type
:
2720 Entity_Id gnat_desig_type
= Directly_Designated_Type (gnat_entity
);
2721 Entity_Id gnat_desig_full
2722 = ((IN (Ekind (Etype (gnat_desig_type
)),
2723 Incomplete_Or_Private_Kind
))
2724 ? Full_View (gnat_desig_type
) : 0);
2725 /* We want to know if we'll be seeing the freeze node for any
2726 incomplete type we may be pointing to. */
2728 = (Present (gnat_desig_full
)
2729 ? In_Extended_Main_Code_Unit (gnat_desig_full
)
2730 : In_Extended_Main_Code_Unit (gnat_desig_type
));
2733 tree gnu_desig_type
= 0;
2735 if (No (gnat_desig_full
)
2736 && (Ekind (gnat_desig_type
) == E_Class_Wide_Type
2737 || (Ekind (gnat_desig_type
) == E_Class_Wide_Subtype
2738 && Present (Equivalent_Type (gnat_desig_type
)))))
2740 if (Present (Equivalent_Type (gnat_desig_type
)))
2742 gnat_desig_full
= Equivalent_Type (gnat_desig_type
);
2743 if (IN (Ekind (gnat_desig_full
), Incomplete_Or_Private_Kind
))
2744 gnat_desig_full
= Full_View (gnat_desig_full
);
2746 else if (IN (Ekind (Root_Type (gnat_desig_type
)),
2747 Incomplete_Or_Private_Kind
))
2748 gnat_desig_full
= Full_View (Root_Type (gnat_desig_type
));
2751 if (Present (gnat_desig_full
) && Is_Concurrent_Type (gnat_desig_full
))
2752 gnat_desig_full
= Corresponding_Record_Type (gnat_desig_full
);
2754 /* If either the designated type or its full view is an
2755 unconstrained array subtype, replace it with the type it's a
2756 subtype of. This avoids problems with multiple copies of
2757 unconstrained array types. */
2758 if (Ekind (gnat_desig_type
) == E_Array_Subtype
2759 && ! Is_Constrained (gnat_desig_type
))
2760 gnat_desig_type
= Etype (gnat_desig_type
);
2761 if (Present (gnat_desig_full
)
2762 && Ekind (gnat_desig_full
) == E_Array_Subtype
2763 && ! Is_Constrained (gnat_desig_full
))
2764 gnat_desig_full
= Etype (gnat_desig_full
);
2766 /* If the designated type is a subtype of an incomplete record type,
2767 use the parent type to avoid order of elaboration issues. This
2768 can lose some code efficiency, but there is no alternative. */
2769 if (Present (gnat_desig_full
)
2770 && Ekind (gnat_desig_full
) == E_Record_Subtype
2771 && Ekind (Etype (gnat_desig_full
)) == E_Record_Type
)
2772 gnat_desig_full
= Etype (gnat_desig_full
);
2774 /* If we are pointing to an incomplete type whose completion is an
2775 unconstrained array, make a fat pointer type instead of a pointer
2776 to VOID. The two types in our fields will be pointers to VOID and
2777 will be replaced in update_pointer_to. Similiarly, if the type
2778 itself is a dummy type or an unconstrained array. Also make
2779 a dummy TYPE_OBJECT_RECORD_TYPE in case we have any thin
2782 if ((Present (gnat_desig_full
)
2783 && Is_Array_Type (gnat_desig_full
)
2784 && ! Is_Constrained (gnat_desig_full
))
2785 || (present_gnu_tree (gnat_desig_type
)
2786 && TYPE_IS_DUMMY_P (TREE_TYPE
2787 (get_gnu_tree (gnat_desig_type
)))
2788 && Is_Array_Type (gnat_desig_type
)
2789 && ! Is_Constrained (gnat_desig_type
))
2790 || (present_gnu_tree (gnat_desig_type
)
2791 && (TREE_CODE (TREE_TYPE (get_gnu_tree (gnat_desig_type
)))
2792 == UNCONSTRAINED_ARRAY_TYPE
)
2793 && (TYPE_POINTER_TO (TREE_TYPE
2794 (get_gnu_tree (gnat_desig_type
)))
2796 || (No (gnat_desig_full
) && ! in_main_unit
2797 && defer_incomplete_level
!= 0
2798 && ! present_gnu_tree (gnat_desig_type
)
2799 && Is_Array_Type (gnat_desig_type
)
2800 && ! Is_Constrained (gnat_desig_type
)))
2803 = (present_gnu_tree (gnat_desig_type
)
2804 ? gnat_to_gnu_type (gnat_desig_type
)
2805 : make_dummy_type (gnat_desig_type
));
2808 /* Show the dummy we get will be a fat pointer. */
2809 got_fat_p
= made_dummy
= 1;
2811 /* If the call above got something that has a pointer, that
2812 pointer is our type. This could have happened either
2813 because the type was elaborated or because somebody
2814 else executed the code below. */
2815 gnu_type
= TYPE_POINTER_TO (gnu_old
);
2818 gnu_type
= make_node (RECORD_TYPE
);
2819 TYPE_UNCONSTRAINED_ARRAY (gnu_type
) = gnu_old
;
2820 TYPE_POINTER_TO (gnu_old
) = gnu_type
;
2822 set_lineno (gnat_entity
, 0);
2824 = chainon (chainon (NULL_TREE
,
2826 (get_identifier ("P_ARRAY"),
2827 ptr_void_type_node
, gnu_type
,
2829 create_field_decl (get_identifier ("P_BOUNDS"),
2831 gnu_type
, 0, 0, 0, 0));
2833 /* Make sure we can place this into a register. */
2834 TYPE_ALIGN (gnu_type
)
2835 = MIN (BIGGEST_ALIGNMENT
, 2 * POINTER_SIZE
);
2836 TYPE_IS_FAT_POINTER_P (gnu_type
) = 1;
2837 finish_record_type (gnu_type
, fields
, 0, 1);
2839 TYPE_OBJECT_RECORD_TYPE (gnu_old
) = make_node (RECORD_TYPE
);
2840 TYPE_NAME (TYPE_OBJECT_RECORD_TYPE (gnu_old
))
2841 = concat_id_with_name (get_entity_name (gnat_desig_type
),
2843 TYPE_DUMMY_P (TYPE_OBJECT_RECORD_TYPE (gnu_old
)) = 1;
2847 /* If we already know what the full type is, use it. */
2848 else if (Present (gnat_desig_full
)
2849 && present_gnu_tree (gnat_desig_full
))
2850 gnu_desig_type
= TREE_TYPE (get_gnu_tree (gnat_desig_full
));
2852 /* Get the type of the thing we are to point to and build a pointer
2853 to it. If it is a reference to an incomplete or private type with a
2854 full view that is a record, make a dummy type node and get the
2855 actual type later when we have verified it is safe. */
2856 else if (! in_main_unit
2857 && ! present_gnu_tree (gnat_desig_type
)
2858 && Present (gnat_desig_full
)
2859 && ! present_gnu_tree (gnat_desig_full
)
2860 && Is_Record_Type (gnat_desig_full
))
2862 gnu_desig_type
= make_dummy_type (gnat_desig_type
);
2866 /* Likewise if we are pointing to a record or array and we are to defer
2867 elaborating incomplete types. We do this since this access type
2868 may be the full view of some private type. Note that the
2869 unconstrained array case is handled above. */
2870 else if ((! in_main_unit
|| imported_p
) && defer_incomplete_level
!= 0
2871 && ! present_gnu_tree (gnat_desig_type
)
2872 && ((Is_Record_Type (gnat_desig_type
)
2873 || Is_Array_Type (gnat_desig_type
))
2874 || (Present (gnat_desig_full
)
2875 && (Is_Record_Type (gnat_desig_full
)
2876 || Is_Array_Type (gnat_desig_full
)))))
2878 gnu_desig_type
= make_dummy_type (gnat_desig_type
);
2881 else if (gnat_desig_type
== gnat_entity
)
2883 gnu_type
= build_pointer_type (make_node (VOID_TYPE
));
2884 TREE_TYPE (gnu_type
) = TYPE_POINTER_TO (gnu_type
) = gnu_type
;
2887 gnu_desig_type
= gnat_to_gnu_type (gnat_desig_type
);
2889 /* It is possible that the above call to gnat_to_gnu_type resolved our
2890 type. If so, just return it. */
2891 if (present_gnu_tree (gnat_entity
))
2897 /* If we have a GCC type for the designated type, possibly
2898 modify it if we are pointing only to constant objects and then
2899 make a pointer to it. Don't do this for unconstrained arrays. */
2900 if (gnu_type
== 0 && gnu_desig_type
!= 0)
2902 if (Is_Access_Constant (gnat_entity
)
2903 && TREE_CODE (gnu_desig_type
) != UNCONSTRAINED_ARRAY_TYPE
)
2905 = build_qualified_type (gnu_desig_type
,
2906 (TYPE_QUALS (gnu_desig_type
)
2907 | TYPE_QUAL_CONST
));
2909 gnu_type
= build_pointer_type (gnu_desig_type
);
2912 /* If we are not defining this object and we made a dummy pointer,
2913 save our current definition, evaluate the actual type, and replace
2914 the tentative type we made with the actual one. If we are to defer
2915 actually looking up the actual type, make an entry in the
2918 if (! in_main_unit
&& made_dummy
)
2921 = TYPE_FAT_POINTER_P (gnu_type
)
2922 ? TYPE_UNCONSTRAINED_ARRAY (gnu_type
) : TREE_TYPE (gnu_type
);
2924 if (esize
== POINTER_SIZE
2925 && (got_fat_p
|| TYPE_FAT_POINTER_P (gnu_type
)))
2927 = build_pointer_type
2928 (TYPE_OBJECT_RECORD_TYPE
2929 (TYPE_UNCONSTRAINED_ARRAY (gnu_type
)));
2931 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
2932 ! Comes_From_Source (gnat_entity
),
2934 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
2935 this_made_decl
= saved
= 1;
2937 if (defer_incomplete_level
== 0)
2938 update_pointer_to (TYPE_MAIN_VARIANT (gnu_old_type
),
2939 gnat_to_gnu_type (gnat_desig_type
));
2942 struct incomplete
*p
2943 = (struct incomplete
*) xmalloc (sizeof (struct incomplete
));
2945 p
->old_type
= gnu_old_type
;
2946 p
->full_type
= gnat_desig_type
;
2947 p
->next
= defer_incomplete_list
;
2948 defer_incomplete_list
= p
;
2954 case E_Access_Protected_Subprogram_Type
:
2955 if (type_annotate_only
&& No (Equivalent_Type (gnat_entity
)))
2956 gnu_type
= build_pointer_type (void_type_node
);
2958 /* The runtime representation is the equivalent type. */
2959 gnu_type
= gnat_to_gnu_type (Equivalent_Type (gnat_entity
));
2961 if (Is_Itype (Directly_Designated_Type (gnat_entity
))
2962 && ! present_gnu_tree (Directly_Designated_Type (gnat_entity
))
2963 && No (Freeze_Node (Directly_Designated_Type (gnat_entity
)))
2964 && ! Is_Record_Type (Scope (Directly_Designated_Type (gnat_entity
))))
2965 gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity
),
2970 case E_Access_Subtype
:
2972 /* We treat this as identical to its base type; any constraint is
2973 meaningful only to the front end.
2975 The designated type must be elaborated as well, if it does
2976 not have its own freeze node. Designated (sub)types created
2977 for constrained components of records with discriminants are
2978 not frozen by the front end and thus not elaborated by gigi,
2979 because their use may appear before the base type is frozen,
2980 and because it is not clear that they are needed anywhere in
2981 Gigi. With the current model, there is no correct place where
2982 they could be elaborated. */
2984 gnu_type
= gnat_to_gnu_type (Etype (gnat_entity
));
2985 if (Is_Itype (Directly_Designated_Type (gnat_entity
))
2986 && ! present_gnu_tree (Directly_Designated_Type (gnat_entity
))
2987 && Is_Frozen (Directly_Designated_Type (gnat_entity
))
2988 && No (Freeze_Node (Directly_Designated_Type (gnat_entity
))))
2990 /* If we are not defining this entity, and we have incomplete
2991 entities being processed above us, make a dummy type and
2992 elaborate it later. */
2993 if (! definition
&& defer_incomplete_level
!= 0)
2995 struct incomplete
*p
2996 = (struct incomplete
*) xmalloc (sizeof (struct incomplete
));
2998 = build_pointer_type
2999 (make_dummy_type (Directly_Designated_Type (gnat_entity
)));
3001 p
->old_type
= TREE_TYPE (gnu_ptr_type
);
3002 p
->full_type
= Directly_Designated_Type (gnat_entity
);
3003 p
->next
= defer_incomplete_list
;
3004 defer_incomplete_list
= p
;
3007 gnat_to_gnu_entity (Directly_Designated_Type (gnat_entity
),
3014 /* Subprogram Entities
3016 The following access functions are defined for subprograms (functions
3019 First_Formal The first formal parameter.
3020 Is_Imported Indicates that the subprogram has appeared in
3021 an INTERFACE or IMPORT pragma. For now we
3022 assume that the external language is C.
3023 Is_Inlined True if the subprogram is to be inlined.
3025 In addition for function subprograms we have:
3027 Etype Return type of the function.
3029 Each parameter is first checked by calling must_pass_by_ref on its
3030 type to determine if it is passed by reference. For parameters which
3031 are copied in, if they are Ada IN OUT or OUT parameters, their return
3032 value becomes part of a record which becomes the return type of the
3033 function (C function - note that this applies only to Ada procedures
3034 so there is no Ada return type). Additional code to store back the
3035 parameters will be generated on the caller side. This transformation
3036 is done here, not in the front-end.
3038 The intended result of the transformation can be seen from the
3039 equivalent source rewritings that follow:
3041 struct temp {int a,b};
3042 procedure P (A,B: IN OUT ...) is temp P (int A,B) {
3044 end P; return {A,B};
3054 For subprogram types we need to perform mainly the same conversions to
3055 GCC form that are needed for procedures and function declarations. The
3056 only difference is that at the end, we make a type declaration instead
3057 of a function declaration. */
3059 case E_Subprogram_Type
:
3063 /* The first GCC parameter declaration (a PARM_DECL node). The
3064 PARM_DECL nodes are chained through the TREE_CHAIN field, so this
3065 actually is the head of this parameter list. */
3066 tree gnu_param_list
= NULL_TREE
;
3067 /* The type returned by a function. If the subprogram is a procedure
3068 this type should be void_type_node. */
3069 tree gnu_return_type
= void_type_node
;
3070 /* List of fields in return type of procedure with copy in copy out
3072 tree gnu_field_list
= NULL_TREE
;
3073 /* Non-null for subprograms containing parameters passed by copy in
3074 copy out (Ada IN OUT or OUT parameters not passed by reference),
3075 in which case it is the list of nodes used to specify the values of
3076 the in out/out parameters that are returned as a record upon
3077 procedure return. The TREE_PURPOSE of an element of this list is
3078 a field of the record and the TREE_VALUE is the PARM_DECL
3079 corresponding to that field. This list will be saved in the
3080 TYPE_CI_CO_LIST field of the FUNCTION_TYPE node we create. */
3081 tree gnu_return_list
= NULL_TREE
;
3082 Entity_Id gnat_param
;
3083 int inline_flag
= Is_Inlined (gnat_entity
);
3084 int public_flag
= Is_Public (gnat_entity
);
3086 = (Is_Public (gnat_entity
) && !definition
) || imported_p
;
3087 int pure_flag
= Is_Pure (gnat_entity
);
3088 int volatile_flag
= No_Return (gnat_entity
);
3089 int returns_by_ref
= 0;
3090 int returns_unconstrained
= 0;
3091 tree gnu_ext_name
= NULL_TREE
;
3092 int has_copy_in_out
= 0;
3095 if (kind
== E_Subprogram_Type
&& ! definition
)
3096 /* A parameter may refer to this type, so defer completion
3097 of any incomplete types. */
3098 defer_incomplete_level
++, this_deferred
= 1;
3100 /* If the subprogram has an alias, it is probably inherited, so
3101 we can use the original one. If the original "subprogram"
3102 is actually an enumeration literal, it may be the first use
3103 of its type, so we must elaborate that type now. */
3104 if (Present (Alias (gnat_entity
)))
3106 if (Ekind (Alias (gnat_entity
)) == E_Enumeration_Literal
)
3107 gnat_to_gnu_entity (Etype (Alias (gnat_entity
)), NULL_TREE
, 0);
3109 gnu_decl
= gnat_to_gnu_entity (Alias (gnat_entity
),
3112 /* Elaborate any Itypes in the parameters of this entity. */
3113 for (gnat_temp
= First_Formal (gnat_entity
);
3114 Present (gnat_temp
);
3115 gnat_temp
= Next_Formal_With_Extras (gnat_temp
))
3116 if (Is_Itype (Etype (gnat_temp
)))
3117 gnat_to_gnu_entity (Etype (gnat_temp
), NULL_TREE
, 0);
3122 if (kind
== E_Function
|| kind
== E_Subprogram_Type
)
3123 gnu_return_type
= gnat_to_gnu_type (Etype (gnat_entity
));
3125 /* If this function returns by reference, make the actual
3126 return type of this function the pointer and mark the decl. */
3127 if (Returns_By_Ref (gnat_entity
))
3131 gnu_return_type
= build_pointer_type (gnu_return_type
);
3134 /* If we are supposed to return an unconstrained array,
3135 actually return a fat pointer and make a note of that. Return
3136 a pointer to an unconstrained record of variable size. */
3137 else if (TREE_CODE (gnu_return_type
) == UNCONSTRAINED_ARRAY_TYPE
)
3139 gnu_return_type
= TREE_TYPE (gnu_return_type
);
3140 returns_unconstrained
= 1;
3143 /* If the type requires a transient scope, the result is allocated
3144 on the secondary stack, so the result type of the function is
3146 else if (Requires_Transient_Scope (Etype (gnat_entity
)))
3148 gnu_return_type
= build_pointer_type (gnu_return_type
);
3149 returns_unconstrained
= 1;
3152 /* If the type is a padded type and the underlying type would not
3153 be passed by reference or this function has a foreign convention,
3154 return the underlying type. */
3155 else if (TREE_CODE (gnu_return_type
) == RECORD_TYPE
3156 && TYPE_IS_PADDING_P (gnu_return_type
)
3157 && (! default_pass_by_ref (TREE_TYPE
3158 (TYPE_FIELDS (gnu_return_type
)))
3159 || Has_Foreign_Convention (gnat_entity
)))
3160 gnu_return_type
= TREE_TYPE (TYPE_FIELDS (gnu_return_type
));
3162 /* Look at all our parameters and get the type of
3163 each. While doing this, build a copy-out structure if
3166 for (gnat_param
= First_Formal (gnat_entity
), parmnum
= 0;
3167 Present (gnat_param
);
3168 gnat_param
= Next_Formal_With_Extras (gnat_param
), parmnum
++)
3170 tree gnu_param_name
= get_entity_name (gnat_param
);
3171 tree gnu_param_type
= gnat_to_gnu_type (Etype (gnat_param
));
3172 tree gnu_param
, gnu_field
;
3175 int by_component_ptr_p
= 0;
3176 int copy_in_copy_out_flag
= 0;
3177 int req_by_copy
= 0, req_by_ref
= 0;
3179 /* See if a Mechanism was supplied that forced this
3180 parameter to be passed one way or another. */
3181 if (Is_Valued_Procedure (gnat_entity
) && parmnum
== 0)
3183 else if (Mechanism (gnat_param
) == Default
)
3185 else if (Mechanism (gnat_param
) == By_Copy
)
3187 else if (Mechanism (gnat_param
) == By_Reference
)
3189 else if (Mechanism (gnat_param
) <= By_Descriptor
)
3191 else if (Mechanism (gnat_param
) > 0)
3193 if (TREE_CODE (gnu_param_type
) == UNCONSTRAINED_ARRAY_TYPE
3194 || TREE_CODE (TYPE_SIZE (gnu_param_type
)) != INTEGER_CST
3195 || 0 < compare_tree_int (TYPE_SIZE (gnu_param_type
),
3196 Mechanism (gnat_param
)))
3202 post_error ("unsupported mechanism for&", gnat_param
);
3204 /* If this is either a foreign function or if the
3205 underlying type won't be passed by refererence, strip off
3206 possible padding type. */
3207 if (TREE_CODE (gnu_param_type
) == RECORD_TYPE
3208 && TYPE_IS_PADDING_P (gnu_param_type
)
3209 && (req_by_ref
|| Has_Foreign_Convention (gnat_entity
)
3210 || ! must_pass_by_ref (TREE_TYPE (TYPE_FIELDS
3211 (gnu_param_type
)))))
3212 gnu_param_type
= TREE_TYPE (TYPE_FIELDS (gnu_param_type
));
3214 /* If this is an IN parameter it is read-only, so make a variant
3215 of the type that is read-only.
3217 ??? However, if this is an unconstrained array, that type can
3218 be very complex. So skip it for now. Likewise for any other
3219 self-referential type. */
3220 if (Ekind (gnat_param
) == E_In_Parameter
3221 && TREE_CODE (gnu_param_type
) != UNCONSTRAINED_ARRAY_TYPE
3222 && ! (TYPE_SIZE (gnu_param_type
) != 0
3223 && TREE_CODE (TYPE_SIZE (gnu_param_type
)) != INTEGER_CST
3224 && contains_placeholder_p (TYPE_SIZE (gnu_param_type
))))
3226 = build_qualified_type (gnu_param_type
,
3227 (TYPE_QUALS (gnu_param_type
)
3228 | TYPE_QUAL_CONST
));
3230 /* For foreign conventions, pass arrays as a pointer to the
3231 underlying type. First check for unconstrained array and get
3232 the underlying array. Then get the component type and build
3234 if (Has_Foreign_Convention (gnat_entity
)
3235 && TREE_CODE (gnu_param_type
) == UNCONSTRAINED_ARRAY_TYPE
)
3237 = TREE_TYPE (TREE_TYPE (TYPE_FIELDS
3238 (TREE_TYPE (gnu_param_type
))));
3242 = build_pointer_type
3243 (build_vms_descriptor (gnu_param_type
,
3244 Mechanism (gnat_param
),
3247 else if (Has_Foreign_Convention (gnat_entity
)
3249 && TREE_CODE (gnu_param_type
) == ARRAY_TYPE
)
3251 /* Strip off any multi-dimensional entries, then strip
3252 off the last array to get the component type. */
3253 while (TREE_CODE (TREE_TYPE (gnu_param_type
)) == ARRAY_TYPE
3254 && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_param_type
)))
3255 gnu_param_type
= TREE_TYPE (gnu_param_type
);
3257 by_component_ptr_p
= 1;
3258 gnu_param_type
= TREE_TYPE (gnu_param_type
);
3260 if (Ekind (gnat_param
) == E_In_Parameter
)
3262 = build_qualified_type (gnu_param_type
,
3263 (TYPE_QUALS (gnu_param_type
)
3264 | TYPE_QUAL_CONST
));
3266 gnu_param_type
= build_pointer_type (gnu_param_type
);
3269 /* Fat pointers are passed as thin pointers for foreign
3271 else if (Has_Foreign_Convention (gnat_entity
)
3272 && TYPE_FAT_POINTER_P (gnu_param_type
))
3274 = make_type_from_size (gnu_param_type
,
3275 size_int (POINTER_SIZE
), 0);
3277 /* If we must pass or were requested to pass by reference, do so.
3278 If we were requested to pass by copy, do so.
3279 Otherwise, for foreign conventions, pass all in out parameters
3280 or aggregates by reference. For COBOL and Fortran, pass
3281 all integer and FP types that way too. For Convention Ada,
3282 use the standard Ada default. */
3283 else if (must_pass_by_ref (gnu_param_type
) || req_by_ref
3285 && ((Has_Foreign_Convention (gnat_entity
)
3286 && (Ekind (gnat_param
) != E_In_Parameter
3287 || AGGREGATE_TYPE_P (gnu_param_type
)))
3288 || (((Convention (gnat_entity
)
3289 == Convention_Fortran
)
3290 || (Convention (gnat_entity
)
3291 == Convention_COBOL
))
3292 && (INTEGRAL_TYPE_P (gnu_param_type
)
3293 || FLOAT_TYPE_P (gnu_param_type
)))
3294 /* For convention Ada, see if we pass by reference
3296 || (! Has_Foreign_Convention (gnat_entity
)
3297 && default_pass_by_ref (gnu_param_type
)))))
3299 gnu_param_type
= build_reference_type (gnu_param_type
);
3303 else if (Ekind (gnat_param
) != E_In_Parameter
)
3304 copy_in_copy_out_flag
= 1;
3306 if (req_by_copy
&& (by_ref_p
|| by_component_ptr_p
))
3307 post_error ("?cannot pass & by copy", gnat_param
);
3309 /* If this is an OUT parameter that isn't passed by reference
3310 and isn't a pointer or aggregate, we don't make a PARM_DECL
3311 for it. Instead, it will be a VAR_DECL created when we process
3312 the procedure. For the special parameter of Valued_Procedure,
3313 never pass it in. */
3314 if (Ekind (gnat_param
) == E_Out_Parameter
&& ! by_ref_p
3315 && ((Is_Valued_Procedure (gnat_entity
) && parmnum
== 0)
3317 && ! POINTER_TYPE_P (gnu_param_type
)
3318 && ! AGGREGATE_TYPE_P (gnu_param_type
))))
3322 set_lineno (gnat_param
, 0);
3325 (gnu_param_name
, gnu_param_type
,
3326 by_ref_p
|| by_component_ptr_p
3327 || Ekind (gnat_param
) == E_In_Parameter
);
3329 DECL_BY_REF_P (gnu_param
) = by_ref_p
;
3330 DECL_BY_COMPONENT_PTR_P (gnu_param
) = by_component_ptr_p
;
3331 DECL_BY_DESCRIPTOR_P (gnu_param
) = by_descr_p
;
3332 DECL_POINTS_TO_READONLY_P (gnu_param
)
3333 = (Ekind (gnat_param
) == E_In_Parameter
3334 && (by_ref_p
|| by_component_ptr_p
));
3335 save_gnu_tree (gnat_param
, gnu_param
, 0);
3336 gnu_param_list
= chainon (gnu_param
, gnu_param_list
);
3338 /* If a parameter is a pointer, this function may modify
3339 memory through it and thus shouldn't be considered
3340 a pure function. Also, the memory may be modified
3341 between two calls, so they can't be CSE'ed. The latter
3342 case also handles by-ref parameters. */
3343 if (POINTER_TYPE_P (gnu_param_type
)
3344 || TYPE_FAT_POINTER_P (gnu_param_type
))
3348 if (copy_in_copy_out_flag
)
3350 if (! has_copy_in_out
)
3352 if (TREE_CODE (gnu_return_type
) != VOID_TYPE
)
3355 gnu_return_type
= make_node (RECORD_TYPE
);
3356 TYPE_NAME (gnu_return_type
) = get_identifier ("RETURN");
3357 has_copy_in_out
= 1;
3360 set_lineno (gnat_param
, 0);
3361 gnu_field
= create_field_decl (gnu_param_name
, gnu_param_type
,
3362 gnu_return_type
, 0, 0, 0, 0);
3363 TREE_CHAIN (gnu_field
) = gnu_field_list
;
3364 gnu_field_list
= gnu_field
;
3365 gnu_return_list
= tree_cons (gnu_field
, gnu_param
,
3370 /* Do not compute record for out parameters if subprogram is
3371 stubbed since structures are incomplete for the back-end. */
3372 if (gnu_field_list
!= 0
3373 && Convention (gnat_entity
) != Convention_Stubbed
)
3374 finish_record_type (gnu_return_type
, nreverse (gnu_field_list
),
3377 /* If we have a CICO list but it has only one entry, we convert
3378 this function into a function that simply returns that one
3380 if (list_length (gnu_return_list
) == 1)
3381 gnu_return_type
= TREE_TYPE (TREE_PURPOSE (gnu_return_list
));
3383 if (Convention (gnat_entity
) == Convention_Stdcall
)
3386 = (struct attrib
*) xmalloc (sizeof (struct attrib
));
3388 attr
->next
= attr_list
;
3389 attr
->type
= ATTR_MACHINE_ATTRIBUTE
;
3390 attr
->name
= get_identifier ("stdcall");
3391 attr
->arg
= NULL_TREE
;
3392 attr
->error_point
= gnat_entity
;
3396 /* Both lists ware built in reverse. */
3397 gnu_param_list
= nreverse (gnu_param_list
);
3398 gnu_return_list
= nreverse (gnu_return_list
);
3401 = create_subprog_type (gnu_return_type
, gnu_param_list
,
3402 gnu_return_list
, returns_unconstrained
,
3404 Function_Returns_With_DSP (gnat_entity
));
3406 /* ??? For now, don't consider nested functions pure. */
3407 if (! global_bindings_p ())
3411 = build_qualified_type (gnu_type
,
3412 (TYPE_QUALS (gnu_type
)
3413 | (TYPE_QUAL_CONST
* pure_flag
)
3414 | (TYPE_QUAL_VOLATILE
* volatile_flag
)));
3416 /* Top-level or external functions need to have an assembler name.
3417 This is passed to create_subprog_decl through the ext_name argument.
3418 For Pragma Interface subprograms with no Pragma Interface_Name, the
3419 simple name already in entity_name is correct, and this is what is
3420 gotten when ext_name is NULL. If Interface_Name is specified, then
3421 the name is extracted from the N_String_Literal node containing the
3422 string specified in the Pragma. If there is no Pragma Interface,
3423 then the Ada fully qualified name is created. */
3425 if (Present (Interface_Name (gnat_entity
))
3426 || ! (Is_Imported (gnat_entity
) || Is_Exported (gnat_entity
)))
3428 gnu_ext_name
= create_concat_name (gnat_entity
, 0);
3430 /* If there wasn't a specified Interface_Name, use this for the
3431 main name of the entity. This will cause GCC to allow
3432 qualification of a nested subprogram with a unique ID. We
3433 need this in case there is an overloaded subprogram somewhere
3436 ??? This may be a kludge. */
3437 if (No (Interface_Name (gnat_entity
)))
3438 gnu_entity_id
= gnu_ext_name
;
3441 set_lineno (gnat_entity
, 0);
3443 /* If we are defining the subprogram and it has an Address clause
3444 we must get the address expression from the saved GCC tree for the
3445 subprogram if it has a Freeze_Node. Otherwise, we elaborate
3446 the address expression here since the front-end has guaranteed
3447 in that case that the elaboration has no effects. If there is
3448 an Address clause and we are not defining the object, just
3449 make it a constant. */
3450 if (Present (Address_Clause (gnat_entity
)))
3452 tree gnu_address
= 0;
3456 = (present_gnu_tree (gnat_entity
)
3457 ? get_gnu_tree (gnat_entity
)
3458 : gnat_to_gnu (Expression (Address_Clause (gnat_entity
))));
3460 save_gnu_tree (gnat_entity
, NULL_TREE
, 0);
3462 gnu_type
= build_reference_type (gnu_type
);
3463 if (gnu_address
!= 0)
3464 gnu_address
= convert (gnu_type
, gnu_address
);
3467 = create_var_decl (gnu_entity_id
, gnu_ext_name
, gnu_type
,
3468 gnu_address
, 0, Is_Public (gnat_entity
),
3470 DECL_BY_REF_P (gnu_decl
) = 1;
3473 else if (kind
== E_Subprogram_Type
)
3474 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
3475 ! Comes_From_Source (gnat_entity
),
3479 gnu_decl
= create_subprog_decl (gnu_entity_id
, gnu_ext_name
,
3480 gnu_type
, gnu_param_list
,
3481 inline_flag
, public_flag
,
3482 extern_flag
, attr_list
);
3483 DECL_STUBBED_P (gnu_decl
)
3484 = Convention (gnat_entity
) == Convention_Stubbed
;
3489 case E_Incomplete_Type
:
3490 case E_Private_Type
:
3491 case E_Limited_Private_Type
:
3492 case E_Record_Type_With_Private
:
3493 case E_Private_Subtype
:
3494 case E_Limited_Private_Subtype
:
3495 case E_Record_Subtype_With_Private
:
3497 /* If this type does not have a full view in the unit we are
3498 compiling, then just get the type from its Etype. */
3499 if (No (Full_View (gnat_entity
)))
3501 /* If this is an incomplete type with no full view, it must
3502 be a Taft Amendement type, so just return a dummy type. */
3503 if (kind
== E_Incomplete_Type
)
3504 gnu_type
= make_dummy_type (gnat_entity
);
3506 else if (Present (Underlying_Full_View (gnat_entity
)))
3507 gnu_decl
= gnat_to_gnu_entity (Underlying_Full_View (gnat_entity
),
3511 gnu_decl
= gnat_to_gnu_entity (Etype (gnat_entity
),
3519 /* Otherwise, if we are not defining the type now, get the
3520 type from the full view. But always get the type from the full
3521 view for define on use types, since otherwise we won't see them! */
3523 else if (! definition
3524 || (Is_Itype (Full_View (gnat_entity
))
3525 && No (Freeze_Node (gnat_entity
)))
3526 || (Is_Itype (gnat_entity
)
3527 && No (Freeze_Node (Full_View (gnat_entity
)))))
3529 gnu_decl
= gnat_to_gnu_entity (Full_View (gnat_entity
),
3535 /* For incomplete types, make a dummy type entry which will be
3537 gnu_type
= make_dummy_type (gnat_entity
);
3539 /* Save this type as the full declaration's type so we can do any needed
3540 updates when we see it. */
3541 set_lineno (gnat_entity
, 0);
3542 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
3543 ! Comes_From_Source (gnat_entity
),
3545 save_gnu_tree (Full_View (gnat_entity
), gnu_decl
, 0);
3548 /* Simple class_wide types are always viewed as their root_type
3549 by Gigi unless an Equivalent_Type is specified. */
3550 case E_Class_Wide_Type
:
3551 if (Present (Equivalent_Type (gnat_entity
)))
3552 gnu_type
= gnat_to_gnu_type (Equivalent_Type (gnat_entity
));
3554 gnu_type
= gnat_to_gnu_type (Root_Type (gnat_entity
));
3560 case E_Task_Subtype
:
3561 case E_Protected_Type
:
3562 case E_Protected_Subtype
:
3563 if (type_annotate_only
&& No (Corresponding_Record_Type (gnat_entity
)))
3564 gnu_type
= void_type_node
;
3566 gnu_type
= gnat_to_gnu_type (Corresponding_Record_Type (gnat_entity
));
3572 gnu_decl
= create_label_decl (gnu_entity_id
);
3577 /* Nothing at all to do here, so just return an ERROR_MARK and claim
3578 we've already saved it, so we don't try to. */
3579 gnu_decl
= error_mark_node
;
3587 /* If we had a case where we evaluated another type and it might have
3588 defined this one, handle it here. */
3589 if (maybe_present
&& present_gnu_tree (gnat_entity
))
3591 gnu_decl
= get_gnu_tree (gnat_entity
);
3595 /* If we are processing a type and there is either no decl for it or
3596 we just made one, do some common processing for the type, such as
3597 handling alignment and possible padding. */
3599 if ((gnu_decl
== 0 || this_made_decl
) && IN (kind
, Type_Kind
))
3601 if (Is_Tagged_Type (gnat_entity
))
3602 TYPE_ALIGN_OK (gnu_type
) = 1;
3604 if (AGGREGATE_TYPE_P (gnu_type
) && Is_By_Reference_Type (gnat_entity
))
3605 TYPE_BY_REFERENCE_P (gnu_type
) = 1;
3607 /* ??? Don't set the size for a String_Literal since it is either
3608 confirming or we don't handle it properly (if the low bound is
3610 if (gnu_size
== 0 && kind
!= E_String_Literal_Subtype
)
3611 gnu_size
= validate_size (Esize (gnat_entity
), gnu_type
, gnat_entity
,
3612 TYPE_DECL
, 0, Has_Size_Clause (gnat_entity
));
3614 /* If a size was specified, see if we can make a new type of that size
3615 by rearranging the type, for example from a fat to a thin pointer. */
3619 = make_type_from_size (gnu_type
, gnu_size
,
3620 Has_Biased_Representation (gnat_entity
));
3622 if (operand_equal_p (TYPE_SIZE (gnu_type
), gnu_size
, 0)
3623 && operand_equal_p (rm_size (gnu_type
), gnu_size
, 0))
3627 /* If the alignment hasn't already been processed and this is
3628 not an unconstrained array, see if an alignment is specified.
3629 If not, we pick a default alignment for atomic objects. */
3630 if (align
!= 0 || TREE_CODE (gnu_type
) == UNCONSTRAINED_ARRAY_TYPE
)
3632 else if (Known_Alignment (gnat_entity
))
3633 align
= validate_alignment (Alignment (gnat_entity
), gnat_entity
,
3634 TYPE_ALIGN (gnu_type
));
3635 else if (Is_Atomic (gnat_entity
) && gnu_size
== 0
3636 && host_integerp (TYPE_SIZE (gnu_type
), 1)
3637 && integer_pow2p (TYPE_SIZE (gnu_type
)))
3638 align
= MIN (BIGGEST_ALIGNMENT
,
3639 tree_low_cst (TYPE_SIZE (gnu_type
), 1));
3640 else if (Is_Atomic (gnat_entity
) && gnu_size
!= 0
3641 && host_integerp (gnu_size
, 1)
3642 && integer_pow2p (gnu_size
))
3643 align
= MIN (BIGGEST_ALIGNMENT
, tree_low_cst (gnu_size
, 1));
3645 /* See if we need to pad the type. If we did, and made a record,
3646 the name of the new type may be changed. So get it back for
3647 us when we make the new TYPE_DECL below. */
3648 gnu_type
= maybe_pad_type (gnu_type
, gnu_size
, align
,
3649 gnat_entity
, "PAD", 1, definition
, 0);
3650 if (TREE_CODE (gnu_type
) == RECORD_TYPE
3651 && TYPE_IS_PADDING_P (gnu_type
))
3653 gnu_entity_id
= TYPE_NAME (gnu_type
);
3654 if (TREE_CODE (gnu_entity_id
) == TYPE_DECL
)
3655 gnu_entity_id
= DECL_NAME (gnu_entity_id
);
3658 set_rm_size (RM_Size (gnat_entity
), gnu_type
, gnat_entity
);
3660 /* If we are at global level, GCC will have applied variable_size to
3661 the type, but that won't have done anything. So, if it's not
3662 a constant or self-referential, call elaborate_expression_1 to
3663 make a variable for the size rather than calculating it each time.
3664 Handle both the RM size and the actual size. */
3665 if (global_bindings_p ()
3666 && TYPE_SIZE (gnu_type
) != 0
3667 && TREE_CODE (TYPE_SIZE (gnu_type
)) != INTEGER_CST
3668 && ! contains_placeholder_p (TYPE_SIZE (gnu_type
)))
3670 if (TREE_CODE (gnu_type
) == RECORD_TYPE
3671 && operand_equal_p (TYPE_ADA_SIZE (gnu_type
),
3672 TYPE_SIZE (gnu_type
), 0))
3673 TYPE_ADA_SIZE (gnu_type
) = TYPE_SIZE (gnu_type
)
3674 = elaborate_expression_1 (gnat_entity
, gnat_entity
,
3675 TYPE_SIZE (gnu_type
),
3676 get_identifier ("SIZE"),
3680 TYPE_SIZE (gnu_type
)
3681 = elaborate_expression_1 (gnat_entity
, gnat_entity
,
3682 TYPE_SIZE (gnu_type
),
3683 get_identifier ("SIZE"),
3686 /* ??? For now, store the size as a multiple of the alignment
3687 in bytes so that we can see the alignment from the tree. */
3688 TYPE_SIZE_UNIT (gnu_type
)
3690 (MULT_EXPR
, sizetype
,
3691 elaborate_expression_1
3692 (gnat_entity
, gnat_entity
,
3693 build_binary_op (EXACT_DIV_EXPR
, sizetype
,
3694 TYPE_SIZE_UNIT (gnu_type
),
3695 size_int (TYPE_ALIGN (gnu_type
)
3697 get_identifier ("SIZE_A_UNIT"),
3699 size_int (TYPE_ALIGN (gnu_type
) / BITS_PER_UNIT
));
3701 if (TREE_CODE (gnu_type
) == RECORD_TYPE
)
3702 TYPE_ADA_SIZE (gnu_type
)
3703 = elaborate_expression_1 (gnat_entity
, gnat_entity
,
3704 TYPE_ADA_SIZE (gnu_type
),
3705 get_identifier ("RM_SIZE"),
3710 /* If this is a record type or subtype, call elaborate_expression_1 on
3711 any field position. Do this for both global and local types.
3712 Skip any fields that we haven't made trees for to avoid problems with
3713 class wide types. */
3714 if (IN (kind
, Record_Kind
))
3715 for (gnat_temp
= First_Entity (gnat_entity
); Present (gnat_temp
);
3716 gnat_temp
= Next_Entity (gnat_temp
))
3717 if (Ekind (gnat_temp
) == E_Component
&& present_gnu_tree (gnat_temp
))
3719 tree gnu_field
= get_gnu_tree (gnat_temp
);
3721 /* ??? Unfortunately, GCC needs to be able to prove the
3722 alignment of this offset and if it's a variable, it can't.
3723 In GCC 3.2, we'll use DECL_OFFSET_ALIGN in some way, but
3724 right now, we have to put in an explicit multiply and
3725 divide by that value. */
3726 if (TREE_CODE (DECL_FIELD_OFFSET (gnu_field
)) != INTEGER_CST
3727 && ! contains_placeholder_p (DECL_FIELD_OFFSET (gnu_field
)))
3728 DECL_FIELD_OFFSET (gnu_field
)
3730 (MULT_EXPR
, sizetype
,
3731 elaborate_expression_1
3732 (gnat_temp
, gnat_temp
,
3733 build_binary_op (EXACT_DIV_EXPR
, sizetype
,
3734 DECL_FIELD_OFFSET (gnu_field
),
3735 size_int (DECL_OFFSET_ALIGN (gnu_field
)
3737 get_identifier ("OFFSET"),
3739 size_int (DECL_OFFSET_ALIGN (gnu_field
) / BITS_PER_UNIT
));
3742 gnu_type
= build_qualified_type (gnu_type
,
3743 (TYPE_QUALS (gnu_type
)
3744 | (TYPE_QUAL_VOLATILE
3745 * Is_Volatile (gnat_entity
))));
3747 if (Is_Atomic (gnat_entity
))
3748 check_ok_for_atomic (gnu_type
, gnat_entity
, 0);
3750 if (Known_Alignment (gnat_entity
))
3751 TYPE_USER_ALIGN (gnu_type
) = 1;
3755 set_lineno (gnat_entity
, 0);
3756 gnu_decl
= create_type_decl (gnu_entity_id
, gnu_type
, attr_list
,
3757 ! Comes_From_Source (gnat_entity
),
3761 TREE_TYPE (gnu_decl
) = gnu_type
;
3764 if (IN (kind
, Type_Kind
) && ! TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl
)))
3766 gnu_type
= TREE_TYPE (gnu_decl
);
3768 /* Back-annotate the Alignment of the type if not already in the
3769 tree. Likewise for sizes. */
3770 if (Unknown_Alignment (gnat_entity
))
3771 Set_Alignment (gnat_entity
,
3772 UI_From_Int (TYPE_ALIGN (gnu_type
) / BITS_PER_UNIT
));
3774 if (Unknown_Esize (gnat_entity
) && TYPE_SIZE (gnu_type
) != 0)
3776 /* If the size is self-referential, we annotate the maximum
3777 value of that size. */
3778 tree gnu_size
= TYPE_SIZE (gnu_type
);
3780 if (contains_placeholder_p (gnu_size
))
3781 gnu_size
= max_size (gnu_size
, 1);
3783 Set_Esize (gnat_entity
, annotate_value (gnu_size
));
3786 if (Unknown_RM_Size (gnat_entity
) && rm_size (gnu_type
) != 0)
3787 Set_RM_Size (gnat_entity
, annotate_value (rm_size (gnu_type
)));
3790 if (! Comes_From_Source (gnat_entity
) && DECL_P (gnu_decl
))
3791 DECL_ARTIFICIAL (gnu_decl
) = 1;
3793 if (! debug_info_p
&& DECL_P (gnu_decl
)
3794 && TREE_CODE (gnu_decl
) != FUNCTION_DECL
)
3795 DECL_IGNORED_P (gnu_decl
) = 1;
3797 /* If this decl is really indirect, adjust it. */
3798 if (TREE_CODE (gnu_decl
) == VAR_DECL
)
3799 adjust_decl_rtl (gnu_decl
);
3801 /* If we haven't already, associate the ..._DECL node that we just made with
3802 the input GNAT entity node. */
3804 save_gnu_tree (gnat_entity
, gnu_decl
, 0);
3806 /* If this is an enumeral or floating-point type, we were not able to set
3807 the bounds since they refer to the type. These bounds are always static.
3809 For enumeration types, also write debugging information and declare the
3810 enumeration literal table, if needed. */
3812 if ((kind
== E_Enumeration_Type
&& Present (First_Literal (gnat_entity
)))
3813 || (kind
== E_Floating_Point_Type
&& ! Vax_Float (gnat_entity
)))
3815 tree gnu_scalar_type
= gnu_type
;
3817 /* If this is a padded type, we need to use the underlying type. */
3818 if (TREE_CODE (gnu_scalar_type
) == RECORD_TYPE
3819 && TYPE_IS_PADDING_P (gnu_scalar_type
))
3820 gnu_scalar_type
= TREE_TYPE (TYPE_FIELDS (gnu_scalar_type
));
3822 /* If this is a floating point type and we haven't set a floating
3823 point type yet, use this in the evaluation of the bounds. */
3824 if (longest_float_type_node
== 0 && kind
== E_Floating_Point_Type
)
3825 longest_float_type_node
= gnu_type
;
3827 TYPE_MIN_VALUE (gnu_scalar_type
)
3828 = gnat_to_gnu (Type_Low_Bound (gnat_entity
));
3829 TYPE_MAX_VALUE (gnu_scalar_type
)
3830 = gnat_to_gnu (Type_High_Bound (gnat_entity
));
3832 if (kind
== E_Enumeration_Type
)
3834 TYPE_STUB_DECL (gnu_scalar_type
) = gnu_decl
;
3836 /* Since this has both a typedef and a tag, avoid outputting
3838 DECL_ARTIFICIAL (gnu_decl
) = 1;
3839 rest_of_type_compilation (gnu_scalar_type
, global_bindings_p ());
3843 /* If we deferred processing of incomplete types, re-enable it. If there
3844 were no other disables and we have some to process, do so. */
3845 if (this_deferred
&& --defer_incomplete_level
== 0
3846 && defer_incomplete_list
!= 0)
3848 struct incomplete
*incp
= defer_incomplete_list
;
3849 struct incomplete
*next
;
3851 defer_incomplete_list
= 0;
3852 for (; incp
; incp
= next
)
3856 if (incp
->old_type
!= 0)
3857 update_pointer_to (TYPE_MAIN_VARIANT (incp
->old_type
),
3858 gnat_to_gnu_type (incp
->full_type
));
3863 /* If we are not defining this type, see if it's in the incomplete list.
3864 If so, handle that list entry now. */
3865 else if (! definition
)
3867 struct incomplete
*incp
;
3869 for (incp
= defer_incomplete_list
; incp
; incp
= incp
->next
)
3870 if (incp
->old_type
!= 0 && incp
->full_type
== gnat_entity
)
3872 update_pointer_to (TYPE_MAIN_VARIANT (incp
->old_type
),
3873 TREE_TYPE (gnu_decl
));
3881 if (Is_Packed_Array_Type (gnat_entity
)
3882 && Is_Itype (Associated_Node_For_Itype (gnat_entity
))
3883 && No (Freeze_Node (Associated_Node_For_Itype (gnat_entity
)))
3884 && ! present_gnu_tree (Associated_Node_For_Itype (gnat_entity
)))
3885 gnat_to_gnu_entity (Associated_Node_For_Itype (gnat_entity
), NULL_TREE
, 0);
3890 /* Given GNAT_ENTITY, elaborate all expressions that are required to
3891 be elaborated at the point of its definition, but do nothing else. */
3894 elaborate_entity (gnat_entity
)
3895 Entity_Id gnat_entity
;
3897 switch (Ekind (gnat_entity
))
3899 case E_Signed_Integer_Subtype
:
3900 case E_Modular_Integer_Subtype
:
3901 case E_Enumeration_Subtype
:
3902 case E_Ordinary_Fixed_Point_Subtype
:
3903 case E_Decimal_Fixed_Point_Subtype
:
3904 case E_Floating_Point_Subtype
:
3906 Node_Id gnat_lb
= Type_Low_Bound (gnat_entity
);
3907 Node_Id gnat_hb
= Type_High_Bound (gnat_entity
);
3909 /* ??? Tests for avoiding static constaint error expression
3910 is needed until the front stops generating bogus conversions
3911 on bounds of real types. */
3913 if (! Raises_Constraint_Error (gnat_lb
))
3914 elaborate_expression (gnat_lb
, gnat_entity
, get_identifier ("L"),
3915 1, 0, Needs_Debug_Info (gnat_entity
));
3916 if (! Raises_Constraint_Error (gnat_hb
))
3917 elaborate_expression (gnat_hb
, gnat_entity
, get_identifier ("U"),
3918 1, 0, Needs_Debug_Info (gnat_entity
));
3924 Node_Id full_definition
= Declaration_Node (gnat_entity
);
3925 Node_Id record_definition
= Type_Definition (full_definition
);
3927 /* If this is a record extension, go a level further to find the
3928 record definition. */
3929 if (Nkind (record_definition
) == N_Derived_Type_Definition
)
3930 record_definition
= Record_Extension_Part (record_definition
);
3934 case E_Record_Subtype
:
3935 case E_Private_Subtype
:
3936 case E_Limited_Private_Subtype
:
3937 case E_Record_Subtype_With_Private
:
3938 if (Is_Constrained (gnat_entity
)
3939 && Has_Discriminants (Base_Type (gnat_entity
))
3940 && Present (Discriminant_Constraint (gnat_entity
)))
3942 Node_Id gnat_discriminant_expr
;
3943 Entity_Id gnat_field
;
3945 for (gnat_field
= First_Discriminant (Base_Type (gnat_entity
)),
3946 gnat_discriminant_expr
3947 = First_Elmt (Discriminant_Constraint (gnat_entity
));
3948 Present (gnat_field
);
3949 gnat_field
= Next_Discriminant (gnat_field
),
3950 gnat_discriminant_expr
= Next_Elmt (gnat_discriminant_expr
))
3951 /* ??? For now, ignore access discriminants. */
3952 if (! Is_Access_Type (Etype (Node (gnat_discriminant_expr
))))
3953 elaborate_expression (Node (gnat_discriminant_expr
),
3955 get_entity_name (gnat_field
), 1, 0, 0);
3962 /* Mark GNAT_ENTITY as going out of scope at this point. Recursively mark
3963 any entities on its entity chain similarly. */
3966 mark_out_of_scope (gnat_entity
)
3967 Entity_Id gnat_entity
;
3969 Entity_Id gnat_sub_entity
;
3970 unsigned int kind
= Ekind (gnat_entity
);
3972 /* If this has an entity list, process all in the list. */
3973 if (IN (kind
, Class_Wide_Kind
) || IN (kind
, Concurrent_Kind
)
3974 || IN (kind
, Private_Kind
)
3975 || kind
== E_Block
|| kind
== E_Entry
|| kind
== E_Entry_Family
3976 || kind
== E_Function
|| kind
== E_Generic_Function
3977 || kind
== E_Generic_Package
|| kind
== E_Generic_Procedure
3978 || kind
== E_Loop
|| kind
== E_Operator
|| kind
== E_Package
3979 || kind
== E_Package_Body
|| kind
== E_Procedure
3980 || kind
== E_Record_Type
|| kind
== E_Record_Subtype
3981 || kind
== E_Subprogram_Body
|| kind
== E_Subprogram_Type
)
3982 for (gnat_sub_entity
= First_Entity (gnat_entity
);
3983 Present (gnat_sub_entity
);
3984 gnat_sub_entity
= Next_Entity (gnat_sub_entity
))
3985 if (Scope (gnat_sub_entity
) == gnat_entity
3986 && gnat_sub_entity
!= gnat_entity
)
3987 mark_out_of_scope (gnat_sub_entity
);
3989 /* Now clear this if it has been defined, but only do so if it isn't
3990 a subprogram or parameter. We could refine this, but it isn't
3991 worth it. If this is statically allocated, it is supposed to
3992 hang around out of cope. */
3993 if (present_gnu_tree (gnat_entity
) && ! Is_Statically_Allocated (gnat_entity
)
3994 && kind
!= E_Procedure
&& kind
!= E_Function
&& ! IN (kind
, Formal_Kind
))
3996 save_gnu_tree (gnat_entity
, NULL_TREE
, 1);
3997 save_gnu_tree (gnat_entity
, error_mark_node
, 1);
4001 /* Return a TREE_LIST describing the substitutions needed to reflect
4002 discriminant substitutions from GNAT_SUBTYPE to GNAT_TYPE and add
4003 them to GNU_LIST. If GNAT_TYPE is not specified, use the base type
4004 of GNAT_SUBTYPE. The substitions can be in any order. TREE_PURPOSE
4005 gives the tree for the discriminant and TREE_VALUES is the replacement
4006 value. They are in the form of operands to substitute_in_expr.
4007 DEFINITION is as in gnat_to_gnu_entity. */
4010 substitution_list (gnat_subtype
, gnat_type
, gnu_list
, definition
)
4011 Entity_Id gnat_subtype
;
4012 Entity_Id gnat_type
;
4016 Entity_Id gnat_discrim
;
4020 gnat_type
= Implementation_Base_Type (gnat_subtype
);
4022 if (Has_Discriminants (gnat_type
))
4023 for (gnat_discrim
= First_Girder_Discriminant (gnat_type
),
4024 gnat_value
= First_Elmt (Girder_Constraint (gnat_subtype
));
4025 Present (gnat_discrim
);
4026 gnat_discrim
= Next_Girder_Discriminant (gnat_discrim
),
4027 gnat_value
= Next_Elmt (gnat_value
))
4028 /* Ignore access discriminants. */
4029 if (! Is_Access_Type (Etype (Node (gnat_value
))))
4030 gnu_list
= tree_cons (gnat_to_gnu_entity (gnat_discrim
, NULL_TREE
, 0),
4031 elaborate_expression
4032 (Node (gnat_value
), gnat_subtype
,
4033 get_entity_name (gnat_discrim
), definition
,
4040 /* For the following two functions: for each GNAT entity, the GCC
4041 tree node used as a dummy for that entity, if any. */
4043 static tree
*dummy_node_table
;
4045 /* Initialize the above table. */
4052 dummy_node_table
= (tree
*) xmalloc (max_gnat_nodes
* sizeof (tree
));
4053 ggc_add_tree_root (dummy_node_table
, max_gnat_nodes
);
4055 for (gnat_node
= 0; gnat_node
< max_gnat_nodes
; gnat_node
++)
4056 dummy_node_table
[gnat_node
] = NULL_TREE
;
4058 dummy_node_table
-= First_Node_Id
;
4061 /* Make a dummy type corresponding to GNAT_TYPE. */
4064 make_dummy_type (gnat_type
)
4065 Entity_Id gnat_type
;
4067 Entity_Id gnat_underlying
;
4070 /* Find a full type for GNAT_TYPE, taking into account any class wide
4072 if (Is_Class_Wide_Type (gnat_type
) && Present (Equivalent_Type (gnat_type
)))
4073 gnat_type
= Equivalent_Type (gnat_type
);
4074 else if (Ekind (gnat_type
) == E_Class_Wide_Type
)
4075 gnat_type
= Root_Type (gnat_type
);
4077 for (gnat_underlying
= gnat_type
;
4078 (IN (Ekind (gnat_underlying
), Incomplete_Or_Private_Kind
)
4079 && Present (Full_View (gnat_underlying
)));
4080 gnat_underlying
= Full_View (gnat_underlying
))
4083 /* If it there already a dummy type, use that one. Else make one. */
4084 if (dummy_node_table
[gnat_underlying
])
4085 return dummy_node_table
[gnat_underlying
];
4087 /* If this is a record, make this a RECORD_TYPE or UNION_TYPE; else make
4089 if (Is_Record_Type (gnat_underlying
))
4090 gnu_type
= make_node (Is_Unchecked_Union (gnat_underlying
)
4091 ? UNION_TYPE
: RECORD_TYPE
);
4093 gnu_type
= make_node (ENUMERAL_TYPE
);
4095 TYPE_NAME (gnu_type
) = get_entity_name (gnat_type
);
4096 if (AGGREGATE_TYPE_P (gnu_type
))
4097 TYPE_STUB_DECL (gnu_type
)
4098 = pushdecl (build_decl (TYPE_DECL
, NULL_TREE
, gnu_type
));
4100 TYPE_DUMMY_P (gnu_type
) = 1;
4101 dummy_node_table
[gnat_underlying
] = gnu_type
;
4106 /* Return 1 if the size represented by GNU_SIZE can be handled by an
4107 allocation. If STATIC_P is non-zero, consider only what can be
4108 done with a static allocation. */
4111 allocatable_size_p (gnu_size
, static_p
)
4115 /* If this is not a static allocation, the only case we want to forbid
4116 is an overflowing size. That will be converted into a raise a
4119 return ! (TREE_CODE (gnu_size
) == INTEGER_CST
4120 && TREE_CONSTANT_OVERFLOW (gnu_size
));
4122 /* Otherwise, we need to deal with both variable sizes and constant
4123 sizes that won't fit in a host int. */
4124 return host_integerp (gnu_size
, 1);
4127 /* Return a list of attributes for GNAT_ENTITY, if any. */
4129 static struct attrib
*
4130 build_attr_list (gnat_entity
)
4131 Entity_Id gnat_entity
;
4133 struct attrib
*attr_list
= 0;
4136 for (gnat_temp
= First_Rep_Item (gnat_entity
); Present (gnat_temp
);
4137 gnat_temp
= Next_Rep_Item (gnat_temp
))
4138 if (Nkind (gnat_temp
) == N_Pragma
)
4140 struct attrib
*attr
;
4141 tree gnu_arg0
= 0, gnu_arg1
= 0;
4142 Node_Id gnat_assoc
= Pragma_Argument_Associations (gnat_temp
);
4143 enum attr_type etype
;
4145 if (Present (gnat_assoc
) && Present (First (gnat_assoc
))
4146 && Present (Next (First (gnat_assoc
)))
4147 && (Nkind (Expression (Next (First (gnat_assoc
))))
4148 == N_String_Literal
))
4150 gnu_arg0
= get_identifier (TREE_STRING_POINTER
4153 (First (gnat_assoc
))))));
4154 if (Present (Next (Next (First (gnat_assoc
))))
4155 && (Nkind (Expression (Next (Next (First (gnat_assoc
)))))
4156 == N_String_Literal
))
4157 gnu_arg1
= get_identifier (TREE_STRING_POINTER
4161 (First (gnat_assoc
)))))));
4164 switch (Get_Pragma_Id (Chars (gnat_temp
)))
4166 case Pragma_Machine_Attribute
:
4167 etype
= ATTR_MACHINE_ATTRIBUTE
;
4170 case Pragma_Linker_Alias
:
4171 etype
= ATTR_LINK_ALIAS
;
4174 case Pragma_Linker_Section
:
4175 etype
= ATTR_LINK_SECTION
;
4178 case Pragma_Weak_External
:
4179 etype
= ATTR_WEAK_EXTERNAL
;
4186 attr
= (struct attrib
*) xmalloc (sizeof (struct attrib
));
4187 attr
->next
= attr_list
;
4189 attr
->name
= gnu_arg0
;
4190 attr
->arg
= gnu_arg1
;
4192 = Present (Next (First (gnat_assoc
)))
4193 ? Expression (Next (First (gnat_assoc
))) : gnat_temp
;
4200 /* Get the unpadded version of a GNAT type. */
4203 get_unpadded_type (gnat_entity
)
4204 Entity_Id gnat_entity
;
4206 tree type
= gnat_to_gnu_type (gnat_entity
);
4208 if (TREE_CODE (type
) == RECORD_TYPE
&& TYPE_IS_PADDING_P (type
))
4209 type
= TREE_TYPE (TYPE_FIELDS (type
));
4214 /* Called when we need to protect a variable object using a save_expr. */
4217 maybe_variable (gnu_operand
, gnat_node
)
4221 if (TREE_CONSTANT (gnu_operand
) || TREE_READONLY (gnu_operand
)
4222 || TREE_CODE (gnu_operand
) == SAVE_EXPR
4223 || TREE_CODE (gnu_operand
) == NULL_EXPR
)
4226 /* If we will be generating code, make sure we are at the proper
4228 if (! global_bindings_p () && ! TREE_CONSTANT (gnu_operand
)
4229 && ! contains_placeholder_p (gnu_operand
))
4230 set_lineno (gnat_node
, 1);
4232 if (TREE_CODE (gnu_operand
) == UNCONSTRAINED_ARRAY_REF
)
4233 return build1 (UNCONSTRAINED_ARRAY_REF
, TREE_TYPE (gnu_operand
),
4234 variable_size (TREE_OPERAND (gnu_operand
, 0)));
4236 return variable_size (gnu_operand
);
4239 /* Given a GNAT tree GNAT_EXPR, for an expression which is a value within a
4240 type definition (either a bound or a discriminant value) for GNAT_ENTITY,
4241 return the GCC tree to use for that expression. GNU_NAME is the
4242 qualification to use if an external name is appropriate and DEFINITION is
4243 nonzero if this is a definition of GNAT_ENTITY. If NEED_VALUE is nonzero,
4244 we need a result. Otherwise, we are just elaborating this for
4245 side-effects. If NEED_DEBUG is nonzero we need the symbol for debugging
4246 purposes even if it isn't needed for code generation. */
4249 elaborate_expression (gnat_expr
, gnat_entity
, gnu_name
, definition
,
4250 need_value
, need_debug
)
4252 Entity_Id gnat_entity
;
4260 /* If we already elaborated this expression (e.g., it was involved
4261 in the definition of a private type), use the old value. */
4262 if (present_gnu_tree (gnat_expr
))
4263 return get_gnu_tree (gnat_expr
);
4265 /* If we don't need a value and this is static or a discriment, we
4266 don't need to do anything. */
4267 else if (! need_value
4268 && (Is_OK_Static_Expression (gnat_expr
)
4269 || (Nkind (gnat_expr
) == N_Identifier
4270 && Ekind (Entity (gnat_expr
)) == E_Discriminant
)))
4273 /* Otherwise, convert this tree to its GCC equivalant. */
4275 = elaborate_expression_1 (gnat_expr
, gnat_entity
, gnat_to_gnu (gnat_expr
),
4276 gnu_name
, definition
, need_debug
);
4278 /* Save the expression in case we try to elaborate this entity again.
4279 Since this is not a DECL, don't check it. If this is a constant,
4280 don't save it since GNAT_EXPR might be used more than once. Also,
4281 don't save if it's a discriminant. */
4282 if (! TREE_CONSTANT (gnu_expr
) && ! contains_placeholder_p (gnu_expr
))
4283 save_gnu_tree (gnat_expr
, gnu_expr
, 1);
4285 return need_value
? gnu_expr
: error_mark_node
;
4288 /* Similar, but take a GNU expression. */
4291 elaborate_expression_1 (gnat_expr
, gnat_entity
, gnu_expr
, gnu_name
, definition
,
4294 Entity_Id gnat_entity
;
4301 /* Strip any conversions to see if the expression is a readonly variable.
4302 ??? This really should remain readonly, but we have to think about
4303 the typing of the tree here. */
4304 tree gnu_inner_expr
= remove_conversions (gnu_expr
, 1);
4305 int expr_global
= Is_Public (gnat_entity
) || global_bindings_p ();
4308 /* In most cases, we won't see a naked FIELD_DECL here because a
4309 discriminant reference will have been replaced with a COMPONENT_REF
4310 when the type is being elaborated. However, there are some cases
4311 involving child types where we will. So convert it to a COMPONENT_REF
4312 here. We have to hope it will be at the highest level of the
4313 expression in these cases. */
4314 if (TREE_CODE (gnu_expr
) == FIELD_DECL
)
4315 gnu_expr
= build (COMPONENT_REF
, TREE_TYPE (gnu_expr
),
4316 build (PLACEHOLDER_EXPR
, DECL_CONTEXT (gnu_expr
)),
4319 /* If GNU_EXPR is neither a placeholder nor a constant, nor a variable
4320 that is a constant, make a variable that is initialized to contain the
4321 bound when the package containing the definition is elaborated. If
4322 this entity is defined at top level and a bound or discriminant value
4323 isn't a constant or a reference to a discriminant, replace the bound
4324 by the variable; otherwise use a SAVE_EXPR if needed. Note that we
4325 rely here on the fact that an expression cannot contain both the
4326 discriminant and some other variable. */
4328 expr_variable
= (TREE_CODE_CLASS (TREE_CODE (gnu_expr
)) != 'c'
4329 && ! (TREE_CODE (gnu_inner_expr
) == VAR_DECL
4330 && TREE_READONLY (gnu_inner_expr
))
4331 && ! contains_placeholder_p (gnu_expr
));
4333 /* If this is a static expression or contains a discriminant, we don't
4334 need the variable for debugging (and can't elaborate anyway if a
4337 && (Is_OK_Static_Expression (gnat_expr
)
4338 || contains_placeholder_p (gnu_expr
)))
4341 /* Now create the variable if we need it. */
4342 if (need_debug
|| (expr_variable
&& expr_global
))
4344 set_lineno (gnat_entity
, ! global_bindings_p ());
4346 = create_var_decl (create_concat_name (gnat_entity
,
4347 IDENTIFIER_POINTER (gnu_name
)),
4348 NULL_TREE
, TREE_TYPE (gnu_expr
), gnu_expr
, 1,
4349 Is_Public (gnat_entity
), ! definition
, 0, 0);
4352 /* We only need to use this variable if we are in global context since GCC
4353 can do the right thing in the local case. */
4354 if (expr_global
&& expr_variable
)
4356 else if (! expr_variable
)
4359 return maybe_variable (gnu_expr
, gnat_expr
);
4362 /* Create a record type that contains a field of TYPE with a starting bit
4363 position so that it is aligned to ALIGN bits and is SIZE bytes long. */
4366 make_aligning_type (type
, align
, size
)
4371 tree record_type
= make_node (RECORD_TYPE
);
4372 tree place
= build (PLACEHOLDER_EXPR
, record_type
);
4373 tree size_addr_place
= convert (sizetype
,
4374 build_unary_op (ADDR_EXPR
, NULL_TREE
,
4376 tree name
= TYPE_NAME (type
);
4379 if (TREE_CODE (name
) == TYPE_DECL
)
4380 name
= DECL_NAME (name
);
4382 TYPE_NAME (record_type
) = concat_id_with_name (name
, "_ALIGN");
4384 /* The bit position is obtained by "and"ing the alignment minus 1
4385 with the two's complement of the address and multiplying
4386 by the number of bits per unit. Do all this in sizetype. */
4388 pos
= size_binop (MULT_EXPR
,
4389 convert (bitsizetype
,
4390 size_binop (BIT_AND_EXPR
,
4391 size_diffop (size_zero_node
,
4393 ssize_int ((align
/ BITS_PER_UNIT
)
4397 field
= create_field_decl (get_identifier ("F"), type
, record_type
,
4399 DECL_BIT_FIELD (field
) = 0;
4401 finish_record_type (record_type
, field
, 1, 0);
4402 TYPE_ALIGN (record_type
) = BIGGEST_ALIGNMENT
;
4403 TYPE_SIZE (record_type
)
4404 = size_binop (PLUS_EXPR
,
4405 size_binop (MULT_EXPR
, convert (bitsizetype
, size
),
4407 bitsize_int (align
));
4408 TYPE_SIZE_UNIT (record_type
)
4409 = size_binop (PLUS_EXPR
, size
, size_int (align
/ BITS_PER_UNIT
));
4414 /* TYPE is a RECORD_TYPE with BLKmode that's being used as the field
4415 type of a packed record. See if we can rewrite it as a record that has
4416 a non-BLKmode type, which we can pack tighter. If so, return the
4417 new type. If not, return the original type. */
4420 make_packable_type (type
)
4423 tree new_type
= make_node (RECORD_TYPE
);
4424 tree field_list
= NULL_TREE
;
4427 /* Copy the name and flags from the old type to that of the new and set
4428 the alignment to try for an integral type. */
4429 TYPE_NAME (new_type
) = TYPE_NAME (type
);
4430 TYPE_LEFT_JUSTIFIED_MODULAR_P (new_type
)
4431 = TYPE_LEFT_JUSTIFIED_MODULAR_P (type
);
4432 TYPE_CONTAINS_TEMPLATE_P (new_type
) = TYPE_CONTAINS_TEMPLATE_P (type
);
4434 TYPE_ALIGN (new_type
)
4435 = ((HOST_WIDE_INT
) 1
4436 << (floor_log2 (tree_low_cst (TYPE_SIZE (type
), 1) - 1) + 1));
4438 /* Now copy the fields, keeping the position and size. */
4439 for (old_field
= TYPE_FIELDS (type
); old_field
!= 0;
4440 old_field
= TREE_CHAIN (old_field
))
4443 = create_field_decl (DECL_NAME (old_field
), TREE_TYPE (old_field
),
4444 new_type
, TYPE_PACKED (type
),
4445 DECL_SIZE (old_field
),
4446 bit_position (old_field
),
4447 ! DECL_NONADDRESSABLE_P (old_field
));
4449 DECL_INTERNAL_P (new_field
) = DECL_INTERNAL_P (old_field
);
4450 DECL_ORIGINAL_FIELD (new_field
)
4451 = (DECL_ORIGINAL_FIELD (old_field
) != 0
4452 ? DECL_ORIGINAL_FIELD (old_field
) : old_field
);
4453 TREE_CHAIN (new_field
) = field_list
;
4454 field_list
= new_field
;
4457 finish_record_type (new_type
, nreverse (field_list
), 1, 1);
4458 return TYPE_MODE (new_type
) == BLKmode
? type
: new_type
;
4461 /* Ensure that TYPE has SIZE and ALIGN. Make and return a new padded type
4462 if needed. We have already verified that SIZE and TYPE are large enough.
4464 GNAT_ENTITY and NAME_TRAILER are used to name the resulting record and
4467 IS_USER_TYPE is nonzero if we must be sure we complete the original type.
4469 DEFINITION is nonzero if this type is being defined.
4471 SAME_RM_SIZE is nonzero if the RM_Size of the resulting type is to be
4472 set to its TYPE_SIZE; otherwise, it's set to the RM_Size of the original
4476 maybe_pad_type (type
, size
, align
, gnat_entity
, name_trailer
,
4477 is_user_type
, definition
, same_rm_size
)
4481 Entity_Id gnat_entity
;
4482 const char *name_trailer
;
4487 tree orig_size
= TYPE_SIZE (type
);
4491 /* If TYPE is a padded type, see if it agrees with any size and alignment
4492 we were given. If so, return the original type. Otherwise, strip
4493 off the padding, since we will either be returning the inner type
4494 or repadding it. If no size or alignment is specified, use that of
4495 the original padded type. */
4497 if (TREE_CODE (type
) == RECORD_TYPE
&& TYPE_IS_PADDING_P (type
))
4500 || operand_equal_p (round_up (size
,
4501 MAX (align
, TYPE_ALIGN (type
))),
4502 round_up (TYPE_SIZE (type
),
4503 MAX (align
, TYPE_ALIGN (type
))),
4505 && (align
== 0 || align
== TYPE_ALIGN (type
)))
4509 size
= TYPE_SIZE (type
);
4511 align
= TYPE_ALIGN (type
);
4513 type
= TREE_TYPE (TYPE_FIELDS (type
));
4514 orig_size
= TYPE_SIZE (type
);
4517 /* If the size is either not being changed or is being made smaller (which
4518 is not done here (and is only valid for bitfields anyway), show the size
4519 isn't changing. Likewise, clear the alignment if it isn't being
4520 changed. Then return if we aren't doing anything. */
4523 && (operand_equal_p (size
, orig_size
, 0)
4524 || (TREE_CODE (orig_size
) == INTEGER_CST
4525 && tree_int_cst_lt (size
, orig_size
))))
4528 if (align
== TYPE_ALIGN (type
))
4531 if (align
== 0 && size
== 0)
4534 /* We used to modify the record in place in some cases, but that could
4535 generate incorrect debugging information. So make a new record
4537 record
= make_node (RECORD_TYPE
);
4539 if (Present (gnat_entity
))
4540 TYPE_NAME (record
) = create_concat_name (gnat_entity
, name_trailer
);
4542 /* If we were making a type, complete the original type and give it a
4545 create_type_decl (get_entity_name (gnat_entity
), type
,
4546 0, ! Comes_From_Source (gnat_entity
),
4547 ! (TYPE_NAME (type
) != 0
4548 && TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
4549 && DECL_IGNORED_P (TYPE_NAME (type
))));
4551 /* If we are changing the alignment and the input type is a record with
4552 BLKmode and a small constant size, try to make a form that has an
4553 integral mode. That might allow this record to have an integral mode,
4554 which will be much more efficient. There is no point in doing this if a
4555 size is specified unless it is also smaller than the biggest alignment
4556 and it is incorrect to do this if the size of the original type is not a
4557 multiple of the alignment. */
4559 && TREE_CODE (type
) == RECORD_TYPE
4560 && TYPE_MODE (type
) == BLKmode
4561 && host_integerp (orig_size
, 1)
4562 && compare_tree_int (orig_size
, BIGGEST_ALIGNMENT
) <= 0
4564 || (TREE_CODE (size
) == INTEGER_CST
4565 && compare_tree_int (size
, BIGGEST_ALIGNMENT
) <= 0))
4566 && tree_low_cst (orig_size
, 1) % align
== 0)
4567 type
= make_packable_type (type
);
4569 field
= create_field_decl (get_identifier ("F"), type
, record
, 0,
4570 NULL_TREE
, bitsize_zero_node
, 1);
4572 DECL_INTERNAL_P (field
) = 1;
4573 TYPE_SIZE (record
) = size
!= 0 ? size
: orig_size
;
4574 TYPE_SIZE_UNIT (record
)
4575 = convert (sizetype
,
4576 size_binop (CEIL_DIV_EXPR
, TYPE_SIZE (record
),
4577 bitsize_unit_node
));
4578 TYPE_ALIGN (record
) = align
;
4579 TYPE_IS_PADDING_P (record
) = 1;
4580 TYPE_VOLATILE (record
)
4581 = Present (gnat_entity
) && Is_Volatile (gnat_entity
);
4582 finish_record_type (record
, field
, 1, 0);
4584 /* Keep the RM_Size of the padded record as that of the old record
4586 TYPE_ADA_SIZE (record
) = same_rm_size
? size
: rm_size (type
);
4588 /* Unless debugging information isn't being written for the input type,
4589 write a record that shows what we are a subtype of and also make a
4590 variable that indicates our size, if variable. */
4591 if (TYPE_NAME (record
) != 0
4592 && AGGREGATE_TYPE_P (type
)
4593 && (TREE_CODE (TYPE_NAME (type
)) != TYPE_DECL
4594 || ! DECL_IGNORED_P (TYPE_NAME (type
))))
4596 tree marker
= make_node (RECORD_TYPE
);
4597 tree name
= DECL_NAME (TYPE_NAME (record
));
4598 tree orig_name
= TYPE_NAME (type
);
4600 if (TREE_CODE (orig_name
) == TYPE_DECL
)
4601 orig_name
= DECL_NAME (orig_name
);
4603 TYPE_NAME (marker
) = concat_id_with_name (name
, "XVS");
4604 finish_record_type (marker
,
4605 create_field_decl (orig_name
, integer_type_node
,
4606 marker
, 0, NULL_TREE
, NULL_TREE
,
4610 if (size
!= 0 && TREE_CODE (size
) != INTEGER_CST
&& definition
)
4611 create_var_decl (concat_id_with_name (name
, "XVZ"), NULL_TREE
,
4612 sizetype
, TYPE_SIZE (record
), 0, 0, 0, 0,
4618 if (TREE_CODE (orig_size
) != INTEGER_CST
4619 && contains_placeholder_p (orig_size
))
4620 orig_size
= max_size (orig_size
, 1);
4622 /* If the size was widened explicitly, maybe give a warning. */
4623 if (size
!= 0 && Present (gnat_entity
)
4624 && ! operand_equal_p (size
, orig_size
, 0)
4625 && ! (TREE_CODE (size
) == INTEGER_CST
4626 && TREE_CODE (orig_size
) == INTEGER_CST
4627 && tree_int_cst_lt (size
, orig_size
)))
4629 Node_Id gnat_error_node
= Empty
;
4631 if (Is_Packed_Array_Type (gnat_entity
))
4632 gnat_entity
= Associated_Node_For_Itype (gnat_entity
);
4634 if ((Ekind (gnat_entity
) == E_Component
4635 || Ekind (gnat_entity
) == E_Discriminant
)
4636 && Present (Component_Clause (gnat_entity
)))
4637 gnat_error_node
= Last_Bit (Component_Clause (gnat_entity
));
4638 else if (Present (Size_Clause (gnat_entity
)))
4639 gnat_error_node
= Expression (Size_Clause (gnat_entity
));
4641 /* Generate message only for entities that come from source, since
4642 if we have an entity created by expansion, the message will be
4643 generated for some other corresponding source entity. */
4644 if (Comes_From_Source (gnat_entity
) && Present (gnat_error_node
))
4645 post_error_ne_tree ("{^ }bits of & unused?", gnat_error_node
,
4647 size_diffop (size
, orig_size
));
4649 else if (*name_trailer
== 'C' && ! Is_Internal (gnat_entity
))
4650 post_error_ne_tree ("component of& padded{ by ^ bits}?",
4651 gnat_entity
, gnat_entity
,
4652 size_diffop (size
, orig_size
));
4658 /* Given a GNU tree and a GNAT list of choices, generate an expression to test
4659 the value passed against the list of choices. */
4662 choices_to_gnu (operand
, choices
)
4668 tree result
= integer_zero_node
;
4669 tree this_test
, low
= 0, high
= 0, single
= 0;
4671 for (choice
= First (choices
); Present (choice
); choice
= Next (choice
))
4673 switch (Nkind (choice
))
4676 low
= gnat_to_gnu (Low_Bound (choice
));
4677 high
= gnat_to_gnu (High_Bound (choice
));
4679 /* There's no good type to use here, so we might as well use
4680 integer_type_node. */
4682 = build_binary_op (TRUTH_ANDIF_EXPR
, integer_type_node
,
4683 build_binary_op (GE_EXPR
, integer_type_node
,
4685 build_binary_op (LE_EXPR
, integer_type_node
,
4690 case N_Subtype_Indication
:
4691 gnat_temp
= Range_Expression (Constraint (choice
));
4692 low
= gnat_to_gnu (Low_Bound (gnat_temp
));
4693 high
= gnat_to_gnu (High_Bound (gnat_temp
));
4696 = build_binary_op (TRUTH_ANDIF_EXPR
, integer_type_node
,
4697 build_binary_op (GE_EXPR
, integer_type_node
,
4699 build_binary_op (LE_EXPR
, integer_type_node
,
4704 case N_Expanded_Name
:
4705 /* This represents either a subtype range, an enumeration
4706 literal, or a constant Ekind says which. If an enumeration
4707 literal or constant, fall through to the next case. */
4708 if (Ekind (Entity (choice
)) != E_Enumeration_Literal
4709 && Ekind (Entity (choice
)) != E_Constant
)
4711 tree type
= gnat_to_gnu_type (Entity (choice
));
4713 low
= TYPE_MIN_VALUE (type
);
4714 high
= TYPE_MAX_VALUE (type
);
4717 = build_binary_op (TRUTH_ANDIF_EXPR
, integer_type_node
,
4718 build_binary_op (GE_EXPR
, integer_type_node
,
4720 build_binary_op (LE_EXPR
, integer_type_node
,
4724 /* ... fall through ... */
4725 case N_Character_Literal
:
4726 case N_Integer_Literal
:
4727 single
= gnat_to_gnu (choice
);
4728 this_test
= build_binary_op (EQ_EXPR
, integer_type_node
, operand
,
4732 case N_Others_Choice
:
4733 this_test
= integer_one_node
;
4740 result
= build_binary_op (TRUTH_ORIF_EXPR
, integer_type_node
,
4747 /* Return a GCC tree for a field corresponding to GNAT_FIELD to be
4748 placed in GNU_RECORD_TYPE.
4750 PACKED is 1 if the enclosing record is packed and -1 if the enclosing
4751 record has a Component_Alignment of Storage_Unit.
4753 DEFINITION is nonzero if this field is for a record being defined. */
4756 gnat_to_gnu_field (gnat_field
, gnu_record_type
, packed
, definition
)
4757 Entity_Id gnat_field
;
4758 tree gnu_record_type
;
4762 tree gnu_field_id
= get_entity_name (gnat_field
);
4763 tree gnu_field_type
= gnat_to_gnu_type (Etype (gnat_field
));
4764 tree gnu_orig_field_type
= gnu_field_type
;
4768 int needs_strict_alignment
4769 = (Is_Aliased (gnat_field
) || Strict_Alignment (Etype (gnat_field
))
4770 || Is_Volatile (gnat_field
));
4772 /* If this field requires strict alignment pretend it isn't packed. */
4773 if (needs_strict_alignment
)
4776 /* For packed records, this is one of the few occasions on which we use
4777 the official RM size for discrete or fixed-point components, instead
4778 of the normal GNAT size stored in Esize. See description in Einfo:
4779 "Handling of Type'Size Values" for further details. */
4782 gnu_size
= validate_size (RM_Size (Etype (gnat_field
)), gnu_field_type
,
4783 gnat_field
, FIELD_DECL
, 0, 1);
4785 if (Known_Static_Esize (gnat_field
))
4786 gnu_size
= validate_size (Esize (gnat_field
), gnu_field_type
,
4787 gnat_field
, FIELD_DECL
, 0, 1);
4789 /* If the field's type is a left-justified modular type, make the field
4790 the type of the inner object unless it is aliases. We don't need
4791 the the wrapper here and it can prevent packing. */
4792 if (! Is_Aliased (gnat_field
) && TREE_CODE (gnu_field_type
) == RECORD_TYPE
4793 && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_field_type
))
4794 gnu_field_type
= TREE_TYPE (TYPE_FIELDS (gnu_field_type
));
4796 /* If we are packing this record or we have a specified size that's
4797 smaller than that of the field type and the field type is also a record
4798 that's BLKmode and with a small constant size, see if we can get a
4799 better form of the type that allows more packing. If we can, show
4800 a size was specified for it if there wasn't one so we know to
4801 make this a bitfield and avoid making things wider. */
4802 if (TREE_CODE (gnu_field_type
) == RECORD_TYPE
4803 && TYPE_MODE (gnu_field_type
) == BLKmode
4804 && host_integerp (TYPE_SIZE (gnu_field_type
), 1)
4805 && compare_tree_int (TYPE_SIZE (gnu_field_type
), BIGGEST_ALIGNMENT
) <= 0
4807 || (gnu_size
!= 0 && tree_int_cst_lt (gnu_size
,
4808 TYPE_SIZE (gnu_field_type
)))))
4810 gnu_field_type
= make_packable_type (gnu_field_type
);
4812 if (gnu_field_type
!= gnu_orig_field_type
&& gnu_size
== 0)
4813 gnu_size
= rm_size (gnu_field_type
);
4816 if (Present (Component_Clause (gnat_field
)))
4818 gnu_pos
= UI_To_gnu (Component_Bit_Offset (gnat_field
), bitsizetype
);
4819 gnu_size
= validate_size (Esize (gnat_field
), gnu_field_type
,
4820 gnat_field
, FIELD_DECL
, 0, 1);
4822 /* Ensure the position does not overlap with the parent subtype,
4824 if (Present (Parent_Subtype (Underlying_Type (Scope (gnat_field
)))))
4827 = gnat_to_gnu_type (Parent_Subtype
4828 (Underlying_Type (Scope (gnat_field
))));
4830 if (TREE_CODE (TYPE_SIZE (gnu_parent
)) == INTEGER_CST
4831 && tree_int_cst_lt (gnu_pos
, TYPE_SIZE (gnu_parent
)))
4834 ("offset of& must be beyond parent{, minimum allowed is ^}",
4835 First_Bit (Component_Clause (gnat_field
)), gnat_field
,
4836 TYPE_SIZE_UNIT (gnu_parent
));
4840 /* If this field needs strict alignment, ensure the record is
4841 sufficiently aligned and that that position and size are
4842 consistent with the alignment. */
4843 if (needs_strict_alignment
)
4845 tree gnu_min_size
= round_up (rm_size (gnu_field_type
),
4846 TYPE_ALIGN (gnu_field_type
));
4848 TYPE_ALIGN (gnu_record_type
)
4849 = MAX (TYPE_ALIGN (gnu_record_type
), TYPE_ALIGN (gnu_field_type
));
4851 /* If Atomic, the size must match exactly and if aliased, the size
4852 must not be less than the rounded size. */
4853 if ((Is_Atomic (gnat_field
) || Is_Atomic (Etype (gnat_field
)))
4854 && ! operand_equal_p (gnu_size
, TYPE_SIZE (gnu_field_type
), 0))
4857 ("atomic field& must be natural size of type{ (^)}",
4858 Last_Bit (Component_Clause (gnat_field
)), gnat_field
,
4859 TYPE_SIZE (gnu_field_type
));
4864 else if (Is_Aliased (gnat_field
)
4866 && tree_int_cst_lt (gnu_size
, gnu_min_size
))
4869 ("size of aliased field& too small{, minimum required is ^}",
4870 Last_Bit (Component_Clause (gnat_field
)), gnat_field
,
4875 if (! integer_zerop (size_binop
4876 (TRUNC_MOD_EXPR
, gnu_pos
,
4877 bitsize_int (TYPE_ALIGN (gnu_field_type
)))))
4879 if (Is_Aliased (gnat_field
))
4881 ("position of aliased field& must be multiple of ^ bits",
4882 First_Bit (Component_Clause (gnat_field
)), gnat_field
,
4883 TYPE_ALIGN (gnu_field_type
));
4885 else if (Is_Volatile (gnat_field
))
4887 ("position of volatile field& must be multiple of ^ bits",
4888 First_Bit (Component_Clause (gnat_field
)), gnat_field
,
4889 TYPE_ALIGN (gnu_field_type
));
4891 else if (Strict_Alignment (Etype (gnat_field
)))
4893 ("position of & with aliased or tagged components not multiple of ^ bits",
4894 First_Bit (Component_Clause (gnat_field
)), gnat_field
,
4895 TYPE_ALIGN (gnu_field_type
));
4902 /* If an error set the size to zero, show we have no position
4908 if (Is_Atomic (gnat_field
))
4909 check_ok_for_atomic (gnu_field_type
, gnat_field
, 0);
4911 if (gnu_pos
!=0 && TYPE_MODE (gnu_field_type
) == BLKmode
4912 && (! integer_zerop (size_binop (TRUNC_MOD_EXPR
, gnu_pos
,
4913 bitsize_unit_node
))))
4915 /* Try to see if we can make this a packable type. If we
4917 if (TREE_CODE (gnu_field_type
) == RECORD_TYPE
)
4918 gnu_field_type
= make_packable_type (gnu_field_type
);
4920 if (TYPE_MODE (gnu_field_type
) == BLKmode
)
4922 post_error_ne ("fields of& must start at storage unit boundary",
4923 First_Bit (Component_Clause (gnat_field
)),
4924 Etype (gnat_field
));
4930 /* If the record has rep clauses and this is the tag field, make a rep
4931 clause for it as well. */
4932 else if (Has_Specified_Layout (Scope (gnat_field
))
4933 && Chars (gnat_field
) == Name_uTag
)
4935 gnu_pos
= bitsize_zero_node
;
4936 gnu_size
= TYPE_SIZE (gnu_field_type
);
4939 /* We need to make the size the maximum for the type if it is
4940 self-referential and an unconstrained type. In that case, we can't
4941 pack the field since we can't make a copy to align it. */
4942 if (TREE_CODE (gnu_field_type
) == RECORD_TYPE
4944 && ! TREE_CONSTANT (TYPE_SIZE (gnu_field_type
))
4945 && contains_placeholder_p (TYPE_SIZE (gnu_field_type
))
4946 && ! Is_Constrained (Underlying_Type (Etype (gnat_field
))))
4948 gnu_size
= max_size (TYPE_SIZE (gnu_field_type
), 1);
4952 /* If no size is specified (or if there was an error), don't specify a
4958 /* Unless this field is aliased, we can remove any left-justified
4959 modular type since it's only needed in the unchecked conversion
4960 case, which doesn't apply here. */
4961 if (! needs_strict_alignment
4962 && TREE_CODE (gnu_field_type
) == RECORD_TYPE
4963 && TYPE_LEFT_JUSTIFIED_MODULAR_P (gnu_field_type
))
4964 gnu_field_type
= TREE_TYPE (TYPE_FIELDS (gnu_field_type
));
4967 = make_type_from_size (gnu_field_type
, gnu_size
,
4968 Has_Biased_Representation (gnat_field
));
4969 gnu_field_type
= maybe_pad_type (gnu_field_type
, gnu_size
, 0,
4970 gnat_field
, "PAD", 0, definition
, 1);
4973 if (TREE_CODE (gnu_field_type
) == RECORD_TYPE
4974 && TYPE_CONTAINS_TEMPLATE_P (gnu_field_type
))
4977 set_lineno (gnat_field
, 0);
4978 gnu_field
= create_field_decl (gnu_field_id
, gnu_field_type
, gnu_record_type
,
4979 packed
, gnu_size
, gnu_pos
,
4980 Is_Aliased (gnat_field
));
4982 TREE_THIS_VOLATILE (gnu_field
) = Is_Volatile (gnat_field
);
4984 if (Ekind (gnat_field
) == E_Discriminant
)
4985 DECL_DISCRIMINANT_NUMBER (gnu_field
)
4986 = UI_To_gnu (Discriminant_Number (gnat_field
), sizetype
);
4991 /* Return a GCC tree for a record type given a GNAT Component_List and a chain
4992 of GCC trees for fields that are in the record and have already been
4993 processed. When called from gnat_to_gnu_entity during the processing of a
4994 record type definition, the GCC nodes for the discriminants will be on
4995 the chain. The other calls to this function are recursive calls from
4996 itself for the Component_List of a variant and the chain is empty.
4998 PACKED is 1 if this is for a record with "pragma pack" and -1 is this is
4999 for a record type with "pragma component_alignment (storage_unit)".
5001 FINISH_RECORD is nonzero if this call will supply all of the remaining
5002 fields of the record.
5004 P_GNU_REP_LIST, if nonzero, is a pointer to a list to which each field
5005 with a rep clause is to be added. If it is nonzero, that is all that
5006 should be done with such fields.
5008 CANCEL_ALIGNMENT, if nonzero, means the alignment should be zeroed
5009 before laying out the record. This means the alignment only serves
5010 to force fields to be bitfields, but not require the record to be
5011 that aligned. This is used for variants.
5013 ALL_REP, if nonzero, means that a rep clause was found for all the
5014 fields. This simplifies the logic since we know we're not in the mixed
5017 The processing of the component list fills in the chain with all of the
5018 fields of the record and then the record type is finished. */
5021 components_to_record (gnu_record_type
, component_list
, gnu_field_list
, packed
,
5022 definition
, p_gnu_rep_list
, cancel_alignment
, all_rep
)
5023 tree gnu_record_type
;
5024 Node_Id component_list
;
5025 tree gnu_field_list
;
5028 tree
*p_gnu_rep_list
;
5029 int cancel_alignment
;
5032 Node_Id component_decl
;
5033 Entity_Id gnat_field
;
5034 Node_Id variant_part
;
5036 tree gnu_our_rep_list
= NULL_TREE
;
5037 tree gnu_field
, gnu_last
;
5038 int layout_with_rep
= 0;
5040 /* For each variable within each component declaration create a GCC field
5041 and add it to the list, skipping any pragmas in the list. */
5043 if (Present (Component_Items (component_list
)))
5044 for (component_decl
= First_Non_Pragma (Component_Items (component_list
));
5045 Present (component_decl
);
5046 component_decl
= Next_Non_Pragma (component_decl
))
5048 gnat_field
= Defining_Entity (component_decl
);
5050 if (Chars (gnat_field
) == Name_uParent
)
5051 gnu_field
= tree_last (TYPE_FIELDS (gnu_record_type
));
5054 gnu_field
= gnat_to_gnu_field (gnat_field
, gnu_record_type
,
5055 packed
, definition
);
5057 /* If this is the _Tag field, put it before any discriminants,
5058 instead of after them as is the case for all other fields. */
5059 if (Chars (gnat_field
) == Name_uTag
)
5060 gnu_field_list
= chainon (gnu_field_list
, gnu_field
);
5063 TREE_CHAIN (gnu_field
) = gnu_field_list
;
5064 gnu_field_list
= gnu_field
;
5068 save_gnu_tree (gnat_field
, gnu_field
, 0);
5071 /* At the end of the component list there may be a variant part. */
5072 variant_part
= Variant_Part (component_list
);
5074 /* If this is an unchecked union, each variant must have exactly one
5075 component, each of which becomes one component of this union. */
5076 if (TREE_CODE (gnu_record_type
) == UNION_TYPE
&& Present (variant_part
))
5077 for (variant
= First_Non_Pragma (Variants (variant_part
));
5079 variant
= Next_Non_Pragma (variant
))
5082 = First_Non_Pragma (Component_Items (Component_List (variant
)));
5083 gnat_field
= Defining_Entity (component_decl
);
5084 gnu_field
= gnat_to_gnu_field (gnat_field
, gnu_record_type
, packed
,
5086 TREE_CHAIN (gnu_field
) = gnu_field_list
;
5087 gnu_field_list
= gnu_field
;
5088 save_gnu_tree (gnat_field
, gnu_field
, 0);
5091 /* We create a QUAL_UNION_TYPE for the variant part since the variants are
5092 mutually exclusive and should go in the same memory. To do this we need
5093 to treat each variant as a record whose elements are created from the
5094 component list for the variant. So here we create the records from the
5095 lists for the variants and put them all into the QUAL_UNION_TYPE. */
5096 else if (Present (variant_part
))
5098 tree gnu_discriminant
= gnat_to_gnu (Name (variant_part
));
5100 tree gnu_union_type
= make_node (QUAL_UNION_TYPE
);
5101 tree gnu_union_field
;
5102 tree gnu_variant_list
= NULL_TREE
;
5103 tree gnu_name
= TYPE_NAME (gnu_record_type
);
5105 = concat_id_with_name
5106 (get_identifier (Get_Name_String (Chars (Name (variant_part
)))),
5109 if (TREE_CODE (gnu_name
) == TYPE_DECL
)
5110 gnu_name
= DECL_NAME (gnu_name
);
5112 TYPE_NAME (gnu_union_type
)
5113 = concat_id_with_name (gnu_name
, IDENTIFIER_POINTER (gnu_var_name
));
5114 TYPE_PACKED (gnu_union_type
) = TYPE_PACKED (gnu_record_type
);
5116 for (variant
= First_Non_Pragma (Variants (variant_part
));
5118 variant
= Next_Non_Pragma (variant
))
5120 tree gnu_variant_type
= make_node (RECORD_TYPE
);
5121 tree gnu_inner_name
;
5124 Get_Variant_Encoding (variant
);
5125 gnu_inner_name
= get_identifier (Name_Buffer
);
5126 TYPE_NAME (gnu_variant_type
)
5127 = concat_id_with_name (TYPE_NAME (gnu_union_type
),
5128 IDENTIFIER_POINTER (gnu_inner_name
));
5130 /* Set the alignment of the inner type in case we need to make
5131 inner objects into bitfields, but then clear it out
5132 so the record actually gets only the alignment required. */
5133 TYPE_ALIGN (gnu_variant_type
) = TYPE_ALIGN (gnu_record_type
);
5134 TYPE_PACKED (gnu_variant_type
) = TYPE_PACKED (gnu_record_type
);
5135 components_to_record (gnu_variant_type
, Component_List (variant
),
5136 NULL_TREE
, packed
, definition
,
5137 &gnu_our_rep_list
, 1, all_rep
);
5139 gnu_qual
= choices_to_gnu (gnu_discriminant
,
5140 Discrete_Choices (variant
));
5142 Set_Present_Expr (variant
, annotate_value (gnu_qual
));
5143 gnu_field
= create_field_decl (gnu_inner_name
, gnu_variant_type
,
5144 gnu_union_type
, 0, 0, 0, 1);
5145 DECL_INTERNAL_P (gnu_field
) = 1;
5146 DECL_QUALIFIER (gnu_field
) = gnu_qual
;
5147 TREE_CHAIN (gnu_field
) = gnu_variant_list
;
5148 gnu_variant_list
= gnu_field
;
5151 /* We can delete any empty variants from the end. This may leave none
5152 left. Note we cannot delete variants from anywhere else. */
5153 while (gnu_variant_list
!= 0
5154 && TYPE_FIELDS (TREE_TYPE (gnu_variant_list
)) == 0)
5155 gnu_variant_list
= TREE_CHAIN (gnu_variant_list
);
5157 /* Only make the QUAL_UNION_TYPE if there are any non-empty variants. */
5158 if (gnu_variant_list
!= 0)
5160 finish_record_type (gnu_union_type
, nreverse (gnu_variant_list
),
5164 = create_field_decl (gnu_var_name
, gnu_union_type
, gnu_record_type
,
5166 all_rep
? TYPE_SIZE (gnu_union_type
) : 0,
5167 all_rep
? bitsize_zero_node
: 0, 1);
5169 DECL_INTERNAL_P (gnu_union_field
) = 1;
5170 TREE_CHAIN (gnu_union_field
) = gnu_field_list
;
5171 gnu_field_list
= gnu_union_field
;
5175 /* Scan GNU_FIELD_LIST and see if any fields have rep clauses. If they
5176 do, pull them out and put them into GNU_OUR_REP_LIST. We have to do this
5177 in a separate pass since we want to handle the discriminants but can't
5178 play with them until we've used them in debugging data above.
5180 ??? Note: if we then reorder them, debugging information will be wrong,
5181 but there's nothing that can be done about this at the moment. */
5183 for (gnu_field
= gnu_field_list
, gnu_last
= 0; gnu_field
; )
5185 if (DECL_FIELD_OFFSET (gnu_field
) != 0)
5187 tree gnu_next
= TREE_CHAIN (gnu_field
);
5190 gnu_field_list
= gnu_next
;
5192 TREE_CHAIN (gnu_last
) = gnu_next
;
5194 TREE_CHAIN (gnu_field
) = gnu_our_rep_list
;
5195 gnu_our_rep_list
= gnu_field
;
5196 gnu_field
= gnu_next
;
5200 gnu_last
= gnu_field
;
5201 gnu_field
= TREE_CHAIN (gnu_field
);
5205 /* If we have any items in our rep'ed field list, it is not the case that all
5206 the fields in the record have rep clauses, and P_REP_LIST is nonzero,
5207 set it and ignore the items. Otherwise, sort the fields by bit position
5208 and put them into their own record if we have any fields without
5210 if (gnu_our_rep_list
!= 0 && p_gnu_rep_list
!= 0 && ! all_rep
)
5211 *p_gnu_rep_list
= chainon (*p_gnu_rep_list
, gnu_our_rep_list
);
5212 else if (gnu_our_rep_list
!= 0)
5215 = gnu_field_list
== 0 ? gnu_record_type
: make_node (RECORD_TYPE
);
5216 int len
= list_length (gnu_our_rep_list
);
5217 tree
*gnu_arr
= (tree
*) alloca (sizeof (tree
) * len
);
5220 /* Set DECL_SECTION_NAME to increasing integers so we have a
5222 for (i
= 0, gnu_field
= gnu_our_rep_list
; gnu_field
;
5223 gnu_field
= TREE_CHAIN (gnu_field
), i
++)
5225 gnu_arr
[i
] = gnu_field
;
5226 DECL_SECTION_NAME (gnu_field
) = size_int (i
);
5229 qsort (gnu_arr
, len
, sizeof (tree
), compare_field_bitpos
);
5231 /* Put the fields in the list in order of increasing position, which
5232 means we start from the end. */
5233 gnu_our_rep_list
= NULL_TREE
;
5234 for (i
= len
- 1; i
>= 0; i
--)
5236 TREE_CHAIN (gnu_arr
[i
]) = gnu_our_rep_list
;
5237 gnu_our_rep_list
= gnu_arr
[i
];
5238 DECL_CONTEXT (gnu_arr
[i
]) = gnu_rep_type
;
5239 DECL_SECTION_NAME (gnu_arr
[i
]) = 0;
5242 if (gnu_field_list
!= 0)
5244 finish_record_type (gnu_rep_type
, gnu_our_rep_list
, 1, 0);
5245 gnu_field
= create_field_decl (get_identifier ("REP"), gnu_rep_type
,
5246 gnu_record_type
, 0, 0, 0, 1);
5247 DECL_INTERNAL_P (gnu_field
) = 1;
5248 gnu_field_list
= chainon (gnu_field_list
, gnu_field
);
5252 layout_with_rep
= 1;
5253 gnu_field_list
= nreverse (gnu_our_rep_list
);
5257 if (cancel_alignment
)
5258 TYPE_ALIGN (gnu_record_type
) = 0;
5260 finish_record_type (gnu_record_type
, nreverse (gnu_field_list
),
5261 layout_with_rep
, 0);
5264 /* Called via qsort from the above. Returns -1, 1, depending on the
5265 bit positions and ordinals of the two fields. */
5268 compare_field_bitpos (rt1
, rt2
)
5272 tree
*t1
= (tree
*) rt1
;
5273 tree
*t2
= (tree
*) rt2
;
5275 if (tree_int_cst_equal (bit_position (*t1
), bit_position (*t2
)))
5277 (tree_int_cst_lt (DECL_SECTION_NAME (*t1
), DECL_SECTION_NAME (*t2
))
5279 else if (tree_int_cst_lt (bit_position (*t1
), bit_position (*t2
)))
5285 /* Given GNU_SIZE, a GCC tree representing a size, return a Uint to be
5286 placed into an Esize, Component_Bit_Offset, or Component_Size value
5287 in the GNAT tree. */
5290 annotate_value (gnu_size
)
5293 int len
= TREE_CODE_LENGTH (TREE_CODE (gnu_size
));
5295 Node_Ref_Or_Val ops
[3];
5299 /* If we do not return inside this switch, TCODE will be set to the
5300 code to use for a Create_Node operand and LEN (set above) will be
5301 the number of recursive calls for us to make. */
5303 switch (TREE_CODE (gnu_size
))
5306 if (TREE_OVERFLOW (gnu_size
))
5309 /* This may have come from a conversion from some smaller type,
5310 so ensure this is in bitsizetype. */
5311 gnu_size
= convert (bitsizetype
, gnu_size
);
5313 /* For negative values, use NEGATE_EXPR of the supplied value. */
5314 if (tree_int_cst_sgn (gnu_size
) < 0)
5316 /* The rediculous code below is to handle the case of the largest
5317 negative integer. */
5318 tree negative_size
= size_diffop (bitsize_zero_node
, gnu_size
);
5322 if (TREE_CONSTANT_OVERFLOW (negative_size
))
5325 = size_binop (MINUS_EXPR
, bitsize_zero_node
,
5326 size_binop (PLUS_EXPR
, gnu_size
,
5331 temp
= build1 (NEGATE_EXPR
, bitsizetype
, negative_size
);
5333 temp
= build (MINUS_EXPR
, bitsizetype
, temp
, bitsize_one_node
);
5335 return annotate_value (temp
);
5338 if (! host_integerp (gnu_size
, 1))
5341 size
= tree_low_cst (gnu_size
, 1);
5343 /* This peculiar test is to make sure that the size fits in an int
5344 on machines where HOST_WIDE_INT is not "int". */
5345 if (tree_low_cst (gnu_size
, 1) == size
)
5346 return UI_From_Int (size
);
5351 /* The only case we handle here is a simple discriminant reference. */
5352 if (TREE_CODE (TREE_OPERAND (gnu_size
, 0)) == PLACEHOLDER_EXPR
5353 && TREE_CODE (TREE_OPERAND (gnu_size
, 1)) == FIELD_DECL
5354 && DECL_DISCRIMINANT_NUMBER (TREE_OPERAND (gnu_size
, 1)) != 0)
5355 return Create_Node (Discrim_Val
,
5356 annotate_value (DECL_DISCRIMINANT_NUMBER
5357 (TREE_OPERAND (gnu_size
, 1))),
5362 case NOP_EXPR
: case CONVERT_EXPR
: case NON_LVALUE_EXPR
:
5363 return annotate_value (TREE_OPERAND (gnu_size
, 0));
5365 /* Now just list the operations we handle. */
5366 case COND_EXPR
: tcode
= Cond_Expr
; break;
5367 case PLUS_EXPR
: tcode
= Plus_Expr
; break;
5368 case MINUS_EXPR
: tcode
= Minus_Expr
; break;
5369 case MULT_EXPR
: tcode
= Mult_Expr
; break;
5370 case TRUNC_DIV_EXPR
: tcode
= Trunc_Div_Expr
; break;
5371 case CEIL_DIV_EXPR
: tcode
= Ceil_Div_Expr
; break;
5372 case FLOOR_DIV_EXPR
: tcode
= Floor_Div_Expr
; break;
5373 case TRUNC_MOD_EXPR
: tcode
= Trunc_Mod_Expr
; break;
5374 case CEIL_MOD_EXPR
: tcode
= Ceil_Mod_Expr
; break;
5375 case FLOOR_MOD_EXPR
: tcode
= Floor_Mod_Expr
; break;
5376 case EXACT_DIV_EXPR
: tcode
= Exact_Div_Expr
; break;
5377 case NEGATE_EXPR
: tcode
= Negate_Expr
; break;
5378 case MIN_EXPR
: tcode
= Min_Expr
; break;
5379 case MAX_EXPR
: tcode
= Max_Expr
; break;
5380 case ABS_EXPR
: tcode
= Abs_Expr
; break;
5381 case TRUTH_ANDIF_EXPR
: tcode
= Truth_Andif_Expr
; break;
5382 case TRUTH_ORIF_EXPR
: tcode
= Truth_Orif_Expr
; break;
5383 case TRUTH_AND_EXPR
: tcode
= Truth_And_Expr
; break;
5384 case TRUTH_OR_EXPR
: tcode
= Truth_Or_Expr
; break;
5385 case TRUTH_XOR_EXPR
: tcode
= Truth_Xor_Expr
; break;
5386 case TRUTH_NOT_EXPR
: tcode
= Truth_Not_Expr
; break;
5387 case LT_EXPR
: tcode
= Lt_Expr
; break;
5388 case LE_EXPR
: tcode
= Le_Expr
; break;
5389 case GT_EXPR
: tcode
= Gt_Expr
; break;
5390 case GE_EXPR
: tcode
= Ge_Expr
; break;
5391 case EQ_EXPR
: tcode
= Eq_Expr
; break;
5392 case NE_EXPR
: tcode
= Ne_Expr
; break;
5398 /* Now get each of the operands that's relevant for this code. If any
5399 cannot be expressed as a repinfo node, say we can't. */
5400 for (i
= 0; i
< 3; i
++)
5403 for (i
= 0; i
< len
; i
++)
5405 ops
[i
] = annotate_value (TREE_OPERAND (gnu_size
, i
));
5406 if (ops
[i
] == No_Uint
)
5410 return Create_Node (tcode
, ops
[0], ops
[1], ops
[2]);
5413 /* Given GNAT_ENTITY, a record type, and GNU_TYPE, its corresponding
5414 GCC type, set Component_Bit_Offset and Esize to the position and size
5418 annotate_rep (gnat_entity
, gnu_type
)
5419 Entity_Id gnat_entity
;
5424 Entity_Id gnat_field
;
5426 /* We operate by first making a list of all field and their positions
5427 (we can get the sizes easily at any time) by a recursive call
5428 and then update all the sizes into the tree. */
5429 gnu_list
= compute_field_positions (gnu_type
, NULL_TREE
,
5430 size_zero_node
, bitsize_zero_node
,
5433 for (gnat_field
= First_Entity (gnat_entity
); Present (gnat_field
);
5434 gnat_field
= Next_Entity (gnat_field
))
5435 if ((Ekind (gnat_field
) == E_Component
5436 || (Ekind (gnat_field
) == E_Discriminant
5437 && ! Is_Unchecked_Union (Scope (gnat_field
))))
5438 && 0 != (gnu_entry
= purpose_member (gnat_to_gnu_entity (gnat_field
,
5442 Set_Component_Bit_Offset
5444 annotate_value (bit_from_pos
5445 (TREE_PURPOSE (TREE_VALUE (gnu_entry
)),
5446 TREE_VALUE (TREE_VALUE
5447 (TREE_VALUE (gnu_entry
))))));
5449 Set_Esize (gnat_field
,
5450 annotate_value (DECL_SIZE (TREE_PURPOSE (gnu_entry
))));
5454 /* Scan all fields in GNU_TYPE and build entries where TREE_PURPOSE is the
5455 FIELD_DECL and TREE_VALUE a TREE_LIST with TREE_PURPOSE being the byte
5456 position and TREE_VALUE being a TREE_LIST with TREE_PURPOSE the value to be
5457 placed into DECL_OFFSET_ALIGN and TREE_VALUE the bit position. GNU_POS is
5458 to be added to the position, GNU_BITPOS to the bit position, OFFSET_ALIGN is
5459 the present value of DECL_OFFSET_ALIGN and GNU_LIST is a list of the entries
5463 compute_field_positions (gnu_type
, gnu_list
, gnu_pos
, gnu_bitpos
, offset_align
)
5468 unsigned int offset_align
;
5471 tree gnu_result
= gnu_list
;
5473 for (gnu_field
= TYPE_FIELDS (gnu_type
); gnu_field
;
5474 gnu_field
= TREE_CHAIN (gnu_field
))
5476 tree gnu_our_bitpos
= size_binop (PLUS_EXPR
, gnu_bitpos
,
5477 DECL_FIELD_BIT_OFFSET (gnu_field
));
5478 tree gnu_our_offset
= size_binop (PLUS_EXPR
, gnu_pos
,
5479 DECL_FIELD_OFFSET (gnu_field
));
5480 unsigned int our_offset_align
5481 = MIN (offset_align
, DECL_OFFSET_ALIGN (gnu_field
));
5484 = tree_cons (gnu_field
,
5485 tree_cons (gnu_our_offset
,
5486 tree_cons (size_int (our_offset_align
),
5487 gnu_our_bitpos
, NULL_TREE
),
5491 if (DECL_INTERNAL_P (gnu_field
))
5493 = compute_field_positions (TREE_TYPE (gnu_field
), gnu_result
,
5494 gnu_our_offset
, gnu_our_bitpos
,
5501 /* UINT_SIZE is a Uint giving the specified size for an object of GNU_TYPE
5502 corresponding to GNAT_OBJECT. If size is valid, return a tree corresponding
5503 to its value. Otherwise return 0. KIND is VAR_DECL is we are specifying
5504 the size for an object, TYPE_DECL for the size of a type, and FIELD_DECL
5505 for the size of a field. COMPONENT_P is true if we are being called
5506 to process the Component_Size of GNAT_OBJECT. This is used for error
5507 message handling and to indicate to use the object size of GNU_TYPE.
5508 ZERO_OK is nonzero if a size of zero is permitted; if ZERO_OK is zero,
5509 it means that a size of zero should be treated as an unspecified size. */
5512 validate_size (uint_size
, gnu_type
, gnat_object
, kind
, component_p
, zero_ok
)
5515 Entity_Id gnat_object
;
5516 enum tree_code kind
;
5520 Node_Id gnat_error_node
;
5522 = kind
== VAR_DECL
? TYPE_SIZE (gnu_type
) : rm_size (gnu_type
);
5525 if (type_size
!= 0 && TREE_CODE (type_size
) != INTEGER_CST
5526 && contains_placeholder_p (type_size
))
5527 type_size
= max_size (type_size
, 1);
5529 if (TYPE_FAT_POINTER_P (gnu_type
))
5530 type_size
= bitsize_int (POINTER_SIZE
);
5532 if ((Ekind (gnat_object
) == E_Component
5533 || Ekind (gnat_object
) == E_Discriminant
)
5534 && Present (Component_Clause (gnat_object
)))
5535 gnat_error_node
= Last_Bit (Component_Clause (gnat_object
));
5536 else if (Present (Size_Clause (gnat_object
)))
5537 gnat_error_node
= Expression (Size_Clause (gnat_object
));
5539 gnat_error_node
= gnat_object
;
5541 /* Don't give errors on packed array types; we'll be giving the error on
5542 the type itself soon enough. */
5543 if (Is_Packed_Array_Type (gnat_object
))
5544 gnat_error_node
= Empty
;
5546 /* Get the size as a tree. Return 0 if none was specified, either because
5547 Esize was not Present or if the specified size was zero. Give an error
5548 if a size was specified, but cannot be represented as in sizetype. If
5549 the size is negative, it was a back-annotation of a variable size and
5550 should be treated as not specified. */
5551 if (No (uint_size
) || uint_size
== No_Uint
)
5554 size
= UI_To_gnu (uint_size
, bitsizetype
);
5555 if (TREE_OVERFLOW (size
))
5558 post_error_ne ("component size of & is too large",
5559 gnat_error_node
, gnat_object
);
5561 post_error_ne ("size of & is too large", gnat_error_node
, gnat_object
);
5566 /* Ignore a negative size since that corresponds to our back-annotation.
5567 Also ignore a zero size unless a size clause exists. */
5568 else if (tree_int_cst_sgn (size
) < 0 || (integer_zerop (size
) && ! zero_ok
))
5571 /* The size of objects is always a multiple of a byte. */
5572 if (kind
== VAR_DECL
5573 && ! integer_zerop (size_binop (TRUNC_MOD_EXPR
, size
,
5574 bitsize_unit_node
)))
5577 post_error_ne ("component size for& is not a multiple of Storage_Unit",
5578 gnat_error_node
, gnat_object
);
5580 post_error_ne ("size for& is not a multiple of Storage_Unit",
5581 gnat_error_node
, gnat_object
);
5585 /* If this is an integral type, the front-end has verified the size, so we
5586 need not do it here (which would entail checking against the bounds).
5587 However, if this is an aliased object, it may not be smaller than the
5588 type of the object. */
5589 if (INTEGRAL_TYPE_P (gnu_type
) && ! TYPE_PACKED_ARRAY_TYPE_P (gnu_type
)
5590 && ! (kind
== VAR_DECL
&& Is_Aliased (gnat_object
)))
5593 /* If the object is a record that contains a template, add the size of
5594 the template to the specified size. */
5595 if (TREE_CODE (gnu_type
) == RECORD_TYPE
5596 && TYPE_CONTAINS_TEMPLATE_P (gnu_type
))
5597 size
= size_binop (PLUS_EXPR
, DECL_SIZE (TYPE_FIELDS (gnu_type
)), size
);
5599 /* If the size of the object is a constant, the new size must not be
5601 if (TREE_CODE (type_size
) != INTEGER_CST
5602 || TREE_OVERFLOW (type_size
)
5603 || tree_int_cst_lt (size
, type_size
))
5607 ("component size for& too small{, minimum allowed is ^}",
5608 gnat_error_node
, gnat_object
, type_size
);
5610 post_error_ne_tree ("size for& too small{, minimum allowed is ^}",
5611 gnat_error_node
, gnat_object
, type_size
);
5613 if (kind
== VAR_DECL
&& ! component_p
5614 && TREE_CODE (rm_size (gnu_type
)) == INTEGER_CST
5615 && ! tree_int_cst_lt (size
, rm_size (gnu_type
)))
5616 post_error_ne_tree_2
5617 ("\\size of ^ is not a multiple of alignment (^ bits)",
5618 gnat_error_node
, gnat_object
, rm_size (gnu_type
),
5619 TYPE_ALIGN (gnu_type
));
5621 else if (INTEGRAL_TYPE_P (gnu_type
))
5622 post_error_ne ("\\size would be legal if & were not aliased!",
5623 gnat_error_node
, gnat_object
);
5631 /* Similarly, but both validate and process a value of RM_Size. This
5632 routine is only called for types. */
5635 set_rm_size (uint_size
, gnu_type
, gnat_entity
)
5638 Entity_Id gnat_entity
;
5640 /* Only give an error if a Value_Size clause was explicitly given.
5641 Otherwise, we'd be duplicating an error on the Size clause. */
5642 Node_Id gnat_attr_node
5643 = Get_Attribute_Definition_Clause (gnat_entity
, Attr_Value_Size
);
5644 tree old_size
= rm_size (gnu_type
);
5647 /* Get the size as a tree. Do nothing if none was specified, either
5648 because RM_Size was not Present or if the specified size was zero.
5649 Give an error if a size was specified, but cannot be represented as
5651 if (No (uint_size
) || uint_size
== No_Uint
)
5654 size
= UI_To_gnu (uint_size
, bitsizetype
);
5655 if (TREE_OVERFLOW (size
))
5657 if (Present (gnat_attr_node
))
5658 post_error_ne ("Value_Size of & is too large", gnat_attr_node
,
5664 /* Ignore a negative size since that corresponds to our back-annotation.
5665 Also ignore a zero size unless a size clause exists, a Value_Size
5666 clause exists, or this is an integer type, in which case the
5667 front end will have always set it. */
5668 else if (tree_int_cst_sgn (size
) < 0
5669 || (integer_zerop (size
) && No (gnat_attr_node
)
5670 && ! Has_Size_Clause (gnat_entity
)
5671 && ! Is_Discrete_Or_Fixed_Point_Type (gnat_entity
)))
5674 /* If the old size is self-referential, get the maximum size. */
5675 if (TREE_CODE (old_size
) != INTEGER_CST
5676 && contains_placeholder_p (old_size
))
5677 old_size
= max_size (old_size
, 1);
5679 /* If the size of the object is a constant, the new size must not be
5680 smaller (the front end checks this for scalar types). */
5681 if (TREE_CODE (old_size
) != INTEGER_CST
5682 || TREE_OVERFLOW (old_size
)
5683 || (AGGREGATE_TYPE_P (gnu_type
)
5684 && tree_int_cst_lt (size
, old_size
)))
5686 if (Present (gnat_attr_node
))
5688 ("Value_Size for& too small{, minimum allowed is ^}",
5689 gnat_attr_node
, gnat_entity
, old_size
);
5694 /* Otherwise, set the RM_Size. */
5695 if (TREE_CODE (gnu_type
) == INTEGER_TYPE
5696 && Is_Discrete_Or_Fixed_Point_Type (gnat_entity
))
5697 TYPE_RM_SIZE_INT (gnu_type
) = size
;
5698 else if (TREE_CODE (gnu_type
) == ENUMERAL_TYPE
)
5699 TYPE_RM_SIZE_ENUM (gnu_type
) = size
;
5700 else if ((TREE_CODE (gnu_type
) == RECORD_TYPE
5701 || TREE_CODE (gnu_type
) == UNION_TYPE
5702 || TREE_CODE (gnu_type
) == QUAL_UNION_TYPE
)
5703 && ! TYPE_IS_FAT_POINTER_P (gnu_type
))
5704 TYPE_ADA_SIZE (gnu_type
) = size
;
5707 /* Given a type TYPE, return a new type whose size is appropriate for SIZE.
5708 If TYPE is the best type, return it. Otherwise, make a new type. We
5709 only support new integral and pointer types. BIASED_P is nonzero if
5710 we are making a biased type. */
5713 make_type_from_size (type
, size_tree
, biased_p
)
5719 unsigned HOST_WIDE_INT size
;
5721 /* If size indicates an error, just return TYPE to avoid propagating the
5722 error. Likewise if it's too large to represent. */
5723 if (size_tree
== 0 || ! host_integerp (size_tree
, 1))
5726 size
= tree_low_cst (size_tree
, 1);
5727 switch (TREE_CODE (type
))
5731 /* Only do something if the type is not already the proper size and is
5732 not a packed array type. */
5733 if (TYPE_PACKED_ARRAY_TYPE_P (type
)
5734 || (TYPE_PRECISION (type
) == size
5735 && biased_p
== (TREE_CODE (type
) == INTEGER_CST
5736 && TYPE_BIASED_REPRESENTATION_P (type
))))
5739 size
= MIN (size
, LONG_LONG_TYPE_SIZE
);
5740 new_type
= make_signed_type (size
);
5741 TREE_TYPE (new_type
)
5742 = TREE_TYPE (type
) != 0 ? TREE_TYPE (type
) : type
;
5743 TYPE_MIN_VALUE (new_type
)
5744 = convert (TREE_TYPE (new_type
), TYPE_MIN_VALUE (type
));
5745 TYPE_MAX_VALUE (new_type
)
5746 = convert (TREE_TYPE (new_type
), TYPE_MAX_VALUE (type
));
5747 TYPE_BIASED_REPRESENTATION_P (new_type
)
5748 = ((TREE_CODE (type
) == INTEGER_TYPE
5749 && TYPE_BIASED_REPRESENTATION_P (type
))
5751 TREE_UNSIGNED (new_type
)
5752 = TREE_UNSIGNED (type
) | TYPE_BIASED_REPRESENTATION_P (new_type
);
5753 TYPE_RM_SIZE_INT (new_type
) = bitsize_int (size
);
5757 /* Do something if this is a fat pointer, in which case we
5758 may need to return the thin pointer. */
5759 if (TYPE_IS_FAT_POINTER_P (type
) && size
< POINTER_SIZE
* 2)
5762 (TYPE_OBJECT_RECORD_TYPE (TYPE_UNCONSTRAINED_ARRAY (type
)));
5766 /* Only do something if this is a thin pointer, in which case we
5767 may need to return the fat pointer. */
5768 if (TYPE_THIN_POINTER_P (type
) && size
>= POINTER_SIZE
* 2)
5770 build_pointer_type (TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type
)));
5781 /* ALIGNMENT is a Uint giving the alignment specified for GNAT_ENTITY,
5782 a type or object whose present alignment is ALIGN. If this alignment is
5783 valid, return it. Otherwise, give an error and return ALIGN. */
5786 validate_alignment (alignment
, gnat_entity
, align
)
5788 Entity_Id gnat_entity
;
5791 Node_Id gnat_error_node
= gnat_entity
;
5792 unsigned int new_align
;
5794 #ifndef MAX_OFILE_ALIGNMENT
5795 #define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
5798 if (Present (Alignment_Clause (gnat_entity
)))
5799 gnat_error_node
= Expression (Alignment_Clause (gnat_entity
));
5801 /* Don't worry about checking alignment if alignment was not specified
5802 by the source program and we already posted an error for this entity. */
5804 if (Error_Posted (gnat_entity
) && !Has_Alignment_Clause (gnat_entity
))
5807 /* Within GCC, an alignment is an integer, so we must make sure a
5808 value is specified that fits in that range. Also, alignments of
5809 more than MAX_OFILE_ALIGNMENT can't be supported. */
5811 if (! UI_Is_In_Int_Range (alignment
)
5812 || ((new_align
= UI_To_Int (alignment
))
5813 > MAX_OFILE_ALIGNMENT
/ BITS_PER_UNIT
))
5814 post_error_ne_num ("largest supported alignment for& is ^",
5815 gnat_error_node
, gnat_entity
,
5816 MAX_OFILE_ALIGNMENT
/ BITS_PER_UNIT
);
5817 else if (! (Present (Alignment_Clause (gnat_entity
))
5818 && From_At_Mod (Alignment_Clause (gnat_entity
)))
5819 && new_align
* BITS_PER_UNIT
< align
)
5820 post_error_ne_num ("alignment for& must be at least ^",
5821 gnat_error_node
, gnat_entity
,
5822 align
/ BITS_PER_UNIT
);
5824 align
= MAX (align
, new_align
== 0 ? 1 : new_align
* BITS_PER_UNIT
);
5829 /* Verify that OBJECT, a type or decl, is something we can implement
5830 atomically. If not, give an error for GNAT_ENTITY. COMP_P is nonzero
5831 if we require atomic components. */
5834 check_ok_for_atomic (object
, gnat_entity
, comp_p
)
5836 Entity_Id gnat_entity
;
5839 Node_Id gnat_error_point
= gnat_entity
;
5841 enum machine_mode mode
;
5845 /* There are three case of what OBJECT can be. It can be a type, in which
5846 case we take the size, alignment and mode from the type. It can be a
5847 declaration that was indirect, in which case the relevant values are
5848 that of the type being pointed to, or it can be a normal declaration,
5849 in which case the values are of the decl. The code below assumes that
5850 OBJECT is either a type or a decl. */
5851 if (TYPE_P (object
))
5853 mode
= TYPE_MODE (object
);
5854 align
= TYPE_ALIGN (object
);
5855 size
= TYPE_SIZE (object
);
5857 else if (DECL_BY_REF_P (object
))
5859 mode
= TYPE_MODE (TREE_TYPE (TREE_TYPE (object
)));
5860 align
= TYPE_ALIGN (TREE_TYPE (TREE_TYPE (object
)));
5861 size
= TYPE_SIZE (TREE_TYPE (TREE_TYPE (object
)));
5865 mode
= DECL_MODE (object
);
5866 align
= DECL_ALIGN (object
);
5867 size
= DECL_SIZE (object
);
5870 /* Consider all floating-point types atomic and any types that that are
5871 represented by integers no wider than a machine word. */
5872 if (GET_MODE_CLASS (mode
) == MODE_FLOAT
5873 || ((GET_MODE_CLASS (mode
) == MODE_INT
5874 || GET_MODE_CLASS (mode
) == MODE_PARTIAL_INT
)
5875 && GET_MODE_BITSIZE (mode
) <= BITS_PER_WORD
))
5878 /* For the moment, also allow anything that has an alignment equal
5879 to its size and which is smaller than a word. */
5880 if (TREE_CODE (size
) == INTEGER_CST
5881 && compare_tree_int (size
, align
) == 0
5882 && align
<= BITS_PER_WORD
)
5885 for (gnat_node
= First_Rep_Item (gnat_entity
); Present (gnat_node
);
5886 gnat_node
= Next_Rep_Item (gnat_node
))
5888 if (! comp_p
&& Nkind (gnat_node
) == N_Pragma
5889 && Get_Pragma_Id (Chars (gnat_node
)) == Pragma_Atomic
)
5890 gnat_error_point
= First (Pragma_Argument_Associations (gnat_node
));
5891 else if (comp_p
&& Nkind (gnat_node
) == N_Pragma
5892 && (Get_Pragma_Id (Chars (gnat_node
))
5893 == Pragma_Atomic_Components
))
5894 gnat_error_point
= First (Pragma_Argument_Associations (gnat_node
));
5898 post_error_ne ("atomic access to component of & cannot be guaranteed",
5899 gnat_error_point
, gnat_entity
);
5901 post_error_ne ("atomic access to & cannot be guaranteed",
5902 gnat_error_point
, gnat_entity
);
5905 /* Given a type T, a FIELD_DECL F, and a replacement value R,
5906 return a new type with all size expressions that contain F
5907 updated by replacing F with R. This is identical to GCC's
5908 substitute_in_type except that it knows about TYPE_INDEX_TYPE.
5909 If F is NULL_TREE, always make a new RECORD_TYPE, even if nothing has
5913 gnat_substitute_in_type (t
, f
, r
)
5919 switch (TREE_CODE (t
))
5925 if ((TREE_CODE (TYPE_MIN_VALUE (t
)) != INTEGER_CST
5926 && contains_placeholder_p (TYPE_MIN_VALUE (t
)))
5927 || (TREE_CODE (TYPE_MAX_VALUE (t
)) != INTEGER_CST
5928 && contains_placeholder_p (TYPE_MAX_VALUE (t
))))
5930 tree low
= substitute_in_expr (TYPE_MIN_VALUE (t
), f
, r
);
5931 tree high
= substitute_in_expr (TYPE_MAX_VALUE (t
), f
, r
);
5933 if (low
== TYPE_MIN_VALUE (t
) && high
== TYPE_MAX_VALUE (t
))
5936 new = build_range_type (TREE_TYPE (t
), low
, high
);
5937 if (TYPE_INDEX_TYPE (t
))
5938 TYPE_INDEX_TYPE (new)
5939 = gnat_substitute_in_type (TYPE_INDEX_TYPE (t
), f
, r
);
5946 if ((TYPE_MIN_VALUE (t
) != 0
5947 && TREE_CODE (TYPE_MIN_VALUE (t
)) != REAL_CST
5948 && contains_placeholder_p (TYPE_MIN_VALUE (t
)))
5949 || (TYPE_MAX_VALUE (t
) != 0
5950 && TREE_CODE (TYPE_MAX_VALUE (t
)) != REAL_CST
5951 && contains_placeholder_p (TYPE_MAX_VALUE (t
))))
5953 tree low
= 0, high
= 0;
5955 if (TYPE_MIN_VALUE (t
))
5956 low
= substitute_in_expr (TYPE_MIN_VALUE (t
), f
, r
);
5957 if (TYPE_MAX_VALUE (t
))
5958 high
= substitute_in_expr (TYPE_MAX_VALUE (t
), f
, r
);
5960 if (low
== TYPE_MIN_VALUE (t
) && high
== TYPE_MAX_VALUE (t
))
5964 TYPE_MIN_VALUE (t
) = low
;
5965 TYPE_MAX_VALUE (t
) = high
;
5970 tem
= gnat_substitute_in_type (TREE_TYPE (t
), f
, r
);
5971 if (tem
== TREE_TYPE (t
))
5974 return build_complex_type (tem
);
5982 /* Don't know how to do these yet. */
5987 tree component
= gnat_substitute_in_type (TREE_TYPE (t
), f
, r
);
5988 tree domain
= gnat_substitute_in_type (TYPE_DOMAIN (t
), f
, r
);
5990 if (component
== TREE_TYPE (t
) && domain
== TYPE_DOMAIN (t
))
5993 new = build_array_type (component
, domain
);
5994 TYPE_SIZE (new) = 0;
5995 TYPE_MULTI_ARRAY_P (new) = TYPE_MULTI_ARRAY_P (t
);
5996 TYPE_CONVENTION_FORTRAN_P (new) = TYPE_CONVENTION_FORTRAN_P (t
);
5998 TYPE_ALIGN (new) = TYPE_ALIGN (t
);
6004 case QUAL_UNION_TYPE
:
6008 = (f
== NULL_TREE
&& ! TREE_CONSTANT (TYPE_SIZE (t
)));
6009 int field_has_rep
= 0;
6010 tree last_field
= 0;
6012 tree
new = copy_type (t
);
6014 /* Start out with no fields, make new fields, and chain them
6015 in. If we haven't actually changed the type of any field,
6016 discard everything we've done and return the old type. */
6018 TYPE_FIELDS (new) = 0;
6019 TYPE_SIZE (new) = 0;
6021 for (field
= TYPE_FIELDS (t
); field
;
6022 field
= TREE_CHAIN (field
))
6024 tree new_field
= copy_node (field
);
6026 TREE_TYPE (new_field
)
6027 = gnat_substitute_in_type (TREE_TYPE (new_field
), f
, r
);
6029 if (DECL_HAS_REP_P (field
) && ! DECL_INTERNAL_P (field
))
6031 else if (TREE_TYPE (new_field
) != TREE_TYPE (field
))
6034 /* If this is an internal field and the type of this field is
6035 a UNION_TYPE or RECORD_TYPE with no elements, ignore it. If
6036 the type just has one element, treat that as the field.
6037 But don't do this if we are processing a QUAL_UNION_TYPE. */
6038 if (TREE_CODE (t
) != QUAL_UNION_TYPE
6039 && DECL_INTERNAL_P (new_field
)
6040 && (TREE_CODE (TREE_TYPE (new_field
)) == UNION_TYPE
6041 || TREE_CODE (TREE_TYPE (new_field
)) == RECORD_TYPE
))
6043 if (TYPE_FIELDS (TREE_TYPE (new_field
)) == 0)
6046 if (TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new_field
))) == 0)
6049 = copy_node (TYPE_FIELDS (TREE_TYPE (new_field
)));
6051 /* Make sure omitting the union doesn't change
6053 DECL_ALIGN (next_new_field
) = DECL_ALIGN (new_field
);
6054 new_field
= next_new_field
;
6058 DECL_CONTEXT (new_field
) = new;
6059 DECL_ORIGINAL_FIELD (new_field
)
6060 = DECL_ORIGINAL_FIELD (field
) != 0
6061 ? DECL_ORIGINAL_FIELD (field
) : field
;
6063 /* If the size of the old field was set at a constant,
6064 propagate the size in case the type's size was variable.
6065 (This occurs in the case of a variant or discriminated
6066 record with a default size used as a field of another
6068 DECL_SIZE (new_field
)
6069 = TREE_CODE (DECL_SIZE (field
)) == INTEGER_CST
6070 ? DECL_SIZE (field
) : 0;
6071 DECL_SIZE_UNIT (new_field
)
6072 = TREE_CODE (DECL_SIZE_UNIT (field
)) == INTEGER_CST
6073 ? DECL_SIZE_UNIT (field
) : 0;
6075 if (TREE_CODE (t
) == QUAL_UNION_TYPE
)
6077 tree new_q
= substitute_in_expr (DECL_QUALIFIER (field
), f
, r
);
6079 if (new_q
!= DECL_QUALIFIER (new_field
))
6082 /* Do the substitution inside the qualifier and if we find
6083 that this field will not be present, omit it. */
6084 DECL_QUALIFIER (new_field
) = new_q
;
6086 if (integer_zerop (DECL_QUALIFIER (new_field
)))
6090 if (last_field
== 0)
6091 TYPE_FIELDS (new) = new_field
;
6093 TREE_CHAIN (last_field
) = new_field
;
6095 last_field
= new_field
;
6097 /* If this is a qualified type and this field will always be
6098 present, we are done. */
6099 if (TREE_CODE (t
) == QUAL_UNION_TYPE
6100 && integer_onep (DECL_QUALIFIER (new_field
)))
6104 /* If this used to be a qualified union type, but we now know what
6105 field will be present, make this a normal union. */
6106 if (changed_field
&& TREE_CODE (new) == QUAL_UNION_TYPE
6107 && (TYPE_FIELDS (new) == 0
6108 || integer_onep (DECL_QUALIFIER (TYPE_FIELDS (new)))))
6109 TREE_SET_CODE (new, UNION_TYPE
);
6110 else if (! changed_field
)
6118 /* If the size was originally a constant use it. */
6119 if (TYPE_SIZE (t
) != 0 && TREE_CODE (TYPE_SIZE (t
)) == INTEGER_CST
6120 && TREE_CODE (TYPE_SIZE (new)) != INTEGER_CST
)
6122 TYPE_SIZE (new) = TYPE_SIZE (t
);
6123 TYPE_SIZE_UNIT (new) = TYPE_SIZE_UNIT (t
);
6124 TYPE_ADA_SIZE (new) = TYPE_ADA_SIZE (t
);
6135 /* Return the "RM size" of GNU_TYPE. This is the actual number of bits
6136 needed to represent the object. */
6142 /* For integer types, this is the precision. For record types, we store
6143 the size explicitly. For other types, this is just the size. */
6145 if (INTEGRAL_TYPE_P (gnu_type
) && TYPE_RM_SIZE (gnu_type
) != 0)
6146 return TYPE_RM_SIZE (gnu_type
);
6147 else if (TREE_CODE (gnu_type
) == RECORD_TYPE
6148 && TYPE_CONTAINS_TEMPLATE_P (gnu_type
))
6149 /* Return the rm_size of the actual data plus the size of the template. */
6151 size_binop (PLUS_EXPR
,
6152 rm_size (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type
)))),
6153 DECL_SIZE (TYPE_FIELDS (gnu_type
)));
6154 else if ((TREE_CODE (gnu_type
) == RECORD_TYPE
6155 || TREE_CODE (gnu_type
) == UNION_TYPE
6156 || TREE_CODE (gnu_type
) == QUAL_UNION_TYPE
)
6157 && ! TYPE_IS_FAT_POINTER_P (gnu_type
)
6158 && TYPE_ADA_SIZE (gnu_type
) != 0)
6159 return TYPE_ADA_SIZE (gnu_type
);
6161 return TYPE_SIZE (gnu_type
);
6164 /* Return an identifier representing the external name to be used for
6165 GNAT_ENTITY. If SUFFIX is specified, the name is followed by "___"
6166 and the specified suffix. */
6169 create_concat_name (gnat_entity
, suffix
)
6170 Entity_Id gnat_entity
;
6173 const char *str
= (suffix
== 0 ? "" : suffix
);
6174 String_Template temp
= {1, strlen (str
)};
6175 Fat_Pointer fp
= {str
, &temp
};
6177 Get_External_Name_With_Suffix (gnat_entity
, fp
);
6179 return get_identifier (Name_Buffer
);
6182 /* Return the name to be used for GNAT_ENTITY. If a type, create a
6183 fully-qualified name, possibly with type information encoding.
6184 Otherwise, return the name. */
6187 get_entity_name (gnat_entity
)
6188 Entity_Id gnat_entity
;
6190 Get_Encoded_Name (gnat_entity
);
6191 return get_identifier (Name_Buffer
);
6194 /* Given GNU_ID, an IDENTIFIER_NODE containing a name and SUFFIX, a
6195 string, return a new IDENTIFIER_NODE that is the concatenation of
6196 the name in GNU_ID and SUFFIX. */
6199 concat_id_with_name (gnu_id
, suffix
)
6203 int len
= IDENTIFIER_LENGTH (gnu_id
);
6205 strncpy (Name_Buffer
, IDENTIFIER_POINTER (gnu_id
),
6206 IDENTIFIER_LENGTH (gnu_id
));
6207 strncpy (Name_Buffer
+ len
, "___", 3);
6209 strcpy (Name_Buffer
+ len
, suffix
);
6210 return get_identifier (Name_Buffer
);