diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2007-11-23 11:11:04 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2007-11-23 11:11:04 +0000 |
commit | 5102fac5feb4262e4ea4bf771d8bc5a3f14812ed (patch) | |
tree | 6fe9b17c7454584b3d6e48dd0f922cde410bfd9c /gcc/ada/decl.c | |
parent | 96d9bb07adf360fd685c102467798ba47de254a4 (diff) | |
download | gcc-5102fac5feb4262e4ea4bf771d8bc5a3f14812ed.zip gcc-5102fac5feb4262e4ea4bf771d8bc5a3f14812ed.tar.gz gcc-5102fac5feb4262e4ea4bf771d8bc5a3f14812ed.tar.bz2 |
decl.c (ceil_alignment): New function.
* decl.c (ceil_alignment): New function.
(gnat_to_gnu_entity): Use it to set the alignment on atomic types.
(make_packable_type): Likewise.
From-SVN: r130373
Diffstat (limited to 'gcc/ada/decl.c')
-rw-r--r-- | gcc/ada/decl.c | 28 |
1 files changed, 15 insertions, 13 deletions
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 |