]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* gcc-interface/decl.c (gnat_to_gnu_entity): Translate the Esize on
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Jun 2012 08:02:35 +0000 (08:02 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Jun 2012 08:02:35 +0000 (08:02 +0000)
entry only for elementary types and abort if it is too large.
<E_Record_Type>: Make sure the Esize is known before using it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188378 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index 98d10084b277ca8a84adcee50634fe3ba2c505b4..dcd94738647e2a5400055708aa7efba661d5bfe1 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2012-06-04  Steven Bosscher  <steven@gcc.gnu.org>
 
        * gcc-interface/utils2.c: Do not include output.h.
index 76c960fee4b6a9f4ef31261c797b1e501939703e..1c7f337b38f9c2cf424d4f1dd82338f6f08958e1 100644 (file)
@@ -377,11 +377,12 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
        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_entity, tree gnu_expr, int definition)
        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;