diff options
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 19 |
2 files changed, 17 insertions, 8 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 98d1008..dcd9473 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -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. diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 76c960f..1c7f337 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -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; |