driver-kitchen.sh (3389B)
1 #!/bin/sh 2 # Coarse Tier 1 kitchen-sink smoke for the multitool driver. 3 4 set -u 5 6 script_dir=$(cd "$(dirname "$0")" && pwd) 7 repo_root=$(cd "$script_dir/../../.." && pwd) 8 KIT="${KIT:-$repo_root/build/kit}" 9 10 if [ ! -x "$KIT" ]; then 11 echo "driver-kitchen: kit binary not found at $KIT" >&2 12 exit 2 13 fi 14 15 work=$(mktemp -d "${TMPDIR:-/tmp}/kit-t1-driver.XXXXXX") 16 trap 'rm -rf "$work"' EXIT 17 18 KIT_KIT_DIR="$repo_root/test/lib" 19 . "$repo_root/test/lib/kit_sh_kit.sh" 20 kit_report_init 21 22 cat > "$work/main.c" <<'SRC' 23 int helper(int x) { return x + 1; } 24 int main(void) { return helper(41); } 25 void _start(void) { (void)main(); for (;;) {} } 26 SRC 27 28 cat > "$work/bad.c" <<'SRC' 29 int broken( { return 0; } 30 SRC 31 32 run_ok cc-dumpmachine "$KIT" cc -target riscv64-linux -dumpmachine 33 contains cc-dumpmachine-rv64 "$work/cc-dumpmachine.out" "riscv64-linux" 34 35 run_ok cpp-stdout "$KIT" cpp "$work/main.c" 36 contains cpp-has-helper "$work/cpp-stdout.out" "helper" 37 38 run_ok check-good "$KIT" check "$work/main.c" 39 run_fail check-bad "$KIT" check "$work/bad.c" 40 contains check-bad-diagnostic "$work/check-bad.err" "fatal:" 41 42 run_ok cc-object "$KIT" cc -target x86_64-linux -g -c "$work/main.c" \ 43 -o "$work/main.o" 44 run_ok cc-emit-ir "$KIT" cc -O1 --emit=ir -c "$work/main.c" \ 45 -o "$work/main.ir" 46 contains cc-ir-has-func "$work/main.ir" "func sym#" 47 48 run_ok ld-exe "$KIT" ld -e _start "$work/main.o" -o "$work/main.exe" 49 is_executable ld-exe-mode "$work/main.exe" 50 run_ok objdump-private "$KIT" objdump -p "$work/main.exe" 51 contains objdump-entry "$work/objdump-private.out" "entry point" 52 53 run_ok nm-basic "$KIT" nm "$work/main.o" 54 contains nm-main "$work/nm-basic.out" "main" 55 run_ok size-basic "$KIT" size "$work/main.o" 56 contains size-has-text "$work/size-basic.out" "text" 57 58 helper_addr=$("$KIT" nm "$work/main.o" 2>/dev/null | awk '/ helper$/{print $1; exit}') 59 if [ -n "$helper_addr" ] && 60 "$KIT" addr2line -e "$work/main.o" "0x$helper_addr" \ 61 > "$work/addr2line.out" 2> "$work/addr2line.err" && 62 grep -q "main.c" "$work/addr2line.out"; then 63 ok addr2line-basic 64 else 65 { printf 'helper_addr=%s\n' "$helper_addr" 66 sed 's/^/out: /' "$work/addr2line.out" 2>/dev/null 67 sed 's/^/err: /' "$work/addr2line.err" 2>/dev/null; } \ 68 > "$work/addr2line.diag" 69 not_ok addr2line-basic "$work/addr2line.diag" 70 fi 71 72 cat > "$work/rv64.s" <<'SRC' 73 .text 74 .globl rv64_entry 75 rv64_entry: 76 li a0, 7 77 ret 78 SRC 79 run_ok as-rv64 "$KIT" as -target riscv64-linux "$work/rv64.s" \ 80 -o "$work/rv64.o" 81 run_ok objdump-rv64 "$KIT" objdump -h "$work/rv64.o" 82 contains objdump-rv64-format "$work/objdump-rv64.out" "elf64-riscv64" 83 84 cat > "$work/run-main.c" <<'SRC' 85 int main(void) { return 42; } 86 SRC 87 "$KIT" run "$work/run-main.c" > "$work/run.out" 2> "$work/run.err" 88 run_rc=$? 89 if [ "$run_rc" -eq 42 ]; then 90 ok run-exit-status 91 else 92 { printf 'exit=%s want=42\n' "$run_rc" 93 sed 's/^/err: /' "$work/run.err"; } > "$work/run.diag" 94 not_ok run-exit-status "$work/run.diag" 95 fi 96 97 inst="$work/inst" 98 run_ok install-explicit "$KIT" install "$inst" cc nm 99 assert_file_exists install-cc "$inst/cc" 100 assert_file_exists install-nm "$inst/nm" 101 if [ -e "$inst/ld" ]; then 102 echo "ld installed despite explicit cc nm list" > "$work/install.diag" 103 not_ok install-explicit-only-listed "$work/install.diag" 104 else 105 ok install-explicit-only-listed 106 fi 107 run_ok install-dispatch "$inst/cc" --help 108 109 kit_summary driver-kitchen 110 kit_exit