Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -97,12 +97,17 @@ # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET # endif #else # ifdef __ELF__ -# if defined(__amd64__) || defined(__x86_64__) || defined(__i386__) || \ - defined(__arm__) || defined(__ARM__) +# if defined(__amd64__) || defined(__x86_64__) +# define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR +# if __has_feature(objc_msg_lookup_stret) +# define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET +# endif +# endif +# if defined(__i386__) || defined(__arm__) || defined(__ARM__) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # endif # if (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) || \ (defined(__mips_eabi) && _MIPS_SZPTR == 32) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR Index: src/forwarding-amd64-elf.S ================================================================== --- src/forwarding-amd64-elf.S +++ src/forwarding-amd64-elf.S @@ -17,11 +17,10 @@ .globl of_forward .globl of_forward_stret .section .text of_forward: -of_forward_stret: /* FIXME */ pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -65,10 +64,11 @@ movdqa -0x50(%rbp), %xmm0 movq -0x38(%rbp), %r9 movq -0x30(%rbp), %r8 movq -0x28(%rbp), %rcx movq -0x20(%rbp), %rdx + movq -0x18(%rbp), %rsi movq -0x10(%rbp), %rdi movq -0x8(%rbp), %rax movq %rbp, %rsp popq %rbp @@ -75,10 +75,70 @@ jmpq *%r11 .type of_forward, %function .size of_forward, .-of_forward +of_forward_stret: + pushq %rbp + movq %rsp, %rbp + + /* Save all arguments */ + subq $0xC0, %rsp /* 16-byte alignment */ + movq %rax, -0x8(%rbp) + movq %rdi, -0x10(%rbp) + movq %rsi, -0x18(%rbp) + movq %rdx, -0x20(%rbp) + movq %rcx, -0x28(%rbp) + movq %r8, -0x30(%rbp) + movq %r9, -0x38(%rbp) + movdqa %xmm0, -0x50(%rbp) + movdqa %xmm1, -0x60(%rbp) + movdqa %xmm2, -0x70(%rbp) + movdqa %xmm3, -0x80(%rbp) + movdqa %xmm4, -0x90(%rbp) + movdqa %xmm5, -0xA0(%rbp) + movdqa %xmm6, -0xB0(%rbp) + movdqa %xmm7, -0xC0(%rbp) + + movq %rsi, %rdi + leaq sel_forwardingTargetForSelector_(%rip), %rsi + call objc_msg_lookup@PLT + movq -0x18(%rbp), %rdi + leaq sel_forwardingTargetForSelector_(%rip), %rsi + movq -0x20(%rbp), %rdx + call *%rax + movq %rax, -0x18(%rbp) + + movq %rax, %rdi + movq -0x20(%rbp), %rsi + call objc_msg_lookup_stret@PLT + movq %rax, %r11 + + /* Restore all arguments */ + movdqa -0xC0(%rbp), %xmm7 + movdqa -0xB0(%rbp), %xmm6 + movdqa -0xA0(%rbp), %xmm5 + movdqa -0x90(%rbp), %xmm4 + movdqa -0x80(%rbp), %xmm3 + movdqa -0x70(%rbp), %xmm2 + movdqa -0x60(%rbp), %xmm1 + movdqa -0x50(%rbp), %xmm0 + movq -0x38(%rbp), %r9 + movq -0x30(%rbp), %r8 + movq -0x28(%rbp), %rcx + movq -0x20(%rbp), %rdx + movq -0x18(%rbp), %rsi + movq -0x10(%rbp), %rdi + movq -0x8(%rbp), %rax + + movq %rbp, %rsp + popq %rbp + + jmpq *%r11 +.type of_forward_stret, %function +.size of_forward_stret, .-of_forward_stret + init: leaq module(%rip), %rdi jmp __objc_exec_class@PLT .section .ctors, "a", %progbits