60 lines
1.4 KiB
Go
60 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 (
|
|
"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")
|
|
}
|
|
}
|