diff options
Diffstat (limited to 'linux/test_apps_emulated')
-rwxr-xr-x | linux/test_apps_emulated | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/linux/test_apps_emulated b/linux/test_apps_emulated new file mode 100755 index 00000000..9a488c2f --- /dev/null +++ b/linux/test_apps_emulated @@ -0,0 +1,295 @@ +#!/bin/sh +# Build and test all included SubX programs on non-Linux platforms: +# 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 +# +# Example usage: +# test_apps_emulated +# test_apps_emulated record # don't compare with what's in git +# +# This script is slow. 20+ times slower than running natively on Linux. + +set -e +cd `dirname $0` + +echo "== translating using the bootstrap C++ translator" + +# example programs + +echo ex1 +bootstrap/bootstrap translate 000init.subx ex1.subx -o ex1 +{ + bootstrap/bootstrap run ex1 || ret=$? + test $ret -eq 42 # life, the universe and everything +} + +echo ex2 +bootstrap/bootstrap translate 000init.subx ex2.subx -o ex2 +{ + bootstrap/bootstrap run ex2 || ret=$? + test $ret -eq 7 # 3 + 4 +} + +echo ex3 +bootstrap/bootstrap translate 000init.subx ex3.subx -o ex3 +{ + bootstrap/bootstrap run ex3 || ret=$? + test $ret -eq 55 # 1 + 2 + ... + 10 +} + +echo ex4 +bootstrap/bootstrap translate 000init.subx ex4.subx -o ex4 +{ + echo a | bootstrap/bootstrap run ex4 >ex4.out || true + test `cat ex4.out` = 'a' +} + +echo ex5 +bootstrap/bootstrap translate 000init.subx ex5.subx -o ex5 +{ + echo a | bootstrap/bootstrap run ex5 >ex5.out || true + test `cat ex5.out` = 'a' +} + +echo ex6 +bootstrap/bootstrap translate 000init.subx ex6.subx -o ex6 +{ + bootstrap/bootstrap run ex6 >ex6.out || true + test "`cat ex6.out`" = 'Hello, world!' +} + +echo ex7 +bootstrap/bootstrap translate 000init.subx ex7.subx -o ex7 +{ + bootstrap/bootstrap run ex7 || ret=$? + test $ret -eq 97 # 'a' +} + +echo ex8 +bootstrap/bootstrap translate 000init.subx ex8.subx -o ex8 +{ + bootstrap/bootstrap run ex8 abcd || ret=$? + test $ret -eq 4 # length('abcd') +} + +echo ex9 +bootstrap/bootstrap translate 000init.subx ex9.subx -o ex9 +{ + bootstrap/bootstrap run ex9 z x || ret=$? + test $ret -eq 2 # 'z' - 'x' +} + +echo ex10 +bootstrap/bootstrap translate 000init.subx 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 +} + +echo ex11 +bootstrap/bootstrap translate 000init.subx ex11.subx -o ex11 +{ + bootstrap/bootstrap run ex11 + echo +} + +echo ex12 +bootstrap/bootstrap translate 000init.subx ex12.subx -o ex12 +test $EMULATED && bootstrap/bootstrap run ex12 # final byte of mmap'd address is well-nigh guaranteed to be 0 +test $NATIVE && ex12 + +echo ex13 +bootstrap/bootstrap translate 000init.subx ex13.subx -o ex13 +{ + bootstrap/bootstrap run ex13 || ret=$? + test $ret -eq 1 # 3 == 3 +} + +# Larger apps that use the standard library. + +echo factorial +bootstrap/bootstrap translate [01]*.subx factorial.subx -o factorial +{ + bootstrap/bootstrap run factorial || ret=$? + test $ret -eq 120 # factorial(5) + bootstrap/bootstrap run factorial test + echo +} + +echo crenshaw2-1 +bootstrap/bootstrap translate [01]*.subx crenshaw2-1.subx -o crenshaw2-1 +{ + bootstrap/bootstrap run crenshaw2-1 test + echo +} + +echo crenshaw2-1b +bootstrap/bootstrap translate [01]*.subx crenshaw2-1b.subx -o crenshaw2-1b +{ + bootstrap/bootstrap run crenshaw2-1b test + echo +} + +echo random +bootstrap/bootstrap translate [01]*.subx random.subx -o random +# don't run + +# Phases of the self-hosted SubX translator. + +for phase in hex survey_elf 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 + } +done + +# One phase variant for translating SubX to baremetal. (Other phases are reused.) + +for phase in survey_baremetal +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 + } +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 +} + +echo calls +cat [012]*.subx subx-params.subx calls.subx | bootstrap/bootstrap run sigils > a.sigils +bootstrap/bootstrap translate a.sigils -o calls +test "$1" = 'record' || git diff --exit-code calls +{ + bootstrap/bootstrap run calls test + echo +} + +echo braces + # bootstrap/bootstrap wrapper script can't have multiple copies running concurrently +cat [012]*.subx subx-params.subx braces.subx | bootstrap/bootstrap_bin run calls | bootstrap/bootstrap_bin run sigils > a.sigils +bootstrap/bootstrap translate a.sigils -o braces +test "$1" = 'record' || git diff --exit-code braces +{ + bootstrap/bootstrap run braces test + echo +} + +echo mu +cat [0-2]*.subx mu.subx | bootstrap/bootstrap_bin run braces | bootstrap/bootstrap_bin run calls | bootstrap/bootstrap_bin run sigils > a.sigils +bootstrap/bootstrap translate a.sigils -o mu +test "$1" = 'record' || git diff --exit-code mu +{ + bootstrap/bootstrap run mu test + echo +} + +echo "== translating using the self-hosted translator" + +# example programs + +for n in `seq 1 12` +do + echo ex$n + ./translate_subx_emulated 000init.subx ex$n.subx + diff ex$n a.elf +done + +# Larger apps that use the standard library. + +for app in factorial crenshaw2-1 crenshaw2-1b +do + echo $app + ./translate_subx_emulated [01]*.subx $app.subx + diff $app a.elf +done + +# Phases of the self-hosted SubX translator. + +for app in hex survey_elf pack assort dquotes tests +do + echo $app + ./translate_subx_emulated [01]*.subx subx-params.subx $app.subx + diff $app a.elf +done + +# One phase variant for translating SubX to baremetal. (Other phases are reused.) + +for app in survey_baremetal +do + echo $app + ./translate_subx_emulated [01]*.subx subx-params.subx $app.subx + diff $app a.elf +done + +for app in sigils calls braces +do + echo $app + ./translate_subx_emulated [012]*.subx subx-params.subx $app.subx + diff $app a.elf +done + +# Mu translator +echo mu +./translate_subx_emulated [0-2]*.subx mu.subx +diff mu a.elf + +# Mu programs + +echo ex1.mu +./translate_emulated ex1.mu +{ + bootstrap/bootstrap run a.elf || ret=$? + test $ret -eq 42 # life, the universe and everything +} + +echo ex2.mu +./translate_emulated ex2.mu +{ + bootstrap/bootstrap run a.elf || ret=$? + test $ret -eq 7 +} + +echo ex3.mu +./translate_emulated ex3.mu +{ + bootstrap/bootstrap run a.elf || ret=$? + test $ret -eq 55 +} + +echo ex3.2.mu +./translate_emulated ex3.2.mu +{ + bootstrap/bootstrap run a.elf || ret=$? + test $ret -eq 55 +} + +echo factorial.mu +./translate_emulated factorial.mu +{ + bootstrap/bootstrap run a.elf || ret=$? + test $ret -eq 120 + bootstrap/bootstrap run a.elf test + echo +} + +exit 0 |