Index: src/apple-forwarding-i386.S ================================================================== --- src/apple-forwarding-i386.S +++ src/apple-forwarding-i386.S @@ -27,32 +27,31 @@ .section __OBJC, __image_info .long 0, 0 .section __TEXT, __text, regular, pure_instructions -.macro forward dispatch_func +_of_forward: pushl %ebp movl %esp, %ebp pushl 8(%ebp) call _object_getClass addl $4, %esp - movl %eax, %edx call get_eip -L0_\dispatch_func: - pushl L_sel_forwardingTargetForSelector-L0_\dispatch_func(%eax) - pushl %edx +L0: + pushl L_sel_forwardingTargetForSelector-L0(%edx) + pushl %eax call _class_respondsToSelector addl $8, %esp testl %eax, %eax jz fail pushl 12(%ebp) call get_eip -L1_\dispatch_func: - pushl L_sel_forwardingTargetForSelector-L1_\dispatch_func(%eax) +L1: + pushl L_sel_forwardingTargetForSelector-L1(%edx) pushl 8(%ebp) call _objc_msgSend testl %eax, %eax jz fail @@ -63,23 +62,64 @@ movl %eax, 8(%ebp) movl %ebp, %esp popl %ebp - jmp \dispatch_func -.endmacro - -_of_forward: - forward _objc_msgSend - -_of_forward_stret: - forward _objc_msgSend_stret + jmp _objc_msgSend fail: movl %ebp, %esp popl %ebp jmp _of_method_not_found +_of_forward_stret: + pushl %ebp + movl %esp, %ebp + + pushl 12(%ebp) + call _object_getClass + addl $4, %esp + + call get_eip +L2: + pushl L_sel_forwardingTargetForSelector-L2(%edx) + pushl %eax + call _class_respondsToSelector + addl $8, %esp + testl %eax, %eax + jz fail_stret + + pushl 16(%ebp) + call get_eip +L3: + pushl L_sel_forwardingTargetForSelector-L3(%edx) + pushl 12(%ebp) + call _objc_msgSend + + testl %eax, %eax + jz fail_stret + + cmpl 12(%ebp), %eax + je fail_stret + + movl %eax, 12(%ebp) + + movl %ebp, %esp + popl %ebp + + jmp _objc_msgSend_stret + +fail_stret: + movl 12(%ebp), %eax + movl %eax, 8(%ebp) + movl 16(%ebp), %eax + movl %eax, 12(%ebp) + + movl %ebp, %esp + popl %ebp + + jmp _of_method_not_found + get_eip: - movl (%esp), %eax + movl (%esp), %edx ret Index: src/apple-forwarding-x86_64.S ================================================================== --- src/apple-forwarding-x86_64.S +++ src/apple-forwarding-x86_64.S @@ -27,11 +27,11 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions -.macro forward dispatch_func +_of_forward: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -50,20 +50,21 @@ movd %xmm5, 0x20(%rsp) movd %xmm6, 0x10(%rsp) movd %xmm7, (%rsp) call _object_getClass + movq %rax, %rdi movq L_sel_forwardingTargetForSelector(%rip), %rsi call _class_respondsToSelector testq %rax, %rax jz fail movq 0xA0(%rsp), %rdi movq L_sel_forwardingTargetForSelector(%rip), %rsi movq 0x98(%rsp), %rdx - call \dispatch_func + call _objc_msgSend movq %rax, %rdi testq %rdi, %rdi jz fail @@ -87,22 +88,88 @@ movq 0xA8(%rsp), %rax movq %rbp, %rsp popq %rbp - jmp \dispatch_func -.endmacro - -_of_forward: - forward _objc_msgSend - -_of_forward_stret: - forward _objc_msgSend_stret + jmp _objc_msgSend fail: movq 0xA0(%rsp), %rdi movq 0x98(%rsp), %rsi + movq %rbp, %rsp + popq %rbp + + jmp _of_method_not_found + +_of_forward_stret: + pushq %rbp + movq %rsp, %rbp + + /* Save all arguments */ + subq $0xC0, %rsp /* 16-byte alignment */ + movq %rax, 0xA8(%rsp) + movq %rdi, 0xA0(%rsp) + movq %rsi, 0x98(%rsp) + movq %rdx, 0x90(%rsp) + movq %rcx, 0x88(%rsp) + movq %r8, 0x80(%rsp) + movq %r9, 0x78(%rsp) + movd %xmm0, 0x70(%rsp) + movd %xmm1, 0x60(%rsp) + movd %xmm2, 0x50(%rsp) + movd %xmm3, 0x40(%rsp) + movd %xmm4, 0x30(%rsp) + movd %xmm5, 0x20(%rsp) + movd %xmm6, 0x10(%rsp) + movd %xmm7, (%rsp) + + movq %rsi, %rdi + call _object_getClass + + movq %rax, %rdi + movq L_sel_forwardingTargetForSelector(%rip), %rsi + call _class_respondsToSelector + testq %rax, %rax + jz fail_stret + + movq 0x98(%rsp), %rdi + movq L_sel_forwardingTargetForSelector(%rip), %rsi + movq 0x90(%rsp), %rdx + call _objc_msgSend + movq %rax, %rsi + + testq %rsi, %rsi + jz fail_stret + + cmpq 0x98(%rsp), %rsi + je fail_stret + + /* Restore all arguments, except %rsi */ + movd (%rsp), %xmm7 + movd 0x10(%rsp), %xmm6 + movd 0x20(%rsp), %xmm5 + movd 0x30(%rsp), %xmm4 + movd 0x40(%rsp), %xmm3 + movd 0x50(%rsp), %xmm2 + movd 0x60(%rsp), %xmm1 + movd 0x70(%rsp), %xmm0 + movq 0x78(%rsp), %r9 + movq 0x80(%rsp), %r8 + movq 0x88(%rsp), %rcx + movq 0x90(%rsp), %rdx + movq 0xA0(%rsp), %rdi + movq 0xA8(%rsp), %rax + + movq %rbp, %rsp + popq %rbp + + jmp _objc_msgSend_stret + +fail_stret: + movq 0x98(%rsp), %rdi + movq 0x90(%rsp), %rsi + movq %rbp, %rsp popq %rbp jmp _of_method_not_found