https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68818

            Bug ID: 68818
           Summary: Issue switching stacks on x86 with -fdefer-pop and
                    -fomit-frame-pointer
           Product: gcc
           Version: 5.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mdaniels at qnx dot com
  Target Milestone: ---

Created attachment 36975
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36975&action=edit
Minimal example to reproduce

If you switch stacks to make a function call and -fdefer-pop is enabled, the
push is happening after before the function call, but the pop gets deferred
until after the stack gets switched back.

If you have frame pointers, this is fine, as the stack pointer will be restored
before returning, but if they are omitted then your stack pointer is incorrect
at the point when you pop the return address off the stack.

I have attached a minimal example.

I am testing with a x86_64 Ubuntu 14.04 host. I see this with 4.9 and 5.3, but
not 4.8. The specific versions I am using:

gcc-4.8 (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
gcc-4.9 (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3
gcc-5 (Ubuntu 5.3.0-3ubuntu1~14.04) 5.3.0 20151204

And this is how I am building it:

gcc -m32 -o stk stk.c -fomit-frame-pointer -fdefer-pop

Here is the assembly for 4.8.3 and 5.3.0 for comparison:

0804846d <func>:
 804846d:       83 ec 2c                sub    $0x2c,%esp
 8048470:       8b 44 24 30             mov    0x30(%esp),%eax
 8048474:       89 64 24 1c             mov    %esp,0x1c(%esp)
 8048478:       89 c4                   mov    %eax,%esp
 804847a:       c7 04 24 60 85 04 08    movl   $0x8048560,(%esp)
 8048481:       e8 ba fe ff ff          call   8048340 <puts@plt>
 8048486:       8b 44 24 1c             mov    0x1c(%esp),%eax
 804848a:       89 c4                   mov    %eax,%esp
 804848c:       83 c4 2c                add    $0x2c,%esp
 804848f:       c3                      ret    

0804846b <func>:
 804846b:       83 ec 1c                sub    $0x1c,%esp
 804846e:       8b 44 24 20             mov    0x20(%esp),%eax
 8048472:       89 64 24 0c             mov    %esp,0xc(%esp)
 8048476:       89 c4                   mov    %eax,%esp
 8048478:       83 ec 0c                sub    $0xc,%esp
 804847b:       68 80 85 04 08          push   $0x8048580
 8048480:       e8 bb fe ff ff          call   8048340 <puts@plt>
 8048485:       8b 44 24 1c             mov    0x1c(%esp),%eax
 8048489:       89 c4                   mov    %eax,%esp
 804848b:       83 c4 10                add    $0x10,%esp
 804848e:       83 c4 1c                add    $0x1c,%esp
 8048491:       c3                      ret

Reply via email to