Index: PLATFORMS.md ================================================================== --- PLATFORMS.md +++ PLATFORMS.md @@ -213,11 +213,12 @@ * ARM (EABI/ELF, Apple/Mach-O) * ARM64 (ARM64/ELF, Apple/Mach-O) * MIPS (O32/ELF, EABI/ELF) * PowerPC (SysV/ELF, EABI/ELF, Apple/Mach-O) + * SPARC (SysV/ELF) * SPARC64 (SysV/ELF) * x86 (SysV/ELF, Apple/Mach-O, Win32/PE) * x86_64 (SysV/ELF, Apple/Mach-O, Mach-O, Win64/PE) Apple/Mach-O means both, the Apple ABI and runtime, while Mach-O means the ObjFW runtime on Mach-O. ADDED src/forwarding/forwarding-sparc-elf.S Index: src/forwarding/forwarding-sparc-elf.S ================================================================== --- src/forwarding/forwarding-sparc-elf.S +++ src/forwarding/forwarding-sparc-elf.S @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * 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" + +#include "platform.h" + +.globl of_forward +.globl of_forward_stret + +.section .text +of_forward: + save %sp, -96, %sp + + sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7 + call add_pc + add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7 + + mov %i0, %o0 + call object_getClass + nop + + sethi %hi(sel_forwardingTargetForSelector_), %o1 + or %o1, %lo(sel_forwardingTargetForSelector_), %o1 + ld [%l7 + %o1], %o1 + call class_respondsToSelector + nop + + cmp %o0, 0 + be 0f + + mov %i0, %o0 + sethi %hi(sel_forwardingTargetForSelector_), %o1 + or %o1, %lo(sel_forwardingTargetForSelector_), %o1 + ld [%l7 + %o1], %o1 + call objc_msg_lookup + nop + mov %o0, %l0 + + mov %i0, %o0 + sethi %hi(sel_forwardingTargetForSelector_), %o1 + or %o1, %lo(sel_forwardingTargetForSelector_), %o1 + ld [%l7 + %o1], %o1 + jmpl %l0, %o7 + mov %i1, %o2 + + cmp %o0, 0 + be 0f + cmp %o0, %i0 + be 0f + + mov %o0, %i0 + call objc_msg_lookup + mov %i1, %o1 + + jmpl %o0, %g0 + restore + +0: + call of_method_not_found + restore +.type of_forward, %function +.size of_forward, .-of_forward + +of_forward_stret: + save %sp, -96, %sp + + sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7 + call add_pc + add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7 + + mov %i1, %o0 + call object_getClass + nop + + sethi %hi(sel_forwardingTargetForSelector_), %o1 + or %o1, %lo(sel_forwardingTargetForSelector_), %o1 + ld [%l7 + %o1], %o1 + call class_respondsToSelector + nop + + cmp %o0, 0 + be 0f + + mov %i1, %o0 + sethi %hi(sel_forwardingTargetForSelector_), %o1 + or %o1, %lo(sel_forwardingTargetForSelector_), %o1 + ld [%l7 + %o1], %o1 + call objc_msg_lookup + nop + mov %o0, %l0 + + mov %i1, %o0 + sethi %hi(sel_forwardingTargetForSelector_), %o1 + or %o1, %lo(sel_forwardingTargetForSelector_), %o1 + ld [%l7 + %o1], %o1 + jmpl %l0, %o7 + mov %i2, %o2 + + cmp %o0, 0 + be 0f + cmp %o0, %i1 + be 0f + + mov %o0, %i1 + call objc_msg_lookup + mov %i2, %o1 + + jmpl %o0, %g0 + restore + +0: + call of_method_not_found_stret + restore +.type of_forward_stret, %function +.size of_forward_stret, .-of_forward_stret + +init: + save %sp, -96, %sp + + sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7 + call add_pc + add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7 + + sethi %hi(module), %i0 + or %i0, %lo(module), %i0 + ld [%l7 + %i0], %i0 + + call __objc_exec_class + restore + +add_pc: + jmp %o7 + 8 + add %l7, %o7, %l7 + +#ifdef OF_SOLARIS +.section .init_array, "aw" +#else +.section .ctors, "aw", %progbits +#endif + .word init + +.section .rodata +str_forwardingTargetForSelector_: + .asciz "forwardingTargetForSelector:" + +.section .data +sel_forwardingTargetForSelector_: + .word str_forwardingTargetForSelector_, 0 + .word 0, 0 +symtab: + .word 0, sel_forwardingTargetForSelector_ + .half 0, 0 + .word 0 + .word 0 +module: + .word 8, 16, 0, symtab + +#ifdef OF_LINUX +.section .note.GNU-stack, "", %progbits +#endif Index: src/forwarding/forwarding-sparc64-elf.S ================================================================== --- src/forwarding/forwarding-sparc64-elf.S +++ src/forwarding/forwarding-sparc64-elf.S @@ -61,15 +61,13 @@ or %o1, %lo(sel_forwardingTargetForSelector_), %o1 ldx [%l7 + %o1], %o1 call class_respondsToSelector nop - cmp %o0, 0 - be,pn %xcc, 0f - nop + brz,pn %o0, 0f - mov %i0, %o0 + mov %i0, %o0 sethi %hi(sel_forwardingTargetForSelector_), %o1 or %o1, %lo(sel_forwardingTargetForSelector_), %o1 ldx [%l7 + %o1], %o1 call objc_msg_lookup nop @@ -80,18 +78,15 @@ or %o1, %lo(sel_forwardingTargetForSelector_), %o1 ldx [%l7 + %o1], %o1 jmpl %l0, %o7 mov %i1, %o2 - cmp %o0, 0 - be,pn %xcc, 0f - nop - cmp %o0, %i0 - be,pn %xcc, 0f - nop - - mov %o0, %i0 + brz,pn %o0, 0f + cmp %o0, %i0 + be,pn %xcc, 0f + + mov %o0, %i0 call objc_msg_lookup mov %i1, %o1 /* * Restore all floating point registers as they can be used for @@ -159,15 +154,13 @@ or %o1, %lo(sel_forwardingTargetForSelector_), %o1 ldx [%l7 + %o1], %o1 call class_respondsToSelector nop - cmp %o0, 0 - be,pn %xcc, 0f - nop + brz,pn %o0, 0f - mov %i1, %o0 + mov %i1, %o0 sethi %hi(sel_forwardingTargetForSelector_), %o1 or %o1, %lo(sel_forwardingTargetForSelector_), %o1 ldx [%l7 + %o1], %o1 call objc_msg_lookup nop @@ -178,18 +171,15 @@ or %o1, %lo(sel_forwardingTargetForSelector_), %o1 ldx [%l7 + %o1], %o1 jmpl %l0, %o7 mov %i2, %o2 - cmp %o0, 0 - be,pn %xcc, 0f - nop - cmp %o0, %i1 - be,pn %xcc, 0f - nop - - mov %o0, %i1 + brz,pn %o0, 0f + cmp %o0, %i1 + be,pn %xcc, 0f + + mov %o0, %i1 call objc_msg_lookup mov %i2, %o1 /* * Restore all floating point registers as they can be used for Index: src/forwarding/forwarding.S ================================================================== --- src/forwarding/forwarding.S +++ src/forwarding/forwarding.S @@ -45,10 +45,12 @@ # include "forwarding-powerpc-elf.S" # elif defined(OF_MIPS) # include "forwarding-mips-elf.S" # elif defined(OF_SPARC64) # include "forwarding-sparc64-elf.S" +# elif defined(OF_SPARC) +# include "forwarding-sparc-elf.S" # endif # elif defined(OF_MACH_O) # if defined(OF_X86_64) # include "forwarding-x86_64-macho.S" # endif Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -364,11 +364,11 @@ # endif #else # if defined(OF_ELF) # if defined(OF_X86_64) || defined(OF_X86) || \ defined(OF_ARM64) || defined(OF_ARM) || defined(OF_POWERPC) || \ - defined(OF_MIPS) || defined(OF_SPARC64) + defined(OF_MIPS) || defined(OF_SPARC64) || defined(OF_SPARC) # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR # if __OBJFW_RUNTIME_ABI__ >= 800 # define OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET # endif # endif Index: src/runtime/lookup-asm/lookup-asm-sparc-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-sparc-elf.S +++ src/runtime/lookup-asm/lookup-asm-sparc-elf.S @@ -54,16 +54,21 @@ #endif ld [%o2 + %o4], %o2 ld [%o2 + %o5], %o2 cmp %o2, 0 - be \not_found + be 0f nop retl mov %o2, %o0 +0: + mov %o7, %g1 + call \not_found + mov %g1, %o7 + .Ltagged_pointer_\name: and %o0, 0xE, %o2 sll %o2, 1, %o2 #ifdef OF_PIC Index: tests/TestsAppDelegate.m ================================================================== --- tests/TestsAppDelegate.m +++ tests/TestsAppDelegate.m @@ -213,26 +213,24 @@ - (void)outputSuccess: (OFString *)test inModule: (OFString *)module { if (of_stdout.hasTerminal) { - of_stdout.cursorColumn = 0; of_stdout.foregroundColor = [OFColor lime]; [of_stdout eraseLine]; - [of_stdout writeFormat: @"[%@] %@: ok\n", module, test]; + [of_stdout writeFormat: @"\r[%@] %@: ok\n", module, test]; } else [of_stdout writeLine: @"ok"]; } - (void)outputFailure: (OFString *)test inModule: (OFString *)module { if (of_stdout.hasTerminal) { - of_stdout.cursorColumn = 0; of_stdout.foregroundColor = [OFColor red]; [of_stdout eraseLine]; - [of_stdout writeFormat: @"[%@] %@: failed\n", module, test]; + [of_stdout writeFormat: @"\r[%@] %@: failed\n", module, test]; #ifdef OF_WII [of_stdout reset]; [of_stdout writeLine: @"Press A to continue!"]; @@ -285,11 +283,11 @@ gspWaitForVBlank(); } #endif - of_stdout.cursorColumn = 0; + [of_stdout writeString: @"\r"]; [of_stdout reset]; [of_stdout eraseLine]; } else [of_stdout writeLine: @"failed"]; }