release: v21.0.0 – Full Self‑Hosting (S1/S2/S3 complete)

- DoD met: S1/S2 determinism (const/compare/threeblock-collect), PRIMARY hv1 inline no-fallback, S3 (llvmlite+kernel) reps green
- Harness: v1→llvmlite direct, EXE links to libnyash_kernel.a
- Python LLVM builder fixes: cmp normalization, ret PHI synthesis, mir_call flat shape
- Using/alias polish (prod): modules-first; missing aliases added; duplicate using cleaned
- Docs: phase-21.0 COMPLETE; CurrentTask closed; release notes added
This commit is contained in:
nyash-codex
2025-11-06 16:59:34 +09:00
parent c40fdd95bc
commit e326e787a4
21 changed files with 311 additions and 100 deletions

View File

@ -55,19 +55,22 @@ if ! command -v llvm-config-18 >/dev/null 2>&1; then
exit 3
fi
# Build nyash + NyRT as needed
# Build nyash + NyRT as neededskip allowed
LLVM_FEATURE=${NYASH_LLVM_FEATURE:-llvm}
if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then
# Legacy inkwell needs LLVM_SYS_180_PREFIX
_LLVMPREFIX=$(llvm-config-18 --prefix)
LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null
else
# llvm-harness (default) doesn't need LLVM_SYS_180_PREFIX
cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null
fi
if [[ "$EMIT" == "exe" ]]; then
(cd crates/nyrt && cargo build --release -j 24 >/dev/null)
SKIP_BUILD=${NYASH_LLVM_SKIP_BUILD:-0}
BUILD_TIMEOUT=${NYASH_LLVM_BUILD_TIMEOUT:-180}
if [[ "$SKIP_BUILD" != "1" ]]; then
if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then
_LLVMPREFIX=$(llvm-config-18 --prefix)
timeout "$BUILD_TIMEOUT" \
LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null
else
timeout "$BUILD_TIMEOUT" cargo build --release -j 24 --features "${LLVM_FEATURE}" >/dev/null
fi
if [[ "$EMIT" == "exe" ]]; then
(cd crates/nyrt && timeout "$BUILD_TIMEOUT" cargo build --release -j 24 >/dev/null)
fi
fi
mkdir -p "$PWD/target/aot_objects"
@ -95,26 +98,24 @@ case "$EMIT" in
export NYASH_LLVM_DUMP_LL=1
export NYASH_LLVM_LL_OUT="$OUT"
if [[ "$VERIFY" == "1" ]]; then export NYASH_LLVM_VERIFY=1; fi
# Prefer 'hakorune' binary if present (nyash is deprecated)
BIN="./target/release/hakorune"
[[ -x "$BIN" ]] || BIN="./target/release/nyash"
if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then
cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true
"$BIN" --backend llvm --ny-parser-pipe >/dev/null || true
else
cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 \
./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true
"$BIN" --backend llvm --ny-parser-pipe >/dev/null || true
fi
if [[ ! -f "$OUT" ]]; then echo "error: failed to produce $OUT" >&2; exit 4; fi
[[ "$QUIET" == "0" ]] && echo "OK ll:$OUT"
;;
obj)
export NYASH_LLVM_OBJ_OUT="$OUT"
if [[ "$VERIFY" == "1" ]]; then export NYASH_LLVM_VERIFY=1; fi
# Directly use llvmlite harness with MIR v1 JSON input
rm -f "$OUT"
if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then
cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true
else
cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 \
./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true
if ! python3 "$PWD/tools/llvmlite_harness.py" --in "$IN_FILE" --out "$OUT" >/dev/null 2>&1; then
echo "error: harness failed to produce $OUT" >&2; exit 4
fi
if [[ ! -f "$OUT" ]]; then echo "error: failed to produce $OUT" >&2; exit 4; fi
[[ "$QUIET" == "0" ]] && echo "OK obj:$OUT"
@ -122,23 +123,17 @@ case "$EMIT" in
exe)
# Emit obj then link
OBJ="$PWD/target/aot_objects/__tmp_builder.o"
export NYASH_LLVM_OBJ_OUT="$OBJ"
if [[ "$VERIFY" == "1" ]]; then export NYASH_LLVM_VERIFY=1; fi
rm -f "$OBJ"
if [[ "$LLVM_FEATURE" == "llvm-inkwell-legacy" ]]; then
cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 LLVM_SYS_181_PREFIX="${_LLVMPREFIX}" LLVM_SYS_180_PREFIX="${_LLVMPREFIX}" \
./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true
else
cat "$IN_FILE" | NYASH_LLVM_USE_HARNESS=1 \
./target/release/nyash --backend llvm --ny-parser-pipe >/dev/null || true
if ! python3 "$PWD/tools/llvmlite_harness.py" --in "$IN_FILE" --out "$OBJ" >/dev/null 2>&1; then
echo "error: harness failed to produce object $OBJ" >&2; exit 4
fi
if [[ ! -f "$OBJ" ]]; then echo "error: failed to produce object $OBJ" >&2; exit 4; fi
# Link with NyRT
NYRT_BASE=${NYRT_DIR:-"$PWD/crates/nyrt"}
NYRT_BASE=${NYRT_DIR:-"$PWD/crates/nyash_kernel"}
cc "$OBJ" \
-L target/release \
-L "$NYRT_BASE/target/release" \
-Wl,--whole-archive -lnyrt -Wl,--no-whole-archive \
-Wl,--whole-archive -lnyash_kernel -Wl,--no-whole-archive \
-lpthread -ldl -lm -o "$OUT"
[[ "$QUIET" == "0" ]] && echo "OK exe:$OUT"
;;
@ -146,4 +141,3 @@ case "$EMIT" in
esac
exit 0