Index: src/forwarding/apple-forwarding-amd64.S ================================================================== --- src/forwarding/apple-forwarding-amd64.S +++ src/forwarding/apple-forwarding-amd64.S @@ -15,10 +15,26 @@ #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 str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" @@ -29,150 +45,150 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions _OFForward: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - 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) + 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 call _object_getClass - movq %rax, %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + mov rsi, [rip + sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x10(%rbp), %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x18(%rbp), %rdx + mov rdi, [rbp - 0x10] + mov rsi, [rip + sel_forwardingTargetForSelector_] + mov rdx, [rbp - 0x18] call _objc_msgSend - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x10(%rbp), %rax + cmp rax, [rbp - 0x10] je 0f - movq %rax, %rdi + mov rdi, rax /* Restore all arguments, except %rdi */ - 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 + 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 jmp _objc_msgSend 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi + mov rdi, [rbp - 0x10] + mov rsi, [rbp - 0x18] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _OFMethodNotFound _OFForward_stret: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - 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 + 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 + + mov rdi, rsi call _object_getClass - movq %rax, %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + mov rsi, [rip + sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x18(%rbp), %rdi - movq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x20(%rbp), %rdx + mov rdi, [rbp - 0x18] + mov rsi, [rip + sel_forwardingTargetForSelector_] + mov rdx, [rbp - 0x20] call _objc_msgSend - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x18(%rbp), %rax + cmp rax, [rbp - 0x18] je 0f - movq %rax, %rsi + mov rsi, rax /* Restore all arguments, except %rsi */ - 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 + 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 jmp _objc_msgSend_stret 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi - movq -0x20(%rbp), %rdx + mov rdi, [rbp - 0x10] + mov rsi, [rbp - 0x18] + mov rdx, [rbp - 0x20] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _OFMethodNotFound_stret Index: src/forwarding/forwarding-amd64-macho.S ================================================================== --- src/forwarding/forwarding-amd64-macho.S +++ src/forwarding/forwarding-amd64-macho.S @@ -17,182 +17,198 @@ #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: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - 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) + 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 call _object_getClass - movq %rax, %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + lea rsi, [rip + sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x10(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, [rbp - 0x10] + lea rsi, [rip + sel_forwardingTargetForSelector_] call _objc_msg_lookup - movq -0x10(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x18(%rbp), %rdx + movq rdi, [rbp - 0x10] + leaq rsi, [rip + sel_forwardingTargetForSelector_] + movq rdx, [rbp - 0x18] call *%rax - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x10(%rbp), %rax + cmp rax, [rbp - 0x10] je 0f - movq %rax, -0x10(%rbp) + mov [rbp - 0x10], rax - movq %rax, %rdi - movq -0x18(%rbp), %rsi + mov rdi, rax + mov rsi, [rbp - 0x18] call _objc_msg_lookup - movq %rax, %r11 + mov r11, rax /* Restore all arguments */ - 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 + 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 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi + mov rdi, [rbp - 0x10] + mov rsi, [rbp - 0x18] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _OFMethodNotFound _OFForward_stret: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - 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 + 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 call _object_getClass - movq %rax, %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, rax + lea rsi, [rip + sel_forwardingTargetForSelector_] call _class_respondsToSelector - testq %rax, %rax + test rax, rax jz 0f - movq -0x18(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi + mov rdi, [rbp - 0x18] + lea rsi, [rip + sel_forwardingTargetForSelector_] call _objc_msg_lookup - movq -0x18(%rbp), %rdi - leaq sel_forwardingTargetForSelector_(%rip), %rsi - movq -0x20(%rbp), %rdx + mov rdi, [rbp - 0x18] + lea rsi, [rip + sel_forwardingTargetForSelector_] + mov rdx, [rbp - 0x20] call *%rax - testq %rax, %rax + test rax, rax jz 0f - cmpq -0x18(%rbp), %rax + cmp rax, [rbp - 0x18] je 0f - movq %rax, -0x18(%rbp) + mov [rbp - 0x18], rax - movq %rax, %rdi - movq -0x20(%rbp), %rsi + mov rdi, rax + mov rsi, [rbp - 0x20] call _objc_msg_lookup_stret - movq %rax, %r11 + mov r11, rax /* Restore all arguments */ - 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 + 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 0: - movq -0x10(%rbp), %rdi - movq -0x18(%rbp), %rsi - movq -0x20(%rbp), %rdx + mov rdi, [rbp - 0x10] + mov rsi, [rbp - 0x18] + mov rdx, [rbp - 0x20] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp _OFMethodNotFound_stret init: - leaq module(%rip), %rdi + lea rdi, [rip + module] jmp ___objc_exec_class .section __DATA, __mod_init_func, mod_init_funcs .quad init 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 @@ -17,72 +17,88 @@ .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: - testq %rdi, %rdi + test rdi, rdi jz returnNilMethod - testb $$1, %dil + test dil, 1 jnz LtaggedPointer_$0 - movq (%rdi), %r8 - movq 64(%r8), %r8 + mov r8, [rdi] + mov r8, [r8 + 64] Lmain_$0: - movq (%rsi), %rax - movzbl %ah, %ecx - movzbl %al, %edx + mov rax, [rsi] + movzx ecx, ah + movzx edx, al #ifdef OF_SELUID24 - shrl $$16, %eax + shr eax, 16 - movq (%r8,%rax,8), %r8 + mov r8, [r8 + 8 * rax] #endif - movq (%r8,%rcx,8), %r8 - movq (%r8,%rdx,8), %rax + movq r8, [r8 + 8 * rcx] + movq rax, [r8 + 8 * rdx] - testq %rax, %rax + test rax, rax jz $1 ret LtaggedPointer_$0: - 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 + 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] jmp Lmain_$0 .endmacro .macro GENERATE_LOOKUP_SUPER $0: - movq %rdi, %r8 - movq (%rdi), %rdi - testq %rdi, %rdi + mov r8, rdi + mov rdi, [rdi] + test rdi, rdi jz returnNilMethod - movq 8(%r8), %r8 - movq 64(%r8), %r8 + movq r8, [r8 + 8] + movq r8, [r8 + 64] 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 returnNilMethod: - leaq nilMethod(%rip), %rax + lea rax, [rip + nilMethod] ret nilMethod: - xorq %rax, %rax + xor rax, rax ret