diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2011-09-25 15:42:00 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2011-09-25 15:42:00 +0000 |
commit | dea976c48066580dff56c1055027d7398072bfc9 (patch) | |
tree | ded5b46f411df22844abab53b3af309efe8c7a34 /gcc | |
parent | 960dcaf528c16597fc89da7e0fa6ec75038a8e87 (diff) | |
download | gcc-dea976c48066580dff56c1055027d7398072bfc9.zip gcc-dea976c48066580dff56c1055027d7398072bfc9.tar.gz gcc-dea976c48066580dff56c1055027d7398072bfc9.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/frame_overflow.adb | 25 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/frame_overflow.ads | 17 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/addr1.ads | 2 |
6 files changed, 56 insertions, 23 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 3606791..03adb2a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -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 diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index a6bfd37..d96f683 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -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)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc9624f..7bd46ae 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/gnat.dg/frame_overflow.adb b/gcc/testsuite/gnat.dg/frame_overflow.adb index e1ff4d3..1e7405f 100644 --- a/gcc/testsuite/gnat.dg/frame_overflow.adb +++ b/gcc/testsuite/gnat.dg/frame_overflow.adb @@ -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; diff --git a/gcc/testsuite/gnat.dg/frame_overflow.ads b/gcc/testsuite/gnat.dg/frame_overflow.ads new file mode 100644 index 0000000..898e37a --- /dev/null +++ b/gcc/testsuite/gnat.dg/frame_overflow.ads @@ -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; diff --git a/gcc/testsuite/gnat.dg/specs/addr1.ads b/gcc/testsuite/gnat.dg/specs/addr1.ads index 83d432c..ed048f6 100644 --- a/gcc/testsuite/gnat.dg/specs/addr1.ads +++ b/gcc/testsuite/gnat.dg/specs/addr1.ads @@ -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" } |