[Ada] Adjust Esize processing in gigi

Submitted by Eric Botcazou on June 11, 2012, 7:58 a.m.

Details

Message ID 201206110958.23264.ebotcazou@adacore.com
State New
Headers show

Commit Message

Eric Botcazou June 11, 2012, 7:58 a.m.
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  <ebotcazou@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.

Patch hide | download patch | download mbox

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;