kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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