The x86_64 abi includes a red zone. So I doubt this a bug in gcc unless netbsd's abi does not match what gcc does.

Sent from my iPhone

On Nov 8, 2009, at 12:25 PM, "cube at cubidou dot net" <gcc-bugzi...@gcc.gnu.org > wrote:

Provided a somewhat specific set of local variables, and as long as the code of the function doesn't make any other function calls, gcc will decrease %rsp but
an incorrect and too small value.  This leads to local variables being
corrupted when the execution is interrupted; this happens notably in the
kernel where interrupts use the stack of the thread they interrupted.

The file that I will hopefully be able to attach to that report demonstrates the issue, if you look at the assembler output. With the function call
commented out, gcc sets up the stack that way:

       movq    %rsp, %rbp
       subq    $152, %rsp

and later access one of the local variables with:

       movl    $0, -272(%rbp,%rax,4)

When the function call is uncommented, the subq instruction here will correctly
substract 272 to %rsp.

I've compiled a 4.4.2 for the sole purpose of doing this bug report; NetBSD
comes with 4.1.3 and that's where the bug was initially spotted.


--
          Summary: Incorrect stack setup on x86_64
          Product: gcc
          Version: 4.4.2
           Status: UNCONFIRMED
         Severity: major
         Priority: P3
        Component: c
       AssignedTo: unassigned at gcc dot gnu dot org
       ReportedBy: cube at cubidou dot net
GCC build triplet: x86_64-unknown-netbsd4.99.60
 GCC host triplet: x86_64-unknown-netbsd4.99.60
GCC target triplet: x86_64-unknown-netbsd4.99.60


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

Reply via email to