Commit 0d858698 by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): If an alignment is specified, do not promote that…

decl.c (gnat_to_gnu_entity): If an alignment is specified, do not promote that of the component type beyond it.

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: If an
	alignment is specified, do not promote that of the component type
	beyond it.
	<E_Array_Subtype>: Likewise.

From-SVN: r146670
parent 6216f94e
2009-04-24 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: If an
alignment is specified, do not promote that of the component type
beyond it.
<E_Array_Subtype>: Likewise.
2009-04-23 Eric Botcazou <ebotcazou@adacore.com> 2009-04-23 Eric Botcazou <ebotcazou@adacore.com>
* einfo.ads (Is_True_Constant): Lift restriction on atomic objects. * einfo.ads (Is_True_Constant): Lift restriction on atomic objects.
......
...@@ -1957,11 +1957,28 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -1957,11 +1957,28 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity)) if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity))
{ {
tree orig_tem; tree orig_tem = tem;
unsigned int max_align;
/* If an alignment is specified, use it as a cap on the component
type so that it can be honored for the whole type. But ignore
it for the original type of packed array types. */
if (No (Packed_Array_Type (gnat_entity))
&& Known_Alignment (gnat_entity))
max_align = validate_alignment (Alignment (gnat_entity),
gnat_entity, 0);
else
max_align = 0;
tem = make_type_from_size (tem, gnu_comp_size, false); tem = make_type_from_size (tem, gnu_comp_size, false);
orig_tem = tem; if (max_align > 0 && TYPE_ALIGN (tem) > max_align)
tem = orig_tem;
else
orig_tem = tem;
tem = maybe_pad_type (tem, gnu_comp_size, 0, gnat_entity, tem = maybe_pad_type (tem, gnu_comp_size, 0, gnat_entity,
"C_PAD", false, definition, true); "C_PAD", false, definition, true);
/* If a padding record was made, declare it now since it will /* If a padding record was made, declare it now since it will
never be declared otherwise. This is necessary to ensure never be declared otherwise. This is necessary to ensure
that its subtrees are properly marked. */ that its subtrees are properly marked. */
...@@ -2343,13 +2360,31 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -2343,13 +2360,31 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity)) if (gnu_comp_size && !Is_Bit_Packed_Array (gnat_entity))
{ {
tree orig_gnu_type; tree orig_gnu_type = gnu_type;
unsigned int max_align;
/* If an alignment is specified, use it as a cap on the
component type so that it can be honored for the whole
type. But ignore it for the original type of packed
array types. */
if (No (Packed_Array_Type (gnat_entity))
&& Known_Alignment (gnat_entity))
max_align = validate_alignment (Alignment (gnat_entity),
gnat_entity, 0);
else
max_align = 0;
gnu_type gnu_type
= make_type_from_size (gnu_type, gnu_comp_size, false); = make_type_from_size (gnu_type, gnu_comp_size, false);
orig_gnu_type = gnu_type; if (max_align > 0 && TYPE_ALIGN (gnu_type) > max_align)
gnu_type = orig_gnu_type;
else
orig_gnu_type = gnu_type;
gnu_type = maybe_pad_type (gnu_type, gnu_comp_size, 0, gnu_type = maybe_pad_type (gnu_type, gnu_comp_size, 0,
gnat_entity, "C_PAD", false, gnat_entity, "C_PAD", false,
definition, true); definition, true);
/* If a padding record was made, declare it now since it /* If a padding record was made, declare it now since it
will never be declared otherwise. This is necessary will never be declared otherwise. This is necessary
to ensure that its subtrees are properly marked. */ to ensure that its subtrees are properly marked. */
......
2009-04-24 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/pr34799.ads: Rename to rep_clause1.ads.
* gnat.dg/specs/rep_clause2.ads: New test.
2009-04-24 Jakub Jelinek <jakub@redhat.com> 2009-04-24 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/39794 PR rtl-optimization/39794
......
-- { dg-do compile } -- { dg-do compile }
-- { dg-options "-gnatwa" } -- { dg-options "-gnatwa" }
package PR34799 is package Rep_Clause1 is
generic generic
type Custom_T is private; type Custom_T is private;
package Handler is package Handler is
...@@ -16,4 +16,4 @@ package PR34799 is ...@@ -16,4 +16,4 @@ package PR34799 is
B at 1 range 0..0; B at 1 range 0..0;
end record; end record;
end Handler; end Handler;
end PR34799; end Rep_Clause1;
-- { dg-do compile }
-- { dg-options "-gnatws" }
package Rep_Clause2 is
type S is new String;
for S'Component_Size use 256;
type T is new S(1..8);
end Rep_Clause2;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment