46 lines
1.4 KiB
Bash
Executable file
46 lines
1.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Compile a small C file with clang -target w65816 and disassemble
|
|
# the result. Demonstrates the full toolchain front-to-back.
|
|
#
|
|
# Usage: scripts/cDemo.sh [source.c]
|
|
# Without an argument, compiles a built-in demo program.
|
|
|
|
set -euo pipefail
|
|
source "$(dirname "$0")/common.sh"
|
|
|
|
BUILD_DIR="$TOOLS_DIR/llvm-mos-build"
|
|
CLANG="$BUILD_DIR/bin/clang"
|
|
OBJDUMP="$BUILD_DIR/bin/llvm-objdump"
|
|
|
|
[ -x "$CLANG" ] || die "clang not built; run: ninja -C $BUILD_DIR clang"
|
|
[ -x "$OBJDUMP" ] || die "llvm-objdump not built"
|
|
|
|
src="${1:-}"
|
|
if [ -z "$src" ]; then
|
|
src="$(mktemp --suffix=.c)"
|
|
obj_cleanup_extra="$src"
|
|
cat > "$src" <<'EOF'
|
|
// Built-in demo: simple integer functions
|
|
int counter;
|
|
int target = 100;
|
|
|
|
int get_counter(void) { return counter; }
|
|
int set_counter(int v) { counter = v; return v; }
|
|
int sum_with_target(int x) { return x + target; }
|
|
int doubler(int x) { return x * 2; }
|
|
unsigned half(unsigned x) { return x / 2; } // unsigned: uses lsr
|
|
int reset(void) { counter = 0; return 0; }
|
|
int answer(void) { return 42; }
|
|
EOF
|
|
log "(no source given; using built-in demo)"
|
|
fi
|
|
|
|
obj="$(mktemp --suffix=.o)"
|
|
trap 'rm -f "$obj" ${obj_cleanup_extra:-}' EXIT
|
|
|
|
log "compiling $src with clang -target w65816 -O2"
|
|
"$CLANG" --target=w65816 -O2 -c "$src" -o "$obj"
|
|
|
|
log "disassembling result:"
|
|
echo
|
|
"$OBJDUMP" --triple=w65816 -d "$obj"
|