Index: PLATFORMS.md ================================================================== --- PLATFORMS.md +++ PLATFORMS.md @@ -266,10 +266,11 @@ resolveInstanceMethod:, which are always available): * AMD64 (SysV/ELF, Apple/Mach-O, Mach-O, Win64/PE) * ARM (EABI/ELF, Apple/Mach-O) * ARM64 (ARM64/ELF, Apple/Mach-O) + * LoongArch 64 (SysV/ELF) * MIPS (O32/ELF, EABI/ELF) * MIPS64 (N64/ELF) * PowerPC (SysV/ELF, EABI/ELF, Apple/Mach-O) * RISC-V 64 (SysV/ELF) * SPARC (SysV/ELF) ADDED src/forwarding/forwarding-loongarch64-elf.S Index: src/forwarding/forwarding-loongarch64-elf.S ================================================================== --- /dev/null +++ src/forwarding/forwarding-loongarch64-elf.S @@ -0,0 +1,219 @@ +/* + * 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 + +.section .text +OFForward: + addi.d $sp, $sp, -144 + st.d $ra, $sp, 0 + + st.d $a0, $sp, 8 + st.d $a1, $sp, 16 + st.d $a2, $sp, 24 + st.d $a3, $sp, 32 + st.d $a4, $sp, 40 + st.d $a5, $sp, 48 + st.d $a6, $sp, 56 + st.d $a7, $sp, 64 + + fst.d $fa0, $sp, 72 + fst.d $fa1, $sp, 80 + fst.d $fa2, $sp, 88 + fst.d $fa3, $sp, 96 + fst.d $fa4, $sp, 104 + fst.d $fa5, $sp, 112 + fst.d $fa6, $sp, 120 + fst.d $fa7, $sp, 128 + + bl %plt(object_getClass) + + la.local $a1, .Lsel_forwardingTargetForSelector_ + bl %plt(class_respondsToSelector) + beqz $a0, 0f + + ld.d $a0, $sp, 8 + la.local $a1, .Lsel_forwardingTargetForSelector_ + bl %plt(objc_msg_lookup) + move $t0, $a0 + + ld.d $a0, $sp, 8 + la.local $a1, .Lsel_forwardingTargetForSelector_ + ld.d $a2, $sp, 16 + jirl $ra, $t0, 0 + + beqz $a0, 0f + ld.d $t0, $sp, 8 + beq $t0, $a0, 0f + + st.d $a0, $sp, 8 + + ld.d $a1, $sp, 16 + bl %plt(objc_msg_lookup) + move $t0, $a0 + + fld.d $fa7, $sp, 128 + fld.d $fa6, $sp, 120 + fld.d $fa5, $sp, 112 + fld.d $fa4, $sp, 104 + fld.d $fa3, $sp, 96 + fld.d $fa2, $sp, 88 + fld.d $fa1, $sp, 80 + fld.d $fa0, $sp, 72 + + ld.d $a7, $sp, 64 + ld.d $a6, $sp, 56 + ld.d $a5, $sp, 48 + ld.d $a4, $sp, 40 + ld.d $a3, $sp, 32 + ld.d $a2, $sp, 24 + ld.d $a1, $sp, 16 + ld.d $a0, $sp, 8 + + ld.d $ra, $sp, 0 + addi.d $sp, $sp, 144 + + jr $t0 + +0: + ld.d $a1, $sp, 16 + ld.d $a0, $sp, 8 + + ld.d $ra, $sp, 0 + addi.d $sp, $sp, 144 + + b %plt(OFMethodNotFound) +.type OFForward, @function +.size OFForward, .-OFForward + +OFForward_stret: + addi.d $sp, $sp, -144 + st.d $ra, $sp, 0 + + st.d $a0, $sp, 8 + st.d $a1, $sp, 16 + st.d $a2, $sp, 24 + st.d $a3, $sp, 32 + st.d $a4, $sp, 40 + st.d $a5, $sp, 48 + st.d $a6, $sp, 56 + st.d $a7, $sp, 64 + + fst.d $fa0, $sp, 72 + fst.d $fa1, $sp, 80 + fst.d $fa2, $sp, 88 + fst.d $fa3, $sp, 96 + fst.d $fa4, $sp, 104 + fst.d $fa5, $sp, 112 + fst.d $fa6, $sp, 120 + fst.d $fa7, $sp, 128 + + move $a0, $a1 + bl %plt(object_getClass) + + la.local $a1, .Lsel_forwardingTargetForSelector_ + bl %plt(class_respondsToSelector) + beqz $a0, 0f + + ld.d $a0, $sp, 16 + la.local $a1, .Lsel_forwardingTargetForSelector_ + bl %plt(objc_msg_lookup) + move $t0, $a0 + + ld.d $a0, $sp, 16 + la.local $a1, .Lsel_forwardingTargetForSelector_ + ld.d $a2, $sp, 24 + jirl $ra, $t0, 0 + + beqz $a0, 0f + ld.d $t0, $sp, 16 + beq $t0, $a0, 0f + + st.d $a0, $sp, 16 + + ld.d $a1, $sp, 24 + bl %plt(objc_msg_lookup_stret) + move $t0, $a0 + + fld.d $fa7, $sp, 128 + fld.d $fa6, $sp, 120 + fld.d $fa5, $sp, 112 + fld.d $fa4, $sp, 104 + fld.d $fa3, $sp, 96 + fld.d $fa2, $sp, 88 + fld.d $fa1, $sp, 80 + fld.d $fa0, $sp, 72 + + ld.d $a7, $sp, 64 + ld.d $a6, $sp, 56 + ld.d $a5, $sp, 48 + ld.d $a4, $sp, 40 + ld.d $a3, $sp, 32 + ld.d $a2, $sp, 24 + ld.d $a1, $sp, 16 + ld.d $a0, $sp, 8 + + ld.d $ra, $sp, 0 + addi.d $sp, $sp, 144 + + jr $t0 + +0: + ld.d $a2, $sp, 24 + ld.d $a1, $sp, 16 + ld.d $a0, $sp, 8 + + ld.d $ra, $sp, 0 + addi.d $sp, $sp, 144 + + b %plt(OFMethodNotFound_stret) +.type OFForward_stret, @function +.size OFForward_stret, .-OFForward_stret + +.Linit: + la.local $a0, .Lmodule + b %plt(__objc_exec_class) + +.section .init_array, "aw" + .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 @@ -53,10 +53,12 @@ # include "forwarding-sparc64-elf.S" # elif defined(OF_SPARC) # include "forwarding-sparc-elf.S" # elif defined(OF_RISCV64) # include "forwarding-riscv64-elf.S" +# elif defined(OF_LOONGARCH64) +# include "forwarding-loongarch64-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 @@ -350,11 +350,11 @@ # 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_RISCV64) + defined(OF_RISCV64) || defined(OF_LOONGARCH64) # 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-loongarch64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-loongarch64-elf.S +++ src/runtime/lookup-asm/lookup-asm-loongarch64-elf.S @@ -32,12 +32,12 @@ beqz $a0, .LreturnNilMethod andi $t0, $a0, 1 bnez $t0, .LtaggedPointer_\name - ld.d $t0, $a0, 0 - ld.d $t0, $t0, 64 + ldptr.d $t0, $a0, 0 + ldptr.d $t0, $t0, 64 .Lmain_\name: #ifdef OF_SELUID24 ld.bu $t1, $a1, 2 slli.d $t1, $t1, 3 @@ -68,25 +68,25 @@ andi $t1, $t1, 0xE slli.d $t1, $t1, 2 la.global $t0, objc_taggedPointerClasses ldx.d $t0, $t0, $t1 - ld.d $t0, $t0, 64 + ldptr.d $t0, $t0, 64 b .Lmain_\name .type \name, %function .size \name, .-\name .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: move $t0, $a0 - ld.d $a0, $a0, 0 + ldptr.d $a0, $a0, 0 beqz $a0, .LreturnNilMethod - ld.d $t0, $t0, 8 - ld.d $t0, $t0, 64 + ldptr.d $t0, $t0, 8 + ldptr.d $t0, $t0, 64 b .Lmain_\lookup .type \name, %function .size \name, .-\name .endm