This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Minor code refactoring
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 23 Nov 2007 12:11:28 +0100
- Subject: [Ada] Minor code refactoring
Bootstrapped/regtested on i586-suse-linux, applied on the mainline.
2007-11-23 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (ceil_alignment): New function.
(gnat_to_gnu_entity): Use it to set the alignment on atomic types.
(make_packable_type): Likewise.
--
Eric Botcazou
Index: decl.c
===================================================================
--- decl.c (revision 130341)
+++ decl.c (working copy)
@@ -113,6 +113,7 @@ static tree validate_size (Uint, tree, E
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_entit
/* 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_entit
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
@@ -2468,8 +2465,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
= 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, Enti
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