This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH] Fix PR56434
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 22 Mar 2013 11:27:14 +0100 (CET)
- Subject: Re: [PATCH] Fix PR56434
- References: <alpine dot LNX dot 2 dot 00 dot 1303221103500 dot 3543 at zhemvz dot fhfr dot qr> <20130322101935 dot GW12913 at tucnak dot redhat dot com>
On Fri, 22 Mar 2013, Jakub Jelinek wrote:
> 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.
I think the wrong-code fix is orthogonal to code improvements
which will also trigger on the GIMPLE level (and where they
will have a bigger impact).
We can for example, in config/linux.h do
#define MALLOC_ABI_ALIGNMENT (2 * sizeof (void *))
if that's what glibc really guarantees (does it maybe have a
feature macro for this?)
> > 2013-03-22 Richard Biener <email@example.com>
> > 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);
Richard Biener <firstname.lastname@example.org>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend