Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -104,26 +104,27 @@ #else # define OF_ROOT_CLASS #endif #ifdef OF_APPLE_RUNTIME -# if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || \ - defined(__ppc__) +# if defined(__x86_64__) || defined(__i386__) || defined(__ARM64_ARCH_8__) || \ + defined(__arm__) || defined(__ppc__) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET # endif #else # if defined(__ELF__) # if defined(__amd64__) || defined(__x86_64__) || defined(__i386__) || \ - defined(__arm__) || defined(__ARM__) || defined(__ppc__) || defined(__PPC__) + defined(__arm__) || defined(__ARM__) || defined(__ppc__) || \ + defined(__PPC__) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # if __OBJFW_RUNTIME_ABI__ >= 800 # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET # endif # endif # if (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) || \ - (defined(__mips_eabi) && _MIPS_SZPTR == 32) + (defined(__mips_eabi) && _MIPS_SZPTR == 32) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # if __OBJFW_RUNTIME_ABI__ >= 800 # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET # endif # endif Index: src/forwarding/apple-forwarding-arm.S ================================================================== --- src/forwarding/apple-forwarding-arm.S +++ src/forwarding/apple-forwarding-arm.S @@ -16,16 +16,16 @@ .globl _of_forward .globl _of_forward_stret .section __TEXT, __objc_methname, cstring_literals -L_str_forwardingTargetForSelector: +L_str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" .section __DATA, __objc_selrefs, literal_pointers, no_dead_strip -L_sel_forwardingTargetForSelector: - .long L_str_forwardingTargetForSelector +L_sel_forwardingTargetForSelector_: + .long L_str_forwardingTargetForSelector_ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions @@ -35,11 +35,11 @@ stmfd sp!, {r0-r3, lr} fstmfdd sp!, {d0-d7} blx _object_getClass - ldr r1, L_sel_forwardingTargetForSelector_indirect_L0 + ldr r1, L_sel_forwardingTargetForSelector_$indirect_L0 L0: ldr r1, [pc, r1] stmfd sp!, {r1} blx _class_respondsToSelector ldmfd sp!, {r1} @@ -74,11 +74,11 @@ fstmfdd sp!, {d0-d7} mov r0, r1 blx _object_getClass - ldr r1, L_sel_forwardingTargetForSelector_indirect_L1 + ldr r1, L_sel_forwardingTargetForSelector_$indirect_L1 L1: ldr r1, [pc, r1] stmfd sp!, {r1} blx _class_respondsToSelector ldmfd sp!, {r1} @@ -111,10 +111,10 @@ mov r0, r1 mov r1, r2 b _of_method_not_found .data_region -L_sel_forwardingTargetForSelector_indirect_L0: - .long L_sel_forwardingTargetForSelector-(L0+8) -L_sel_forwardingTargetForSelector_indirect_L1: - .long L_sel_forwardingTargetForSelector-(L1+8) +L_sel_forwardingTargetForSelector_$indirect_L0: + .long L_sel_forwardingTargetForSelector_-(L0+8) +L_sel_forwardingTargetForSelector_$indirect_L1: + .long L_sel_forwardingTargetForSelector_-(L1+8) .end_data_region ADDED src/forwarding/apple-forwarding-arm64.S Index: src/forwarding/apple-forwarding-arm64.S ================================================================== --- src/forwarding/apple-forwarding-arm64.S +++ src/forwarding/apple-forwarding-arm64.S @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +.globl _of_forward +.globl _of_forward_stret + +.section __TEXT, __objc_methname, cstring_literals +L_str_forwardingTargetForSelector_: + .asciz "forwardingTargetForSelector:" + +.section __DATA, __objc_selrefs, literal_pointers, no_dead_strip +L_sel_forwardingTargetForSelector_: + .quad L_str_forwardingTargetForSelector_ + +.section __DATA, __objc_imageinfo, regular, no_dead_strip + .long 0, 0 + +.section __TEXT, __text, regular, pure_instructions +_of_forward: +_of_forward_stret: + stp fp, lr, [sp, #-208]! + mov fp, sp + sub sp, sp, #208 + + /* Save all arguments, x8 and x19 */ + stp x0, x1, [sp] + stp x2, x3, [sp, #16] + stp x4, x5, [sp, #32] + stp x6, x7, [sp, #48] + stp x8, x19, [sp, #64] + + /* Save all foating point arguments */ + stp q0, q1, [sp, #80] + stp q2, q3, [sp, #112] + stp q4, q5, [sp, #144] + stp q6, q7, [sp, #176] + + bl _object_getClass + + adrp x19, L_sel_forwardingTargetForSelector_@PAGE + add x19, x19, L_sel_forwardingTargetForSelector_@PAGEOFF + ldr x19, [x19] + + mov x1, x19 + bl _class_respondsToSelector + cbz x0, fail + + ldp x0, x2, [sp] + mov x1, x19 + bl _objc_msgSend + + cbz x0, fail + ldr x1, [sp, #8] + cmp x0, x1 + b.eq fail + + /* Restore all arguments, x8 and x19, but not x0 */ + ldr x1, [sp, #8] + ldp x2, x3, [sp, #16] + ldp x4, x5, [sp, #32] + ldp x6, x7, [sp, #48] + ldp x8, x19, [sp, #64] + + /* Restore all foating point arguments */ + ldp q0, q1, [sp, #80] + ldp q2, q3, [sp, #112] + ldp q4, q5, [sp, #144] + ldp q6, q7, [sp, #176] + + mov sp, fp + ldp fp, lr, [sp], #208 + + b _objc_msgSend + +fail: + ldp x0, x1, [sp] + + mov sp, fp + ldp fp, lr, [sp], #208 + + b _of_method_not_found Index: src/forwarding/apple-forwarding-i386.S ================================================================== --- src/forwarding/apple-forwarding-i386.S +++ src/forwarding/apple-forwarding-i386.S @@ -16,16 +16,16 @@ .globl _of_forward .globl _of_forward_stret .section __TEXT, __cstring, cstring_literals -L_str_forwardingTargetForSelector: +L_str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" .section __OBJC, __message_refs, literal_pointers, no_dead_strip -L_sel_forwardingTargetForSelector: - .long L_str_forwardingTargetForSelector +L_sel_forwardingTargetForSelector_: + .long L_str_forwardingTargetForSelector_ .section __OBJC, __image_info .long 0, 0 .section __TEXT, __text, regular, pure_instructions @@ -41,19 +41,19 @@ movl 8(%ebp), %eax movl %eax, (%esp) call _object_getClass movl %eax, (%esp) - movl L_sel_forwardingTargetForSelector-.L0(%ebx), %eax + movl L_sel_forwardingTargetForSelector_-.L0(%ebx), %eax movl %eax, 4(%esp) call _class_respondsToSelector testl %eax, %eax jz fail movl 8(%ebp), %eax movl %eax, (%esp) - movl L_sel_forwardingTargetForSelector-.L0(%ebx), %eax + movl L_sel_forwardingTargetForSelector_-.L0(%ebx), %eax movl %eax, 4(%esp) movl 12(%ebp), %eax movl %eax, 8(%esp) call _objc_msgSend @@ -90,19 +90,19 @@ movl 12(%ebp), %eax movl %eax, (%esp) call _object_getClass movl %eax, (%esp) - movl L_sel_forwardingTargetForSelector-.L1(%ebx), %eax + movl L_sel_forwardingTargetForSelector_-.L1(%ebx), %eax movl %eax, 4(%esp) call _class_respondsToSelector testl %eax, %eax jz fail_stret movl 12(%ebp), %eax movl %eax, (%esp) - movl L_sel_forwardingTargetForSelector-.L1(%ebx), %eax + movl L_sel_forwardingTargetForSelector_-.L1(%ebx), %eax movl %eax, 4(%esp) movl 16(%ebp), %eax movl %eax, 8(%esp) call _objc_msgSend Index: src/forwarding/apple-forwarding-ppc.S ================================================================== --- src/forwarding/apple-forwarding-ppc.S +++ src/forwarding/apple-forwarding-ppc.S @@ -16,16 +16,16 @@ .globl _of_forward .globl _of_forward_stret .section __TEXT, __cstring, cstring_literals -L_str_forwardingTargetForSelector: +L_str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" .section __OBJC, __message_refs, literal_pointers, no_dead_strip -L_sel_forwardingTargetForSelector: - .long L_str_forwardingTargetForSelector +L_sel_forwardingTargetForSelector_: + .long L_str_forwardingTargetForSelector_ .section __OBJC, __image_info .long 0, 0 .section __TEXT, __text, regular, pure_instructions @@ -68,12 +68,12 @@ bl _object_getClass bl L0 L0: mflr r13 - addis r13, r13, ha16(L_sel_forwardingTargetForSelector-L0) - lwz r13, lo16(L_sel_forwardingTargetForSelector-L0)(r13) + addis r13, r13, ha16(L_sel_forwardingTargetForSelector_-L0) + lwz r13, lo16(L_sel_forwardingTargetForSelector_-L0)(r13) mr r4, r13 bl _class_respondsToSelector cmpwi r3, 0 beq- fail @@ -170,12 +170,12 @@ bl _object_getClass bl L1 L1: mflr r13 - addis r13, r13, ha16(L_sel_forwardingTargetForSelector-L1) - lwz r13, lo16(L_sel_forwardingTargetForSelector-L1)(r13) + addis r13, r13, ha16(L_sel_forwardingTargetForSelector_-L1) + lwz r13, lo16(L_sel_forwardingTargetForSelector_-L1)(r13) mr r4, r13 bl _class_respondsToSelector cmpwi r3, 0 beq- fail_stret Index: src/forwarding/apple-forwarding-x86_64.S ================================================================== --- src/forwarding/apple-forwarding-x86_64.S +++ src/forwarding/apple-forwarding-x86_64.S @@ -16,16 +16,16 @@ .globl _of_forward .globl _of_forward_stret .section __TEXT, __objc_methname, cstring_literals -L_str_forwardingTargetForSelector: +L_str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" .section __DATA, __objc_selrefs, literal_pointers, no_dead_strip -L_sel_forwardingTargetForSelector: - .quad L_str_forwardingTargetForSelector +L_sel_forwardingTargetForSelector_: + .quad L_str_forwardingTargetForSelector_ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions @@ -52,17 +52,17 @@ movdqa %xmm7, -0xC0(%rbp) call _object_getClass movq %rax, %rdi - movq L_sel_forwardingTargetForSelector(%rip), %rsi + movq L_sel_forwardingTargetForSelector_(%rip), %rsi call _class_respondsToSelector testq %rax, %rax jz fail movq -0x10(%rbp), %rdi - movq L_sel_forwardingTargetForSelector(%rip), %rsi + movq L_sel_forwardingTargetForSelector_(%rip), %rsi movq -0x18(%rbp), %rdx call _objc_msgSend movq %rax, %rdi testq %rdi, %rdi @@ -125,17 +125,17 @@ movq %rsi, %rdi call _object_getClass movq %rax, %rdi - movq L_sel_forwardingTargetForSelector(%rip), %rsi + movq L_sel_forwardingTargetForSelector_(%rip), %rsi call _class_respondsToSelector testq %rax, %rax jz fail_stret movq -0x18(%rbp), %rdi - movq L_sel_forwardingTargetForSelector(%rip), %rsi + movq L_sel_forwardingTargetForSelector_(%rip), %rsi movq -0x20(%rbp), %rdx call _objc_msgSend movq %rax, %rsi testq %rsi, %rsi Index: src/forwarding/forwarding-arm-elf.S ================================================================== --- src/forwarding/forwarding-arm-elf.S +++ src/forwarding/forwarding-arm-elf.S @@ -20,11 +20,11 @@ .section .text of_forward: stmfd sp!, {r0-r3, lr} fstmfdd sp!, {d0-d7} - ldr r1, sel_forwardingTargetForSelector__indirect_L0 + ldr r1, sel_forwardingTargetForSelector_$indirect_L0 .L0: add r1, pc stmfd sp!, {r1} bl objc_msg_lookup(PLT) ldmfd sp!, {r1} @@ -49,11 +49,11 @@ of_forward_stret: stmfd sp!, {r0-r3, lr} fstmfdd sp!, {d0-d7} mov r0, r1 - ldr r1, sel_forwardingTargetForSelector__indirect_L1 + ldr r1, sel_forwardingTargetForSelector_$indirect_L1 .L1: add r1, pc stmfd sp!, {r1} bl objc_msg_lookup(PLT) ldmfd sp!, {r1} @@ -79,13 +79,13 @@ ldr r0, module_indirect_L2 .L2: add r0, pc b __objc_exec_class(PLT) -sel_forwardingTargetForSelector__indirect_L0: +sel_forwardingTargetForSelector_$indirect_L0: .long sel_forwardingTargetForSelector_-(.L0+8) -sel_forwardingTargetForSelector__indirect_L1: +sel_forwardingTargetForSelector_$indirect_L1: .long sel_forwardingTargetForSelector_-(.L1+8) module_indirect_L2: .long module-(.L2+8) .section .ctors, "a", %progbits Index: src/forwarding/forwarding.S ================================================================== --- src/forwarding/forwarding.S +++ src/forwarding/forwarding.S @@ -19,10 +19,12 @@ #ifdef OF_APPLE_RUNTIME # if defined(__x86_64__) # include "apple-forwarding-x86_64.S" # elif defined(__i386__) # include "apple-forwarding-i386.S" +# elif defined(__ARM64_ARCH_8__) +# include "apple-forwarding-arm64.S" # elif defined(__arm__) # include "apple-forwarding-arm.S" # elif defined(__ppc__) # include "apple-forwarding-ppc.S" # endif