GCC 4.6.x miscompiling arm-linux?
Mikael Pettersson
mikpe at it.uu.se
Tue Sep 11 08:53:35 EDT 2012
David Jander writes:
> On Tue, 11 Sep 2012 13:35:40 +0200
> Mikael Pettersson <mikpe at it.uu.se> wrote:
>
> > David Jander writes:
> > > > I can make the patches available if there's confirmation that a vanilla
> > > > upstream gcc-4.6.3 doesn't work.
> > >
> > > I am pretty sure this is the case... do you have a patch series that you can
> > > easily tar and mail to me? I'd like to try those patches with OSELAS, to see
> > > if I can indeed build a gcc-4.6.3 toolchain that generates correct code.... I
> > > already know that I can generate one that doesn't ;-)
> > >
> > ...
> > > > If you're sure no add-on patches were applied, then yes please do.
> > >
> > > Pretty sure, but not 100%, so I'd like to try your patches first if you don't
> > > mind....
> >
> > And I'd like to confirm first. Please tell us the following:
> >
> > > > > > 2: include the output of gcc -v which tells how that gcc was configured,
>
> Using built-in specs.
> COLLECT_GCC=/opt/OSELAS.Toolchain-2011.11.1/arm-v5te-linux-gnueabi/gcc-4.6.3-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/bin/arm-v5te-linux-gnueabi-gcc-4.6.3
> COLLECT_LTO_WRAPPER=/opt/OSELAS.Toolchain-2011.11.1/arm-v5te-linux-gnueabi/gcc-4.6.3-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/libexec/gcc/arm-v5te-linux-gnueabi/4.6.3/lto-wrapper
> Target: arm-v5te-linux-gnueabi
> Configured with: /home/djander/ptxdist/OSELAS.Toolchain-2011.11.1/platform-arm-v5te-linux-gnueabi-gcc-4.6.3-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/build-cross/gcc-4.6.3/configure --target=arm-v5te-linux-gnueabi --with-sysroot=/opt/OSELAS.Toolchain-2011.11.1/arm-v5te-linux-gnueabi/gcc-4.6.3
> -glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/sysroot-arm-v5te-linux-gnueabi --disable-multilib --with-float=soft --with-fpu=vfp --with-cpu=arm926ej-s --enable-__cxa_atexit --disable-sjlj-exceptions --disable-nls --disable-decimal-float --disable-fixed-point --disable-win32-registry --enable-symvers=gnu --with-pkgversion=OSELAS.Toolchain-2011.11.1 --with-system-zlib --with-gmp=/home/djander/ptxdist/OSELAS.Toolchain-2011.11.1/platform-arm-v5te
> -linux-gnueabi-gcc-4.6.3-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/sysroot-host --with-mpfr=/home/djander/ptxdist/OSELAS.Toolchain-2011.11.1/platform-arm-v5te-linux-gnueabi-gcc-4.6.3-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/sysroot-host --prefix=/opt/OSELAS.Toolchain-2011.11.1/arm-v5te-linux-gnueabi/gcc-4.6.3-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized --enable-languages=c,c++ --enable-threads=posix --enable-c99 --enable-long-long --enable-libstdcxx-debug --enable-profile --enable-shared --disable-libssp --enable-checking=release
> Thread model: posix
> gcc version 4.6.3 (OSELAS.Toolchain-2011.11.1)
>
> > > > > > 3: give the exact set of gcc options used then compiling the test case.
>
> If I type this in a terminal:
>
>
> $ /opt/OSELAS.Toolchain-2011.11.1/arm-v5te-linux-gnueabi/gcc-4.6.3-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/bin/arm-v5te-linux-gnueabi-gcc-4.6.3 -Os -S -o - -x c -
>
> struct flexcan_regs {
> unsigned int mcr;
> unsigned int rxfgmask;
> };
>
> #define flexcan_read(a) (*(volatile unsigned int *)(a))
> #define flexcan_write(v,a) (*(volatile unsigned int *)(a) = (v))
>
> int flexcan_chip_start(int ver, struct flexcan_regs *regs)
> {
> flexcan_write(0, ®s->mcr);
>
> if (ver >= 10)
> flexcan_write(0, ®s->rxfgmask);
>
> return 0;
> }
>
>
> I get this output after hitting <CTRL-D>:
>
> .cpu arm926ej-s
> .fpu softvfp
> .eabi_attribute 20, 1
> .eabi_attribute 21, 1
> .eabi_attribute 23, 3
> .eabi_attribute 24, 1
> .eabi_attribute 25, 1
> .eabi_attribute 26, 2
> .eabi_attribute 30, 4
> .eabi_attribute 18, 4
> .file ""
> .text
> .align 2
> .global flexcan_chip_start
> .type flexcan_chip_start, %function
> flexcan_chip_start:
> @ args = 0, pretend = 0, frame = 0
> @ frame_needed = 0, uses_anonymous_args = 0
> @ link register save eliminated.
> mov r3, #0
> cmp r0, #9
> str r3, [r1, #0]
> ldrle r3, [r1, #4]
> mov r0, #0
> str r3, [r1, #4]
> bx lr
> .size flexcan_chip_start, .-flexcan_chip_start
> .ident "GCC: (OSELAS.Toolchain-2011.11.1) 4.6.3"
> .section .note.GNU-stack,"",%progbits
>
>
> Do you need more information?
No, I can reproduce the bug with vanilla gcc-4.6.3; vanilla 4.7.1 and 4.5.4 are Ok.
I'll bisect my 4.6.3 patch series to see which patch fixes it.
More information about the linux-arm-kernel
mailing list