diff mbox

Fix unaligned access in function returning composite type

Message ID 2654832.bGeA7oMeEq@polaris
State New
Headers show

Commit Message

Eric Botcazou Oct. 6, 2014, 9:40 a.m. UTC
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.


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.

Comments

Richard Biener Oct. 6, 2014, 11:28 a.m. UTC | #1
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
diff mbox

Patch

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
 	  {