// Copyright (c) 2026 Petr BalvĂ­n (https://petrbalvin.org) // SPDX-License-Identifier: BSD-3-Clause package asm import ( "testing" "sourcedock.dev/petrbalvin/gasm-devkit/parser" ) // TestLOONG64RelocOffsetsIncludePrologue pins the function-relative // relocation offsets of a framed loong64 function: the offsets used to // exclude the prologue, so every relocation landed on a prologue // instruction in the GOOBJ/ELF output. func TestLOONG64RelocOffsetsIncludePrologue(t *testing.T) { f, errs := parser.Parse("k_loong64.s", "TEXT \u00b7f(SB), $16-0\n"+ "\tMOVV $gdata(SB), R4\n"+ "\tRET\n"+ "GLOBL gdata(SB), $8\n") if len(errs) > 0 { t.Fatalf("parse: %v", errs) } img, err := AssembleFileLOONG64(f) if err != nil { t.Fatalf("assemble: %v", err) } fn := img.Funcs[0] // Layout: 12-byte prologue (autosize 32), pcalau12i+addi.d (12, 16), // epilogue with RET. if len(fn.Relocs) != 2 { t.Fatalf("relocs = %d, want 2", len(fn.Relocs)) } hi, lo := fn.Relocs[0], fn.Relocs[1] if hi.Kind != RelLoong64AddrHi || hi.Off != 12 || hi.After != 12 { t.Errorf("hi reloc = {off %d after %d kind %d}, want {off 12 after 12 kind RelLoong64AddrHi}", hi.Off, hi.After, hi.Kind) } if lo.Kind != RelLoong64AddrLo || lo.Off != 16 || lo.After != 16 { t.Errorf("lo reloc = {off %d after %d kind %d}, want {off 16 after 16 kind RelLoong64AddrLo}", lo.Off, lo.After, lo.Kind) } }