Commit dea976c4 by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): Do not promote the alignment if this doesn't…

decl.c (gnat_to_gnu_entity): Do not promote the alignment if this doesn't prevent BLKmode access to the object.

	* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Do not promote
	the alignment if this doesn't prevent BLKmode access to the object.

From-SVN: r179167
parent 960dcaf5
2011-09-25 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Do not promote
the alignment if this doesn't prevent BLKmode access to the object.
2011-09-24 Iain Sandoe <iains@gcc.gnu.org> 2011-09-24 Iain Sandoe <iains@gcc.gnu.org>
* gcc-interface/Makefile.in (darwin): Do not issue the * gcc-interface/Makefile.in (darwin): Do not issue the
......
...@@ -817,16 +817,30 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -817,16 +817,30 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
&& No (Address_Clause (gnat_entity)))) && No (Address_Clause (gnat_entity))))
&& TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST) && TREE_CODE (TYPE_SIZE (gnu_type)) == INTEGER_CST)
{ {
/* No point in jumping through all the hoops needed in order unsigned int size_cap, align_cap;
/* No point in promoting the alignment if this doesn't prevent
BLKmode access to the object, in particular block copy, as
this will for example disable the NRV optimization for it.
No point in jumping through all the hoops needed in order
to support BIGGEST_ALIGNMENT if we don't really have to. to support BIGGEST_ALIGNMENT if we don't really have to.
So we cap to the smallest alignment that corresponds to So we cap to the smallest alignment that corresponds to
a known efficient memory access pattern of the target. */ a known efficient memory access pattern of the target. */
unsigned int align_cap = Is_Atomic (gnat_entity) if (Is_Atomic (gnat_entity))
? BIGGEST_ALIGNMENT {
: get_mode_alignment (ptr_mode); size_cap = UINT_MAX;
align_cap = BIGGEST_ALIGNMENT;
}
else
{
size_cap = MAX_FIXED_MODE_SIZE;
align_cap = get_mode_alignment (ptr_mode);
}
if (!host_integerp (TYPE_SIZE (gnu_type), 1) if (!host_integerp (TYPE_SIZE (gnu_type), 1)
|| compare_tree_int (TYPE_SIZE (gnu_type), align_cap) >= 0) || compare_tree_int (TYPE_SIZE (gnu_type), size_cap) > 0)
align = 0;
else if (compare_tree_int (TYPE_SIZE (gnu_type), align_cap) > 0)
align = align_cap; align = align_cap;
else else
align = ceil_alignment (tree_low_cst (TYPE_SIZE (gnu_type), 1)); align = ceil_alignment (tree_low_cst (TYPE_SIZE (gnu_type), 1));
......
2011-09-25 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/frame_overflow.ads: New.
* gnat.dg/frame_overflow.adb: Adjust.
* gnat.dg/specs/addr1.ads: Likewise.
2011-09-25 Jakub Jelinek <jakub@redhat.com> 2011-09-25 Jakub Jelinek <jakub@redhat.com>
* g++.dg/tree-ssa/restrict2.C: New test. * g++.dg/tree-ssa/restrict2.C: New test.
......
-- { dg-do compile } -- { dg-do compile }
with System; package body Frame_Overflow is
procedure frame_overflow is function -- { dg-error "too large" }
type Bitpos_Range_T is range 1..2**(System.Word_Size-1)-1;
type Bitmap_Array_T is array (Bitpos_Range_T) of Boolean;
type Bitmap_T is record
Bits : Bitmap_Array_T := (others => False);
end record;
function
Set_In (Bitmap : Bitmap_T; Bitpos : Bitpos_Range_T) return Bitmap_T Set_In (Bitmap : Bitmap_T; Bitpos : Bitpos_Range_T) return Bitmap_T
is is
Result: Bitmap_T := Bitmap; -- { dg-error "Storage_Error" } Result: Bitmap_T := Bitmap;
begin begin
Result.Bits (Bitpos) := True; Result.Bits (Bitpos) := True;
return Result; return Result;
end; end;
function Negate (Bitmap : Bitmap_T) return Bitmap_T is function -- { dg-error "too large" }
Result: Bitmap_T; -- { dg-error "Storage_Error" } Negate (Bitmap : Bitmap_T) return Bitmap_T
is
Result: Bitmap_T;
begin begin
for E in Bitpos_Range_T loop for E in Bitpos_Range_T loop
Result.Bits (E) := not Bitmap.Bits (E); Result.Bits (E) := not Bitmap.Bits (E);
...@@ -29,6 +22,4 @@ procedure frame_overflow is ...@@ -29,6 +22,4 @@ procedure frame_overflow is
return Result; return Result;
end; end;
begin end Frame_Overflow;
null;
end;
with System;
package Frame_Overflow is
type Bitpos_Range_T is range 1..2**(System.Word_Size-1)-1;
type Bitmap_Array_T is array (Bitpos_Range_T) of Boolean;
type Bitmap_T is record
Bits : Bitmap_Array_T := (others => False);
end record;
function
Set_In (Bitmap : Bitmap_T; Bitpos : Bitpos_Range_T) return Bitmap_T;
function Negate (Bitmap : Bitmap_T) return Bitmap_T;
end Frame_Overflow;
...@@ -15,7 +15,7 @@ package Addr1 is ...@@ -15,7 +15,7 @@ package Addr1 is
end record; end record;
for Rec2'Size use 64; for Rec2'Size use 64;
A: Arr (1 .. 12); A: Arr (1 .. 4);
Obj1: Rec1; Obj1: Rec1;
for Obj1'Address use A'Address; -- { dg-bogus "alignment" } for Obj1'Address use A'Address; -- { dg-bogus "alignment" }
......
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