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  <ebotca...@adacore.com>

        * 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;

Reply via email to