refactor(verify): extract the shared goobj link-parity harness
Assisted-by: GLM 5.3 Flash
This commit is contained in:
1 parent
a4a77b3168
commit
ffc23929c6
1 file changed
+26
-11
+26
-11
@@ -34,6 +34,20 @@ import (
|
|||||||
// repack, so a build-layout change that silently skipped the substitution
|
// repack, so a build-layout change that silently skipped the substitution
|
||||||
// fails the test instead of passing it vacuously.
|
// fails the test instead of passing it vacuously.
|
||||||
|
|
||||||
|
// buildLinkParityGasm builds the gasm binary from the tree under test, one
|
||||||
|
// level above this package, so every link-parity test exercises the shipped
|
||||||
|
// CLI path rather than the library.
|
||||||
|
func buildLinkParityGasm(t *testing.T, goBin string) string {
|
||||||
|
t.Helper()
|
||||||
|
gasmBin := filepath.Join(t.TempDir(), "gasm")
|
||||||
|
build := exec.Command(goBin, "build", "-o", gasmBin, "./cmd/gasm")
|
||||||
|
build.Dir = ".."
|
||||||
|
if out, err := build.CombinedOutput(); err != nil {
|
||||||
|
t.Fatalf("build gasm: %v\n%s", err, out)
|
||||||
|
}
|
||||||
|
return gasmBin
|
||||||
|
}
|
||||||
|
|
||||||
// goobjLinkModule is the Go side of the regression module. The assembly
|
// goobjLinkModule is the Go side of the regression module. The assembly
|
||||||
// declares the five functions; main verifies their semantics and prints a
|
// declares the five functions; main verifies their semantics and prints a
|
||||||
// deterministic line the linked binaries must agree on.
|
// deterministic line the linked binaries must agree on.
|
||||||
@@ -130,28 +144,29 @@ func TestGOOBJLinkRegression(t *testing.T) {
|
|||||||
|
|
||||||
// One gasm binary for every architecture, built from the tree under
|
// One gasm binary for every architecture, built from the tree under
|
||||||
// test: the regression exercises the shipped CLI path, not the library.
|
// test: the regression exercises the shipped CLI path, not the library.
|
||||||
// The build runs from the module root, one level above this package.
|
gasmBin := buildLinkParityGasm(t, goBin)
|
||||||
gasmBin := filepath.Join(t.TempDir(), "gasm")
|
|
||||||
gasmBuild := exec.Command(goBin, "build", "-o", gasmBin, "./cmd/gasm")
|
|
||||||
gasmBuild.Dir = ".."
|
|
||||||
if out, err := gasmBuild.CombinedOutput(); err != nil {
|
|
||||||
t.Fatalf("build gasm: %v\n%s", err, out)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, goarch := range []string{"amd64", "arm64", "riscv64", "loong64"} {
|
for _, goarch := range []string{"amd64", "arm64", "riscv64", "loong64"} {
|
||||||
t.Run(goarch, func(t *testing.T) {
|
t.Run(goarch, func(t *testing.T) {
|
||||||
testGOOBJLinkArch(t, goBin, gasmBin, goarch)
|
goobjLinkKernel(t, goBin, gasmBin, goarch, "linkreg_"+goarch+".s", goobjLinkMainSrc)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGOOBJLinkArch(t *testing.T, goBin, gasmBin, goarch string) {
|
// goobjLinkKernel runs the whole regression for one architecture against
|
||||||
|
// one kernel: the kernel is assembled by the toolchain for the baseline,
|
||||||
|
// re-assembled by the gasm CLI, substituted into the real build's package
|
||||||
|
// archive and the program relinked. The Go side (mainSrc) carries the
|
||||||
|
// semantics and prints the deterministic line the two binaries must share.
|
||||||
|
// The standing linkreg kernels and the newer family kernels all go through
|
||||||
|
// this one path, so a change here moves every link-parity claim at once.
|
||||||
|
func goobjLinkKernel(t *testing.T, goBin, gasmBin, goarch, kernelFile, mainSrc string) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
|
|
||||||
// The module: main.go, go.mod and the kernel as main_<goarch>.s, the
|
// The module: main.go, go.mod and the kernel as main_<goarch>.s, the
|
||||||
// name the build system selects the assembly by.
|
// name the build system selects the assembly by.
|
||||||
kernel, err := os.ReadFile(filepath.Join("testdata", "linkreg_"+goarch+".s"))
|
kernel, err := os.ReadFile(filepath.Join("testdata", kernelFile))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("read kernel: %v", err)
|
t.Fatalf("read kernel: %v", err)
|
||||||
}
|
}
|
||||||
@@ -159,7 +174,7 @@ func testGOOBJLinkArch(t *testing.T, goBin, gasmBin, goarch string) {
|
|||||||
if err := os.WriteFile(asmPath, kernel, 0o644); err != nil {
|
if err := os.WriteFile(asmPath, kernel, 0o644); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := os.WriteFile(filepath.Join(dir, "main.go"), []byte(goobjLinkMainSrc), 0o644); err != nil {
|
if err := os.WriteFile(filepath.Join(dir, "main.go"), []byte(mainSrc), 0o644); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte("module linkreg\n\ngo 1.27\n"), 0o644); err != nil {
|
if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte("module linkreg\n\ngo 1.27\n"), 0o644); err != nil {
|
||||||
|
|||||||
Reference in new issue
Block a user