// Copyright (c) 2026 Petr Balvín (https://petrbalvin.org) // SPDX-License-Identifier: BSD-3-Clause package asm import ( "strings" "testing" "sourcedock.dev/petrbalvin/gasm-devkit/parser" ) // TestGOObjectAARCH64Structure checks the basic structure of the emitted // AArch64 GOOBJ: the preamble, the magic, the block offsets and the // non-package symbol definitions. func TestGOObjectAARCH64Structure(t *testing.T) { f, errs := parser.Parse("k_arm64.s", ` #include "textflag.h" TEXT ·add(SB), NOSPLIT, $0-24 MOVD a+0(FP), R4 MOVD b+8(FP), R5 ADD R5, R4, R4 MOVD R4, ret+16(FP) RET `) if len(errs) > 0 { t.Fatalf("parse: %v", errs) } img, err := AssembleFileARM64(f) if err != nil { t.Fatalf("AssembleFileARM64: %v", err) } obj, err := img.GOObjectAARCH64("testpkg", "k_arm64.s") if err != nil { t.Fatalf("GOObjectAARCH64: %v", err) } // Check preamble. idx := strings.Index(string(obj), "\n!\n") if idx < 0 { t.Fatal("missing preamble separator") } preamble := string(obj[:idx]) if !strings.HasPrefix(preamble, "go object") { t.Errorf("preamble = %q, want 'go object ...'", preamble) } // Check GOOBJ magic. magicIdx := idx + 3 if magicIdx+8 > len(obj) || string(obj[magicIdx:magicIdx+8]) != "\x00go120ld" { t.Error("missing GOOBJ magic") } // The object should contain the function's code. if len(img.Code) == 0 { t.Error("no code generated") } }