From 8b76d35b0a045e0a3277be422513b938ef33dcce Mon Sep 17 00:00:00 2001 From: hachem Date: Wed, 9 Sep 2026 05:14:44 +0200 Subject: feat: fasm backend --- scripts/dump_asm.sh | 34 ++++++++++++++++++++++++++++++++++ scripts/run_suite.sh | 4 +++- scripts/test_examples.sh | 19 +++++++++++++++---- 3 files changed, 52 insertions(+), 5 deletions(-) create mode 100755 scripts/dump_asm.sh (limited to 'scripts') diff --git a/scripts/dump_asm.sh b/scripts/dump_asm.sh new file mode 100755 index 0000000..cb8a710 --- /dev/null +++ b/scripts/dump_asm.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd "$(dirname "$0")/.." && pwd)" +cd "$root" + +assemblers="${1:-${ASSEMBLER:-nasm fasm}}" + +docker compose up -d >/dev/null + +docker compose exec -T -e ASMS="$assemblers" hdass bash -c ' + set -e + cd /hdass + [ -d build-linux ] || meson setup build-linux >/dev/null + meson compile -C build-linux >/dev/null + +cat > /tmp/sidebyside.awk <<"AWK" +NR == FNR { left[FNR] = $0; if (length($0) > width) width = length($0); ln = FNR; next } +{ right[FNR] = $0; if (FNR > rn) rn = FNR } +END { + total = ln > rn ? ln : rn + for (i = 1; i <= total; i += 1) + printf "%-*s | %s\n", width, (i in left ? left[i] : ""), (i in right ? right[i] : "") +} +AWK + + for asm in $ASMS; do + for src in examples/*.hdass; do + printf "\n===== %s (%s) =====\n" "$(basename "$src")" "$asm" + ./build-linux/hdass -t "$asm" "$src" -o /tmp/gen.asm + awk -f /tmp/sidebyside.awk <(expand -t 4 "$src") <(expand -t 4 /tmp/gen.asm) + done + done +' /dev/null 2>&1; then echo "${red}error:${reset} '$tool' not found; run this inside the Docker environment" >&2 exit 1 fi done +assemble() +{ + if [ "$assembler" = "fasm" ]; then + fasm "$1" "$2" >/dev/null + else + nasm -f elf64 "$1" -o "$2" + fi +} + work="$(mktemp -d)" trap 'rm -rf "$work"' EXIT @@ -35,9 +46,9 @@ check() local name="$1" desc="$2" source="$3" expected_exit="$4" expected_stdout="$5" local asm="$work/$name.asm" obj="$work/$name.o" bin="$work/$name" stage="" - if ! "$hdass" "$source" -o "$asm" 2>"$work/err"; then + if ! "$hdass" -t "$assembler" "$source" -o "$asm" 2>"$work/err"; then stage="transpile" - elif ! nasm -f elf64 "$asm" -o "$obj" 2>"$work/err"; then + elif ! assemble "$asm" "$obj" 2>"$work/err"; then stage="assemble" elif ! ld -e main "$obj" -o "$bin" 2>"$work/err"; then stage="link" @@ -71,7 +82,7 @@ check() pass=$((pass + 1)) } -printf '%s━━ example programs ━━%s\n' "$bold" "$reset" +printf '%s━━ example programs (%s) ━━%s\n' "$bold" "$assembler" "$reset" check hello_world "writes a greeting to stdout" examples/hello_world.hdass 0 "Hello, World!" check greet "writes a fixed string" examples/greet.hdass 0 "hdass works!" -- cgit v1.3