feat(asm): emit the riscv64 local-exec TLS sequence

Assisted-by: GLM 5.3
This commit is contained in:
petrbalvin committed 2026-10-07 13:51:02 +02:00
1 parent f8dbd4f017
commit f2892e4f59
6 files changed
+114 -29

No files matched your search

+17 -17
View File
@@ -35,7 +35,7 @@ func firstTextRISCV(t *testing.T, src string) *ast.Text {
// assembleRISCVHelper assembles one TEXT function and returns its code bytes.
func assembleRISCVHelper(t *testing.T, fn *ast.Text) []byte {
t.Helper()
code, _, _, _, _, _, err := assembleRISCV(fn)
code, _, _, _, _, _, err := assembleRISCV(fn, nil)
if err != nil {
t.Fatalf("assemble: %v", err)
}
@@ -132,7 +132,7 @@ TEXT ·wide(SB), NOSPLIT, $0
AUIPC $524288, X10
RET
`)
if _, _, _, _, _, _, err := assembleRISCV(fn); err == nil {
if _, _, _, _, _, _, err := assembleRISCV(fn, nil); err == nil {
t.Error("AUIPC $524288: expected the 20-bit range error, got none")
}
}
@@ -868,7 +868,7 @@ TEXT ·argfp(SB), NOSPLIT, $0
MOV $arg(FP), X10
RET
`)
code, _, _, _, _, _, err := assembleRISCV(fn)
code, _, _, _, _, _, err := assembleRISCV(fn, nil)
if err != nil {
t.Fatalf("assemble: %v", err)
}
@@ -891,7 +891,7 @@ TEXT ·book(SB), NOSPLIT, $0-8
MOV X10, ret+0(FP)
RET
`)
code, _, _, _, _, _, err := assembleRISCV(fn)
code, _, _, _, _, _, err := assembleRISCV(fn, nil)
if err != nil {
t.Fatalf("assemble: %v", err)
}
@@ -915,7 +915,7 @@ TEXT ·slots(SB), NOSPLIT, $0-0
JMP -3(PC)
RET
`)
code, _, _, _, _, _, err := assembleRISCV(fn)
code, _, _, _, _, _, err := assembleRISCV(fn, nil)
if err != nil {
t.Fatalf("assemble: %v", err)
}
@@ -943,7 +943,7 @@ TEXT ·wide(SB), NOSPLIT, $0-0
MOV $0x000fffffffffffda, X5
RET
`)
code, _, _, _, _, _, err := assembleRISCV(fn)
code, _, _, _, _, _, err := assembleRISCV(fn, nil)
if err != nil {
t.Fatalf("assemble: %v", err)
}
@@ -1003,7 +1003,7 @@ TEXT ·calltest(SB), NOSPLIT, $0
CALL ext(SB)
RET
`)
code, _, relocs, _, _, _, err := assembleRISCV(fn)
code, _, relocs, _, _, _, err := assembleRISCV(fn, nil)
if err != nil {
t.Fatalf("assemble: %v", err)
}
@@ -1032,7 +1032,7 @@ TEXT ·calllocal(SB), NOSPLIT, $0
sub:
RET
`)
_, _, _, _, _, _, err := assembleRISCV(fn)
_, _, _, _, _, _, err := assembleRISCV(fn, nil)
if err == nil {
t.Error("expected error for CALL to local label, got nil")
}
@@ -1066,7 +1066,7 @@ func encodeOneInstrRISCV(t *testing.T, src string, pc int, offsets map[string]in
t.Helper()
fn := firstTextRISCV(t, "#include \"textflag.h\"\n"+src)
instr := fn.Body[0].(*ast.Instr)
return encodeRISCVInstr(instr, pc, offsets, riscvFrameInfo{}, nil, nil, nil)
return encodeRISCVInstr(instr, pc, offsets, riscvFrameInfo{}, nil, nil, nil, nil)
}
// TestRISCVBranchJumpRange checks that displacements beyond the B-type span
@@ -1115,7 +1115,7 @@ func TestRISCVBranchFarBody(t *testing.T) {
}
sb.WriteString("done:\n\tRET\n")
fn := firstTextRISCV(t, sb.String())
out, _, _, _, _, _, err := assembleRISCV(fn)
out, _, _, _, _, _, err := assembleRISCV(fn, nil)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
@@ -1141,7 +1141,7 @@ TEXT ·csrhi(SB), NOSPLIT, $0
CSRRW $4096, X10, X11
RET
`)
if _, _, _, _, _, _, err := assembleRISCV(fn); err == nil {
if _, _, _, _, _, _, err := assembleRISCV(fn, nil); err == nil {
t.Error("expected an out-of-range error for CSR $4096, got none")
}
fn = firstTextRISCV(t, `#include "textflag.h"
@@ -1149,7 +1149,7 @@ TEXT ·csrmax(SB), NOSPLIT, $0
CSRRW $4095, X10, X11
RET
`)
if _, _, _, _, _, _, err := assembleRISCV(fn); err != nil {
if _, _, _, _, _, _, err := assembleRISCV(fn, nil); err != nil {
t.Errorf("CSR $4095 must assemble: %v", err)
}
}
@@ -1166,7 +1166,7 @@ func TestRISCV_Imm64Rejected(t *testing.T) {
}
for _, src := range cases {
fn := firstTextRISCV(t, "#include \"textflag.h\"\nTEXT ·wide(SB), NOSPLIT, $0\n\t"+src+"\n\tRET\n")
if _, _, _, _, _, _, err := assembleRISCV(fn); err == nil {
if _, _, _, _, _, _, err := assembleRISCV(fn, nil); err == nil {
t.Errorf("%s: expected an out-of-range error, got none", src)
}
}
@@ -1179,7 +1179,7 @@ TEXT ·edge(SB), NOSPLIT, $0
SUB $0x80000000, X12, X13
RET
`)
if _, _, _, _, _, _, err := assembleRISCV(fn); err != nil {
if _, _, _, _, _, _, err := assembleRISCV(fn, nil); err != nil {
t.Errorf("int32-span immediates must assemble: %v", err)
}
// Beyond the span the MOV forms materialise the constant like the
@@ -1189,7 +1189,7 @@ TEXT ·pool(SB), NOSPLIT, $0
MOV $0x123456789, X10
RET
`)
if _, _, _, _, _, _, err := assembleRISCV(fn); err != nil {
if _, _, _, _, _, _, err := assembleRISCV(fn, nil); err != nil {
t.Errorf("MOV with a 64-bit immediate must assemble: %v", err)
}
}
@@ -1424,7 +1424,7 @@ func TestRISCV_rawDataRange(t *testing.T) {
asmOne := func(t *testing.T, stmt string) ([]byte, error) {
t.Helper()
fn := firstTextRISCV(t, "#include \"textflag.h\"\nTEXT ·w(SB), NOSPLIT, $0\n\t"+stmt+"\n\tRET\n")
code, _, _, _, _, _, err := assembleRISCV(fn)
code, _, _, _, _, _, err := assembleRISCV(fn, nil)
return code, err
}
t.Run("word bounds", func(t *testing.T) {
@@ -1471,7 +1471,7 @@ func TestRISCV_shiftImmediateRange(t *testing.T) {
asmOne := func(t *testing.T, stmt string) error {
t.Helper()
fn := firstTextRISCV(t, "#include \"textflag.h\"\nTEXT ·s(SB), NOSPLIT, $0\n\t"+stmt+"\n\tRET\n")
_, _, _, _, _, _, err := assembleRISCV(fn)
_, _, _, _, _, _, err := assembleRISCV(fn, nil)
return err
}
for _, s := range []string{