Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -107,10 +107,13 @@ # endif # endif # if (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32) || \ (defined(__mips_eabi) && _MIPS_SZPTR == 32) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR +# if __has_feature(objc_msg_lookup_stret) +# define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET +# endif # endif # endif #endif #if __has_feature(objc_arc) Index: src/forwarding-mips-elf.S ================================================================== --- src/forwarding-mips-elf.S +++ src/forwarding-mips-elf.S @@ -17,11 +17,10 @@ .globl of_forward .globl of_forward_stret .section .text of_forward: -of_forward_stret: /* FIXME */ #ifdef __PIC__ lui $gp, %hi(_gp_disp) addiu $gp, $gp, %lo(_gp_disp) addu $gp, $gp, $t9 #endif @@ -125,14 +124,125 @@ move $t9, $v0 jr $t9 #else jr $v0 #endif - .type of_forward, %function .size of_forward, .-of_forward +of_forward_stret: +#ifdef __PIC__ + lui $gp, %hi(_gp_disp) + addiu $gp, $gp, %lo(_gp_disp) + addu $gp, $gp, $t9 +#endif + + addiu $sp, $sp, -72 + + /* + * O32: The registers for floating point arguments don't need to be + * saved, as the ABI specifies that all remaining arguments are passed + * in integer registers if the first argument is passed in an integer + * register. This is always the case, as the first argument is always + * self. + */ + 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) + + swc1 $f12, 40($sp) + swc1 $f13, 44($sp) + swc1 $f14, 48($sp) + swc1 $f15, 52($sp) + swc1 $f16, 56($sp) + swc1 $f17, 60($sp) + swc1 $f18, 64($sp) + swc1 $f19, 68($sp) +#endif + + move $a0, $a1 +#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, 12($sp) +#ifdef __PIC__ + lw $a1, %got(sel_forwardingTargetForSelector_)($gp) +#else + lui $a1, %hi(sel_forwardingTargetForSelector_) +#endif + addiu $a1, $a1, %lo(sel_forwardingTargetForSelector_) + lw $a2, 16($sp) +#ifdef __PIC__ + move $t9, $v0 + jalr $t9 +#else + jalr $v0 +#endif + sw $v0, 12($sp) + + lw $gp, 0($sp) + move $a0, $v0 + lw $a1, 16($sp) +#ifdef __PIC__ + lw $t9, %call16(objc_msg_lookup_stret)($gp) + jalr $t9 +#else + jal objc_msg_lookup_stret +#endif + +#ifdef __mips_eabi + lwc1 $f19, 68($sp) + lwc1 $f18, 64($sp) + lwc1 $f17, 60($sp) + lwc1 $f16, 56($sp) + lwc1 $f15, 52($sp) + lwc1 $f14, 48($sp) + lwc1 $f13, 44($sp) + lwc1 $f12, 40($sp) + + 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, $sp, 72 + +#ifdef __PIC__ + move $t9, $v0 + jr $t9 +#else + jr $v0 +#endif +.type of_forward_stret, %function +.size of_forward_stret, .-of_forward_stret + init: #ifdef __PIC__ lui $gp, %hi(_gp_disp) addiu $gp, $gp, %lo(_gp_disp) addu $gp, $gp, $t9