Cranelift AOT Box: 設計ノートと obj 出力 PoC（Phase 15 準備）

目的
- Nyash → MIR → Cranelift AOT（C ABI）→ オブジェクト（.o/.obj）→ リンク → EXE の最小パイプラインを確立する前準備。
- 本ブランチでは「設計と仕様の確定（ドキュメント化）」のみを行い、実装は別ブランチ `phase-15/self-host-aot-cranelift` で着手する。

対象範囲（P0）
- PoC として `ny_main`（i64 → i64 返し）を定義する最小オブジェクトを Cranelift で生成できること。
- 生成物を NyRT（`crates/nyrt`）と静的リンクして実行可能ファイルを作成できること。
- 実行結果として `Result: 42` 等の既知の値確認を行うこと。

アーキテクチャ概要
- CraneliftAotBox（本ドキュメントの主題）
  - 役割: MIR から Cranelift IR（CLIF）を生成し、`cranelift-object` でオブジェクトを出力する。
  - 出力: ターゲット環境に応じた COFF/ELF/Mach-O（`cranelift-object` の既定に従う）。
  - シグネチャ: PoC は `ny_main: () -> i64`（将来的には引数の受け渡しや NyRT 呼び出しを拡張）。
- LinkerBox（別タスク、別文書で仕様化）
  - 役割: 生成された `.o/.obj` を NyRT（`libnyrt.a`/`nyrt.lib`）とリンクして EXE を作る。
  - Windows は `link.exe`/`lld-link`、Linux は `cc` 経由を想定（詳細は LinkerBox 仕様にて）。

ABI / 連携
- エントリ: `ny_main` を EXE から呼び出す形。NyRT 側が `main()` 内から `ny_main()` を適切に呼び出して結果を表示（または検証）する想定。
- ランタイム: PoC 段階では NyRT の最低限（起動/終了）に依存。将来的に checkpoint や GC バリアなどの外部関数を `extern "C"` で参照可能にする。

PoC 受入基準（P0）
- `.o/.obj` に `ny_main` シンボルが定義されている。
- `libnyrt.a`/`nyrt.lib` とリンクして実行可能ファイルが作成できる。
- 実行すると標準出力に既知の値（例: `Result: 42`）が出力される。

想定コマンド（リンク例）
- Linux: `cc -o app ny_main.o target/release/libnyrt.a -ldl -lpthread`
- Windows (MSVC): `link ny_main.obj nyrt.lib /OUT:app.exe`
- 実行時設定: 実行ファイルと同じディレクトリに `nyash.toml` を配置することでプラグイン解決を容易にする（NyRT は exe 直下→CWD の順で探索）。

CLI/ツール統合（案）
- バックエンドキー: `--backend cranelift-aot`
- PoC フラグ: `--poc-const N`（`ny_main` が `N` を返す単機能）
- 補助スクリプト（設計のみ、本ブランチでは作成しない）:
  - `tools/aot_smoke_cranelift.sh apps/APP/main.hako -o app`
  - 流れ: Nyash → MIR → CraneliftAotBox → `.o` → LinkerBox/cc → `app`

ロードマップ
- P0: PoC スタブ `ny_main` 定数返し、リンク/実行確認。
- P1: 最小 MIR（`const_i64`/`add_i64`/`ret`）のマッピング。
- P2: NyRT チェックポイント呼び出しなど最小の外部関数連携。
- P3: Plugin 経由の I/O など実用的な呼び出しの一部導入。

既知のリスクと対策
- プラットフォーム ABI 差異: 既定の呼出規約を使用し、まず Linux で動作確認。
- オブジェクト形式差: `cranelift-object` の既定に寄り添う。必要に応じてターゲット指定を導入。
- 重複実装の懸念: 既存のオブジェクトビルダ（JIT/emit系）の再利用・抽象化を検討。

実装方針（別ブランチで実施）
- フィーチャ: `cranelift-aot = ["dep:cranelift-object"]`
- モジュール: `src/backend/cranelift/aot_box.rs` を追加し、PoC 用 `compile_stub_ny_main_i64` を提供。
- CLI 統合: `--backend cranelift-aot` と PoC フラグの導入（PoC 期間は一時的）。

