Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -97,19 +97,17 @@ # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET # endif #else # ifdef __ELF__ -# if defined(__amd64__) || defined(__x86_64__) || defined(__i386__) +# if defined(__amd64__) || defined(__x86_64__) || defined(__i386__) || \ + defined(__arm__) || defined(__ARM__) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # if __has_feature(objc_msg_lookup_stret) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET # endif # endif -# if defined(__arm__) || defined(__ARM__) -# define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR -# endif # if (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) || \ (defined(__mips_eabi) && _MIPS_SZPTR == 32) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # endif # endif Index: src/forwarding-arm-elf.S ================================================================== --- src/forwarding-arm-elf.S +++ src/forwarding-arm-elf.S @@ -17,11 +17,10 @@ .globl of_forward .globl of_forward_stret .section .text of_forward: -of_forward_stret: /* FIXME */ stmfd sp!, {r0-r3, lr} fstmfdd sp!, {d0-d7} ldr r1, sel_forwardingTargetForSelector__indirect_L0 .L0: @@ -45,20 +44,51 @@ bx r12 .type of_forward, %function .size of_forward, .-of_forward -init: - ldr r0, module_indirect_L1 +of_forward_stret: + stmfd sp!, {r0-r3, lr} + fstmfdd sp!, {d0-d7} + + mov r0, r1 + ldr r1, sel_forwardingTargetForSelector__indirect_L1 .L1: + add r1, pc + stmfd sp!, {r1} + bl objc_msg_lookup(PLT) + ldmfd sp!, {r1} + + mov r12, r0 + ldr r0, [sp, #68] + ldr r2, [sp, #72] + blx r12 + + str r0, [sp, #68] + ldr r1, [sp, #72] + bl objc_msg_lookup(PLT) + + mov r12, r0 + fldmfdd sp!, {d0-d7} + ldmfd sp!, {r0-r3, lr} + + bx r12 +.type of_forward_stret, %function +.size of_forward_stret, .-of_forward_stret + +init: + ldr r0, module_indirect_L2 +.L2: add r0, pc b __objc_exec_class(PLT) sel_forwardingTargetForSelector__indirect_L0: .long sel_forwardingTargetForSelector_-(.L0+8) -module_indirect_L1: - .long module-(.L1+8) +sel_forwardingTargetForSelector__indirect_L1: + .long sel_forwardingTargetForSelector_-(.L1+8) +module_indirect_L2: + .long module-(.L2+8) .section .ctors, "a", %progbits .long init .section .rodata