ADDED src/forwarding/forwarding-riscv64-elf.S Index: src/forwarding/forwarding-riscv64-elf.S ================================================================== --- /dev/null +++ src/forwarding/forwarding-riscv64-elf.S @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2008-2024 Jonathan Schleifer + * + * All rights reserved. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version 3.0 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3.0 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3.0 along with this program. If not, see + * . + */ + +#include "config.h" + +#include "platform.h" + +.globl OFForward +.globl OFForward_stret + +OFForward: + addi sp, sp, -144 + sd ra, 8(sp) + + sd a0, 16(sp) + sd a1, 24(sp) + sd a2, 32(sp) + sd a3, 40(sp) + sd a4, 48(sp) + sd a5, 56(sp) + sd a6, 64(sp) + sd a7, 72(sp) + + fsd fa0, 80(sp) + fsd fa1, 88(sp) + fsd fa2, 96(sp) + fsd fa3, 104(sp) + fsd fa4, 112(sp) + fsd fa5, 120(sp) + fsd fa6, 128(sp) + fsd fa7, 136(sp) + + call object_getClass@plt + + lla a1, .Lsel_forwardingTargetForSelector_ + call class_respondsToSelector@plt + beqz a0, 0f + + ld a0, 16(sp) + lla a1, .Lsel_forwardingTargetForSelector_ + call objc_msg_lookup@plt + + mv t0, a0 + ld a0, 16(sp) + lla a1, .Lsel_forwardingTargetForSelector_ + ld a2, 24(sp) + jalr t0 + + beqz a0, 0f + ld t0, 16(sp) + beq a0, t0, 0f + + sd a0, 16(sp) + + ld a1, 24(sp) + call objc_msg_lookup@plt + mv t0, a0 + + fld fa7, 136(sp) + fld fa6, 128(sp) + fld fa5, 120(sp) + fld fa4, 112(sp) + fld fa3, 104(sp) + fld fa2, 96(sp) + fld fa1, 88(sp) + fld fa0, 80(sp) + + ld a7, 72(sp) + ld a6, 64(sp) + ld a5, 56(sp) + ld a4, 48(sp) + ld a3, 40(sp) + ld a2, 32(sp) + ld a1, 24(sp) + ld a0, 16(sp) + + ld ra, 8(sp) + + add sp, sp, 144 + + jr t0 + +0: + ld a1, 24(sp) + ld a0, 16(sp) + + ld ra, 8(sp) + + add sp, sp, 144 + + tail OFMethodNotFound@plt +.type OFForward, @function +.size OFForward, .-OFForward + +OFForward_stret: + addi sp, sp, -144 + sd ra, 8(sp) + + sd a0, 16(sp) + sd a1, 24(sp) + sd a2, 32(sp) + sd a3, 40(sp) + sd a4, 48(sp) + sd a5, 56(sp) + sd a6, 64(sp) + sd a7, 72(sp) + + fsd fa0, 80(sp) + fsd fa1, 88(sp) + fsd fa2, 96(sp) + fsd fa3, 104(sp) + fsd fa4, 112(sp) + fsd fa5, 120(sp) + fsd fa6, 128(sp) + fsd fa7, 136(sp) + + mv a0, a1 + call object_getClass@plt + + lla a1, .Lsel_forwardingTargetForSelector_ + call class_respondsToSelector@plt + beqz a0, 0f + + ld a0, 24(sp) + lla a1, .Lsel_forwardingTargetForSelector_ + call objc_msg_lookup@plt + + mv t0, a0 + ld a0, 24(sp) + lla a1, .Lsel_forwardingTargetForSelector_ + ld a2, 32(sp) + jalr t0 + + beqz a0, 0f + ld t0, 24(sp) + beq a0, t0, 0f + + sd a0, 24(sp) + + ld a1, 32(sp) + call objc_msg_lookup_stret@plt + mv t0, a0 + + fld fa7, 136(sp) + fld fa6, 128(sp) + fld fa5, 120(sp) + fld fa4, 112(sp) + fld fa3, 104(sp) + fld fa2, 96(sp) + fld fa1, 88(sp) + fld fa0, 80(sp) + + ld a7, 72(sp) + ld a6, 64(sp) + ld a5, 56(sp) + ld a4, 48(sp) + ld a3, 40(sp) + ld a2, 32(sp) + ld a1, 24(sp) + ld a0, 16(sp) + + ld ra, 8(sp) + + add sp, sp, 144 + + jr t0 + +0: + ld a2, 32(sp) + ld a1, 24(sp) + ld a0, 16(sp) + + ld ra, 8(sp) + + add sp, sp, 144 + + tail OFMethodNotFound_stret@plt +.type OFForward_stret, @function +.size OFForward_stret, .-OFForward_stret + +.Linit: + lla a0, .Lmodule + tail __objc_exec_class@plt + +.section .ctors, "aw", @progbits + .quad .Linit + +.section .rodata +.Lstr_forwardingTargetForSelector_: + .asciz "forwardingTargetForSelector:" + +.section .data +.Lsel_forwardingTargetForSelector_: + .quad .Lstr_forwardingTargetForSelector_, 0 + .quad 0, 0 +.Lsymtab: + .quad 0, .Lsel_forwardingTargetForSelector_ + .short 0, 0 + .long 0 + .quad 0 +.Lmodule: + .quad 8, 32, 0, .Lsymtab + +#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD) +.section .note.GNU-stack, "", @progbits +#endif Index: src/forwarding/forwarding.S ================================================================== --- src/forwarding/forwarding.S +++ src/forwarding/forwarding.S @@ -51,10 +51,12 @@ # include "forwarding-mips-elf.S" # elif defined(OF_SPARC64) # include "forwarding-sparc64-elf.S" # elif defined(OF_SPARC) # include "forwarding-sparc-elf.S" +# elif defined(OF_RISCV64) +# include "forwarding-riscv64-elf.S" # endif # elif defined(OF_MACH_O) # if defined(OF_AMD64) # include "forwarding-amd64-macho.S" # endif Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -349,11 +349,12 @@ #else # if defined(OF_ELF) # if defined(OF_AMD64) || defined(OF_X86) || \ defined(OF_ARM64) || defined(OF_ARM) || defined(OF_POWERPC) || \ defined(OF_MIPS64_N64) || defined(OF_MIPS) || \ - defined(OF_SPARC64) || defined(OF_SPARC) + defined(OF_SPARC64) || defined(OF_SPARC) || \ + defined(OF_RISCV64) # 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-riscv64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-riscv64-elf.S +++ src/runtime/lookup-asm/lookup-asm-riscv64-elf.S @@ -56,11 +56,11 @@ add t0, t0, t3 ld t0, (t0) beqz t0, 0f - move a0, t0 + mv a0, t0 ret 0: tail \notFound@plt @@ -81,11 +81,11 @@ .size \name, .-\name .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: - move t0, a0 + mv t0, a0 ld a0, (a0) beqz a0, .LreturnNilMethod ld t0, 8(t0) ld t0, 64(t0) @@ -106,8 +106,8 @@ .LnilMethod: li a0, 0 ret -#ifdef OF_LINUX +#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD) .section .note.GNU-stack, "", @progbits #endif