Index: src/runtime/lookup-asm-mips-elf.S ================================================================== --- src/runtime/lookup-asm-mips-elf.S +++ src/runtime/lookup-asm-mips-elf.S @@ -56,14 +56,37 @@ addu $t0, $t0, $t2 lw $t0, 0($t0) addu $t0, $t0, $t3 lw $t0, 0($t0) +#ifdef __PIC__ + beqz $t0, forward +#else beqz $t0, objc_not_found_handler +#endif move $v0, $t0 j $ra + +ret_nil: +#ifdef __PIC__ + addiu $v0, $t9, nil_method-objc_msg_lookup +#else + la $v0, nil_method +#endif + j $ra + +#ifdef __PIC__ +forward: + lui $gp, %hi(_gp_disp) + addiu $gp, $gp, %lo(_gp_disp) + addu $gp, $gp, $t9 + addiu $gp, $gp, forward-objc_msg_lookup + + lw $t9, %call16(objc_not_found_handler)($gp) + jr $t9 +#endif .type objc_msg_lookup, %function .size objc_msg_lookup, .-objc_msg_lookup objc_msg_lookup_super: lw $t0, 0($a0) @@ -74,17 +97,12 @@ b lookup .type objc_msg_lookup_super, %function .size objc_msg_lookup_super, .-objc_msg_lookup_super -ret_nil: - lui $v0, %hi(nil_method) - addiu $v0, %lo(nil_method) - j $ra - nil_method: move $v0, $zero j $ra #ifdef __linux__ .section .note.GNU-stack, "", %progbits #endif Index: src/runtime/lookup-asm.S ================================================================== --- src/runtime/lookup-asm.S +++ src/runtime/lookup-asm.S @@ -23,13 +23,14 @@ # include "lookup-asm-x86-elf.S" # elif defined(__ppc__) || defined(__PPC__) # include "lookup-asm-ppc-elf.S" # elif defined(__arm__) || defined(__ARM__) # include "lookup-asm-arm-elf.S" -# elif defined(__mips) && __mips < 64 +# elif (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) || \ + (defined(__mips_eabi) && _MIPS_SZPTR == 32) # include "lookup-asm-mips-elf.S" # endif #elif defined(__MACH__) # if defined(__amd64__) || defined(__x86_64__) # include "lookup-asm-amd64-macho.S" # endif #endif Index: src/runtime/runtime-private.h ================================================================== --- src/runtime/runtime-private.h +++ src/runtime/runtime-private.h @@ -176,11 +176,13 @@ #if defined(__ELF__) # if defined(__amd64__) || defined(__x86_64__) || defined(__i386__) || \ defined(__ppc__) || defined(__PPC__) || defined(__arm__) || defined(__ARM__) # define OF_ASM_LOOKUP -# elif defined(__mips) && __mips < 64 +# endif +# if (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) || \ + (defined(__mips_eabi) && _MIPS_SZPTR == 32) # define OF_ASM_LOOKUP # endif #elif defined(__MACH__) # if defined(__amd64__) || defined(__x86_64__) # define OF_ASM_LOOKUP