summaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2012-06-11 08:02:35 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2012-06-11 08:02:35 +0000
commit5382f1ddfd72fe17dbbccad21ab19777b0401b68 (patch)
treec5323547beeb6dc6bdf7344aedec86de9f171cc2 /gcc/ada/gcc-interface
parente4a2c33969f47a21b171735ebf9d06be9de837a0 (diff)
downloadgcc-5382f1ddfd72fe17dbbccad21ab19777b0401b68.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188378 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/gcc-interface')
-rw-r--r--gcc/ada/gcc-interface/decl.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 76c960fee4b..1c7f337b38f 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;