Weird error in tla package

Josh Boyer jwboyer at jdub.homelinux.org
Sat Feb 25 01:02:40 UTC 2006


On Fri, 2006-02-24 at 05:53 -0500, Josh Boyer wrote:
> On Fri, 2006-02-24 at 10:45 +0000, David Woodhouse wrote:
> > 
> > MACHINE_ALIGNMENT is the maximal alignment of various types, including
> > 'long double'. That's recently changed from 8 bytes to 16. Could it be
> > that malloc() or your own internal allocation routines are still
> > returning chunks which are only 8-byte aligned?
> 
> Ah...  that was the recent ABI change that caused rawhide to be respun a
> bit ago, right?
> 
> It could be doing what you say.  The code to generate the macro is
> convoluted so I'll need to figure it out.  If anyone cares, the code is
> in the tla package at src/hackerlab/machine/gen-alignment.to-c (which
> gets turned into a .c file at build time).  And the code for the test
> that's failing is in src/hackerlab/tests/array-tests/unit-ar.c.
> 
> When I find some time I'll try an figure it all out.  In the meantime,
> I'll just continue cursing tla ;).

I did some more digging and it turns out that malloc() _is_ returning
chunks that are only 8-byte aligned.  See:

https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=182742

for the details on tla itself, but I can reproduce 8-byte aligned
addresses with the trivial program below.  From my understanding of the
recent ABI change, this shouldn't happen.

Jakub, do you want me to open a bug for this?

josh

[jwboyer at net2-102 ~]$ gcc -o malloc-check malloc-check.c
[jwboyer at net2-102 ~]$ ./malloc-check
foo is not 16-byte aligned: 10011008
[jwboyer at net2-102 ~]$


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
        void *foo = NULL;
        void *bar = NULL;
        int i;

        for (i = 0; i < 1000; i++) {
                foo = malloc(360);
                bar = malloc(360);

                if ((unsigned long) foo & 0xf) {
                        printf("foo is not 16-byte aligned: %lx\n",
                                (unsigned long) foo);
                        return -1;
                }
                if ((unsigned long) bar & 0xf) {
                        printf("bar is not 16-byte aligned: %lx\n",
                                (unsigned long) bar);
                        return -1;
                }

                if (i % 150) {
                        free(foo);
                        free(bar);
                        foo = NULL;
                        bar = NULL;
                }
        }

        return 0;
}






More information about the ppc mailing list