run_all.sh 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/bin/bash
  2. # Run every check. Non-zero exit if anything fails.
  3. #
  4. # Four suites, in increasing order of "how much could be lying to me":
  5. #
  6. # 1. compile matrix 27 fixtures, verdict + code size + data size ASSERTED
  7. # from expected.tsv. Fast, no pty.
  8. # 2. .COM linker links every fixture, then re-verifies the bytes with an
  9. # independent checker that restates the layout constants
  10. # instead of asking the compiler.
  11. # 3. UI error path pty: W, C on a bad file, editor opens on the error,
  12. # Ctrl-K D, Q. Covers the shell behaviour that only
  13. # exists interactively.
  14. # 4. UI success path pty: Options -> Destination=COM, C, then the .COM is
  15. # checked ON DISK. This is the end-to-end path from
  16. # keystroke to artifact.
  17. #
  18. # 5. frame displ links the two fixtures that touch a stack frame and
  19. # asserts the [BP+off] displacement encoding, which no
  20. # other check can see: disp8 and disp16 are both
  21. # well-formed and both decode cleanly, and only one of
  22. # them reads the variable the symbol table named.
  23. #
  24. # RtProbe dumps the runtime size and its 14 entry offsets, so a
  25. # runtime change that moves an entry is visible here.
  26. #
  27. # Three runtime suites run before all of those, because everything else
  28. # trusts the runtime's bytes:
  29. #
  30. # audit_helpers disassembles every one-line emitter in BOTH Runtime.mod
  31. # and Compiler.mod and compares the DECODE against the
  32. # procedure's NAME. This is the only check that can see
  33. # a wrong ModRM that still decodes cleanly, which is the
  34. # mistake this project actually makes: MovSiBx and
  35. # CmpSiBx were both `DC` (= MOV SP,BX / CMP SP,BX) for a
  36. # long time, and EmXchgAxCx was `93` (XCHG BX,AX) under a
  37. # name that says XCHG AX,CX.
  38. #
  39. # It sweeps Compiler.mod because that is where the
  40. # emitter was. Auditing one module said "every helper
  41. # agrees with its name" about a module it had not
  42. # examined, which is why the XCHG fault survived a green
  43. # run. It also cross-checks its own coverage: a
  44. # procedure that emits bytes but that the audit never
  45. # matched is itself a failure, because a helper that
  46. # drops out of the audit when you add a comment is worse
  47. # than a helper that is checked and found wanting.
  48. # check_runtime sweeps the built runtime's code region with FCML: no
  49. # desync, every entry and every branch target on an
  50. # instruction boundary, and the whole disassembly equal
  51. # to tests/runtime.golden.
  52. # nonvacuity breaks the runtime six ways and asserts each named
  53. # check goes red for the stated reason. Slower, so it
  54. # is not in the default run: run it when a check's
  55. # sensitivity is in question, or after editing a check.
  56. #
  57. # nonvacuity.sh is NOT run by default: it rebuilds the runtime six times and
  58. # it is a meta-check, so it belongs to "is the harness honest" reviews rather
  59. # than to every change. Run tests/nonvacuity.sh directly after touching any
  60. # of the checks above.
  61. #
  62. # Two more checks guard the ModR/M table itself, which is the input every hand
  63. # written emitter in Runtime.mod depends on:
  64. #
  65. # probe/modrm11.py asks GNU `as` (.code16) to encode the register moves
  66. # and FCML to decode them, and requires the result to
  67. # agree with the hard-coded bytes, the four
  68. # hand-checking anchors, and the table in Runtime.mod.
  69. # This is the only check that can catch the TABLE being
  70. # wrong rather than one emitter: the table shipped once
  71. # with AX dropped off the front of the mod=11 column
  72. # and a duplicate BX invented at the end, which shifts
  73. # every code down by one and makes `89 DC` (MOV SP,BX)
  74. # look like the SI move the name asks for.
  75. # probe/modrm19.s the execution probe for mod=00/01/10, kept as the
  76. # record of how the memory forms were measured. It is
  77. # not run by default: it needs qemu and a hand-built
  78. # floppy image, and its result is already written into
  79. # the table in Runtime.mod, which modrm11.py checks.
  80. # See probe/README.md to re-run it.
  81. #
  82. # rt_exec.py is NOT run: it needs Unicorn, whose 16-bit ModRM decoding is
  83. # wrong on this machine (see SUMMARY.md), so its failures would be the
  84. # emulator's, not the runtime's. Running it by default would be noise.
  85. set -u
  86. D=/home/eric/Projets/Projets-Modula2/MyWork/TP3-comp/shell
  87. GM2=/home/eric/bin/Modula2/Gm2/bin/gm2
  88. cd "$D" || exit 9
  89. fail=0
  90. run () {
  91. name=$1
  92. shift
  93. echo
  94. echo "=============================================================="
  95. echo "== $name"
  96. echo "=============================================================="
  97. if "$@" ; then
  98. echo "-- $name: PASS"
  99. else
  100. echo "-- $name: FAIL (rc=$?)"
  101. fail=1
  102. fi
  103. }
  104. echo "== build =="
  105. make clean >/dev/null 2>&1
  106. if ! make >/tmp/tp_all_mk 2>&1 ; then
  107. echo "BUILD FAIL"
  108. grep -m10 "error:" /tmp/tp_all_mk
  109. exit 1
  110. fi
  111. echo "make rc=0, tpshell $(stat -c%s tpshell) bytes"
  112. # gm2 reports a pass-3 rollup on the compiler during phase 1 of the two-phase
  113. # link; that is expected and is not a build failure (make rc=0 is the check).
  114. run "runtime probe" bash -c '
  115. GM2=/home/eric/bin/Modula2/Gm2/bin/gm2
  116. $GM2 -fiso -o /tmp/tp_rtprobe tests/RtProbe.mod Runtime.o Posix.o \
  117. >/tmp/tp_rt 2>&1 || { grep -m5 error: /tmp/tp_rt; exit 1; }
  118. /tmp/tp_rtprobe'
  119. run "helper audit" python3 tests/audit_helpers.py
  120. run "mod=11 table" python3 tests/probe/modrm11.py
  121. run "runtime image" python3 tests/check_runtime.py
  122. run "compile matrix" tests/run_compile_tests.sh
  123. run "COM linker" tests/run_com_tests.sh
  124. # The byte checks above can only ask "are these bytes well formed". This one
  125. # asks "does the program do the right thing": every fixture with a .out is
  126. # compiled, booted in qemu, and its output compared byte for byte, together
  127. # with the DOS exit code. It is the step that found eleven runtime bugs, the
  128. # FOR off-by-one, the missing procedure-skip jump and a parser bug - none of
  129. # which produced a malformed byte.
  130. run "EXECUTE under qemu" python3 tests/run_com_exec.py
  131. run "frame displ" python3 tests/check_framedisp.py
  132. run "UI error path" python3 tests/uitest.py
  133. run "UI success path" python3 tests/comtest.py
  134. echo
  135. echo "=============================================================="
  136. if [ "$fail" -eq 0 ]; then
  137. echo "OVERALL: ALL PASS"
  138. else
  139. echo "OVERALL: FAILURES PRESENT"
  140. fi
  141. echo "=============================================================="
  142. exit $fail