https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84150
Bug ID: 84150 Summary: Wrong pointer size used in builtin setjmp/longjmp with -maddress-mode=long Product: gcc Version: 6.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: hjl.tools at gmail dot com CC: igor.v.tsimbalist at intel dot com, ubizjak at gmail dot com Target Milestone: --- Target: x32 [hjl@gnu-6 gcc]$ cat /tmp/foo.c void *buf[5]; void raise0(void) { __builtin_longjmp (buf, 1); } void execute(int cmd) { __builtin_setjmp (buf); } [hjl@gnu-6 gcc]$ gcc -S -O3 -mx32 /tmp/foo.c [hjl@gnu-6 gcc]$ cat foo.s .file "foo.c" .text .p2align 4,,15 .globl raise0 .type raise0, @function raise0: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movl buf+4(%rip), %eax movl %esp, %ebp .cfi_def_cfa_register 6 movl buf(%rip), %ebp movl buf+8(%rip), %esp jmp *%rax .cfi_endproc .LFE0: .size raise0, .-raise0 .p2align 4,,15 .globl execute .type execute, @function execute: .LFB1: .cfi_startproc movl %esp, buf(%rip) movl $.L5, buf+4(%rip) movl %esp, buf+8(%rip) ret .L5: .cfi_endproc .LFE1: .size execute, .-execute .comm buf,20,16 [hjl@gnu-6 gcc]$ gcc -S -O3 -mx32 /tmp/foo.c -maddress-mode=long [hjl@gnu-6 gcc]$ cat foo.s .file "foo.c" .text .p2align 4,,15 .globl raise0 .type raise0, @function raise0: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq buf+8(%rip), %rax movq %rsp, %rbp .cfi_def_cfa_register 6 movq buf(%rip), %rbp movq buf+16(%rip), %rsp jmp *%rax .cfi_endproc .LFE0: .size raise0, .-raise0 .p2align 4,,15 .globl execute .type execute, @function execute: .LFB1: .cfi_startproc movq %rsp, buf(%rip) <<<<<<<<<<< Pointer size should be 4 bytes. movq $.L5, buf+8(%rip) movq %rsp, buf+16(%rip) ret .L5: .cfi_endproc .LFE1: .size execute, .-execute .comm buf,20,16