Index: src/forwarding/forwarding-x86-elf.S ================================================================== --- src/forwarding/forwarding-x86-elf.S +++ src/forwarding/forwarding-x86-elf.S @@ -15,163 +15,165 @@ #include "config.h" #include "platform.h" +.intel_syntax noprefix + .globl OFForward .globl OFForward_stret .section .text OFForward: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp - pushl %ebx - subl $20, %esp + push ebx + sub esp, 20 call getEIP - addl $_GLOBAL_OFFSET_TABLE_, %ebx + add ebx, offset _GLOBAL_OFFSET_TABLE_ - movl 8(%ebp), %eax - movl %eax, (%esp) + mov eax, [ebp + 8] + mov [esp], eax call object_getClass@PLT - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) + mov [esp], eax + lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF] + mov [esp + 4], eax call class_respondsToSelector@PLT - testl %eax, %eax - jz 0f - - movl 8(%ebp), %eax - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) - call objc_msg_lookup@PLT - - 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 0f - cmpl 8(%ebp), %eax - je 0f - - movl %eax, 8(%ebp) - movl %eax, (%esp) - movl 12(%ebp), %eax - movl %eax, 4(%esp) - call objc_msg_lookup@PLT - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax - -0: - movl OFMethodNotFound@GOT(%ebx), %eax - - addl $20, %esp - popl %ebx - popl %ebp - - jmp *%eax + test eax, eax + jz short 0f + + mov eax, [ebp + 8] + mov [esp], eax + lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF] + mov [esp + 4], eax + call objc_msg_lookup@PLT + + 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 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@PLT + + add esp, 20 + pop ebx + pop ebp + + jmp eax + +0: + mov eax, [ebx + OFMethodNotFound@GOT] + + add esp, 20 + pop ebx + pop ebp + + jmp eax .type OFForward, %function .size OFForward, .-OFForward OFForward_stret: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp - pushl %ebx - subl $20, %esp + push ebx + sub esp, 20 call getEIP - addl $_GLOBAL_OFFSET_TABLE_, %ebx + add ebx, offset _GLOBAL_OFFSET_TABLE_ - movl 12(%ebp), %eax - movl %eax, (%esp) + mov eax, [ebp + 12] + mov [esp], eax call object_getClass@PLT - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) + mov [esp], eax + lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF] + mov [esp + 4], eax call class_respondsToSelector@PLT - testl %eax, %eax - jz 0f + test eax, eax + jz short 0f - movl 12(%ebp), %eax - movl %eax, (%esp) - leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax - movl %eax, 4(%esp) + mov eax, [ebp + 12] + mov [esp], eax + lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF] + mov [esp + 4], eax call objc_msg_lookup@PLT - 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 0f - cmpl 12(%ebp), %eax - je 0f - - movl %eax, 12(%ebp) - movl %eax, (%esp) - movl 16(%ebp), %eax - movl %eax, 4(%esp) + 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 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@PLT - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp - jmp *%eax + jmp eax 0: - movl OFMethodNotFound_stret@GOT(%ebx), %eax + mov eax, [ebx + OFMethodNotFound_stret@GOT] - addl $20, %esp - popl %ebx - popl %ebp + add esp, 20 + pop ebx + pop ebp - jmp *%eax + jmp eax .type OFForward_stret, %function .size OFForward_stret, .-OFForward_stret init: - pushl %ebp - movl %esp, %ebp + push ebp + mov ebp, esp - pushl %ebx - subl $4, %esp + push ebx + sub esp, 4 call getEIP - addl $_GLOBAL_OFFSET_TABLE_, %ebx + add ebx, offset _GLOBAL_OFFSET_TABLE_ - leal module@GOTOFF(%ebx), %eax - movl %eax, (%esp) + lea eax, [ebx + module@GOTOFF] + mov [esp], eax call __objc_exec_class@PLT - addl $4, %esp - popl %ebx - popl %ebp + add esp, 4 + pop ebx + pop ebp ret getEIP: - 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 @@ -15,80 +15,82 @@ #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 notFound \name: - movl 4(%esp), %edx - testl %edx, %edx - jz returnNilMethod - - testb $1, %dl - jnz .LtaggedPointer_\name - - movl (%edx), %edx - movl 32(%edx), %edx + mov edx, [esp + 4] + test edx, edx + jz short returnNilMethod + + test dl, 1 + jnz short .LtaggedPointer_\name + + 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 + 4 * ecx] #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 + 4 * ecx] + movzx ecx, byte ptr [eax] + mov eax, [edx + 4 * ecx] - testl %eax, %eax - jz 0f + test eax, eax + jz short 0f ret 0: call getEIP - addl $_GLOBAL_OFFSET_TABLE_, %eax - movl \notFound@GOT(%eax), %eax - jmp *%eax + add eax, offset _GLOBAL_OFFSET_TABLE_ + mov eax, [eax + \notFound@GOT] + jmp eax .LtaggedPointer_\name: call getEIP - addl $_GLOBAL_OFFSET_TABLE_, %eax - - movl objc_taggedPointerSecret@GOT(%eax), %ecx - xorl (%ecx), %edx - andb $0xE, %dl - movzbl %dl, %edx - - movl objc_taggedPointerClasses@GOT(%eax), %eax - movl (%eax,%edx,2), %edx - movl 32(%edx), %edx - - jmp .Lmain_\name + add eax, offset _GLOBAL_OFFSET_TABLE_ + + mov ecx, [eax + objc_taggedPointerSecret@GOT] + xor edx, [ecx] + and dl, 0xE + movzx edx, dl + + mov eax, [eax + objc_taggedPointerClasses@GOT] + mov edx, [eax + 2 * edx] + mov edx, [edx + 32] + + jmp short .Lmain_\name .type \name, %function .size \name, .-\name .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: - movl 4(%esp), %edx - movl (%edx), %eax - testl %eax, %eax - jz returnNilMethod - - movl %eax, 4(%esp) - mov 4(%edx), %edx - mov 32(%edx), %edx - jmp .Lmain_\lookup + mov edx, [esp + 4] + mov eax, [edx] + test eax, eax + jz short returnNilMethod + + 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_methodNotFound @@ -96,20 +98,20 @@ GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret returnNilMethod: call getEIP - addl $_GLOBAL_OFFSET_TABLE_, %eax - leal nilMethod@GOTOFF(%eax), %eax + add eax, offset _GLOBAL_OFFSET_TABLE_ + lea eax, [eax + nilMethod@GOTOFF] ret nilMethod: - xorl %eax, %eax + xor eax, eax ret getEIP: - movl (%esp), %eax + mov eax, [esp] ret #if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD) .section .note.GNU-stack, "", %progbits #endif