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:
parent
2a8ef76700
commit
391756ad9d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
Loading…
Reference in New Issue