Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -250,10 +250,14 @@ dnl files, but not for assembly files. mips*-*-*) flag="-integrated-as" OBJCFLAGS="$OBJCFLAGS $flag" OBJFW_OBJCFLAGS="$OBJFW_OBJCFLAGS $flag" + ;; + dnl Don't use -no-integrated-as on Darwin. It breaks + dnl building for the iOS simulator. + i?86-*-darwin* | x86_64-*-darwin*) ;; dnl Many older Clang versions don't support jmp short. i?86-*-* | x86_64-*-*) ASFLAGS="$ASFLAGS -no-integrated-as" ;; Index: src/forwarding/forwarding-x86-elf.S ================================================================== --- src/forwarding/forwarding-x86-elf.S +++ src/forwarding/forwarding-x86-elf.S @@ -31,33 +31,29 @@ push ebx sub esp, 20 call get_eip -0: add ebx, offset _GLOBAL_OFFSET_TABLE_ mov eax, [ebp+8] mov [esp], eax - mov eax, [ebx+object_getClass@GOT] - call eax + call object_getClass@PLT mov [esp], eax lea eax, [ebx+sel_forwardingTargetForSelector_@GOTOFF] mov [esp+4], eax - mov eax, [ebx+class_respondsToSelector@GOT] - call eax + call class_respondsToSelector@PLT test eax, eax - jz short 1f + jz short 0f mov eax, [ebp+8] mov [esp], eax lea eax, [ebx+sel_forwardingTargetForSelector_@GOTOFF] mov [esp+4], eax - mov eax, [ebx+objc_msg_lookup@GOT] - call eax + call objc_msg_lookup@PLT mov edx, [ebp+8] mov [esp], edx lea edx, [ebx+sel_forwardingTargetForSelector_@GOTOFF] mov [esp+4], edx @@ -64,29 +60,28 @@ mov edx, [ebp+12] mov [esp+8], edx call eax test eax, eax - jz short 1f + jz short 0f cmp eax, [ebp+8] - je short 1f + je short 0f mov [ebp+8], eax mov [esp], eax mov eax, [ebp+12] mov [esp+4], eax - mov eax, [ebx+objc_msg_lookup@GOT] - call eax + call objc_msg_lookup@PLT add esp, 20 pop ebx pop ebp jmp eax -1: - mov eax, [ebx+of_method_not_found@GOT] +0: + lea eax, [ebx+of_method_not_found@GOTOFF] add esp, 20 pop ebx pop ebp @@ -100,33 +95,29 @@ push ebx sub esp, 20 call get_eip -0: add ebx, offset _GLOBAL_OFFSET_TABLE_ mov eax, [ebp+12] mov [esp], eax - mov eax, [ebx+object_getClass@GOT] - call eax + call object_getClass@PLT mov [esp], eax lea eax, [ebx+sel_forwardingTargetForSelector_@GOTOFF] mov [esp+4], eax - mov eax, [ebx+class_respondsToSelector@GOT] - call eax + call class_respondsToSelector@PLT test eax, eax - jz short 1f + jz short 0f mov eax, [ebp+12] mov [esp], eax lea eax, [ebx+sel_forwardingTargetForSelector_@GOTOFF] mov [esp+4], eax - mov eax, [ebx+objc_msg_lookup@GOT] - call eax + call objc_msg_lookup@PLT mov edx, [ebp+12] mov [esp], edx lea edx, [ebx+sel_forwardingTargetForSelector_@GOTOFF] mov [esp+4], edx @@ -133,29 +124,28 @@ mov edx, [ebp+16] mov [esp+8], edx call eax test eax, eax - jz short 1f + jz short 0f cmp eax, [ebp+12] - je short 1f + je short 0f mov [ebp+12], eax mov [esp], eax mov eax, [ebp+16] mov [esp+4], eax - mov eax, [ebx+objc_msg_lookup_stret@GOT] - call eax + call objc_msg_lookup_stret@PLT add esp, 20 pop ebx pop ebp jmp eax -1: - mov eax, [ebx+of_method_not_found_stret@GOT] +0: + lea eax, [ebx+of_method_not_found_stret@GOTOFF] add esp, 20 pop ebx pop ebp @@ -169,17 +159,15 @@ push ebx sub esp, 4 call get_eip -0: add ebx, offset _GLOBAL_OFFSET_TABLE_ lea eax, [ebx+module@GOTOFF] mov [esp], eax - mov eax, [ebx+__objc_exec_class@GOT] - call eax + call __objc_exec_class@PLT add esp, 4 pop ebx pop ebp ret Index: src/forwarding/forwarding-x86-win32.S ================================================================== --- src/forwarding/forwarding-x86-win32.S +++ src/forwarding/forwarding-x86-win32.S @@ -15,167 +15,144 @@ * file. */ #include "config.h" +.intel_syntax noprefix + .globl _of_forward .globl _of_forward_stret .section .text _of_forward: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp + + push ebx + sub esp, 20 + + mov eax, [ebp+8] + mov [esp], eax + call _object_getClass + + mov [esp], eax + mov eax, offset sel_forwardingTargetForSelector_ + mov [esp+4], eax + call _class_respondsToSelector + + test eax, eax + jz short 0f + + mov eax, [ebp+8] + mov [esp], eax + mov eax, offset sel_forwardingTargetForSelector_ + mov [esp+4], eax + call _objc_msg_lookup + + mov edx, [ebp+8] + mov [esp], edx + mov edx, offset sel_forwardingTargetForSelector_ + mov [esp+4], edx + mov edx, [ebp+12] + mov [esp+8], edx + call eax + + test eax, eax + jz short 0f + cmp eax, [ebp+8] + je short 0f + + mov [ebp+8], eax + mov [esp], eax + mov eax, [ebp+12] + mov [esp+4], eax + call _objc_msg_lookup - pushl %ebx - subl $20, %esp + add esp, 20 + pop ebx + pop ebp - call get_eip + jmp eax + 0: - - movl 8(%ebp), %eax - movl %eax, (%esp) - leal _object_getClass-0b(%ebx), %eax - call *%eax - - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) - leal _class_respondsToSelector-0b(%ebx), %eax - call *%eax - - testl %eax, %eax - jz 1f - - movl 8(%ebp), %eax - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) - leal _objc_msg_lookup-0b(%ebx), %eax - call *%eax - - movl 8(%ebp), %edx - movl %edx, (%esp) - leal sel_forwardingTargetForSelector_-0b(%ebx), %edx - movl %edx, 4(%esp) - movl 12(%ebp), %edx - movl %edx, 8(%esp) - call *%eax - - testl %eax, %eax - jz 1f - cmpl 8(%ebp), %eax - je 1f - - movl %eax, 8(%ebp) - movl %eax, (%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - leal _objc_msg_lookup-0b(%ebx), %eax - call *%eax - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax - -1: - leal _of_method_not_found-0b(%ebx), %eax - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax + add esp, 20 + pop ebx + pop ebp + + jmp _of_method_not_found _of_forward_stret: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp + + push ebx + sub esp, 20 + + mov eax, [ebp+12] + mov [esp], eax + call _object_getClass + + mov [esp], eax + mov eax, offset sel_forwardingTargetForSelector_ + mov [esp+4], eax + call _class_respondsToSelector + + test eax, eax + jz short 0f + + mov eax, [ebp+12] + mov [esp], eax + mov eax, offset sel_forwardingTargetForSelector_ + mov [esp+4], eax + call _objc_msg_lookup + + mov edx, [ebp+12] + mov [esp], edx + mov edx, offset sel_forwardingTargetForSelector_ + mov [esp+4], edx + mov edx, [ebp+16] + mov [esp+8], edx + call eax + + test eax, eax + jz short 0f + cmp eax, [ebp+12] + je short 0f + + mov [ebp+12], eax + mov [esp], eax + mov eax, [ebp+16] + mov [esp+4], eax + call _objc_msg_lookup_stret - pushl %ebx - subl $20, %esp + add esp, 20 + pop ebx + pop ebp - call get_eip + jmp eax + 0: - - movl 12(%ebp), %eax - movl %eax, (%esp) - leal _object_getClass-0b(%ebx), %eax - call *%eax - - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) - leal _class_respondsToSelector-0b(%ebx), %eax - call *%eax - - testl %eax, %eax - jz 1f - - movl 12(%ebp), %eax - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_-0b(%ebx), %eax - movl %eax, 4(%esp) - leal _objc_msg_lookup-0b(%ebx), %eax - call *%eax - - movl 12(%ebp), %edx - movl %edx, (%esp) - leal sel_forwardingTargetForSelector_-0b(%ebx), %edx - movl %edx, 4(%esp) - movl 16(%ebp), %edx - movl %edx, 8(%esp) - call *%eax - - testl %eax, %eax - jz 1f - cmpl 12(%ebp), %eax - je 1f - - movl %eax, 12(%ebp) - movl %eax, (%esp) - movl 16(%ebp), %eax - movl %eax, 4(%esp) - leal _objc_msg_lookup_stret-0b(%ebx), %eax - call *%eax - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax - -1: - leal _of_method_not_found_stret-0b(%ebx), %eax - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax + add esp, 20 + pop ebx + pop ebp + + jmp _of_method_not_found_stret init: - pushl %ebp - movl %esp, %ebp - - pushl %ebx - subl $4, %esp - - call get_eip -0: - leal module-0b(%ebx), %eax - movl %eax, (%esp) - leal ___objc_exec_class-0b(%ebx), %eax - call *%eax - - addl $4, %esp - popl %ebx - popl %ebp - ret - -get_eip: - movl (%esp), %ebx + push ebp + mov ebp, esp + + push ebx + sub esp, 4 + + mov eax, offset module + mov [esp], eax + call ___objc_exec_class + + add esp, 4 + pop ebx + pop ebp ret .section .ctors, "aw" .long init Index: src/forwarding/forwarding-x86_64-win64.S ================================================================== --- src/forwarding/forwarding-x86_64-win64.S +++ src/forwarding/forwarding-x86_64-win64.S @@ -15,160 +15,162 @@ * file. */ #include "config.h" +.intel_syntax noprefix + .globl of_forward .globl of_forward_stret .section .text of_forward: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0x90, %rsp /* 16-byte alignment */ - movq %rax, -0x28(%rbp) - movq %rcx, -0x30(%rbp) - movq %rdx, -0x38(%rbp) - movq %r8, -0x40(%rbp) - movq %r9, -0x48(%rbp) - movaps %xmm0, -0x60(%rbp) - movaps %xmm1, -0x70(%rbp) - movaps %xmm2, -0x80(%rbp) - movaps %xmm3, -0x90(%rbp) + sub rsp, 0x90 /* 16-byte alignment */ + mov [rbp-0x28], rax + mov [rbp-0x30], rcx + mov [rbp-0x38], rdx + mov [rbp-0x40], r8 + mov [rbp-0x48], r9 + movaps [rbp-0x60], xmm0 + movaps [rbp-0x70], xmm1 + movaps [rbp-0x80], xmm2 + movaps [rbp-0x90], xmm3 call object_getClass - movq %rax, %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx + mov rcx, rax + mov rdx, offset sel_forwardingTargetForSelector_ call class_respondsToSelector - testq %rax, %rax - jz 0f - - movq -0x30(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx - call objc_msg_lookup - - movq -0x30(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx - movq -0x38(%rbp), %r8 - call *%rax - - testq %rax, %rax - jz 0f - cmpq -0x30(%rbp), %rax - je 0f - - movq %rax, -0x30(%rbp) - - movq %rax, %rcx - movq -0x38(%rbp), %rdx - call objc_msg_lookup - movq %rax, %r11 + test rax, rax + jz short 0f + + mov rcx, [rbp-0x30] + mov rdx, offset sel_forwardingTargetForSelector_ + call objc_msg_lookup + + mov rcx, [rbp-0x30] + mov rdx, offset sel_forwardingTargetForSelector_ + mov r8, [rbp-0x38] + call rax + + test rax, rax + jz short 0f + cmp rax, [rbp-0x30] + je short 0f + + mov [rbp-0x30], rax + + mov rcx, rax + mov rdx, [rbp-0x38] + call objc_msg_lookup + mov r11, rax /* Restore all arguments */ - movaps -0x90(%rbp), %xmm3 - movaps -0x80(%rbp), %xmm2 - movaps -0x70(%rbp), %xmm1 - movaps -0x60(%rbp), %xmm0 - movq -0x48(%rbp), %r9 - movq -0x40(%rbp), %r8 - movq -0x38(%rbp), %rdx - movq -0x30(%rbp), %rcx - movq -0x28(%rbp), %rax - - movq %rbp, %rsp - popq %rbp - - jmpq *%r11 + movaps xmm3, [rbp-0x90] + movaps xmm2, [rbp-0x80] + movaps xmm1, [rbp-0x70] + movaps xmm0, [rbp-0x60] + mov r9, [rbp-0x48] + mov r8, [rbp-0x40] + mov rdx, [rbp-0x38] + mov rcx, [rbp-0x30] + mov rax, [rbp-0x28] + + mov rsp, rbp + pop rbp + + jmp r11 0: - movq -0x30(%rbp), %rcx - movq -0x38(%rbp), %rdx + mov rcx, [rbp-0x30] + mov rdx, [rbp-0x38] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp of_method_not_found of_forward_stret: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0x90, %rsp /* 16-byte alignment */ - movq %rax, -0x28(%rbp) - movq %rcx, -0x30(%rbp) - movq %rdx, -0x38(%rbp) - movq %r8, -0x40(%rbp) - movq %r9, -0x48(%rbp) - movaps %xmm0, -0x60(%rbp) - movaps %xmm1, -0x70(%rbp) - movaps %xmm2, -0x80(%rbp) - movaps %xmm3, -0x90(%rbp) - - movq %rdx, %rcx + sub rsp, 0x90 /* 16-byte alignment */ + mov [rbp-0x28], rax + mov [rbp-0x30], rcx + mov [rbp-0x38], rdx + mov [rbp-0x40], r8 + mov [rbp-0x48], r9 + movaps [rbp-0x60], xmm0 + movaps [rbp-0x70], xmm1 + movaps [rbp-0x80], xmm2 + movaps [rbp-0x90], xmm3 + + mov rcx, rdx call object_getClass - movq %rax, %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx + mov rcx, rax + mov rdx, offset sel_forwardingTargetForSelector_ call class_respondsToSelector - testq %rax, %rax - jz 0f + test rax, rax + jz short 0f - movq -0x38(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx + mov rcx, [rbp-0x38] + mov rdx, offset sel_forwardingTargetForSelector_ call objc_msg_lookup - movq -0x38(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx - movq -0x40(%rbp), %r8 - call *%rax - - testq %rax, %rax - jz 0f - cmpq -0x38(%rbp), %rax - je 0f - - movq %rax, -0x38(%rbp) - - movq %rax, %rcx - movq -0x40(%rbp), %rdx + mov rcx, [rbp-0x38] + mov rdx, offset sel_forwardingTargetForSelector_ + mov r8, [rbp-0x40] + call rax + + test rax, rax + jz short 0f + cmp rax, [rbp-0x38] + je short 0f + + mov [rbp-0x38], rax + + mov rcx, rax + mov rdx, [rbp-0x40] call objc_msg_lookup_stret - movq %rax, %r11 + mov r11, rax /* Restore all arguments */ - movaps -0x90(%rbp), %xmm3 - movaps -0x80(%rbp), %xmm2 - movaps -0x70(%rbp), %xmm1 - movaps -0x60(%rbp), %xmm0 - movq -0x48(%rbp), %r9 - movq -0x40(%rbp), %r8 - movq -0x38(%rbp), %rdx - movq -0x30(%rbp), %rcx - movq -0x28(%rbp), %rax - - movq %rbp, %rsp - popq %rbp - - jmpq *%r11 + movaps xmm3, [rbp-0x90] + movaps xmm2, [rbp-0x80] + movaps xmm1, [rbp-0x70] + movaps xmm0, [rbp-0x60] + mov r9, [rbp-0x48] + mov r8, [rbp-0x40] + mov rdx, [rbp-0x38] + mov rcx, [rbp-0x30] + mov rax, [rbp-0x28] + + mov rsp, rbp + pop rbp + + jmp r11 0: - movq -0x30(%rbp), %rcx - movq -0x38(%rbp), %rdx - movq -0x40(%rbp), %r8 + mov rcx, [rbp-0x30] + mov rdx, [rbp-0x38] + mov r8, [rbp-0x40] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp of_method_not_found_stret init: - leaq module(%rip), %rcx + mov rcx, offset module jmp __objc_exec_class .section .ctors, "aw" .quad init Index: src/runtime/lookup-asm/lookup-asm-x86-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86-elf.S +++ src/runtime/lookup-asm/lookup-asm-x86-elf.S @@ -56,13 +56,12 @@ ret 0: call get_eip -1: add eax, offset _GLOBAL_OFFSET_TABLE_ - mov eax, [eax+\not_found@GOT] + lea eax, [eax+\not_found@GOTOFF] jmp eax .Ltagged_pointer_\name: movzx edx, dl shr edx, 1 @@ -99,12 +98,12 @@ generate_lookup_super objc_msg_lookup_super objc_msg_lookup generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret ret_nil: call get_eip -0: - add eax, nil_method-0b + add eax, offset _GLOBAL_OFFSET_TABLE_ + lea eax, [eax+nil_method@GOTOFF] ret nil_method: xor eax, eax ret Index: src/runtime/lookup-asm/lookup-asm-x86-win32.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86-win32.S +++ src/runtime/lookup-asm/lookup-asm-x86-win32.S @@ -14,76 +14,69 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" + +.intel_syntax noprefix .globl _objc_msg_lookup .globl _objc_msg_lookup_stret .globl _objc_msg_lookup_super .globl _objc_msg_lookup_super_stret .section .text .macro generate_lookup name not_found \name: - movl 4(%esp), %edx - testl %edx, %edx - jz ret_nil + mov edx, [esp+4] + test edx, edx + jz short ret_nil - movl (%edx), %edx - movl 32(%edx), %edx + mov edx, [edx] + mov edx, [edx+32] .Lmain_\name: - movl 8(%esp), %eax + mov eax, [esp+8] #ifdef OF_SELUID24 - movzbl 2(%eax), %ecx - movl (%edx,%ecx,4), %edx + movzx ecx, byte ptr [eax+2] + mov edx, [edx+ecx*4] #endif - movzbl 1(%eax), %ecx - movl (%edx,%ecx,4), %edx - movzbl (%eax), %ecx - movl (%edx,%ecx,4), %eax + movzx ecx, byte ptr [eax+1] + mov edx, [edx+ecx*4] + movzx ecx, byte ptr [eax] + mov eax, [edx+ecx*4] - testl %eax, %eax - jz 0f + test eax, eax + jz short 0f ret 0: - call get_eip -1: - addl $\not_found-1b, %eax - jmp *%eax + jmp \not_found .endm .macro generate_lookup_super name lookup \name: - movl 4(%esp), %edx - movl (%edx), %eax - cmpl $0, %eax - je ret_nil - - movl %eax, 4(%esp) - movl 4(%edx), %edx - movl 32(%edx), %edx - jmp .Lmain_\lookup + mov edx, [esp+4] + mov eax, [edx] + test eax, eax + jz short ret_nil + + mov [esp+4], eax + mov edx, [edx+4] + mov edx, [edx+32] + jmp short .Lmain_\lookup .endm generate_lookup _objc_msg_lookup _objc_method_not_found generate_lookup _objc_msg_lookup_stret _objc_method_not_found_stret generate_lookup_super _objc_msg_lookup_super _objc_msg_lookup generate_lookup_super _objc_msg_lookup_super_stret _objc_msg_lookup_stret ret_nil: - call get_eip -0: - addl $nil_method-0b, %eax + mov eax, offset nil_method ret nil_method: - xorl %eax, %eax - ret - -get_eip: - movl (%esp), %eax + xor eax, eax ret Index: src/runtime/lookup-asm/lookup-asm-x86_64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86_64-elf.S +++ src/runtime/lookup-asm/lookup-asm-x86_64-elf.S @@ -43,13 +43,13 @@ movzx ecx, ah movzx edx, al #ifdef OF_SELUID24 shr eax, 16 - mov r8, [r8+rax*8] + mov r8, [r8+rax*8] #endif - mov r8, [r8+rcx*8] + mov r8, [r8+rcx*8] mov rax, [r8+rdx*8] test rax, rax jz short \not_found@PLT @@ -71,15 +71,15 @@ .macro generate_lookup_super name lookup \name: mov r8, rdi mov rdi, [rdi] test rdi, rdi - jz ret_nil + jz short ret_nil mov r8, [r8+8] mov r8, [r8+64] - jmp .Lmain_\lookup + jmp short .Lmain_\lookup .type \name, %function .size \name, .-\name .endm generate_lookup objc_msg_lookup objc_method_not_found Index: src/runtime/lookup-asm/lookup-asm-x86_64-win64.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-x86_64-win64.S +++ src/runtime/lookup-asm/lookup-asm-x86_64-win64.S @@ -15,69 +15,71 @@ * file. */ #include "config.h" +.intel_syntax noprefix + .globl objc_msg_lookup .globl objc_msg_lookup_stret .globl objc_msg_lookup_super .globl objc_msg_lookup_super_stret .section .text .macro generate_lookup name not_found \name: - testq %rcx, %rcx - jz ret_nil + test %rcx, %rcx + jz short ret_nil - movq (%rcx), %r8 - movq 56(%r8), %r8 + mov r8, [rcx] + mov r8, [r8+56] .Lmain_\name: - movq %rcx, %r10 - movq %rdx, %r11 + mov r10, rcx + mov r11, rdx - movq (%rdx), %rax - movzbl %ah, %ecx - movzbl %al, %edx + mov rax, [rdx] + movzx ecx, ah + movzx edx, al #ifdef OF_SELUID24 - shrl $16, %eax + shr eax, 16 - movq (%r8,%rax,8), %r8 + mov r8, [r8+rax*8] #endif - movq (%r8,%rcx,8), %r8 - movq (%r8,%rdx,8), %rax + mov r8, [r8+rcx*8] + mov rax, [r8+rdx*8] - testq %rax, %rax - jz 0f + test rax, rax + jz short 0f ret 0: - movq %r10, %rcx - movq %r11, %rdx + mov rcx, r10 + mov rdx, r11 jmp \not_found .endm .macro generate_lookup_super name lookup \name: - movq %rcx, %r8 - movq (%rcx), %rcx - testq %rcx, %rcx - jz ret_nil - - movq 8(%r8), %r8 - movq 56(%r8), %r8 - jmp .Lmain_\lookup + mov r8, rcx + mov rcx, [rcx] + test rcx, rcx + jz short ret_nil + + mov r8, [r8+8] + mov r8, [r8+56] + jmp short .Lmain_\lookup .endm generate_lookup objc_msg_lookup objc_method_not_found generate_lookup objc_msg_lookup_stret objc_method_not_found_stret generate_lookup_super objc_msg_lookup_super objc_msg_lookup generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret ret_nil: - leaq nil_method(%rip), %rax + mov rax, offset nil_method ret nil_method: - xorq %rax, %rax + xor rax, rax ret