From: ebotcazou Date: Fri, 23 Nov 2007 11:11:04 +0000 (+0000) Subject: * decl.c (ceil_alignment): New function. X-Git-Tag: upstream/4.9.2~44948 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7a5493c8ff51da7478979b38ba9835fd3f79a6cb;p=platform%2Fupstream%2Flinaro-gcc.git * decl.c (ceil_alignment): New function. (gnat_to_gnu_entity): Use it to set the alignment on atomic types. (make_packable_type): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130373 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 67e7105..79ce81c 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2007-11-23 Eric Botcazou + + * decl.c (ceil_alignment): New function. + (gnat_to_gnu_entity): Use it to set the alignment on atomic types. + (make_packable_type): Likewise. + 2007-11-22 Olivier Hainque * trans.c (gnat_to_gnu) : Reformat lines diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index fdb39f2..20b65d2 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -113,6 +113,7 @@ static tree validate_size (Uint, tree, Entity_Id, enum tree_code, bool, bool); static void set_rm_size (Uint, tree, Entity_Id); static tree make_type_from_size (tree, tree, bool); static unsigned int validate_alignment (Uint, Entity_Id, unsigned int); +static unsigned int ceil_alignment (unsigned HOST_WIDE_INT); static void check_ok_for_atomic (tree, Entity_Id, bool); static int compatible_signatures_p (tree ftype1, tree ftype2); @@ -645,9 +646,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) /* If this is an atomic object with no specified size and alignment, but where the size of the type is a constant, set the alignment to - the lowest power of two greater than the size, or to the - biggest meaningful alignment, whichever is smaller. */ - + the smallest not less than the size, or to the biggest meaningful + alignment, whichever is smaller. */ if (Is_Atomic (gnat_entity) && !gnu_size && align == 0 && TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST) { @@ -656,10 +656,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) BIGGEST_ALIGNMENT)) align = BIGGEST_ALIGNMENT; else - align = ((unsigned int) 1 - << (floor_log2 (tree_low_cst - (TYPE_SIZE (gnu_type), 1) - 1) - + 1)); + align = ceil_alignment (tree_low_cst (TYPE_SIZE (gnu_type), 1)); } /* If the object is set to have atomic components, find the component @@ -734,7 +731,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) || (Is_Exported (gnat_entity) /* Exclude exported constants created by the compiler, which should boil down to static dispatch tables and - make it possible to put them in read-only memory.  */ + make it possible to put them in read-only memory. */ && (Comes_From_Source (gnat_entity) || !const_flag)) || Is_Imported (gnat_entity) || Present (Address_Clause (gnat_entity))) @@ -2468,8 +2465,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) = 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 - : 1 << (floor_log2 (esize - 1) + 1)); + = esize >= BITS_PER_WORD ? BITS_PER_WORD : ceil_alignment (esize); else TYPE_ALIGN (gnu_type) = 0; @@ -5208,9 +5204,7 @@ make_packable_type (tree type) TYPE_SIZE_UNIT (new_type) = TYPE_SIZE_UNIT (type); } - TYPE_ALIGN (new_type) - = ((HOST_WIDE_INT) 1 - << (floor_log2 (tree_low_cst (TYPE_SIZE (type), 1) - 1) + 1)); + TYPE_ALIGN (new_type) = ceil_alignment (tree_low_cst (TYPE_SIZE (type), 1)); TYPE_USER_ALIGN (new_type) = 1; /* Now copy the fields, keeping the position and size. */ @@ -6783,6 +6777,14 @@ validate_alignment (Uint alignment, Entity_Id gnat_entity, unsigned int align) return align; } + +/* Return the smallest alignment not less than SIZE. */ + +static unsigned int +ceil_alignment (unsigned HOST_WIDE_INT size) +{ + return (unsigned int) 1 << (floor_log2 (size - 1) + 1); +} /* Verify that OBJECT, a type or decl, is something we can implement atomically. If not, give an error for GNAT_ENTITY. COMP_P is true