[Bug rtl-optimization/51643] New: Incorrect code produced for tail-call of weak function with -O2/-O3 option

sipych at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Dec 20 21:27:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51643

             Bug #: 51643
           Summary: Incorrect code produced for tail-call of weak function
                    with -O2/-O3 option
    Classification: Unclassified
           Product: gcc
           Version: 4.6.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: sipych@gmail.com


A tail-call of weak function produces incorrect code, compiled with -O2 or -O3.
Target: arm-eabi
Version: GCC 4.6.2 and 4.6.1

***** Test case: t00x1.c

<<<<<
extern void __attribute__((weak)) wfunc(void);
void main(void)
{
  wfunc();  // tail weak call fails!!!
  // __asm__ volatile ("nop":::"memory"); // workaround
}
>>>>>

$ /opt/arm/gnuarm-4.6.2/bin/arm-eabi-gcc -c -S -o t00x1.S -O2 t00x1.c

***** Contents of t00x1.S:
    .file    "t00x1.c"
    .section    .text.startup,"ax",%progbits
    .align    2
    .global    main
    .type    main, %function
main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    b    wfunc    @@@@ <<< Will be replaced by "NOP" in linker!!
                         @@@@ so, no return sequence!
    .size    main, .-main
    .weak    wfunc
    .ident    "GCC: (GNU) 4.6.2"

***** Disassembled (objdump) code: t00x1.lst:
00000240 <main>:
 240:    e1a00000     nop            ; (mov r0, r0)  @@@@ really, NOP

00000244 <__do_global_dtors_aux>:
 244:    e92d4010     push    {r4, lr}
 248:    e59f4028     ldr    r4, [pc, #40]    ; 278
                        .......
******
Call to function "wfunc" was converted to NOP by linker, as expected.
As a result, no return sequence from main(), falling througt to next code line.

For reference: the same program compiled with -O1
*******
    .file    "t00x1.c"
    .text
    .align    2
    .global    main
    .type    main, %function
main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    stmfd    sp!, {r3, lr}
    bl    wfunc
    ldmfd    sp!, {r3, pc}
    .size    main, .-main
    .weak    wfunc
    .ident    "GCC: (GNU) 4.6.2"

Code with workaround, compiled with -O2 correct:
$ /opt/arm/gnuarm-4.6.2/bin/arm-eabi-gcc -c -S -o t00x1.S -O2 t00x1.c
*******
    .file    "t00x1.c"
    .section    .text.startup,"ax",%progbits
    .align    2
    .global    main
    .type    main, %function
main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    stmfd    sp!, {r3, lr}
    bl    wfunc
@ 5 "t00x1.c" 1
    nop
@ 0 "" 2
    ldmfd    sp!, {r3, pc}
    .size    main, .-main
    .weak    wfunc
    .ident    "GCC: (GNU) 4.6.2"

*******
Compiler options:
$ /opt/arm/gnuarm-4.6.2/bin/arm-eabi-gcc -v
Using built-in specs.
COLLECT_GCC=/opt/arm/gnuarm-4.6.2/bin/arm-eabi-gcc
COLLECT_LTO_WRAPPER=/opt/arm/gnuarm-4.6.2/libexec/gcc/arm-eabi/4.6.2/lto-wrapper
Target: arm-eabi
Configured with: ../../src/gcc-4.6.2/configure --target=arm-eabi
--prefix=/opt/arm/gnuarm-4.6.2 --enable-multilib --enable-interwork
--enable-biendian --enable-fpu --with-newlib --with-gnu-ld --with-gnu-as
--disable-nls --disable-shared --with-arch=armv5te --with-fpu=vfp
--with-float=softfp --with-abi=aapcs-linux --enable-lto
--enable-languages=c,c++ --disable-threads --enable-ppl --enable-cloog
--enable-gmp --enable-mpfr --enable-lto
-with-headers=/opt/arm/gnuarm-4.6.2/arm-eabi/include
Thread model: single
gcc version 4.6.2 (GCC)



More information about the Gcc-bugs mailing list