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



             Bug #: 56807

           Summary: mingw32: Conflict between stack realignment and stack

                    probe destroys function argument in EAX

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: target

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: achurch+...@achurch.org





When compiling for mingw32 with an incoming stack boundary less than the

preferred stack boundary, if a non-leaf function with a large (>4000 bytes)

stack size takes arguments in registers, the first argument may be destroyed

depending on the actual stack alignment:



00000000 <_bar>:

   0:   55                      push   %ebp

   1:   89 e5                   mov    %esp,%ebp

   3:   83 e4 f0                and    $0xfffffff0,%esp

   6:   50                      push   %eax

   7:   b8 1c 10 00 00          mov    $0x101c,%eax

   c:   e8 00 00 00 00          call   11 <_bar+0x11>

                        d: DISP32       ___chkstk_ms

  11:   29 c4                   sub    %eax,%esp

  13:   8b 45 f4                mov    -0xc(%ebp),%eax



Note that the stack realignment (at 3) takes place after the frame pointer is

saved (at 1) but before the first argument is pushed to the stack (at 6), so

the offset from the frame pointer to the saved first argument is unknown, yet

GCC tries to reload the argument using the frame pointer as a base (at 13).  If

the stack is not aligned to a multiple of 16 bytes before the function is

called, the reload will get some random value from the stack instead of the

first argument.



Configure options: --prefix=/usr

--bindir=/usr/i686-pc-linux-gnu/mingw32/gcc-bin/4.7.2

--includedir=/usr/lib/gcc/mingw32/4.7.2/include

--datadir=/usr/share/gcc-data/mingw32/4.7.2

--mandir=/usr/share/gcc-data/mingw32/4.7.2/man

--infodir=/usr/share/gcc-data/mingw32/4.7.2/info

--with-gxx-include-dir=/usr/lib/gcc/mingw32/4.7.2/include/g++-v4

--host=i686-pc-linux-gnu --target=mingw32 --build=i686-pc-linux-gnu

--disable-altivec --disable-fixed-point --without-ppl --without-cloog

--enable-lto --disable-nls --with-system-zlib --enable-obsolete

--disable-werror --enable-secureplt --disable-multilib --disable-libmudflap

--disable-libssp --disable-libgomp

--with-python-dir=/share/gcc-data/mingw32/4.7.2/python

--enable-poison-system-directories --enable-checking=release --disable-libgcj

--enable-libstdcxx-time --disable-libquadmath --enable-languages=c,c++

--with-sysroot=/usr/mingw32

Reply via email to