Cm v0.14.2 リリースノート
リリース日: 2026-03-07 前バージョン: v0.14.1
✨ ハイライト
v0.14.2はTagged Union(Result/Option/enum)のペイロード抽出に関する重大バグ2件の修正、ASM過剰volatile生成の修正、Dead Function Elimination(DFE)の追加、__asm__定数展開、モノモーフィゼーション最適化を含むパッチリリースです。ベアメタル環境でのResult型エラーハンドリングを安全に使用可能にし、コンパイル・テスト性能を改善しました。
🐛 重大バグ修正: Tagged Union ペイロード
Bug#1: ペイロード型の64bitハードコード問題
mir_to_llvm.cppのconvertPlaceToAddressでTagged Union(enum/Result/Option)のペイロード型がhir::make_int()(i32)にハードコードされ、64bit型のペイロードが切り詰められる問題。
| 項目 | 詳細 |
|---|---|
| 症状 | Result::Ok(0)のペイロード抽出で188050848088064等の不正値 |
| 原因 | ペイロード型がi32固定 → 64bit値の上位4バイトが未読 |
| 修正 | type_argsから動的にペイロード型を推論、64bit型存在時はi64を使用 |
| テスト | JIT 365 PASS / LLVM 399 PASS、回帰なし |
Bug#2: ペイロード部分書き込みによるundef bytes
Result::Ok(0)等のenum construct時、ペイロード値(i32)がi8[N]に部分書き込みされ、LLVM最適化がmemset+storeをconstant phiに畳み込む際にundef bytesが生成される問題。
| 項目 | 詳細 |
|---|---|
| 症状 | ベアメタル環境でResult<ulong, long>::Ok(0)の値にゴミデータ混入 |
| 原因 | ペイロードストアが32bitのみ→残りバイトがundefined |
| 修正1 | payload storeにZExt(Zero-Extension)を追加し正確なビット幅に拡張 |
| 修正2 | retval allocaにstruct型ゼロ初期化を追加 |
| 修正3 | resolve_typedefにモノモーフ化enum名フォールバック追加 |
影響: この修正により
Result<T, E>でT==E(例:Result<long, long>)が正しく動作。ベアメタル環境を含む全レイヤーでResult型エラーハンドリングが使用可能に。
🐛 その他のバグ修正
ASM含有関数の過剰volatile生成
__asm__を含む関数で全ローカル変数にvolatile属性が付与され、不要なalloca → volatile store → volatile loadチェーンが生成される問題を修正。
修正前: outb(ushort, utiny) → 13回のメモリ操作、0x43バイト
修正後: outb(ushort, utiny) → 0回のメモリ操作、0x4バイト
型キーワードのnamespace名衝突
import ../lib/string;で展開されるnamespace string { ... }がCm組み込み型stringと衝突する問題を修正。
その他
| 問題 | 修正内容 |
|---|---|
| varargs関数のパラメータ数検証 | 最小引数数でのガードに修正 |
| callee関数のシンボル検索失敗 | impl内関数のルックアップロジック修正 |
| 文字列スライスの範囲外アクセス | スライス境界チェック追加 |
| プリプロセッサのデバッグログ | debug_modeガードで保護 |
| パーサ無限再帰 | 安全ガード追加 |
| DFEラムダ関数誤削除 | ラムダ関数をDFEスキップ対象に追加 |
| interface impl関数のDCE除去 | 未使用誤判定の修正 |
| フォーマッター | バッククォートインデント崩壊修正、括弧内継続行修正 |
✨ 新機能
Dead Function Elimination (DFE)
MIR→LLVM変換時に未使用関数を除去する最適化パスを追加。ベアメタル環境でのバイナリサイズ削減に有効。
enum値の文字リテラルサポート
parse_enum_declでCharLiteralを受け付けるよう拡張。
export enum Ascii {
LowerA = 'a',
LowerB, // 98 (オートインクリメント)
UpperA = 'A',
Digit0 = '0',
}
__asm__内の${CONST_NAME}定数展開
lower_asmでasm文字列中の${CONST_NAME}パターンを検出し、global_const_valuesテーブルから定数値を取得して16進数リテラルに直接置換。colonを含む${+r:var}等のオペランド記法はスキップ。
x86_64 Dockerクロスビルド対応
x86_64ターゲット向けDockerビルド環境を追加。LLVM共有ライブラリ + C++静的リンクの最適構成。
⚡ パフォーマンス改善
モノモーフィゼーション反復ループ最適化
| 項目 | 旧 | 新 |
|---|---|---|
| 最大反復数 | 10パス (全関数フルスキャン) | 2パス (2パス目は新規関数のみ) |
monomorphize_structs() |
2回実行 | 1回に統合 |
ネストジェネリクス(Queue等)にも対応。
テストランナー並列化改善(FIFOセマフォ方式)
| 項目 | 旧 | 新 |
|---|---|---|
| 同期方式 | PIDポーリング (kill -0 + sleep 0.05) |
FIFOセマフォ (mkfifo + fd) |
| max_jobs | CPU数 | CPU数×4 (I/Oバウンド考慮) |
| 実行時間 | 1:57 | 51.5s (55%短縮) |
| CPU使用率 | 100% | 232% |
📁 主要な変更ファイル
| ファイル | 変更内容 |
|---|---|
src/codegen/llvm/core/mir_to_llvm.cpp |
ASM volatile修正、DFE連携、64bit payload型推論、ZExtストア、retvalゼロ初期化 |
src/mir/lowering/base.cpp |
resolve_typedefモノモーフ化enum名フォールバック |
src/mir/lowering/context.cpp |
resolve_typedef enum_defs検索フォールバック |
src/mir/lowering/stmt.cpp |
__asm__内${CONST_NAME}定数展開 |
src/mir/passes/cleanup/program_dce.cpp |
Dead Function Elimination実装 |
src/mir/passes/monomorphization_impl.cpp |
モノモーフ反復ループ2パス最適化 |
src/frontend/parser/parser_expr.cpp |
型キーワード名前空間修飾子対応 |
src/frontend/parser/parser_module.cpp |
enum値CharLiteralサポート、無限再帰ガード |
src/frontend/types/checking/stmt.cpp |
Tagged Union 64bitペイロード型チェック |
src/fmt/formatter.cpp |
バッククォート+括弧継続行修正 |
tests/unified_test_runner.sh |
FIFOセマフォ並列化 (55%短縮) |
Dockerfile |
x86_64クロスビルド環境 (新規) |
📊 テスト結果
| バックエンド | 通過 | 失敗 |
|---|---|---|
| JIT (O0) | 365 | 0 |
| LLVM Native | 399 | 0 |
| Baremetal | 全通過 | 0 |
🔮 今後の予定
- v0.15.0: File I/O、パッケージ管理、JSバックエンドのポインタ/VTable対応