Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -271,10 +271,22 @@ yes # endif #endif ], [ AC_SUBST(LOOKUP_S, lookup-ppc-elf.S) + AC_DEFINE(OF_ASM_LOOKUP, 1, + [Whether to use assembly for lookup]) + ]) + + AC_EGREP_CPP(yes, [ + #if defined(__arm__) || defined(__ARM__) + # ifdef __ELF__ + yes + # endif + #endif + ], [ + AC_SUBST(LOOKUP_S, lookup-arm-elf.S) AC_DEFINE(OF_ASM_LOOKUP, 1, [Whether to use assembly for lookup]) ]) AS_IF([test x"$enable_seluid16" = x"yes"], [ ADDED src/runtime/lookup-arm-elf.S Index: src/runtime/lookup-arm-elf.S ================================================================== --- src/runtime/lookup-arm-elf.S +++ src/runtime/lookup-arm-elf.S @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012 + * 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. + */ + +#include "config.h" + +.globl objc_msg_lookup +.globl objc_msg_lookup_super + +.section .text +objc_msg_lookup: + cmp r0, #0 + beq ret_nil + + ldr r2, [r0, #0] + ldr r2, [r2, #32] + +lookup: +#ifndef OF_SELUID16 + ldrb r3, [r1, #2] + ldr r2, [r2, r3, lsl #2] +#endif + ldrb r3, [r1, #1] + ldr r2, [r2, r3, lsl #2] + ldrb r3, [r1, #0] + ldr r2, [r2, r3, lsl #2] + + cmp r2, #0 + beq objc_not_found_handler(PLT) + + mov r0, r2 + bx lr + +objc_msg_lookup_super: + ldr r2, [r0, #0] + cmp r0, #0 + beq ret_nil + + ldr r2, [r0, #4] + ldr r2, [r2, #32] + + b lookup + +ret_nil: + adr r0, nil_method + bx lr + +nil_method: + mov r0, #0 + bx lr + +.type objc_msg_lookup, %function +.type objc_msg_lookup_super, %function +.size objc_msg_lookup, objc_msg_lookup_super-objc_msg_lookup +.size objc_msg_lookup_super, ret_nil-objc_msg_lookup_super