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

            Bug ID: 68937
           Summary: i686: -fno-plt produces wrong code (maybe only with
                    tailcall)
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zsojka at seznam dot cz
  Target Milestone: ---
              Host: x86_64-pc-linux-gnu
            Target: i686-pc-linux-gnu

Created attachment 37047
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=37047&action=edit
reduced testcase

Output:
$ i686-pc-linux-gnu-gcc -O2 -fPIC -fno-plt testcase.c
$ ./a.out 
Segmentation fault

The wrong code is:
...
foo:
...
        call    [DWORD PTR bar@GOT[ebx]]
        mov     DWORD PTR 32[esp], esi
        add     esp, 20
        pop     ebx
        pop     esi
        jmp     [DWORD PTR bar@GOT[ebx]]

ebx is invalid at this point.

Without -fno-plt, the tailcall optimization is not performed:
--- testcase.s  2015-12-16 12:14:49.061674916 +0100
+++ testcase_broken.s   2015-12-16 12:14:17.541674625 +0100
@@ -30,9 +30,8 @@
        mov     esi, DWORD PTR 32[esp]
        push    esi
-       call    bar@PLT
-       mov     DWORD PTR [esp], esi
-       call    bar@PLT
+       call    [DWORD PTR bar@GOT[ebx]]
+       mov     DWORD PTR 32[esp], esi
        add     esp, 20
        pop     ebx
@@ -41,7 +40,7 @@
        pop     esi
-       ret
+       jmp     [DWORD PTR bar@GOT[ebx]]


This seems to affect only i686 (powerpc, powerpc64, x86_64, x86_64 x32,
aarch64, armv7 are fine)

Tested revisions:
r231665 - FAIL

Reply via email to