// Copyright (c) 2026 Petr Balvín (https://petrbalvin.org) // SPDX-License-Identifier: BSD-3-Clause #include "textflag.h" // The link-regression kernel for riscv64, the amd64 one's sibling: stack // discipline (add), an intra-file call (probe calling seven, the // R_RISCV_CALL pair), an AUIPC+I-type pair against static data (word<>, // R_RISCV_PCREL_ITYPE), a symbol-valued DATA field (entry holding // seven's address, R_ADDR), NOPTR data outside the GC's type scan // (counter) and the data section itself. The callee's result slot sits // at the caller's SP+8, the riscv64 ABI0 frame convention. // func add(a, b int64) int64 TEXT ·add(SB), NOSPLIT, $0-24 MOV a+0(FP), X10 MOV b+8(FP), X11 ADD X11, X10, X10 MOV X10, ret+16(FP) RET // func seven() int64 TEXT ·seven(SB), NOSPLIT, $0-8 MOV $7, X10 MOV X10, ret+0(FP) RET // func probe() int64 = seven() + word<>(SB) TEXT ·probe(SB), NOSPLIT, $8-8 CALL ·seven(SB) MOV 8(SP), X10 MOV word<>(SB), X11 ADD X11, X10, X10 MOV X10, ret+0(FP) RET // func entryAddr() uintptr TEXT ·entryAddr(SB), NOSPLIT, $0-8 MOV entry(SB), X10 MOV X10, ret+0(FP) RET // func counterVal() int64 TEXT ·counterVal(SB), NOSPLIT, $0-8 MOV counter(SB), X10 MOV X10, ret+0(FP) RET GLOBL word<>(SB), RODATA, $8 DATA word<>+0(SB)/8, $0x0fedcba987654321 GLOBL entry(SB), RODATA, $8 DATA entry+0(SB)/8, $·seven(SB) GLOBL counter(SB), NOPTR, $8 DATA counter+0(SB)/8, $1234