4.4.0 version does not generate proper code to align variables.

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

4.4.0 version does not generate proper code to align variables.

Pavel Pavlov
It appears that 4.4.0 cegcc doesn't align properly. There's a simple test code:

typedef struct{
        int i;
        short d __attribute__((aligned(16)));
} test16 __attribute__((aligned(16))) ;

void do_test16_dummy(void *);
void do_test16_stack(int N)
{
        test16 tmp[N];
        do_test16_dummy(&tmp[0]);
}

>From that code, sizeof test16 is at least 32 bytes, but cegcc 4.4.0 compiles it as if it was 16 bytes only. At the same time gcc for android based on 4.4.0 generates correct code, cegcc 4.1.0 also generates correct code.


Command line used:
/opt/mingw32ce-4.4.0/bin/arm-mingw32ce-gcc -O3 -std=gnu99 -fomit-frame-pointer -S -o align16.s.4.4.0 align16.c


Outputs:

do_test16_stack:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        stmfd sp!, {fp, lr}
        mov r0, r0, asl #4                             //  <-- error, sizeof test16 has to be 32!
        add r0, r0, #16
        add fp, sp, #4
        sub sp, sp, r0
        add r0, sp, #15
        bic r0, r0, #15
        bl do_test16_dummy
        sub sp, fp, #4
        ldmfd sp!, {fp, pc}


same compilation with 4.1.0:

do_test16_stack:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        mov ip, sp
        stmfd sp!, {r4, fp, ip, lr, pc}
        mov r0, r0, asl #5                     // <--- OK
        add r0, r0, #8
        mov r4, sp
        rsb sp, r0, sp
        add r0, sp, #7
        sub fp, ip, #4
        bic r0, r0, #7
        bl do_test16_dummy
        mov sp, r4
        sub sp, fp, #16
        ldmfd sp, {r4, fp, sp, pc}



android ndk gcc 4.4.0:

do_test16_stack:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        mov r0, r0, asl #5                        // <--- OK
        add r0, r0, #8
        stmfd sp!, {fp, lr}
        add fp, sp, #4
        sub sp, sp, r0
        mov r0, sp
        bl do_test16_dummy
        sub sp, fp, #4
        ldmfd sp!, {fp, pc}



Any ideas what could be wrong? 4.4.0 from android is OK, could that be related to wince related changes or it's (more likely) because there is some bugs related to coff and alignment in gcc code?..
The reason I came to that error is that I had a weird problem: I was getting misalignment crashes and wanted to printout addresses of some structure members and their alignment. At some point I got strange output, where address of structure was clearly not 16 bit aligned, but that same address modulo 16 would output 0! After I run some tests it looks like it's related to this alignment problem.




------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Cegcc-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/cegcc-devel