Index: src/forwarding/apple-forwarding-amd64.S ================================================================== --- src/forwarding/apple-forwarding-amd64.S +++ src/forwarding/apple-forwarding-amd64.S @@ -16,26 +16,10 @@ #include "config.h" .globl _OFForward .globl _OFForward_stret -.intel_syntax noprefix - -/* Work around assembler bugs. */ -.macro call - .att_syntax - /* Use uppercase instruction to avoid recursion. */ - CALL $0 - .intel_syntax noprefix -.endmacro -.macro jmp - .att_syntax - /* Use uppercase instruction to avoid recursion. */ - JMP $0 - .intel_syntax noprefix -.endmacro - .section __TEXT, __objc_methname, cstring_literals Lstr_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" .section __DATA, __objc_selrefs, literal_pointers, no_dead_strip @@ -45,150 +29,150 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions _OFForward: - push rbp - mov rbp, rsp + pushq %rbp + movq %rsp, %rbp /* Save all arguments */ - sub rsp, 0xC0 /* 16-byte alignment */ - mov [rbp - 0x08], rax - mov [rbp - 0x10], rdi - mov [rbp - 0x18], rsi - mov [rbp - 0x20], rdx - mov [rbp - 0x28], rcx - mov [rbp - 0x30], r8 - mov [rbp - 0x38], r9 - movaps [rbp - 0x50], xmm0 - movaps [rbp - 0x60], xmm1 - movaps [rbp - 0x70], xmm2 - movaps [rbp - 0x80], xmm3 - movaps [rbp - 0x90], xmm4 - movaps [rbp - 0xA0], xmm5 - movaps [rbp - 0xB0], xmm6 - movaps [rbp - 0xC0], xmm7 + 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) + movaps %xmm0, -0x50(%rbp) + movaps %xmm1, -0x60(%rbp) + movaps %xmm2, -0x70(%rbp) + movaps %xmm3, -0x80(%rbp) + movaps %xmm4, -0x90(%rbp) + movaps %xmm5, -0xA0(%rbp) + movaps %xmm6, -0xB0(%rbp) + movaps %xmm7, -0xC0(%rbp) call _object_getClass - mov rdi, rax - mov rsi, [rip + Lsel_forwardingTargetForSelector_] + movq %rax, %rdi + movq Lsel_forwardingTargetForSelector_(%rip), %rsi call _class_respondsToSelector - test rax, rax + testq %rax, %rax jz 0f - mov rdi, [rbp - 0x10] - mov rsi, [rip + Lsel_forwardingTargetForSelector_] - mov rdx, [rbp - 0x18] + movq -0x10(%rbp), %rdi + movq Lsel_forwardingTargetForSelector_(%rip), %rsi + movq -0x18(%rbp), %rdx call _objc_msgSend - test rax, rax + testq %rax, %rax jz 0f - cmp rax, [rbp - 0x10] + cmpq -0x10(%rbp), %rax je 0f - mov rdi, rax + movq %rax, %rdi /* Restore all arguments, except %rdi */ - movaps xmm7, [rbp - 0xC0] - movaps xmm6, [rbp - 0xB0] - movaps xmm5, [rbp - 0xA0] - movaps xmm4, [rbp - 0x90] - movaps xmm3, [rbp - 0x80] - movaps xmm2, [rbp - 0x70] - movaps xmm1, [rbp - 0x60] - movaps xmm0, [rbp - 0x50] - mov r9, [rbp - 0x38] - mov r8, [rbp - 0x30] - mov rcx, [rbp - 0x28] - mov rdx, [rbp - 0x20] - mov rsi, [rbp - 0x18] - mov rax, [rbp - 0x08] - - mov rsp, rbp - pop rbp + movaps -0xC0(%rbp), %xmm7 + movaps -0xB0(%rbp), %xmm6 + movaps -0xA0(%rbp), %xmm5 + movaps -0x90(%rbp), %xmm4 + movaps -0x80(%rbp), %xmm3 + movaps -0x70(%rbp), %xmm2 + movaps -0x60(%rbp), %xmm1 + movaps -0x50(%rbp), %xmm0 + movq -0x38(%rbp), %r9 + movq -0x30(%rbp), %r8 + movq -0x28(%rbp), %rcx + movq -0x20(%rbp), %rdx + movq -0x18(%rbp), %rsi + movq -0x8(%rbp), %rax + + movq %rbp, %rsp + popq %rbp jmp _objc_msgSend 0: - mov rdi, [rbp - 0x10] - mov rsi, [rbp - 0x18] + movq -0x10(%rbp), %rdi + movq -0x18(%rbp), %rsi - mov rsp, rbp - pop rbp + movq %rbp, %rsp + popq %rbp jmp _OFMethodNotFound _OFForward_stret: - push rbp - mov rbp, rsp + pushq %rbp + movq %rsp, %rbp /* Save all arguments */ - sub rsp, 0xC0 /* 16-byte alignment */ - mov [rbp - 0x08], rax - mov [rbp - 0x10], rdi - mov [rbp - 0x18], rsi - mov [rbp - 0x20], rdx - mov [rbp - 0x28], rcx - mov [rbp - 0x30], r8 - mov [rbp - 0x38], r9 - movaps [rbp - 0x50], xmm0 - movaps [rbp - 0x60], xmm1 - movaps [rbp - 0x70], xmm2 - movaps [rbp - 0x80], xmm3 - movaps [rbp - 0x90], xmm4 - movaps [rbp - 0xA0], xmm5 - movaps [rbp - 0xB0], xmm6 - movaps [rbp - 0xC0], xmm7 - - mov rdi, rsi + 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) + movaps %xmm0, -0x50(%rbp) + movaps %xmm1, -0x60(%rbp) + movaps %xmm2, -0x70(%rbp) + movaps %xmm3, -0x80(%rbp) + movaps %xmm4, -0x90(%rbp) + movaps %xmm5, -0xA0(%rbp) + movaps %xmm6, -0xB0(%rbp) + movaps %xmm7, -0xC0(%rbp) + + movq %rsi, %rdi call _object_getClass - mov rdi, rax - mov rsi, [rip + Lsel_forwardingTargetForSelector_] + movq %rax, %rdi + movq Lsel_forwardingTargetForSelector_(%rip), %rsi call _class_respondsToSelector - test rax, rax + testq %rax, %rax jz 0f - mov rdi, [rbp - 0x18] - mov rsi, [rip + Lsel_forwardingTargetForSelector_] - mov rdx, [rbp - 0x20] + movq -0x18(%rbp), %rdi + movq Lsel_forwardingTargetForSelector_(%rip), %rsi + movq -0x20(%rbp), %rdx call _objc_msgSend - test rax, rax + testq %rax, %rax jz 0f - cmp rax, [rbp - 0x18] + cmpq -0x18(%rbp), %rax je 0f - mov rsi, rax + movq %rax, %rsi /* Restore all arguments, except %rsi */ - movaps xmm7, [rbp - 0xC0] - movaps xmm6, [rbp - 0xB0] - movaps xmm5, [rbp - 0xA0] - movaps xmm4, [rbp - 0x90] - movaps xmm3, [rbp - 0x80] - movaps xmm2, [rbp - 0x70] - movaps xmm1, [rbp - 0x60] - movaps xmm0, [rbp - 0x50] - mov r9, [rbp - 0x38] - mov r8, [rbp - 0x30] - mov rcx, [rbp - 0x28] - mov rdx, [rbp - 0x20] - mov rdi, [rbp - 0x10] - mov rax, [rbp - 0x08] - - mov rsp, rbp - pop rbp + movaps -0xC0(%rbp), %xmm7 + movaps -0xB0(%rbp), %xmm6 + movaps -0xA0(%rbp), %xmm5 + movaps -0x90(%rbp), %xmm4 + movaps -0x80(%rbp), %xmm3 + movaps -0x70(%rbp), %xmm2 + movaps -0x60(%rbp), %xmm1 + movaps -0x50(%rbp), %xmm0 + movq -0x38(%rbp), %r9 + movq -0x30(%rbp), %r8 + movq -0x28(%rbp), %rcx + movq -0x20(%rbp), %rdx + movq -0x10(%rbp), %rdi + movq -0x8(%rbp), %rax + + movq %rbp, %rsp + popq %rbp jmp _objc_msgSend_stret 0: - mov rdi, [rbp - 0x10] - mov rsi, [rbp - 0x18] - mov rdx, [rbp - 0x20] + movq -0x10(%rbp), %rdi + movq -0x18(%rbp), %rsi + movq -0x20(%rbp), %rdx - mov rsp, rbp - pop rbp + movq %rbp, %rsp + popq %rbp jmp _OFMethodNotFound_stret Index: src/forwarding/forwarding-amd64-macho.S ================================================================== --- src/forwarding/forwarding-amd64-macho.S +++ src/forwarding/forwarding-amd64-macho.S @@ -18,197 +18,181 @@ #include "platform.h" .globl _OFForward .globl _OFForward_stret -.intel_syntax noprefix - -/* Work around assembler bugs. */ -.macro call - .att_syntax - /* Use uppercase instruction to avoid recursion. */ - CALL $0 - .intel_syntax noprefix -.endmacro -.macro jmp - .att_syntax - /* Use uppercase instruction to avoid recursion. */ - JMP $0 - .intel_syntax noprefix -.endmacro - .section __TEXT, __text, regular, pure_instructions _OFForward: - push rbp - mov rbp, rsp + pushq %rbp + movq %rsp, %rbp /* Save all arguments */ - sub rsp, 0xC0 /* 16-byte alignment */ - movq [rbp - 0x08], rax - movq [rbp - 0x10], rdi - movq [rbp - 0x18], rsi - movq [rbp - 0x20], rdx - movq [rbp - 0x28], rcx - movq [rbp - 0x30], r8 - movq [rbp - 0x38], r9 - movaps [rbp - 0x50], xmm0 - movaps [rbp - 0x60], xmm1 - movaps [rbp - 0x70], xmm2 - movaps [rbp - 0x80], xmm3 - movaps [rbp - 0x90], xmm4 - movaps [rbp - 0xA0], xmm5 - movaps [rbp - 0xB0], xmm6 - movaps [rbp - 0xC0], xmm7 + 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) + movaps %xmm0, -0x50(%rbp) + movaps %xmm1, -0x60(%rbp) + movaps %xmm2, -0x70(%rbp) + movaps %xmm3, -0x80(%rbp) + movaps %xmm4, -0x90(%rbp) + movaps %xmm5, -0xA0(%rbp) + movaps %xmm6, -0xB0(%rbp) + movaps %xmm7, -0xC0(%rbp) call _object_getClass - mov rdi, rax - lea rsi, [rip + Lsel_forwardingTargetForSelector_] + movq %rax, %rdi + leaq Lsel_forwardingTargetForSelector_(%rip), %rsi call _class_respondsToSelector - test rax, rax + testq %rax, %rax jz 0f - mov rdi, [rbp - 0x10] - lea rsi, [rip + Lsel_forwardingTargetForSelector_] + movq -0x10(%rbp), %rdi + leaq Lsel_forwardingTargetForSelector_(%rip), %rsi call _objc_msg_lookup - movq rdi, [rbp - 0x10] - leaq rsi, [rip + Lsel_forwardingTargetForSelector_] - movq rdx, [rbp - 0x18] + movq -0x10(%rbp), %rdi + leaq Lsel_forwardingTargetForSelector_(%rip), %rsi + movq -0x18(%rbp), %rdx call *%rax - test rax, rax + testq %rax, %rax jz 0f - cmp rax, [rbp - 0x10] + cmpq -0x10(%rbp), %rax je 0f - mov [rbp - 0x10], rax + movq %rax, -0x10(%rbp) - mov rdi, rax - mov rsi, [rbp - 0x18] + movq %rax, %rdi + movq -0x18(%rbp), %rsi call _objc_msg_lookup - mov r11, rax + movq %rax, %r11 /* Restore all arguments */ - movaps xmm7, [rbp - 0xC0] - movaps xmm6, [rbp - 0xB0] - movaps xmm5, [rbp - 0xA0] - movaps xmm4, [rbp - 0x90] - movaps xmm3, [rbp - 0x80] - movaps xmm2, [rbp - 0x70] - movaps xmm1, [rbp - 0x60] - movaps xmm0, [rbp - 0x50] - mov r9, [rbp - 0x38] - mov r8, [rbp - 0x30] - mov rcx, [rbp - 0x28] - mov rdx, [rbp - 0x20] - mov rsi, [rbp - 0x18] - mov rdi, [rbp - 0x10] - mov rax, [rbp - 0x08] - - mov rsp, rbp - pop rbp - - jmp *%r11 + movaps -0xC0(%rbp), %xmm7 + movaps -0xB0(%rbp), %xmm6 + movaps -0xA0(%rbp), %xmm5 + movaps -0x90(%rbp), %xmm4 + movaps -0x80(%rbp), %xmm3 + movaps -0x70(%rbp), %xmm2 + movaps -0x60(%rbp), %xmm1 + movaps -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 0: - mov rdi, [rbp - 0x10] - mov rsi, [rbp - 0x18] + movq -0x10(%rbp), %rdi + movq -0x18(%rbp), %rsi - mov rsp, rbp - pop rbp + movq %rbp, %rsp + popq %rbp jmp _OFMethodNotFound _OFForward_stret: - push rbp - mov rbp, rsp + pushq %rbp + movq %rsp, %rbp /* Save all arguments */ - sub rsp, 0xC0 /* 16-byte alignment */ - mov [rbp - 0x08], rax - mov [rbp - 0x10], rdi - mov [rbp - 0x18], rsi - mov [rbp - 0x20], rdx - mov [rbp - 0x28], rcx - mov [rbp - 0x30], r8 - mov [rbp - 0x38], r9 - movaps [rbp - 0x50], xmm0 - movaps [rbp - 0x60], xmm1 - movaps [rbp - 0x70], xmm2 - movaps [rbp - 0x80], xmm3 - movaps [rbp - 0x90], xmm4 - movaps [rbp - 0xA0], xmm5 - movaps [rbp - 0xB0], xmm6 - movaps [rbp - 0xC0], xmm7 - - mov rdi, rsi + 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) + movaps %xmm0, -0x50(%rbp) + movaps %xmm1, -0x60(%rbp) + movaps %xmm2, -0x70(%rbp) + movaps %xmm3, -0x80(%rbp) + movaps %xmm4, -0x90(%rbp) + movaps %xmm5, -0xA0(%rbp) + movaps %xmm6, -0xB0(%rbp) + movaps %xmm7, -0xC0(%rbp) + + movq %rsi, %rdi call _object_getClass - mov rdi, rax - lea rsi, [rip + Lsel_forwardingTargetForSelector_] + movq %rax, %rdi + leaq Lsel_forwardingTargetForSelector_(%rip), %rsi call _class_respondsToSelector - test rax, rax + testq %rax, %rax jz 0f - mov rdi, [rbp - 0x18] - lea rsi, [rip + Lsel_forwardingTargetForSelector_] + movq -0x18(%rbp), %rdi + leaq Lsel_forwardingTargetForSelector_(%rip), %rsi call _objc_msg_lookup - mov rdi, [rbp - 0x18] - lea rsi, [rip + Lsel_forwardingTargetForSelector_] - mov rdx, [rbp - 0x20] + movq -0x18(%rbp), %rdi + leaq Lsel_forwardingTargetForSelector_(%rip), %rsi + movq -0x20(%rbp), %rdx call *%rax - test rax, rax + testq %rax, %rax jz 0f - cmp rax, [rbp - 0x18] + cmpq -0x18(%rbp), %rax je 0f - mov [rbp - 0x18], rax + movq %rax, -0x18(%rbp) - mov rdi, rax - mov rsi, [rbp - 0x20] + movq %rax, %rdi + movq -0x20(%rbp), %rsi call _objc_msg_lookup_stret - mov r11, rax + movq %rax, %r11 /* Restore all arguments */ - movaps xmm7, [rbp - 0xC0] - movaps xmm6, [rbp - 0xB0] - movaps xmm5, [rbp - 0xA0] - movaps xmm4, [rbp - 0x90] - movaps xmm3, [rbp - 0x80] - movaps xmm2, [rbp - 0x70] - movaps xmm1, [rbp - 0x60] - movaps xmm0, [rbp - 0x50] - mov r9, [rbp - 0x38] - mov r8, [rbp - 0x30] - mov rcx, [rbp - 0x28] - mov rdx, [rbp - 0x20] - mov rsi, [rbp - 0x18] - mov rdi, [rbp - 0x10] - mov rax, [rbp - 0x08] - - mov rsp, rbp - pop rbp - - jmp *%r11 + movaps -0xC0(%rbp), %xmm7 + movaps -0xB0(%rbp), %xmm6 + movaps -0xA0(%rbp), %xmm5 + movaps -0x90(%rbp), %xmm4 + movaps -0x80(%rbp), %xmm3 + movaps -0x70(%rbp), %xmm2 + movaps -0x60(%rbp), %xmm1 + movaps -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 0: - mov rdi, [rbp - 0x10] - mov rsi, [rbp - 0x18] - mov rdx, [rbp - 0x20] + movq -0x10(%rbp), %rdi + movq -0x18(%rbp), %rsi + movq -0x20(%rbp), %rdx - mov rsp, rbp - pop rbp + movq %rbp, %rsp + popq %rbp jmp _OFMethodNotFound_stret Linit: - lea rdi, [rip + Lmodule] + leaq Lmodule(%rip), %rdi jmp ___objc_exec_class .section __DATA, __mod_init_func, mod_init_funcs .quad Linit Index: src/runtime/lookup-asm/lookup-asm-amd64-macho.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-amd64-macho.S +++ src/runtime/lookup-asm/lookup-asm-amd64-macho.S @@ -18,87 +18,71 @@ .globl _objc_msg_lookup .globl _objc_msg_lookup_stret .globl _objc_msg_lookup_super .globl _objc_msg_lookup_super_stret -.intel_syntax - -/* Work around assembler bugs. */ -.macro jmp - .att_syntax - /* Use uppercase instruction to avoid recursion. */ - JMP $0 - .intel_syntax noprefix -.endmacro -.macro jz - .att_syntax - /* Use uppercase instruction to avoid recursion. */ - JZ $0 - .intel_syntax noprefix -.endmacro - .section __TEXT, __text, regular, pure_instructions .macro GENERATE_LOOKUP $0: - test rdi, rdi + testq %rdi, %rdi jz LreturnNilMethod - test dil, 1 + testb $$1, %dil jnz LtaggedPointer_$0 - mov r8, [rdi] - mov r8, [r8 + 64] + movq (%rdi), %r8 + movq 64(%r8), %r8 Lmain_$0: - mov rax, [rsi] - movzx ecx, ah - movzx edx, al + movq (%rsi), %rax + movzbl %ah, %ecx + movzbl %al, %edx #ifdef OF_SELUID24 - shr eax, 16 + shrl $$16, %eax - mov r8, [r8 + 8 * rax] + movq (%r8,%rax,8), %r8 #endif - movq r8, [r8 + 8 * rcx] - movq rax, [r8 + 8 * rdx] + movq (%r8,%rcx,8), %r8 + movq (%r8,%rdx,8), %rax - test rax, rax + testq %rax, %rax jz $1 ret LtaggedPointer_$0: - mov rax, [rip + _objc_taggedPointerSecret@GOTPCREL] - xor rdi, [rax] - andb dil, 0xE - movzx r8d, dil - - mov rax, [rip + _objc_taggedPointerClasses@GOTPCREL] - mov r8, [rax + 4 * r8] - mov r8, [r8 + 64] + movq _objc_taggedPointerSecret@GOTPCREL(%rip), %rax + xorq (%rax), %rdi + andb $$0xE, %dil + movzbl %dil, %r8d + + movq _objc_taggedPointerClasses@GOTPCREL(%rip), %rax + movq (%rax,%r8,4), %r8 + movq 64(%r8), %r8 jmp Lmain_$0 .endmacro .macro GENERATE_LOOKUP_SUPER $0: - mov r8, rdi - mov rdi, [rdi] - test rdi, rdi + movq %rdi, %r8 + movq (%rdi), %rdi + testq %rdi, %rdi jz LreturnNilMethod - movq r8, [r8 + 8] - movq r8, [r8 + 64] + movq 8(%r8), %r8 + movq 64(%r8), %r8 jmp Lmain_$1 .endmacro GENERATE_LOOKUP _objc_msg_lookup, _objc_methodNotFound GENERATE_LOOKUP _objc_msg_lookup_stret, _objc_methodNotFound_stret GENERATE_LOOKUP_SUPER _objc_msg_lookup_super, _objc_msg_lookup GENERATE_LOOKUP_SUPER _objc_msg_lookup_super_stret, _objc_msg_lookup_stret LreturnNilMethod: - lea rax, [rip + LnilMethod] + leaq LnilMethod(%rip), %rax ret LnilMethod: - xor rax, rax + xorq %rax, %rax ret