43 lines
1.4 KiB
Go
43 lines
1.4 KiB
Go
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package asm
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"sourcedock.dev/petrbalvin/gasm-sdk/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)
|
|
}
|
|
}
|