Index: src/platform.h ================================================================== --- src/platform.h +++ src/platform.h @@ -92,13 +92,13 @@ # endif # if defined(__mc68010__) || defined(OF_M68020) # define OF_M68010 # endif #elif defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64 -# define OF_RISC_V_64 +# define OF_RISCV64 #elif defined(__riscv) -# define OF_RISC_V +# define OF_RISCV #elif defined(__s390x__) # define OF_S390X #elif defined(__s390__) # define OF_S390 #elif defined(__e2k__) ADDED src/runtime/lookup-asm/lookup-asm-riscv64-elf.S Index: src/runtime/lookup-asm/lookup-asm-riscv64-elf.S ================================================================== --- /dev/null +++ src/runtime/lookup-asm/lookup-asm-riscv64-elf.S @@ -0,0 +1,113 @@ +/* + * 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 objc_msg_lookup +.globl objc_msg_lookup_stret +.globl objc_msg_lookup_super +.globl objc_msg_lookup_super_stret + +.section .text +.macro GENERATE_LOOKUP name notFound +\name: + beqz a0, .LreturnNilMethod + + andi t0, a0, 1 + bnez t0, .LtaggedPointer_\name + + ld t0, (a0) + ld t0, 64(t0) + +.Lmain_\name: +#ifdef OF_SELUID24 + lbu t1, 2(a1) + slli t1, t1, 3 +#endif + lbu t2, 1(a1) + slli t2, t2, 3 + lbu t3, (a1) + slli t3, t3, 3 + +#ifdef OF_SELUID24 + add t0, t0, t1 + ld t0, (t0) +#endif + add t0, t0, t2 + ld t0, (t0) + add t0, t0, t3 + ld t0, (t0) + + beqz t0, 0f + + move a0, t0 + ret + +0: + j \notFound + +.LtaggedPointer_\name: + la t1, objc_taggedPointerSecret + ld t1, (t1) + xor t1, a0, t1 + andi t1, t1, 0xE + slli t1, t1, 2 + + la t0, objc_taggedPointerClasses + add t0, t0, t1 + ld t0, (t0) + ld t0, 64(t0) + + j .Lmain_\name +.type \name, @function +.size \name, .-\name +.endm + +.macro GENERATE_LOOKUP_SUPER name lookup +\name: + move t0, a0 + ld a0, (a0) + beqz a0, .LreturnNilMethod + + ld t0, 8(t0) + ld t0, 64(t0) + + j .Lmain_\lookup +.type \name, @function +.size \name, .-\name +.endm + +GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound +GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret +GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup +GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret + +.LreturnNilMethod: + lla a0, .LnilMethod + ret + +.LnilMethod: + li a0, 0 + ret + +#ifdef OF_LINUX +.section .note.GNU-stack, "", @progbits +#endif Index: src/runtime/lookup-asm/lookup-asm.S ================================================================== --- src/runtime/lookup-asm/lookup-asm.S +++ src/runtime/lookup-asm/lookup-asm.S @@ -40,10 +40,12 @@ # include "lookup-asm-mips-elf.S" # elif defined(OF_SPARC64) # include "lookup-asm-sparc64-elf.S" # elif defined(OF_SPARC) # include "lookup-asm-sparc-elf.S" +# elif defined(OF_RISCV64) +# include "lookup-asm-riscv64-elf.S" # endif #elif defined(OF_MACH_O) # if defined(OF_AMD64) # include "lookup-asm-amd64-macho.S" # endif Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -298,11 +298,12 @@ #if defined(OF_ELF) # if defined(OF_AMD64) || defined(OF_X86) || \ defined(OF_POWERPC64) || defined(OF_POWERPC) || \ defined(OF_ARM64) || defined(OF_ARM) || \ defined(OF_MIPS64_N64) || defined(OF_MIPS) || \ - defined(OF_SPARC64) || defined(OF_SPARC) + defined(OF_SPARC64) || defined(OF_SPARC) || \ + defined(OF_RISCV64) # define OF_ASM_LOOKUP # endif #elif defined(OF_MACH_O) # if defined(OF_AMD64) # define OF_ASM_LOOKUP