feat(asm): encode the arm64 local-exec TLS load

Assisted-by: GLM 5.3 Flash
This commit is contained in:
petrbalvin committed 2026-10-07 21:34:30 +02:00
1 parent 5f6be4584d
commit c27ba30862
6 files changed
+114 -2

No files matched your search

+56
View File
@@ -124,3 +124,59 @@ func TestArm64GOObjRelocTypes(t *testing.T) {
// The detailed layout is covered by the goobj tests; here we only pin
// that emission succeeds with the new relocation kinds in play.
}
// TestArm64TLSLoad pins the local-exec TLS load: a symbol the file's own
// GLOBL marks TLSBSS loads as one MOVZ word carrying the R_ARM64_TLS_LE
// relocation (asm7.go case 69), the shape `go tool asm` emits for the
// runtime's tls_g accesses. A non-TLS GLOBL keeps the ADRP+LDR pair.
func TestArm64TLSLoad(t *testing.T) {
img := parseArm64File(t, "#include \"textflag.h\"\n\n"+
"TEXT \u00b7f(SB), NOSPLIT, $0-0\n"+
"\tMOVD tlsvar(SB), R0\n"+
"\tMOVD plain(SB), R1\n"+
"\tRET\n"+
"GLOBL tlsvar(SB), TLSBSS, $8\n"+
"GLOBL plain(SB), NOPTR, $8\n")
fn := img.Funcs[0]
if fn.Size != 4+8+4 {
t.Fatalf("function size = %d, want 16", fn.Size)
}
if w := binary.LittleEndian.Uint32(img.Code[fn.Offset:]); w != 0xd2800000 {
t.Errorf("TLS load word = %08x, want MOVZ 0 (d2800000)", w)
}
var tlsSeen, plainSeen bool
for _, r := range fn.Relocs {
if r.Name != "tlsvar" {
continue
}
tlsSeen = true
if r.Kind != RelArm64TLSLE {
t.Errorf("tlsvar reloc kind = %v, want RelArm64TLSLE", r.Kind)
}
if r.Off != 0 {
t.Errorf("tlsvar reloc off = %d, want 0", r.Off)
}
}
for _, r := range fn.Relocs {
if r.Name == "plain" && r.Kind == RelArm64LDST64 {
plainSeen = true
}
}
if !tlsSeen {
t.Error("no tlsvar relocation recorded")
}
if !plainSeen {
t.Error("the plain GLOBL load lost its ADRP+LDR relocation")
}
// The other widths have no TLS row: the toolchain refuses them.
f, errs := parser.Parse("k_arm64.s", "TEXT \u00b7f(SB), NOSPLIT, $0-0\n"+
"\tMOVW tlsvar(SB), R0\n"+
"\tRET\n"+
"GLOBL tlsvar(SB), TLSBSS, $8\n")
if len(errs) > 0 {
t.Fatalf("parse: %v", errs)
}
if _, err := AssembleFileARM64(f); err == nil {
t.Error("MOVW of a TLS symbol assembled, want an illegal combination")
}
}