Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -100,10 +100,14 @@ #else # ifdef __ELF__ # if defined(__amd64__) || defined(__x86_64__) || defined(__i386__) || \ 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 #endif #if __has_feature(objc_arc) ADDED src/forwarding-mips-elf.S Index: src/forwarding-mips-elf.S ================================================================== --- src/forwarding-mips-elf.S +++ src/forwarding-mips-elf.S @@ -0,0 +1,142 @@ +/* + * 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: +#ifdef __PIC__ + lui $gp, %hi(_gp_disp) + addiu $gp, $gp, %lo(_gp_disp) + addu $gp, $gp, $t9 +#endif + + addiu $sp, -48 + sw $gp, 0($sp) + sw $ra, 4($sp) + sw $a0, 8($sp) + sw $a1, 12($sp) + sw $a2, 16($sp) + sw $a3, 20($sp) +#ifdef __mips_eabi + /* For some reason, $a4-$a8 are not always defined */ + sw $8, 24($sp) + sw $9, 28($sp) + sw $10, 32($sp) + sw $11, 36($sp) +#endif + +#ifdef __PIC__ + lw $a1, %got(sel_forwardingTargetForSelector_)($gp) +#else + lui $a1, %hi(sel_forwardingTargetForSelector_) +#endif + addiu $a1, $a1, %lo(sel_forwardingTargetForSelector_) +#ifdef __PIC__ + lw $t9, %call16(objc_msg_lookup)($gp) + jalr $t9 +#else + jal objc_msg_lookup +#endif + + lw $gp, 0($sp) + lw $a0, 8($sp) +#ifdef __PIC__ + lw $a1, %got(sel_forwardingTargetForSelector_)($gp) +#else + lui $a1, %hi(sel_forwardingTargetForSelector_) +#endif + addiu $a1, $a1, %lo(sel_forwardingTargetForSelector_) + lw $a2, 12($sp) +#ifdef __PIC__ + move $t9, $v0 + jalr $t9 +#else + jalr $v0 +#endif + sw $v0, 8($sp) + + lw $gp, 0($sp) + move $a0, $v0 + lw $a1, 12($sp) +#ifdef __PIC__ + lw $t9, %call16(objc_msg_lookup)($gp) + jalr $t9 +#else + jal objc_msg_lookup +#endif + +#ifdef __mips_eabi + lw $11, 36($sp) + lw $10, 32($sp) + lw $9, 28($sp) + lw $8, 24($sp) +#endif + lw $a3, 20($sp) + lw $a2, 16($sp) + lw $a1, 12($sp) + lw $a0, 8($sp) + lw $ra, 4($sp) + addiu $sp, 48 + +#ifdef __PIC__ + move $t9, $v0 + jr $t9 +#else + jr $v0 +#endif + +.type of_forward, %function +.size of_forward, .-of_forward + +init: +#ifdef __PIC__ + lui $gp, %hi(_gp_disp) + addiu $gp, $gp, %lo(_gp_disp) + addu $gp, $gp, $t9 + + lw $a0, %got(module)($gp) + addiu $a0, $a0, %lo(module) + lw $t9, %call16(__objc_exec_class)($gp) + jr $t9 +#else + lui $a0, %hi(module) + addiu $a0, $a0, %lo(module) + j __objc_exec_class +#endif + +.section .ctors, "a", %progbits + .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 + +#ifdef __linux__ +.section .note.GNU-stack, "", %progbits +#endif Index: src/forwarding.S ================================================================== --- src/forwarding.S +++ src/forwarding.S @@ -32,8 +32,11 @@ # include "forwarding-amd64-elf.S" # elif defined(__i386__) # include "forwarding-x86-elf.S" # elif defined(__arm__) || defined(__ARM__) # include "forwarding-arm-elf.S" +# elif (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) || \ + (defined(__mips_eabi) && _MIPS_SZPTR == 32) +# include "forwarding-mips-elf.S" # endif # endif #endif