Reduced further:
--8<------
struct hurd_sigstate;
typedef struct
{
void *tcb;
union dtv *dtv;
unsigned int self_do_no_use;
int __glibc_padding1;
int multiple_threads;
int gscope_flag;
unsigned long sysinfo;
unsigned long stack_guard;
unsigned long pointer_guard;
long __glibc_padding2[2];
int private_futex;
int __glibc_padding3;
void *__private_tm[4];
void *__private_ss;
unsigned long long int ssp_base;
unsigned int reply_port;
struct hurd_sigstate *_hurd_sigstate;
struct rtld_catch *rtld_catch;
} tcbhead_t;
void
__sigreturn2 (struct hurd_sigstate *ss, unsigned long *usp,
unsigned int sc_reply_port)
{
(* (unsigned int __seg_fs *) __builtin_offsetof (tcbhead_t,
reply_port) = sc_reply_port);
#ifdef ADD_NOP
asm ("nop");
#endif
asm volatile ("movq %0, %%rsp\n"
"retq $128" :
: "rm" (usp));
__builtin_unreachable ();
}
-------->8---
Reproducible on x86_64-linux-gnu gcc just as well:
$ gcc anew.c -c -O2
$ objdump -d anew.o
anew.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <__sigreturn2>:
0: 48 89 f4 mov %rsi,%rsp
3: c2 80 00 ret $0x80
$ gcc anew.c -c -O2 -D ADD_NOP
$ objdump -d anew.o
anew.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <__sigreturn2>:
0: 64 89 14 25 80 00 00 mov %edx,%fs:0x80
7: 00
8: 90 nop
9: 48 89 f4 mov %rsi,%rsp
c: c2 80 00 ret $0x80
Sergey