calls.c (expand_call): Do not use the target as the return slot if it is not sufficiently aligned.

* calls.c (expand_call): Do not use the target as the return slot if
	it is not sufficiently aligned.

From-SVN: r215958
This commit is contained in:
Eric Botcazou 2014-10-06 17:30:34 +00:00 committed by Eric Botcazou
parent 2a8ef76700
commit 391756ad9d
6 changed files with 58 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2014-10-06 Eric Botcazou <ebotcazou@adacore.com>
* calls.c (expand_call): Do not use the target as the return slot if
it is not sufficiently aligned.
2014-10-06 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (analyze_swaps commentary): Add

View File

@ -2377,7 +2377,14 @@ expand_call (tree exp, rtx target, int ignore)
{
struct_value_size = int_size_in_bytes (rettype);
if (target && MEM_P (target) && CALL_EXPR_RETURN_SLOT_OPT (exp))
/* Even if it is semantically safe to use the target as the return
slot, it may be not sufficiently aligned for the return type. */
if (CALL_EXPR_RETURN_SLOT_OPT (exp)
&& target
&& MEM_P (target)
&& !(MEM_ALIGN (target) < TYPE_ALIGN (rettype)
&& SLOW_UNALIGNED_ACCESS (TYPE_MODE (rettype),
MEM_ALIGN (target))))
structure_value_addr = XEXP (target, 0);
else
{

View File

@ -1,3 +1,8 @@
2014-10-06 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/return4.adb: New test.
* gnat.dg/return4_pkg.ad[sb]: New helper.
2014-10-06 Edward Smith-Rowland <3dw4rd@verizon.net>
* g++.dg/cpp1y/attr-deprecated-neg.C: Attribute no longer ignored.

View File

@ -0,0 +1,22 @@
-- { dg-do run }
-- { dg-options "-O" }
with Return4_Pkg; use Return4_Pkg;
procedure Return4 is
type Local_Rec is record
C : Character;
R : Rec;
end record;
pragma Pack (Local_Rec);
L : Local_Rec;
for L'Alignment use 2;
begin
L.R := Get_Value (0);
if L.R.I1 /= 0 then
raise Program_Error;
end if;
end;

View File

@ -0,0 +1,9 @@
package body Return4_Pkg is
function Get_Value (I : Integer) return Rec is
Value : Rec := (I1 => I, I2 => I, I3 => I);
begin
return Value;
end;
end Return4_Pkg;

View File

@ -0,0 +1,9 @@
package Return4_Pkg is
type Rec is record
I1, I2, I3 : Integer;
end record;
function Get_Value (I : Integer) return Rec;
end Return4_Pkg;