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)では再現しません。将来のリリースで改善予定です。


🔮 今後の予定