[PATCH] Fix PR56434

Jakub Jelinek jakub@redhat.com
Fri Mar 22 10:20:00 GMT 2013


On Fri, Mar 22, 2013 at 11:06:53AM +0100, Richard Biener wrote:
> This fixes PR56434 - the use of BIGGEST_ALIGNMENT to annotate
> the pointer returned by malloc is wrong - BIGGEST_ALIGNMENT
> has nothing to do with the alignment guaranteed by the ABI
> for allocated memory.  For example on x86_64 it depends on
> -mavx and thus can result in wrong code being generated.
> 
> The following patch fixes it to use what we use on the
> GIMPLE level - MALLOC_ABI_ALIGNMENT.
> 
> Ok for trunk?

IMHO the change should be accompanied by defining MALLOC_ABI_ALIGNMENT
on at least a couple of popular targets.  E.g. glibc
will guarantee at least 2 * sizeof (void *) alignment on all architectures,
and even if one uses some other malloc implementation, it should be better
ISO C99 conforming on Linux (perhaps ignoring long double type (known
to be non-conforming e.g. on ppc32) and _Decimal* types).
So, at least for Linux I'd say MALLOC_ABI_ALIGNMENT should be defined
as maximum alignment of long, long long, double and void *.

Because, right now, MALLOC_ABI_ALIGNMENT is only defined to
non-__alignof__(char) on VMS.

> 2013-03-22  Richard Biener  <rguenther@suse.de>
> 
> 	PR middle-end/56434
> 	* calls.c (expand_call): Use MALLOC_ABI_ALIGNMENT to annotate
> 	the pointer returned by calls with ECF_MALLOC set.
> 
> Index: gcc/calls.c
> ===================================================================
> --- gcc/calls.c	(revision 196899)
> +++ gcc/calls.c	(working copy)
> @@ -3186,7 +3186,7 @@ expand_call (tree exp, rtx target, int i
>  
>  	  /* The return value from a malloc-like function is a pointer.  */
>  	  if (TREE_CODE (rettype) == POINTER_TYPE)
> -	    mark_reg_pointer (temp, BIGGEST_ALIGNMENT);
> +	    mark_reg_pointer (temp, MALLOC_ABI_ALIGNMENT);
>  
>  	  emit_move_insn (temp, valreg);
>  

	Jakub



More information about the Gcc-patches mailing list