Files
hakorune/docs/private/roadmap/phases/phase-33/README.md

78 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase33 — Native LLVM AOT (C ABI) Skeleton
目的
- llvmlite 既存経路を維持しつつ、ネイティブLLVMC++実装)を C ABI で公開する薄いライブラリを用意し、段階的に自己完結AOTに移行する。
スコープ
- C ABI の契約を先に確定(関数名・戻り値・エラー方針)。
- ひな形(ビルド可能だが NYI 戻り)のライブラリを作成。
- 既存の quick/integration は既定を llvmlite のままにする(破壊的変更なし)。
非スコープ(本フェーズ)
- 実際の LLVM コード生成/リンク実装(次フェーズ)。
- マルチターゲット対応・最適化パスの詳細調整。
配置
- ライブラリ: `c/llvm-native/` CMakeベース
- `include/hako_llvm.h` — C ABI ヘッダ
- `src/hako_llvm.cpp` — 骨格NYI 返却)
- `CMakeLists.txt` — いまは LLVM リンク未設定(スケルトン)
契約C ABI の要旨)
- 初期化/終了: `hako_llvm_init`, `hako_llvm_shutdown`
- 設定: `hako_llvm_set_opt_level`, `hako_llvm_set_reloc_model`
- 生成: `hako_llvm_emit_obj(mir_json → .o)`, `hako_llvm_link_exe(.o + runtime → exe)`
- 返却: 0=OK、負値=エラー。`err` に安定タグ(例: `[aot/codegen] …`
導入方針
- 既定は llvmlite 維持。`--aot-engine {llvmlite|native}` などのトグルで optin。
- 共有ライブラリ + システムLLVM 依存を基本とし、静的単一バイナリは用途限定で後続検討。
受け入れ基準(本フェーズ)
- C ABI ヘッダと NYI 実装がリポジトリに追加され、ビルド骨格が整っている。
- 既存スモークに影響なし(既定経路に変更なし)。
## ENV / Toggles
- `HAKO_AOT_ENGINE` (`llvmlite`|`native`) — default llvmlite, native opt-in
- `HAKO_LLVM_TOOL`, `HAKO_LLVM_LINKER` — optional overrides for clang toolchain
- `HAKO_LLVM_TARGET_TRIPLE`, `HAKO_LLVM_CPU`, `HAKO_LLVM_FEATURES` — target hints
- If native engine is unavailable, pipeline falls back to llvmlite automatically
## Fallback
- If native AOT fails or library is missing, llvmlite pipeline remains active.
- Quick / integration suites keep llvmlite as default (no regression risk).
## Status Update — 20251031
現状の確認と課題main はクリーン、作業は phase33 側で継続)
- EXE 最小カナリアreturn 7は未緑化。
- `ny-llvmc`llvmlite ハーネス)で JSON→EXE が失敗。
- エラー: `unexpected indent (mir_call.py, line 26)`(ハーネスの整備不足)。
- `cargo build --features llvm` は workspace に含まれる欠損プラグイン(`plugins/nyash-aot-plugin`)で失敗。
- 対処方針: workspace から欠損プラグインを一時除外、またはプレースホルダcrateを復旧。
- AOT UserBox マニフェストカナリアは環境未整備で SKIP。
- 動的プラグイン未構築stringbox/integerbox 等)。
- パーサ互換(`;` の受理)と `HAKO_PARSER_AUTO_FALLBACK=1` の実効も要確認。
次の一手(小さく前進)
- A) ハーネス修正(最短で EXE 緑化)
- `src/llvm_py/harness/mir_call.py` のインデント修正 → `ny-llvmc --emit exe` で return 7 を通す。
- B) Workspace 調整
- 欠損プラグインを `Cargo.toml` の workspace から除外またはダミーcrate登録して `--features llvm` を通す。
- C) 代替ルートの準備(任意)
- アーカイバ経路の helper`.o + libnyash_kernel.a → exe`)を復帰し、ハーネス依存を迂回可能にする。
進捗メモ2025-10-31夕方
- ✅ A) ハーネス修正済(`mir_call.py` indentation fix
- ✅ B) Workspace exclude 適用済(欠損プラグインを除外)
- ⏳ NyRT(host_handles) へ移行中
- `encode.rs` / `plugin/{array,map,console,future,instance,invoke,invoke_core,string}` などは `jit::rt::handles` から `runtime::host_handles` へ置換済み。
- 残TODO: `crates/nyash_kernel/src/lib.rs` 全域と `plugin/semantics.rs``to_handle/get` を host_handles に揃え、`i64→u64` キャストを整理する。
- 🧱 libnyash_kernel.a が未生成なため EXE リンクは保留。上記残TODO完了後に return 7 カナリアで確認する。
運用メモ
- main は docs 復元のみコミット済み。AOT 関連の差分は phase33 ブランチ(または stashで保全し、段階的に進める。