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
This commit is contained in:
Eric Botcazou 2011-09-25 15:42:00 +00:00 committed by Eric Botcazou
parent 960dcaf528
commit dea976c480
6 changed files with 56 additions and 23 deletions

View File

@ -1,3 +1,8 @@
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>
* gcc-interface/Makefile.in (darwin): Do not issue the

View File

@ -817,16 +817,30 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
&& No (Address_Clause (gnat_entity))))
&& 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.
So we cap to the smallest alignment that corresponds to
a known efficient memory access pattern of the target. */
unsigned int align_cap = Is_Atomic (gnat_entity)
? BIGGEST_ALIGNMENT
: get_mode_alignment (ptr_mode);
if (Is_Atomic (gnat_entity))
{
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)
|| 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;
else
align = ceil_alignment (tree_low_cst (TYPE_SIZE (gnu_type), 1));

View File

@ -1,3 +1,9 @@
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>
* g++.dg/tree-ssa/restrict2.C: New test.

View File

@ -1,27 +1,20 @@
-- { dg-do compile }
with System;
package body Frame_Overflow is
procedure 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
function -- { dg-error "too large" }
Set_In (Bitmap : Bitmap_T; Bitpos : Bitpos_Range_T) return Bitmap_T
is
Result: Bitmap_T := Bitmap; -- { dg-error "Storage_Error" }
Result: Bitmap_T := Bitmap;
begin
Result.Bits (Bitpos) := True;
return Result;
end;
function Negate (Bitmap : Bitmap_T) return Bitmap_T is
Result: Bitmap_T; -- { dg-error "Storage_Error" }
function -- { dg-error "too large" }
Negate (Bitmap : Bitmap_T) return Bitmap_T
is
Result: Bitmap_T;
begin
for E in Bitpos_Range_T loop
Result.Bits (E) := not Bitmap.Bits (E);
@ -29,6 +22,4 @@ procedure frame_overflow is
return Result;
end;
begin
null;
end;
end Frame_Overflow;

View File

@ -0,0 +1,17 @@
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;

View File

@ -15,7 +15,7 @@ package Addr1 is
end record;
for Rec2'Size use 64;
A: Arr (1 .. 12);
A: Arr (1 .. 4);
Obj1: Rec1;
for Obj1'Address use A'Address; -- { dg-bogus "alignment" }