Index: src/forwarding/forwarding-x86-elf.S ================================================================== --- src/forwarding/forwarding-x86-elf.S +++ src/forwarding/forwarding-x86-elf.S @@ -17,175 +17,177 @@ #include "config.h" #include "platform.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 - pushl %ebx - subl $20, %esp + push ebx + sub esp, 20 call get_eip 0: - addl $_GLOBAL_OFFSET_TABLE_, %ebx - - movl 8(%ebp), %eax - movl %eax, (%esp) - movl object_getClass@GOT(%ebx), %eax - call *%eax - - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) - movl class_respondsToSelector@GOT(%ebx), %eax - call *%eax - - testl %eax, %eax - jz 1f - - movl 8(%ebp), %eax - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) - movl objc_msg_lookup@GOT(%ebx), %eax - call *%eax - - movl 8(%ebp), %edx - movl %edx, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%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) - movl objc_msg_lookup@GOT(%ebx), %eax - call *%eax - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax + add ebx, offset _GLOBAL_OFFSET_TABLE_ + + mov eax, [ebp+8] + mov [esp], eax + mov eax, [ebx+object_getClass@GOT] + call eax + + mov [esp], eax + lea eax, [ebx+sel_forwardingTargetForSelector_@GOTOFF] + mov [esp+4], eax + mov eax, [ebx+class_respondsToSelector@GOT] + call eax + + test eax, eax + jz short 1f + + 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 + + mov edx, [ebp+8] + mov [esp], edx + lea edx, [ebx+sel_forwardingTargetForSelector_@GOTOFF] + mov [esp+4], edx + mov edx, [ebp+12] + mov [esp+8], edx + call eax + + test eax, eax + jz short 1f + cmp eax, [ebp+8] + je short 1f + + mov [ebp+8], eax + mov [esp], eax + mov eax, [ebp+12] + mov [esp+4], eax + mov eax, [ebx+objc_msg_lookup@GOT] + call eax + + add esp, 20 + pop ebx + pop ebp + + jmp eax 1: - movl of_method_not_found@GOT(%ebx), %eax + mov eax, [ebx+of_method_not_found@GOT] - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp - jmp *%eax + jmp eax .type of_forward, %function .size of_forward, .-of_forward of_forward_stret: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp - pushl %ebx - subl $20, %esp + push ebx + sub esp, 20 call get_eip 0: - addl $_GLOBAL_OFFSET_TABLE_, %ebx - - movl 12(%ebp), %eax - movl %eax, (%esp) - movl object_getClass@GOT(%ebx), %eax - call *%eax - - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) - movl class_respondsToSelector@GOT(%ebx), %eax - call *%eax - - testl %eax, %eax - jz 1f - - movl 12(%ebp), %eax - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) - movl objc_msg_lookup@GOT(%ebx), %eax - call *%eax - - movl 12(%ebp), %edx - movl %edx, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%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) - movl objc_msg_lookup_stret@GOT(%ebx), %eax - call *%eax - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax + add ebx, offset _GLOBAL_OFFSET_TABLE_ + + mov eax, [ebp+12] + mov [esp], eax + mov eax, [ebx+object_getClass@GOT] + call eax + + mov [esp], eax + lea eax, [ebx+sel_forwardingTargetForSelector_@GOTOFF] + mov [esp+4], eax + mov eax, [ebx+class_respondsToSelector@GOT] + call eax + + test eax, eax + jz short 1f + + 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 + + mov edx, [ebp+12] + mov [esp], edx + lea edx, [ebx+sel_forwardingTargetForSelector_@GOTOFF] + mov [esp+4], edx + mov edx, [ebp+16] + mov [esp+8], edx + call eax + + test eax, eax + jz short 1f + cmp eax, [ebp+12] + je short 1f + + 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 + + add esp, 20 + pop ebx + pop ebp + + jmp eax 1: - movl of_method_not_found_stret@GOT(%ebx), %eax + mov eax, [ebx+of_method_not_found_stret@GOT] - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp - jmp *%eax + jmp eax .type of_forward_stret, %function .size of_forward_stret, .-of_forward_stret init: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp - pushl %ebx - subl $4, %esp + push ebx + sub esp, 4 call get_eip 0: - add $_GLOBAL_OFFSET_TABLE_, %ebx - - leal module@GOTOFF(%ebx), %eax - movl %eax, (%esp) - movl __objc_exec_class@GOT(%ebx), %eax - call *%eax - - addl $4, %esp - popl %ebx - popl %ebp + add ebx, offset _GLOBAL_OFFSET_TABLE_ + + lea eax, [ebx+module@GOTOFF] + mov [esp], eax + mov eax, [ebx+__objc_exec_class@GOT] + call eax + + add esp, 4 + pop ebx + pop ebp ret get_eip: - movl (%esp), %ebx + mov ebx, [esp] ret #ifdef OF_SOLARIS .section .init_array, "aw" #else 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 @@ -17,63 +17,65 @@ #include "config.h" #include "platform.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 $_GLOBAL_OFFSET_TABLE_, %eax - movl \not_found@GOT(%eax), %eax - jmp *%eax + add eax, offset _GLOBAL_OFFSET_TABLE_ + mov eax, [eax+\not_found@GOT] + jmp eax .type \name, %function .size \name, .-\name .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 .type \name, %function .size \name, .-\name .endm generate_lookup objc_msg_lookup objc_method_not_found @@ -82,19 +84,19 @@ generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret ret_nil: call get_eip 0: - addl $nil_method-0b, %eax + add eax, nil_method-0b ret nil_method: - xorl %eax, %eax + xor eax, eax ret get_eip: - movl (%esp), %eax + mov eax, [esp] ret #ifdef OF_LINUX .section .note.GNU-stack, "", %progbits #endif