Phase 22.x WIP: LLVM backend improvements + MIR builder enhancements
LLVM backend improvements: - Add native LLVM backend support (NYASH_LLVM_BACKEND=native) - Add crate backend selector with priority (crate > llvmlite) - Add native_llvm_builder.py for native IR generation - Add NYASH_LLVM_NATIVE_TRACE=1 for IR dump MIR builder enhancements: - Refactor lower_if_compare_* boxes for better code generation - Refactor lower_return_* boxes for optimized returns - Refactor lower_loop_* boxes for loop handling - Refactor lower_method_* boxes for method calls - Update pattern_util_box for better pattern matching Smoke tests: - Add phase2100 S3 backend selector tests (17 new tests) - Add phase2120 native backend tests (4 new tests) - Add phase2034 MIR builder internal tests (2 new tests) - Add phase2211 TLV shim parity test Documentation: - Update ENV_VARS.md with LLVM backend variables - Update CURRENT_TASK.md with progress - Update README.md and CHANGELOG.md Config: - Add NYASH_LLVM_BACKEND env support in src/config/env.rs - Update ny_mir_builder.sh for backend selection - Update dispatch.rs for backend routing Tools: - Add tools/native_llvm_builder.py - Update smokes/v2/profiles/quick/core/phase2100/run_all.sh Known: Many Hako builder internal files modified for optimization
This commit is contained in:
@ -24,7 +24,17 @@ TARGET=""
|
||||
NYRT_DIR=""
|
||||
VERIFY=0
|
||||
QUIET=0
|
||||
BACKEND="${NYASH_LLVM_BACKEND:-llvmlite}" # llvmlite | crate | native (reserved)
|
||||
# Backend selection (21.11): default to 'crate' when ny-llvmc is available, otherwise fallback to llvmlite.
|
||||
# Explicit env NYASH_LLVM_BACKEND overrides this auto-detection.
|
||||
if [[ -n "${NYASH_LLVM_BACKEND:-}" ]]; then
|
||||
BACKEND="${NYASH_LLVM_BACKEND}"
|
||||
else
|
||||
if [[ -x "./target/release/ny-llvmc" ]]; then
|
||||
BACKEND="crate"
|
||||
else
|
||||
BACKEND="llvmlite"
|
||||
fi
|
||||
fi
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
@ -51,9 +61,12 @@ if [[ -z "$OUT" ]]; then
|
||||
esac
|
||||
fi
|
||||
|
||||
if ! command -v llvm-config-18 >/dev/null 2>&1; then
|
||||
echo "error: llvm-config-18 not found (install LLVM 18 dev)" >&2
|
||||
exit 3
|
||||
# Require LLVM18 only for llvmlite backend
|
||||
if [[ "${NYASH_LLVM_BACKEND:-$BACKEND}" == "llvmlite" ]]; then
|
||||
if ! command -v llvm-config-18 >/dev/null 2>&1; then
|
||||
echo "error: llvm-config-18 not found (install LLVM 18 dev)" >&2
|
||||
exit 3
|
||||
fi
|
||||
fi
|
||||
|
||||
# Build nyash + NyRT as needed(skip allowed)
|
||||
@ -126,6 +139,15 @@ case "$EMIT" in
|
||||
rm -f "$OUT"
|
||||
"$BIN_NYLLVMC" --in "$IN_FILE" --emit obj --out "$OUT" >/dev/null 2>&1 || { echo "error: ny-llvmc failed" >&2; exit 4; }
|
||||
;;
|
||||
native)
|
||||
if ! command -v llc >/dev/null 2>&1; then
|
||||
echo "error: llc not found (install LLVM tools)" >&2; exit 4
|
||||
fi
|
||||
rm -f "$OUT"
|
||||
if ! python3 "$PWD/tools/native_llvm_builder.py" --in "$IN_FILE" --emit obj --out "$OUT" >/dev/null 2>&1; then
|
||||
echo "error: native builder failed" >&2; exit 4
|
||||
fi
|
||||
;;
|
||||
llvmlite|*)
|
||||
# Directly use llvmlite harness with MIR v1 JSON input
|
||||
rm -f "$OUT"
|
||||
@ -153,6 +175,22 @@ case "$EMIT" in
|
||||
echo "error: ny-llvmc failed to link exe" >&2; exit 4
|
||||
fi
|
||||
;;
|
||||
native)
|
||||
if ! command -v llc >/dev/null 2>&1; then
|
||||
echo "error: llc not found (install LLVM tools)" >&2; exit 4
|
||||
fi
|
||||
if ! python3 "$PWD/tools/native_llvm_builder.py" --in "$IN_FILE" --emit obj --out "$OBJ" >/dev/null 2>&1; then
|
||||
echo "error: native builder 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 (same as llvmlite branch)
|
||||
NYRT_BASE=${NYRT_DIR:-"$PWD/crates/nyash_kernel"}
|
||||
cc "$OBJ" \
|
||||
-L target/release \
|
||||
-L "$NYRT_BASE/target/release" \
|
||||
-Wl,--whole-archive -lnyash_kernel -Wl,--no-whole-archive \
|
||||
-lpthread -ldl -lm -o "$OUT"
|
||||
;;
|
||||
llvmlite|*)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user