decl.c (gnat_to_gnu_entity): Add support for scalar types with small alignment.

* decl.c (gnat_to_gnu_entity) <E_Signed_Integer_Subtype>: Add support
	for scalar types with small alignment.

From-SVN: r133027
This commit is contained in:
Eric Botcazou 2008-03-08 11:10:18 +00:00 committed by Eric Botcazou
parent 563569be5e
commit 66abe22c07
4 changed files with 76 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2008-03-08 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (gnat_to_gnu_entity) <E_Signed_Integer_Subtype>: Add support
for scalar types with small alignment.
2008-03-08 Eric Botcazou <ebotcazou@adacore.com>
* trans.c (Loop_Statement_to_gnu): Set the SLOC of the loop label

View File

@ -1520,6 +1520,45 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
copy_alias_set (gnu_type, gnu_field_type);
}
/* If the type we are dealing with has got a smaller alignment than the
natural one, we need to wrap it up in a record type and under-align
the latter. We reuse the padding machinery for this purpose. */
else if (Known_Alignment (gnat_entity)
&& UI_Is_In_Int_Range (Alignment (gnat_entity))
&& (align = UI_To_Int (Alignment (gnat_entity)) * BITS_PER_UNIT)
&& align < TYPE_ALIGN (gnu_type))
{
tree gnu_field_type = gnu_type;
tree gnu_field;
gnu_type = make_node (RECORD_TYPE);
TYPE_NAME (gnu_type) = create_concat_name (gnat_entity, "PAD");
TYPE_ALIGN (gnu_type) = align;
TYPE_PACKED (gnu_type) = 1;
/* Create a stripped-down declaration of the original type, mainly
for debugging. */
create_type_decl (get_entity_name (gnat_entity), gnu_field_type,
NULL, true, debug_info_p, gnat_entity);
/* Don't notify the field as "addressable", since we won't be taking
it's address and it would prevent create_field_decl from making a
bitfield. */
gnu_field = create_field_decl (get_identifier ("OBJECT"),
gnu_field_type, gnu_type, 1, 0, 0, 0);
finish_record_type (gnu_type, gnu_field, 0, false);
TYPE_IS_PADDING_P (gnu_type) = 1;
SET_TYPE_ADA_SIZE (gnu_type, bitsize_int (esize));
copy_alias_set (gnu_type, gnu_field_type);
}
/* Otherwise reset the alignment lest we computed it above. */
else
align = 0;
break;
case E_Floating_Point_Type:

View File

@ -1,3 +1,7 @@
2008-03-08 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/small_alignment.adb: New test.
2008-03-07 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/alignment2.ads: New test.

View File

@ -0,0 +1,28 @@
-- { dg-do run }
-- { dg-options "-gnatws" }
procedure Small_Alignment is
type My_Integer is new Integer;
for My_Integer'Alignment use 1;
function Set_A return My_Integer is
begin
return 12;
end;
function Set_B return My_Integer is
begin
return 6;
end;
C : Character;
A : My_Integer := Set_A;
B : My_Integer := Set_B;
begin
A := A * B / 2;
if A /= 36 then
raise Program_Error;
end if;
end;