This makes it so that the size of types (Esize) is retrieved early and properly
capped for elementary types, in order to avoid obscure failures later on for
huge sizes. Nothing is changed for composite types.
Tested on i586-suse-linux, applied on the mainline.
2012-06-11 Eric Botcazou <[email protected]>
* gcc-interface/decl.c (gnat_to_gnu_entity): Translate the Esize on
entry only for elementary types and abort if it is too large.
<E_Record_Type>: Make sure the Esize is known before using it.
--
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c (revision 188377)
+++ gcc-interface/decl.c (working copy)
@@ -377,11 +377,12 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
prepend_attributes (First_Subtype (Base_Type (gnat_entity)),
&attr_list);
- /* Compute a default value for the size of the type. */
- if (Known_Esize (gnat_entity)
- && UI_Is_In_Int_Range (Esize (gnat_entity)))
+ /* Compute a default value for the size of an elementary type. */
+ if (Known_Esize (gnat_entity) && Is_Elementary_Type (gnat_entity))
{
unsigned int max_esize;
+
+ gcc_assert (UI_Is_In_Int_Range (Esize (gnat_entity)));
esize = UI_To_Int (Esize (gnat_entity));
if (IN (kind, Float_Kind))
@@ -2948,14 +2949,16 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
if (Known_Alignment (gnat_entity))
TYPE_ALIGN (gnu_type)
= validate_alignment (Alignment (gnat_entity), gnat_entity, 0);
- else if (Is_Atomic (gnat_entity))
- TYPE_ALIGN (gnu_type)
- = esize >= BITS_PER_WORD ? BITS_PER_WORD : ceil_pow2 (esize);
+ else if (Is_Atomic (gnat_entity) && Known_Esize (gnat_entity))
+ {
+ unsigned int size = UI_To_Int (Esize (gnat_entity));
+ TYPE_ALIGN (gnu_type)
+ = size >= BITS_PER_WORD ? BITS_PER_WORD : ceil_pow2 (size);
+ }
/* If a type needs strict alignment, the minimum size will be the
type size instead of the RM size (see validate_size). Cap the
alignment, lest it causes this type size to become too large. */
- else if (Strict_Alignment (gnat_entity)
- && Known_RM_Size (gnat_entity))
+ else if (Strict_Alignment (gnat_entity) && Known_RM_Size (gnat_entity))
{
unsigned int raw_size = UI_To_Int (RM_Size (gnat_entity));
unsigned int raw_align = raw_size & -raw_size;