Message ID | 2654832.bGeA7oMeEq@polaris |
---|---|
State | New |
Headers | show |
On Mon, Oct 6, 2014 at 11:40 AM, Eric Botcazou <ebotcazou@adacore.com> wrote: > Hi, > > In Ada, we support all sorts of data structure layout, including on strict- > alignment targets, and the compiler must generate glue code if necessary. > The problem here is a function returning a structure by invisible reference > into a field which is not sufficient aligned because the enclosing object is > packed: in this case, the caller passes an address that is not correctly > aligned to the callee, which can result in an unaligned access in the callee. > > Tested on x86_64-suse-linux and SPARC/Solaris, OK for the mainline. Ok. Thanks, Richard. > > 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 Eric Botcazou <ebotcazou@adacore.com> > > * gnat.dg/return4.adb: New test. > * gnat.dg/return4_pkg.ad[sb]: New helper. > > > -- > Eric Botcazou
Index: calls.c =================================================================== --- calls.c (revision 215843) +++ calls.c (working copy) @@ -2377,7 +2377,14 @@ expand_call (tree exp, rtx target, int i { 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 {