53 lines
2.7 KiB
Markdown
53 lines
2.7 KiB
Markdown
# Phase 20.20 — C ABI Export via LLVM(設計・計画)
|
||
|
||
目的
|
||
- Hakorune スクリプトから LLVM(llvmlite)を用いて C ABI 互換の関数をエクスポートできる最小ラインを構築する。
|
||
- Rust 層の一部(AOT/エクスポート境界)を置き換え可能な薄い導線を用意し、段階的に Rust 依存を薄くする。
|
||
|
||
スコープ(段階導入)
|
||
- 短期(Phase 20.20): プリミティブ型(i64/i32)限定の純関数エクスポート。
|
||
- `@extern_c("c_symbol")` 注釈を MIR JSON へ反映。
|
||
- llvmlite で C calling convention(ccc)・unmangled symbol・visibility を設定したラッパー関数を生成。
|
||
- C ヘッダー自動生成(extern "C"、stdint.h 依存、最小プロトタイプ)。
|
||
- 中期(次フェーズ): String(const char* readonly)、Array(ptr+len 構造体)の読み出しサポート。
|
||
- 長期: Box ABI(Arc/RefCell 相当)と GC 連携(高リスク。段階的に)
|
||
|
||
進捗(2025‑10‑30, M2 到達)
|
||
- Python/llvmlite ビルダーに C‑ABI ラッパ生成を実装(flags.extern_c / metadata.extern_c)
|
||
- MIR(JSON) 例(v1):
|
||
```json
|
||
{
|
||
"schema_version": "1.0",
|
||
"functions": [
|
||
{ "name": "add/2",
|
||
"params": [{"name":"a","type":"i64"},{"name":"b","type":"i64"}],
|
||
"blocks": [],
|
||
"flags": { "extern_c": "hako_add" }
|
||
}
|
||
]
|
||
}
|
||
```
|
||
- 生成IR: `define i64 @hako_add(i64,i64)` が挿入され、内部 `@"add/2"` を呼び出す
|
||
- 使い方: `python3 tools/llvmlite_harness.py --in mir.json --emit-ll out.ll`(または `--out out.o`)
|
||
|
||
非対象(このフェーズ)
|
||
- メモリ管理(自動管理)
|
||
- 参照循環/所有権を跨いだ複雑な Box ABI
|
||
- 既存 CLI/VM ラインの既定挙動変更(すべて既定 OFF の新フラグでガード)
|
||
|
||
設計原則
|
||
- Box‑First(境界を箱化): C ABI 層は `src/llvm_py/abi/`(純粋ツール)に隔離。VM/Runner へ依存しない。
|
||
- Fail‑Fast: 型不一致や未対応は IR 生成前にエラーメッセージで停止。
|
||
- ENV 最小: 既定は CLI フラグ優先。ENV は開発支援の短命 TTL のみ。
|
||
|
||
受け入れ基準(MVP)
|
||
- `@extern_c("hako_add")` を付与した i64 加算関数が `.o` と `.h` に出力され、C からリンクして実行可能。
|
||
- Linux/Mac/Win いずれか 1 プラットフォームで visibility/dllexport 設定に問題がない(警告なし)。
|
||
- MIR 注釈 → IR ラッパ生成 → ヘッダー生成の一貫性(SSOT)を満たす。
|
||
|
||
---
|
||
|
||
関連ドキュメント(起票予定)
|
||
- docs/development/abi/README.md — C ABI 全体設計・制約
|
||
- docs/development/abi/types.md — MIR 型→C 型マッピング(SSOT)
|