4.2 KiB
4.2 KiB
llvmlite Harness(正式導入・Rust LLVM 対置運用)
Purpose
- Python + llvmlite による高速・柔軟な LLVM 生成経路を提供(検証・プロトタイプと将来の主役)。
- Rust/inkwell 経路と並走し、代表ケースで機能同値(戻り値・検証)を維持。
Switch
NYASH_LLVM_USE_HARNESS=1でハーネス優先(LLVM バックエンド入口から起動)。
Tracing
NYASH_LLVM_TRACE_FINAL=1を設定すると、代表コール(Main.node_json/3,Main.esc_json/1,main等)を標準出力へ簡易トレースします。 ON/OFF の最終 JSON 突合の補助に使用してください。
Protocol
- Input: MIR14 JSON(Rust 前段で Resolver/LoopForm 規約を満たした形)。
- Output:
.oオブジェクト(既定:NYASH_AOT_OBJECT_OUTまたはNYASH_LLVM_OBJ_OUT)。 - 入口:
ny_main() -> i64(戻り値は exit code 相当。必要時 handle 正規化を行う)。
CLI(crate)
crates/nyash-llvm-compiler提供のny-llvmcは llvmlite ハーネスの薄ラッパーだよ。- ダミー:
./target/release/ny-llvmc --dummy --out /tmp/dummy.o - JSON→.o:
./target/release/ny-llvmc --in mir.json --out out.o - JSON→EXE(新規):
./target/release/ny-llvmc --in mir.json --emit exe --nyrt target/release --out app--nyrt <dir>でlibnyrt.aの位置を指定(省略時はtarget/release→crates/nyrt/target/releaseの順に探索)- 追加フラグは
--libs "<flags>"で渡せる(例:--libs "-static")
- 既定のハーネススクリプトは
tools/llvmlite_harness.py(--harnessで上書き可)。
- ダミー:
Quick Start
- 依存:
python3 -m pip install llvmlite - ダミー生成(配線検証):
python3 tools/llvmlite_harness.py --out /tmp/dummy.o- NyRT(libnyrt.a)とリンクして EXE 化(例:
cc /tmp/dummy.o -L target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o app_dummy)。
Wiring(Rust 側)
NYASH_LLVM_USE_HARNESS=1のとき:--emit-mir-json <path>等で MIR(JSON) を出力python3 tools/llvmlite_harness.py --in <mir.json> --out <obj.o>を起動- 成功後は通常のリンク手順(NyRT とリンク)
Tools / CLI(統合フロー)
- crate 直結の EXE 出力:
NYASH_LLVM_COMPILER=crate NYASH_LLVM_EMIT=exe tools/build_llvm.sh apps/tests/ternary_basic.nyash -o app- 環境変数
NYASH_LLVM_NYRTで NyRT の場所を、NYASH_LLVM_LIBSで追加フラグを指定できる。
- 環境変数
- CLI から直接 EXE 出力(新規):
./target/release/nyash --emit-exe tmp/app --backend mir apps/tests/ternary_basic.nyash- 追加オプション:
--emit-exe-nyrt <dir>/--emit-exe-libs "<flags>"
Scope(Phase 15)
- 最小命令: Const/BinOp/Compare/Branch/Jump/Return(PHI は LLVM 側で合成)
- 文字列: NyRT Shim(
nyash.string.len_h,charCodeAt_h,concat_hh,eq_hh)を declare → call - NewBox/ExternCall/BoxCall: まずは固定シンボル/by-id を優先(段階導入)
- 目標:
apps/selfhost/tools/dep_tree_min_string.nyashの.ll verify green → .o安定化
Acceptance
- Harness ON/OFF で機能同値(戻り値/検証)。代表ケースで
.ll verify greenと.o生成成功。
Notes
- 初版は固定
ny_mainから開始してもよい(配線確認)。以降、MIR 命令を順次対応。 - ハーネスは自律(外部状態に依存しない)。エラーは即 stderr に詳細を出す。
PHI Policy(要点)
- 既定は PHI‑off(
NYASH_MIR_NO_PHI=1)。Builder/Bridge は pred への edge‑copy のみを生成。 - llvmlite ハーネスは pred 情報から PHI を合成する。
- 開発確認で PHI‑on にする場合は
NYASH_MIR_NO_PHI=0(dev‑only)。詳細はdocs/reference/mir/phi_policy.mdを参照。
Schema Validation(任意)
- JSON v0 のスキーマは
docs/reference/mir/json_v0.schema.jsonにあるよ。 - 検証:
python3 tools/validate_mir_json.py <mir.json>(要:python3 -m pip install jsonschema)。
Appendix: 静的リンクについて
- 生成 EXE は NyRT(libnyrt.a)を静的リンク。完全静的(-static)は musl 推奨(dlopen 不可になるため動的プラグインは使用不可)。