Cm v0.14.1 リリースノート
リリース日: 2026-02-19
最終更新: 2026-02-21
✨ ハイライト
v0.14.1はUEFIコンパイラバグ17件の修正、typedef算術演算サポート、GCC/Linux CIビルド修正を含むパッチリリースです。CosmOS UEFI開発で発見されたコンパイラバグを全件修正し、MIR最適化パスのASM対応、naked関数コード生成の根本修正など広範な安定化を実施しました。
🐛 UEFIコンパイラバグ全件修正(Bug#1〜#17)
CosmOS UEFI開発中に発見されたコンパイラバグ17件を全て修正しました。
| Bug# |
問題 |
重要度 |
修正内容 |
回帰テスト |
| #1 |
3引数関数でのポインタ破損(Win64呼出規約) |
重大 |
全関数にWin64呼出規約を設定 |
uefi_struct |
| #2 |
*ptr as ulongデリファレンスエラー |
— |
仕様通り(括弧付きで正常) |
— |
| #5 |
LICM最適化がASM出力変数を移動 |
重大 |
ASM出力変数のループ不変判定修正 |
uefi_bug5_direct |
| #6 |
constant foldingのASM出力追跡 |
重大 |
ASM→変数代入チェーン最適化抑制 |
uefi_asm_while |
| #7 |
must{__asm__()}の制御フロー干渉 |
低 |
全ASMにhasSideEffects+クロバー設定 |
uefi_bug7_* |
| #8 |
const式でのI/Oポート計算 |
中 |
const式評価パイプライン修正 |
uefi_arithmetic |
| #9 |
ローカル配列のスタックオフセット重複 |
重大 |
alloca skipルール削除+array-to-pointer decay |
uefi_bug9_array_ptr |
| #10 |
ptr->method()のself書き戻し不在 |
重大 |
MIR loweringでポインタ経由書き戻し実装 |
impl_nested_self, impl_ptr_self |
| #11 |
インライン展開によるASMレジスタ割当変更 |
重大 |
ASM含有関数にNoInline属性付与 |
uefi_bug11_asm_func |
| #12 |
インライン展開時のret先不在 |
重大 |
Naked+$N事前置換方式に統一 |
uefi_bug12_asm_ret |
| #13 |
インライン展開時のレジスタ上書き(クラッシュ) |
致命的 |
UEFI全関数NoInline+efi_mainにOptimizeNone |
uefi_impl_inline |
| #14 |
構造体配列の全体再代入でゴミ値 |
重大 |
memcpy/配列代入の型サイズ修正 |
uefi_large_impl |
| #15 |
非export関数がexport関数から呼出不可 |
中 |
シンボル解決(extract_exported_blocks)修正 |
uefi_cross_module_call |
| #16 |
&local as ulongキャスト不正 |
低 |
ポインタ→整数キャスト修正 |
uefi_pointer_cast |
| #17 |
UEFIスタックプローブクラッシュ |
中 |
スタックプローブの無効化 |
uefi_stack_probe |
🔧 言語機能の修正
修正済みバグ(6件)
| 問題 |
修正内容 |
回帰テスト |
| typedef算術演算エラー |
typedef型のis_numeric判定修正 |
typedef_compound_assign |
| typedef引数の型不整合 |
static→static呼び出し時の型解決 |
typedef_struct_param |
| GCC CIビルドエラー |
<unordered_map>ヘッダー追加 |
CI自動テスト |
| 大きな16進リテラルのprintln |
println関数選択にlong/ulong追加 |
ulong_large_hex |
| ビット演算の型幅不一致 |
BitAnd/BitOr/BitXorに型統一ロジック追加 |
operator_bitwise |
| ASM関数のインライン展開 |
ASM含有関数のインライン展開禁止 |
uefi_bug11_asm_func |
typedef算術演算サポート
typedef型の値に対する算術演算・比較演算が正常に動作するようになりました。
typedef EFI_STATUS = ulong;
EFI_STATUS status = 0;
if (status != 0) { /* 修正前: コンパイルエラー → 修正後: 正常動作 */ }
整数型出力の完全対応
MIR loweringのprintln関数選択ロジックにlong/ulong/uint/isize/usize型のケースを追加。i32範囲を超える値が正しく出力されるようになりました。
long v = 0x80000000; // 2147483648
println(v); // 修正前: -2147483648 (i32切り詰め)
// 修正後: 2147483648 (正しい出力)
🏗️ バックエンド改善
GCC/Linux CIビルド修正
src/mir/nodes.hppに<unordered_map>ヘッダーを追加。AppleClangでは間接インクルードで解決されていたが、GCCでは明示的なインクルードが必要でした。
JS/WASMランタイム改善
| ファイル |
変更内容 |
src/codegen/js/builtins.cpp |
cm_println_long/ulong/uintとformat/to_string版追加 |
src/codegen/llvm/wasm/runtime_print.c |
cm_println_long/ulong出力関数追加 |
src/codegen/llvm/core/operators.cpp |
ビット演算(BitAnd/BitOr/BitXor)の型幅統一ロジック追加 |
src/mir/passes/interprocedural/inlining.cpp |
ASM含有関数のインライン展開禁止 |
MIR最適化パスのASM対応
| パス |
修正内容 |
| LICM (Loop Invariant Code Motion) |
ASM出力変数をループ不変と誤判定しない修正 |
| Constant Folding |
ASM→変数代入チェーンの最適化を抑制 |
| Constant Folding |
構造体フィールドアクセスの最適化を抑制 |
| Inlining |
ASM含有関数のインライン展開を禁止 |
📁 主要な変更ファイル
| ファイル |
変更内容 |
src/codegen/llvm/core/mir_to_llvm.cpp |
Bug#1/7/8/11/12/14/16修正、naked関数統一 |
src/codegen/llvm/native/codegen.cpp |
Bug#13/17: UEFI最適化レベル調整、スタックプローブ無効化 |
src/mir/lowering/expr_call.cpp |
println型選択にlong/ulong/uint/isize/usize追加 |
src/mir/lowering/stmt.cpp |
Bug#10: ptr->method()のself書き戻し |
src/mir/lowering/monomorphization_impl.cpp |
typedef引数の型解決修正 |
src/mir/passes/scalar/folding.cpp |
Bug#6/9: ASM出力・構造体フィールド最適化抑制 |
src/mir/passes/loop/licm.cpp |
Bug#5: ASM出力変数のループ不変判定修正 |
src/mir/nodes.hpp |
GCC CIビルド修正(unordered_mapヘッダー追加) |
src/frontend/types/checking/expr.cpp |
typedef算術演算サポート |
src/preprocessor/import.cpp |
Bug#15: 非export関数のシンボル解決修正 |
🧪 リグレッションテスト
UEFIコンパイルテスト(20件)
| テストファイル |
対象バグ/機能 |
uefi_arithmetic.cm |
Bug#8: const式計算 |
uefi_asm_scratch_reg.cm |
ASMスクラッチレジスタ |
uefi_asm_while.cm |
Bug#6: ASMループ |
uefi_bug5_direct.cm |
Bug#5: LICM最適化 |
uefi_bug7_compiler_barrier.cm |
Bug#7: コンパイラバリア |
uefi_bug7_must_hlt.cm |
Bug#7: must+hlt |
uefi_bug9_array_ptr.cm |
Bug#9: 配列ポインタ |
uefi_bug11_asm_func.cm |
Bug#11: ASM関数 |
uefi_bug12_asm_ret.cm |
Bug#12: naked関数 |
uefi_control_flow.cm |
制御フロー |
uefi_cross_module_call.cm |
Bug#15: クロスモジュール |
uefi_export_many.cm |
Bug#14: export数 |
uefi_impl_inline.cm |
Bug#13: インライン展開 |
uefi_large_impl.cm |
Bug#14: 大構造体 |
uefi_must_asm.cm |
must+ASM |
uefi_naked_mixed_func.cm |
naked混在関数 |
uefi_pointer_cast.cm |
Bug#16: ポインタキャスト |
uefi_stack_large.cm |
大スタック |
uefi_stack_probe.cm |
Bug#17: スタックプローブ |
uefi_struct.cm |
Bug#1: 構造体 |
JIT/LLVM回帰テスト(主要)
| テストファイル |
対象 |
impl_nested_self.cm |
Bug#10: ネストself |
impl_nested_self_deep.cm |
Bug#10: 深いネスト |
impl_ptr_self.cm |
Bug#10: ポインタself |
impl_ptr_large_struct.cm |
Bug#10: 大構造体 |
while_sccp_regression.cm |
Bug#5: SCCP回帰 |
ptr_to_int_cast.cm |
Bug#16: ポインタ→整数 |
typedef_compound_assign.cm |
typedef算術 |
operator_bitwise.cm |
ビット演算 |
📊 テスト結果
| バックエンド |
通過 |
失敗 |
スキップ |
| JIT (O0) |
347 |
0 |
4 |
| LLVM Native |
380 |
0 |
7 |
| LLVM WASM |
346 |
0 |
5 |
| JavaScript |
306 |
0 |
49 |
| Baremetal |
11 |
0 |
0 |
| UEFI |
20 |
0 |
0 |
⚠️ 既知の制約事項(UEFIターゲット固有)
以下はUEFIバックエンド固有の制約であり、JIT/LLVM Native/WASM/JSでは発生しません。
全件に回避策があり、CosmOS開発で実証済みです。
| # |
制約 |
回避策 |
| 5 |
ASM出力変数のwhile条件不具合 |
ループ内でスコープ宣言+break |
| 7 |
must{__asm__()}の制御フロー干渉 |
mustなしで直接使用 |
| 9 |
ローカル配列+ポインタ変数のオフセットずれ |
アドレスを変数に格納しない |
| 11 |
ABIレジスタ直接参照の不正動作 |
${r:var}構文を使用 |
| 12 |
インライン展開時のret先不在 |
数値ラベルでreturn address push |
| 17 |
___chkstk_ms未定義シンボル |
no-opスタブをリンク |
注: これらの制約はCmコンパイラのUEFIバックエンド固有の問題であり、
JITモード(cm run)では再現しません。将来のリリースで改善予定です。
🔮 今後の予定
- v0.15.0: File I/O、パッケージ管理、JSバックエンドのポインタ/VTable対応、UEFI/ベアメタルの拡充