Index: src/Makefile ================================================================== --- src/Makefile +++ src/Makefile @@ -1,8 +1,8 @@ include ../extra.mk -SUBDIRS = exceptions ${RUNTIME} ${BRIDGE} +SUBDIRS = ${RUNTIME} exceptions ${BRIDGE} SHARED_LIB = ${OBJFW_SHARED_LIB} STATIC_LIB = ${OBJFW_STATIC_LIB} LIB_MAJOR = ${OBJFW_LIB_MAJOR} LIB_MINOR = ${OBJFW_LIB_MINOR} ADDED src/forwarding-arm-elf.S Index: src/forwarding-arm-elf.S ================================================================== --- src/forwarding-arm-elf.S +++ src/forwarding-arm-elf.S @@ -0,0 +1,81 @@ +/* + * 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 + +.section .text +of_forward: + stmfd sp!, {r0-r3, lr} + fstmfdd sp!, {d0-d7} + + ldr r1, sel_forwardingTargetForSelector__indirect_L0 +.L0: + add r1, pc + stmfd sp!, {r1} + bl objc_msg_lookup(PLT) + ldmfd sp!, {r1} + + mov r12, r0 + ldr r0, [sp, #64] + ldr r2, [sp, #68] + blx r12 + + str r0, [sp, #64] + ldr r1, [sp, #68] + bl objc_msg_lookup(PLT) + + mov r12, r0 + fldmfdd sp!, {d0-d7} + ldmfd sp!, {r0-r3, lr} + + bx r12 + +init: + ldr r0, module_indirect_L1 +.L1: + add r0, pc + b __objc_exec_class(PLT) + +sel_forwardingTargetForSelector__indirect_L0: + .long sel_forwardingTargetForSelector_-(.L0+8) +module_indirect_L1: + .long module-(.L1+8) + +.section .init_array + .long init + +.section .rodata +str_forwardingTargetForSelector_: + .asciz "forwardingTargetForSelector:" + +.section .data +sel_forwardingTargetForSelector_: + .long str_forwardingTargetForSelector_, 0 + .long 0, 0 +symtab: + .long 0, sel_forwardingTargetForSelector_ + .short 0, 0 + .long 0 + .long 0 +module: + .long 8, 16, 0, symtab + +.type of_forward, %function +.size of_forward, init-of_forward + +#ifdef __linux__ +.section .note.GNU-stack, "", %progbits +#endif Index: src/forwarding.S ================================================================== --- src/forwarding.S +++ src/forwarding.S @@ -30,8 +30,10 @@ # ifdef __ELF__ # if defined(__amd64__) || defined(__x86_64__) # include "forwarding-x86_64-elf.S" # elif defined(__i386__) # include "forwarding-x86-elf.S" +# elif defined(__arm__) || defined(__ARM__) +# include "forwarding-arm-elf.S" # endif # endif #endif Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -112,11 +112,12 @@ # 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 # endif # endif #endif