https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84530
Bug ID: 84530 Summary: -mfunction-return=thunk does not work for simple_return_pop_internal insn Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: marxin at gcc dot gnu.org CC: hjl at gcc dot gnu.org, hubicka at ucw dot cz Target Milestone: --- Target: i586 i386.md contains: 13100 (define_insn "simple_return_pop_internal" 13101 [(simple_return) 13102 (use (match_operand:SI 0 "const_int_operand"))] 13103 "reload_completed" 13104 "%!ret\t%0" 13105 [(set_attr "length" "3") 13106 (set_attr "atom_unit" "jeu") 13107 (set_attr "length_immediate" "2") 13108 (set_attr "modrm" "0") 13109 (set_attr "maybe_prefix_bnd" "1")]) Thus: $ cat stdarg.c struct s { _Complex unsigned short x; }; struct s gs = { 100 + 200i }; struct s __attribute__((noinline)) foo (void) { return gs; } $ gcc stdarg.c -S -O2 -m32 -o/dev/stdout -mfunction-return=thunk .file "stdarg.c" .text .p2align 4,,15 .globl foo .type foo, @function foo: .LFB0: .cfi_startproc movl 4(%esp), %eax movl gs, %edx movl %edx, (%eax) ret $4 .cfi_endproc .LFE0: .size foo, .-foo .globl gs .data .align 4 .type gs, @object .size gs, 4 gs: .value 100 .value 200 .ident "GCC: (GNU) 8.0.1 20180223 (experimental)" .section .note.GNU-stack,"",@progbits While x86-64 works: gcc stdarg.c -S -O2 -o/dev/stdout -mfunction-return=thunk .file "stdarg.c" .text .p2align 4,,15 .globl foo .type foo, @function foo: .LFB0: .cfi_startproc movzwl gs+2(%rip), %eax sall $16, %eax movl %eax, %edx movzwl gs(%rip), %eax orl %edx, %eax jmp __x86_return_thunk .cfi_endproc .LFE0: .size foo, .-foo .globl gs .data .align 2 .type gs, @object .size gs, 4 gs: .value 100 .value 200 .section .text.__x86_indirect_thunk,"axG",@progbits,__x86_indirect_thunk,comdat .globl __x86_indirect_thunk .hidden __x86_indirect_thunk .type __x86_indirect_thunk, @function __x86_indirect_thunk: .set __x86_return_thunk,__x86_indirect_thunk .globl __x86_return_thunk .hidden __x86_return_thunk .LFB1: .cfi_startproc call .LIND1 .LIND0: pause lfence jmp .LIND0 .LIND1: lea 8(%rsp), %rsp ret .cfi_endproc .LFE1: .ident "GCC: (GNU) 8.0.1 20180223 (experimental)" .section .note.GNU-stack,"",@progbits