827dd4a7fe
One less error that's only in the bootstrap phase. On the other hand, for simplicity I got rid of the ability to override the Entry label. One less special case, but we're also going further from the ability to run subsets of layers. We haven't really been exercising it for a long time, though (commit 7842, March 2021 when we made baremetal the default).
374 lines
7.1 KiB
Bash
Executable File
374 lines
7.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# Build and test all included Mu and SubX programs on Linux:
|
|
# translate them into ELF binaries
|
|
# if possible, compare the generated binaries with what's already in git
|
|
# run/test the ELF binaries in emulated mode
|
|
# run/test the ELF binaries in native mode
|
|
#
|
|
# Example usage:
|
|
# test_apps
|
|
# test_apps record # don't compare with what's in git
|
|
|
|
set -e
|
|
cd `dirname $0`
|
|
|
|
echo "== translating using the bootstrap C++ translator"
|
|
|
|
# example programs
|
|
|
|
echo ex1
|
|
bootstrap/bootstrap translate 000init.subx apps/ex1.subx -o ex1
|
|
{
|
|
bootstrap/bootstrap run ex1 || ret=$?
|
|
test $ret -eq 42 # life, the universe and everything
|
|
}
|
|
{
|
|
chmod +x ex1
|
|
./ex1 || ret=$?
|
|
test $ret -eq 42 # life, the universe and everything
|
|
}
|
|
|
|
echo ex2
|
|
bootstrap/bootstrap translate 000init.subx apps/ex2.subx -o ex2
|
|
{
|
|
bootstrap/bootstrap run ex2 || ret=$?
|
|
test $ret -eq 7 # 3 + 4
|
|
}
|
|
{
|
|
chmod +x ex2
|
|
./ex2 || ret=$?
|
|
test $ret -eq 7 # 3 + 4
|
|
}
|
|
|
|
echo ex3
|
|
bootstrap/bootstrap translate 000init.subx apps/ex3.subx -o ex3
|
|
{
|
|
bootstrap/bootstrap run ex3 || ret=$?
|
|
test $ret -eq 55 # 1 + 2 + ... + 10
|
|
}
|
|
{
|
|
chmod +x ex3
|
|
./ex3 || ret=$?
|
|
test $ret -eq 55 # 1 + 2 + ... + 10
|
|
}
|
|
|
|
echo ex4
|
|
bootstrap/bootstrap translate 000init.subx apps/ex4.subx -o ex4
|
|
{
|
|
echo a | bootstrap/bootstrap run ex4 >ex4.out || true
|
|
test `cat ex4.out` = 'a'
|
|
}
|
|
{
|
|
chmod +x ex4
|
|
echo a | ./ex4 >ex4.out || true
|
|
test `cat ex4.out` = 'a'
|
|
}
|
|
|
|
echo ex5
|
|
bootstrap/bootstrap translate 000init.subx apps/ex5.subx -o ex5
|
|
{
|
|
echo a | bootstrap/bootstrap run ex5 >ex5.out || true
|
|
test `cat ex5.out` = 'a'
|
|
}
|
|
{
|
|
chmod +x ex5
|
|
echo a | ./ex5 >ex5.out || true
|
|
test `cat ex5.out` = 'a'
|
|
}
|
|
|
|
echo ex6
|
|
bootstrap/bootstrap translate 000init.subx apps/ex6.subx -o ex6
|
|
{
|
|
bootstrap/bootstrap run ex6 >ex6.out || true
|
|
test "`cat ex6.out`" = 'Hello world!'
|
|
}
|
|
{
|
|
chmod +x ex6
|
|
./ex6 >ex6.out || true
|
|
test "`cat ex6.out`" = 'Hello world!'
|
|
}
|
|
|
|
echo ex7
|
|
bootstrap/bootstrap translate 000init.subx apps/ex7.subx -o ex7
|
|
{
|
|
bootstrap/bootstrap run ex7 || ret=$?
|
|
test $ret -eq 97 # 'a'
|
|
}
|
|
{
|
|
chmod +x ex7
|
|
./ex7 || ret=$?
|
|
test $ret -eq 97 # 'a'
|
|
}
|
|
|
|
echo ex8
|
|
bootstrap/bootstrap translate 000init.subx apps/ex8.subx -o ex8
|
|
{
|
|
bootstrap/bootstrap run ex8 abcd || ret=$?
|
|
test $ret -eq 4 # length('abcd')
|
|
}
|
|
{
|
|
chmod +x ex8
|
|
./ex8 abcd || ret=$?
|
|
test $ret -eq 4 # length('abcd')
|
|
}
|
|
|
|
echo ex9
|
|
bootstrap/bootstrap translate 000init.subx apps/ex9.subx -o ex9
|
|
{
|
|
bootstrap/bootstrap run ex9 z x || ret=$?
|
|
test $ret -eq 2 # 'z' - 'x'
|
|
}
|
|
{
|
|
chmod +x ex9
|
|
./ex9 z x || ret=$?
|
|
test $ret -eq 2 # 'z' - 'x'
|
|
}
|
|
|
|
echo ex10
|
|
bootstrap/bootstrap translate 000init.subx apps/ex10.subx -o ex10
|
|
{
|
|
bootstrap/bootstrap run ex10 abc abc || ret=$?
|
|
test $ret -eq 1 # equal
|
|
bootstrap/bootstrap run ex10 abc abcd # 0; not equal
|
|
}
|
|
{
|
|
chmod +x ex10
|
|
./ex10 abc abc || ret=$?
|
|
test $ret -eq 1 # equal
|
|
./ex10 abc abcd # 0; not equal
|
|
}
|
|
|
|
echo ex11
|
|
bootstrap/bootstrap translate 000init.subx apps/ex11.subx -o ex11
|
|
{
|
|
bootstrap/bootstrap run ex11
|
|
echo
|
|
}
|
|
{
|
|
chmod +x ex11
|
|
./ex11
|
|
echo
|
|
}
|
|
|
|
echo ex12
|
|
bootstrap/bootstrap translate 000init.subx apps/ex12.subx -o ex12
|
|
bootstrap/bootstrap run ex12 # final byte of mmap'd address is well-nigh guaranteed to be 0
|
|
chmod +x ex12
|
|
./ex12
|
|
|
|
echo ex13
|
|
bootstrap/bootstrap translate 000init.subx apps/ex13.subx -o ex13
|
|
{
|
|
bootstrap/bootstrap run ex13 || ret=$?
|
|
test $ret -eq 1 # 3 == 3
|
|
}
|
|
{
|
|
chmod +x ex13
|
|
./ex13 || ret=$?
|
|
test $ret -eq 1 # 3 == 3
|
|
}
|
|
|
|
# Larger apps that use the standard library.
|
|
|
|
echo factorial
|
|
bootstrap/bootstrap translate [01]*.subx apps/factorial.subx -o factorial
|
|
{
|
|
bootstrap/bootstrap run factorial || ret=$?
|
|
test $ret -eq 120 # factorial(5)
|
|
bootstrap/bootstrap run factorial test
|
|
echo
|
|
}
|
|
{
|
|
chmod +x factorial
|
|
./factorial || ret=$?
|
|
test $ret -eq 120 # factorial(5)
|
|
./factorial test
|
|
echo
|
|
}
|
|
|
|
echo random
|
|
bootstrap/bootstrap translate [01]*.subx apps/random.subx -o random
|
|
# don't run
|
|
|
|
# Phases of the self-hosted SubX translator.
|
|
|
|
for phase in hex survey_elf survey_baremetal labels_baremetal pack assort dquotes tests
|
|
do
|
|
echo $phase
|
|
bootstrap/bootstrap translate [01]*.subx subx-params.subx $phase.subx -o $phase
|
|
test "$1" = 'record' || git diff --exit-code $phase
|
|
{
|
|
bootstrap/bootstrap run $phase test
|
|
echo
|
|
}
|
|
{
|
|
chmod +x $phase
|
|
./$phase test
|
|
echo
|
|
}
|
|
done
|
|
|
|
# Higher-level syntax.
|
|
|
|
# Certain phases of translation run native beyond this point. We're starting
|
|
# to go beyond functionality of the C++ bootstrap_bin.
|
|
|
|
echo sigils
|
|
bootstrap/bootstrap translate [012]*.subx subx-params.subx sigils.subx -o sigils
|
|
test "$1" = 'record' || git diff --exit-code sigils
|
|
{
|
|
bootstrap/bootstrap run sigils test
|
|
echo
|
|
}
|
|
{
|
|
chmod +x sigils
|
|
./sigils test
|
|
echo
|
|
}
|
|
|
|
echo calls
|
|
cat [012]*.subx subx-params.subx calls.subx | ./sigils > a.sigils
|
|
bootstrap/bootstrap translate a.sigils -o calls
|
|
test "$1" = 'record' || git diff --exit-code calls
|
|
{
|
|
bootstrap/bootstrap run calls test
|
|
echo
|
|
}
|
|
{
|
|
chmod +x calls
|
|
./calls test
|
|
echo
|
|
}
|
|
|
|
echo braces
|
|
cat [012]*.subx subx-params.subx braces.subx | ./calls | ./sigils > a.sigils
|
|
bootstrap/bootstrap translate a.sigils -o braces
|
|
test "$1" = 'record' || git diff --exit-code braces
|
|
{
|
|
bootstrap/bootstrap run braces test
|
|
echo
|
|
}
|
|
{
|
|
chmod +x braces
|
|
./braces test
|
|
echo
|
|
}
|
|
|
|
echo mu
|
|
cat [0-2]*.subx mu.subx | ./braces | ./calls | ./sigils > a.sigils
|
|
bootstrap/bootstrap translate a.sigils -o mu
|
|
test "$1" = 'record' || git diff --exit-code mu
|
|
{
|
|
bootstrap/bootstrap run mu test
|
|
echo
|
|
}
|
|
{
|
|
chmod +x mu
|
|
./mu test
|
|
echo
|
|
}
|
|
|
|
echo "== translating using the self-hosted translator"
|
|
|
|
# example programs
|
|
|
|
for n in `seq 1 12`
|
|
do
|
|
echo ex$n
|
|
./translate_subx 000init.subx apps/ex$n.subx
|
|
diff ex$n a.elf
|
|
done
|
|
|
|
# Larger apps that use the standard library.
|
|
|
|
for app in factorial
|
|
do
|
|
echo $app
|
|
./translate_subx [01]*.subx apps/$app.subx
|
|
diff $app a.elf
|
|
done
|
|
|
|
# Phases of the self-hosted SubX translator.
|
|
|
|
for app in hex survey_elf survey_baremetal labels_baremetal pack assort dquotes tests
|
|
do
|
|
echo $app
|
|
./translate_subx [01]*.subx subx-params.subx $app.subx
|
|
diff $app a.elf
|
|
done
|
|
|
|
for app in sigils calls braces
|
|
do
|
|
echo $app
|
|
./translate_subx [012]*.subx subx-params.subx $app.subx
|
|
diff $app a.elf
|
|
done
|
|
|
|
# Mu translator
|
|
echo mu
|
|
./translate_subx [0-2]*.subx mu.subx
|
|
diff mu a.elf
|
|
|
|
# Mu programs
|
|
|
|
echo ex1.mu
|
|
./translate apps/ex1.mu
|
|
{
|
|
bootstrap/bootstrap run a.elf || ret=$?
|
|
test $ret -eq 42 # life, the universe and everything
|
|
}
|
|
{
|
|
./a.elf || ret=$?
|
|
test $ret -eq 42 # life, the universe and everything
|
|
}
|
|
|
|
echo ex2.mu
|
|
./translate apps/ex2.mu
|
|
{
|
|
bootstrap/bootstrap run a.elf || ret=$?
|
|
test $ret -eq 7
|
|
}
|
|
{
|
|
./a.elf || ret=$?
|
|
test $ret -eq 7
|
|
}
|
|
|
|
echo ex3.mu
|
|
./translate apps/ex3.mu
|
|
{
|
|
bootstrap/bootstrap run a.elf || ret=$?
|
|
test $ret -eq 55
|
|
}
|
|
{
|
|
./a.elf || ret=$?
|
|
test $ret -eq 55
|
|
}
|
|
|
|
echo ex3.2.mu
|
|
./translate apps/ex3.2.mu
|
|
{
|
|
bootstrap/bootstrap run a.elf || ret=$?
|
|
test $ret -eq 55
|
|
}
|
|
{
|
|
./a.elf || ret=$?
|
|
test $ret -eq 55
|
|
}
|
|
|
|
echo factorial.mu
|
|
./translate apps/factorial.mu
|
|
{
|
|
bootstrap/bootstrap run a.elf || ret=$?
|
|
test $ret -eq 120
|
|
bootstrap/bootstrap run a.elf test
|
|
echo
|
|
}
|
|
{
|
|
./a.elf || ret=$?
|
|
test $ret -eq 120
|
|
./a.elf test
|
|
echo
|
|
}
|
|
|
|
exit 0
|