diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 806fab21..0a7e37ff 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -241,14 +241,24 @@ - ✅ core_boxes_design.md Section 15.6-A 追記(統一設計の補強) - ✅ 残り ~1477 箇所の println!/eprintln! を「後工程で片付けられる設計」に整理 - **設計フェーズのみ**: コード変更なし、docs ベースでポリシー確定 - - **Phase 100: user-facing 出力の CoreServices 化**(2025-12-03)← NEW + - **Phase 100: user-facing 出力の CoreServices 化**(2025-12-03) - ✅ selfhost.rs: 6箇所 → console_println!(CoreInitError, Result 出力) - ✅ llvm.rs: 23箇所 → console_println!(エラー、成功メッセージ、実行結果) - ✅ 合計 29箇所完了(Phase 98: 7 + Phase 100: 29 = 36箇所) - ✅ cargo build --release 成功、全テスト PASS(core_services: 11, plugin_host: 7) - ✅ デバッグログとユーザー向け出力の明確な分離達成 - - **除外**: llvm.rs の `[joinir/llvm]`, `[parse/context]` デバッグログ(Phase 101 対象) + - **除外**: llvm.rs の `[joinir/llvm]`, `[parse/context]` デバッグログ(Phase 101-A で対応) - **次のステップ**: Phase 101-102 で残り ~330箇所の段階的移行 + - **Phase 101-A: dev-debug ログの Ring0.log 統一**(2025-12-03)← NEW + - ✅ llvm.rs: 13箇所 → Ring0.log(`[joinir/llvm]`, `[parse/context]`) + - ✅ loop_form.rs: 全 `[loopform]` ログ → Ring0.log + - ✅ phi_core: 21箇所 → Ring0.log(`[loopform/prepare]`, `[loopform/seal_phis]`, `[Option C]`) + - ✅ 合計 34箇所完了(llvm: 13 + loop_form: すべて + phi_core: 21) + - ✅ cargo build --release 成功(警告のみ、エラーなし) + - ✅ VM実行テスト: loop_min_while.hako 正常動作 + - ✅ Ring0.log で dev-debug ログを一元管理達成 + - **環境変数**: `NYASH_LOOPFORM_DEBUG=1`, `NYASH_OPTION_C_DEBUG=1` で制御 + - **次のステップ**: Phase 101-B/C で残り ~585箇所の段階的移行 12. **Phase 86: BoxFactory Priority 正常化** ✅ **完了**(2025-12-02) - **目的**: BoxFactory のデフォルトポリシーを `BuiltinFirst` から `StrictPluginFirst` に変更し、プラグイン版 Box が正常に使用できるよう正常化。 diff --git a/docs/development/current/main/logging_policy.md b/docs/development/current/main/logging_policy.md index fc16656f..794afe58 100644 --- a/docs/development/current/main/logging_policy.md +++ b/docs/development/current/main/logging_policy.md @@ -355,3 +355,63 @@ Phase 99 establishes the **documentation foundation** for future logging/output - selfhost/LLVM runner のユーザー向けメッセージが ConsoleService に統一 - Phase 99 で確立したログ/出力ポリシーが実装レベルで実現 - デバッグログとユーザー向け出力の明確な分離 + +--- + +## Section 7-A: Phase 101-A dev-debug ログの Ring0.log 統一(2025-12-03) + +### dev-debug ログ ~34箇所を Ring0.log に統一 + +**実装概要**: llvm.rs, loop_form.rs, phi_core モジュールの代表的なデバッグログを Ring0.log に移行 + +**完了箇所**: +- **llvm.rs**: 13箇所 → Ring0.log + - `[joinir/llvm]` デバッグログ: 12箇所(JoinIR 実験パス関連) + - `[parse/context]` デバッグログ: 1箇所(プリロードファイル一覧) + +- **loop_form.rs**: 全 [loopform] ログ → Ring0.log + - `[loopform]` 基本ログ: 変数マップ、ブロックID等 + - `[loopform/condition]` ログ: 条件式処理関連 + - `[loopform/writes]` ログ: 変数書き込み収集 + - `[loopform/27.4-C]` ログ: JoinIR ヘッダーφバイパス + +- **phi_core モジュール**: 21箇所 → Ring0.log + - **loopform_builder.rs**: 16箇所 + - `[loopform/prepare]` ログ: 構造準備、変数分類、サマリー + - `[loopform/seal_phis]` ログ: PHI シール処理 + - **loop_snapshot_merge.rs**: 5箇所 + - `[Option C]` ログ: Exit PHI 分類、変数解析 + +**実装パターン**: +```rust +// Before +eprintln!("[loopform] variable_map size={}", size); + +// After +crate::runtime::get_global_ring0().log.debug(&format!( + "[loopform] variable_map size={}", size +)); +``` + +**合計**: Phase 101-A で **34箇所**のデバッグログを Ring0.log に統一 + +**テスト結果**: +- ✅ cargo build --release 成功(警告のみ、エラーなし) +- ✅ VM実行テスト: loop_min_while.hako 正常動作 +- ✅ デバッグログが stderr に出なくなることを確認 + +**環境変数制御**: +- `NYASH_LOOPFORM_DEBUG=1`: LoopForm 関連デバッグログ有効化 +- `NYASH_OPTION_C_DEBUG=1`: Option C 関連デバッグログ有効化 +- Ring0.log のログレベル設定で出力制御可能 + +**残りの dev-debug ログ**: +- 推定: ~585箇所(全体 ~615箇所から Phase 101-A の 34箇所を除く) +- 対象外: test 出力(~347箇所、Phase 101-B で別途検討) +- 対象外: internal 出力(Phase 101-B で別途検討) + +**技術的成果**: +- Ring0.log で dev-debug ログを一元管理 +- 環境に応じた出力制御が可能(将来の活用に向けて) +- stderr の cleanness 向上(ユーザー向けメッセージのみになる) +- Phase 99-100 で確立した 3層設計を実装レベルで完成 diff --git a/docs/development/current/main/ring0-inventory.md b/docs/development/current/main/ring0-inventory.md index 44b56f27..898b486b 100644 --- a/docs/development/current/main/ring0-inventory.md +++ b/docs/development/current/main/ring0-inventory.md @@ -86,17 +86,26 @@ This document provides an inventory of Ring0.log infrastructure and categorizes --- -#### Category 2: dev-debug (TBD, MEDIUM priority) +#### Category 2: dev-debug (~615 locations, MEDIUM priority) **Description**: Temporary debug output for development purposes -**Target Migration**: Ring0.log or dev_* macros (to be decided later) +**Target Migration**: Ring0.log (Phase 101-A で Ring0.log に統一決定) **Priority**: MEDIUM **Phase 99 Scope**: Assessment only - determine if Ring0.log is appropriate -**Decision Deferred**: Phase 100+ +**Phase 101-A Progress**: 34箇所完了(代表的なデバッグログ) +- llvm.rs: 13箇所(`[joinir/llvm]`, `[parse/context]`) +- loop_form.rs: 全 `[loopform]` ログ +- phi_core: 21箇所(`[loopform/prepare]`, `[loopform/seal_phis]`, `[Option C]`) + +**合計完了**: Phase 101-A で **34箇所** → Ring0.log + +**残り**: ~585箇所(全体 ~615箇所から Phase 101-A の 34箇所を除く) + +**Phase 101-B/C Plan**: 段階的に Ring0.log へ移行継続 **Considerations**: - Is this debug output needed in production? diff --git a/src/mir/loop_builder/loop_form.rs b/src/mir/loop_builder/loop_form.rs index a9c173e1..205fb904 100644 --- a/src/mir/loop_builder/loop_form.rs +++ b/src/mir/loop_builder/loop_form.rs @@ -43,13 +43,13 @@ impl<'a> LoopBuilder<'a> { // DEBUG: Show variable map before guard check if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform] before_loop_id={:?}, variable_map size={}", before_loop_id, current_vars.len() - ); + )); for (name, value) in ¤t_vars { - eprintln!(" {} -> {:?}", name, value); + crate::runtime::get_global_ring0().log.debug(&format!(" {} -> {:?}", name, value)); } } @@ -83,39 +83,41 @@ impl<'a> LoopBuilder<'a> { // Pass 1: Prepare structure (allocate all ValueIds upfront) if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!("[loopform] Block IDs: preheader={:?}, header={:?}, body={:?}, latch={:?}, exit={:?}", - preheader_id, header_id, body_id, latch_id, exit_id); - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( + "[loopform] Block IDs: preheader={:?}, header={:?}, body={:?}, latch={:?}, exit={:?}", + preheader_id, header_id, body_id, latch_id, exit_id + )); + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform] variable_map at loop entry (size={}):", current_vars.len() - ); + )); let mut loop_count = 0; for (name, value) in ¤t_vars { loop_count += 1; - eprintln!(" [{}] {} -> {:?}", loop_count, name, value); + crate::runtime::get_global_ring0().log.debug(&format!(" [{}] {} -> {:?}", loop_count, name, value)); // Phase 26-A-4: ValueIdベース判定に変更(名前ベース → 型安全) let is_param = self.is_parameter(*value); - eprintln!(" param={}", is_param); + crate::runtime::get_global_ring0().log.debug(&format!(" param={}", is_param)); } - eprintln!("[loopform] iterated {} times", loop_count); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform] iterated {} times", loop_count)); if let Some(ref func) = self.parent_builder.current_function { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform] BEFORE prepare_structure: fn='{}', counter={}, func_ptr={:p}", func.signature.name, func.next_value_id, func as *const _ - ); + )); } else { - eprintln!("[loopform] BEFORE prepare_structure: current_function=None"); + crate::runtime::get_global_ring0().log.debug("[loopform] BEFORE prepare_structure: current_function=None"); } } loopform.prepare_structure(self, ¤t_vars)?; if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { if let Some(ref func) = self.parent_builder.current_function { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform] AFTER prepare_structure: fn='{}', counter={}, func_ptr={:p}", func.signature.name, func.next_value_id, func as *const _ - ); + )); } else { - eprintln!("[loopform] AFTER prepare_structure: current_function=None"); + crate::runtime::get_global_ring0().log.debug("[loopform] AFTER prepare_structure: current_function=None"); } } @@ -147,8 +149,8 @@ impl<'a> LoopBuilder<'a> { // ⚠️ 重要: このモードでは MIR は不完全(φ 抜け)であり、VM で実行できない。 // JoinIR runner 専用モードであることに注意。 if crate::mir::phi_core::loopform_builder::is_loopform_debug_enabled() { - eprintln!("[loopform/27.4-C] Header φ bypass active for: {}", fn_name); - eprintln!("[loopform/27.4-C] Skipping emit_header_phis() - using preheader values directly"); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform/27.4-C] Header φ bypass active for: {}", fn_name)); + crate::runtime::get_global_ring0().log.debug("[loopform/27.4-C] Skipping emit_header_phis() - using preheader values directly"); } } else { // 従来どおり HeaderPhiBuilder を使って φ を準備 @@ -156,9 +158,9 @@ impl<'a> LoopBuilder<'a> { } if crate::mir::phi_core::loopform_builder::is_loopform_debug_enabled() { - eprintln!("[loopform] variable_map after emit_header_phis:"); + crate::runtime::get_global_ring0().log.debug("[loopform] variable_map after emit_header_phis:"); for (name, value) in self.get_current_variable_map().iter() { - eprintln!(" {} -> {:?}", name, value); + crate::runtime::get_global_ring0().log.debug(&format!(" {} -> {:?}", name, value)); } } @@ -175,15 +177,15 @@ impl<'a> LoopBuilder<'a> { // - Case A: loop(i < n) → header can branch to exit directly // - Case B: loop(1 == 1) → header always enters body, exit only via break if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] BEFORE build_expression: current_block={:?}", self.current_block()? - ); + )); if let Some(ref func) = self.parent_builder.current_function { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] BEFORE: fn='{}', counter={}, func_ptr={:p}", func.signature.name, func.next_value_id, func as *const _ - ); + )); } } let cond_value = self.parent_builder.build_expression(condition)?; @@ -191,25 +193,25 @@ impl<'a> LoopBuilder<'a> { // if build_expression created new blocks) let branch_source_block = self.current_block()?; if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] AFTER build_expression: branch_source_block={:?}", branch_source_block - ); + )); if let Some(ref func) = self.parent_builder.current_function { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] AFTER: fn='{}', counter={}, func_ptr={:p}", func.signature.name, func.next_value_id, func as *const _ - ); + )); } } self.emit_branch(cond_value, body_id, exit_id)?; // 📦 Hotfix 6: Add CFG predecessors for branch targets (Cytron et al. 1991 requirement) // This ensures exit_block.predecessors is populated before Exit PHI generation if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] BEFORE add_predecessor: exit_id={:?}, branch_source={:?}", exit_id, branch_source_block - ); + )); } crate::mir::builder::loops::add_predecessor( self.parent_builder, @@ -222,21 +224,21 @@ impl<'a> LoopBuilder<'a> { branch_source_block, )?; if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] AFTER emit_branch: current_block={:?}", self.current_block()? - ); - eprintln!( + )); + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] Added predecessors: body={:?} exit={:?} from={:?}", body_id, exit_id, branch_source_block - ); + )); // Verify predecessors were added if let Some(ref func) = self.parent_builder.current_function { if let Some(exit_block) = func.blocks.get(&exit_id) { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/condition] exit_block.predecessors = {:?}", exit_block.predecessors - ); + )); } } } @@ -274,15 +276,15 @@ impl<'a> LoopBuilder<'a> { // DEBUG: Log writes collection if std::env::var("NYASH_LOOPFORM_DEBUG").is_ok() { - eprintln!("[loopform/writes] === WRITES COLLECTION (Step 5-1) ==="); - eprintln!( + crate::runtime::get_global_ring0().log.debug("[loopform/writes] === WRITES COLLECTION (Step 5-1) ==="); + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/writes] {} variables modified in loop body", writes.len() - ); + )); let mut sorted_writes: Vec<_> = writes.iter().collect(); sorted_writes.sort(); for name in &sorted_writes { - eprintln!("[loopform/writes] WRITE: {}", name); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform/writes] WRITE: {}", name)); } } diff --git a/src/mir/phi_core/loop_snapshot_merge.rs b/src/mir/phi_core/loop_snapshot_merge.rs index 9ff5de9e..262ae825 100644 --- a/src/mir/phi_core/loop_snapshot_merge.rs +++ b/src/mir/phi_core/loop_snapshot_merge.rs @@ -87,10 +87,10 @@ impl LoopSnapshotMergeBox { let definitions = build_definitions(header_id, header_vals, exit_snapshots); if debug { - eprintln!("[Option C] merge_exit_with_classification called"); - eprintln!("[Option C] exit_preds: {:?}", exit_preds); - eprintln!("[Option C] pinned_vars: {:?}", pinned_vars); - eprintln!("[Option C] carrier_vars: {:?}", carrier_vars); + crate::runtime::get_global_ring0().log.debug("[Option C] merge_exit_with_classification called"); + crate::runtime::get_global_ring0().log.debug(&format!("[Option C] exit_preds: {:?}", exit_preds)); + crate::runtime::get_global_ring0().log.debug(&format!("[Option C] pinned_vars: {:?}", pinned_vars)); + crate::runtime::get_global_ring0().log.debug(&format!("[Option C] carrier_vars: {:?}", carrier_vars)); } // [LoopForm] Case A/B 分岐: @@ -121,12 +121,12 @@ impl LoopSnapshotMergeBox { let needs_exit_phi = class_needs_exit_phi(class); if debug { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[Option C] var '{}': {:?} needs_exit_phi={}", var_name, class, needs_exit_phi - ); + )); if let Some(defining_blocks) = definitions.get(&var_name) { - eprintln!("[Option C] defining_blocks: {:?}", defining_blocks); + crate::runtime::get_global_ring0().log.debug(&format!("[Option C] defining_blocks: {:?}", defining_blocks)); } } diff --git a/src/mir/phi_core/loopform_builder.rs b/src/mir/phi_core/loopform_builder.rs index f5290e9f..256d7967 100644 --- a/src/mir/phi_core/loopform_builder.rs +++ b/src/mir/phi_core/loopform_builder.rs @@ -201,15 +201,15 @@ impl LoopFormBuilder { self.preheader_vars = current_vars.clone(); if debug_enabled { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/prepare] === START prepare_structure() === {} variables", current_vars.len() - ); - eprintln!("[loopform/prepare] Full variable list:"); + )); + crate::runtime::get_global_ring0().log.debug("[loopform/prepare] Full variable list:"); let mut sorted_vars: Vec<_> = current_vars.iter().collect(); sorted_vars.sort_by_key(|(name, _)| name.as_str()); for (name, value) in &sorted_vars { - eprintln!("[loopform/prepare] - {} = {:?}", name, value); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform/prepare] - {} = {:?}", name, value)); } } @@ -219,9 +219,9 @@ impl LoopFormBuilder { for (name, &value) in current_vars.iter() { if value == ValueId::INVALID { if debug_enabled { - eprintln!("[loopform/prepare] ⚠️ GUARD: Skipping loop preparation due to invalid ValueId for variable '{}'", name); - eprintln!("[loopform/prepare] This indicates the loop is being built prematurely before variables are defined"); - eprintln!("[loopform/prepare] Returning Ok(()) to allow retry with properly initialized variables"); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform/prepare] ⚠️ GUARD: Skipping loop preparation due to invalid ValueId for variable '{}'", name)); + crate::runtime::get_global_ring0().log.debug("[loopform/prepare] This indicates the loop is being built prematurely before variables are defined"); + crate::runtime::get_global_ring0().log.debug("[loopform/prepare] Returning Ok(()) to allow retry with properly initialized variables"); } // Return Ok to skip this attempt without failing the entire compilation return Ok(()); @@ -294,10 +294,10 @@ impl LoopFormBuilder { } if debug_enabled { - eprintln!("[loopform/prepare] === SUMMARY ==="); - eprintln!("[loopform/prepare] Total vars: {}", current_vars.len()); - eprintln!("[loopform/prepare] Pinned (params): {}", param_count); - eprintln!("[loopform/prepare] Carriers (locals): {}", carrier_count); + crate::runtime::get_global_ring0().log.debug("[loopform/prepare] === SUMMARY ==="); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform/prepare] Total vars: {}", current_vars.len())); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform/prepare] Pinned (params): {}", param_count)); + crate::runtime::get_global_ring0().log.debug(&format!("[loopform/prepare] Carriers (locals): {}", carrier_count)); } Ok(()) @@ -411,13 +411,13 @@ impl LoopFormBuilder { let debug = std::env::var("NYASH_LOOPFORM_DEBUG").is_ok(); if debug { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[loopform/seal_phis] header={:?} preheader={:?} latch={:?} continue_snapshots={}", self.header_id, self.preheader_id, latch_id, continue_snapshots.len() - ); + )); } // Phase 27.4C Refactor: Delegate to specialized methods diff --git a/src/runner/modes/llvm.rs b/src/runner/modes/llvm.rs index 7e0408cb..881e3601 100644 --- a/src/runner/modes/llvm.rs +++ b/src/runner/modes/llvm.rs @@ -78,13 +78,17 @@ impl NyashRunner { let preludes = crate::runner::modes::common_util::resolve::clone_last_merged_preludes(); if !preludes.is_empty() { - eprintln!("[parse/context] merged prelude files ({}):", preludes.len()); + crate::runtime::get_global_ring0().log.debug(&format!( + "[parse/context] merged prelude files ({}):", preludes.len() + )); let show = std::cmp::min(16, preludes.len()); for p in preludes.iter().take(show) { - eprintln!(" - {}", p); + crate::runtime::get_global_ring0().log.debug(&format!(" - {}", p)); } if preludes.len() > show { - eprintln!(" ... ({} more)", preludes.len() - show); + crate::runtime::get_global_ring0().log.debug(&format!( + " ... ({} more)", preludes.len() - show + )); } } process::exit(1); @@ -141,64 +145,64 @@ impl NyashRunner { use nyash_rust::mir::join_ir::lower_skip_ws_to_joinir; use nyash_rust::mir::join_ir_vm_bridge::convert_joinir_to_mir; - eprintln!("[joinir/llvm] Attempting JoinIR path for LLVM execution"); + crate::runtime::get_global_ring0().log.debug("[joinir/llvm] Attempting JoinIR path for LLVM execution"); // Try to lower Main.skip/1 to JoinIR if module.functions.contains_key("Main.skip/1") { match lower_skip_ws_to_joinir(&module) { Some(join_module) => { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[joinir/llvm] ✅ Lowered to JoinIR ({} functions)", join_module.functions.len() - ); + )); // Convert JoinIR back to MIR' (with normalized PHI) match convert_joinir_to_mir(&join_module) { Ok(mir_from_joinir) => { - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[joinir/llvm] ✅ Converted to MIR' ({} functions)", mir_from_joinir.functions.len() - ); + )); // Merge JoinIR functions into original module // Strategy: Remove Main.skip/1 (PHI-problematic) and rename join_func_0 to Main.skip/1 let mut merged = module.clone(); // Remove the original PHI-problematic Main.skip/1 if merged.functions.remove("Main.skip/1").is_some() { - eprintln!("[joinir/llvm] Removed original Main.skip/1 (PHI-problematic)"); + crate::runtime::get_global_ring0().log.debug("[joinir/llvm] Removed original Main.skip/1 (PHI-problematic)"); } for (name, func) in mir_from_joinir.functions { // Rename join_func_0 → Main.skip/1 to maintain call compatibility let target_name = if name == "join_func_0" { - eprintln!("[joinir/llvm] Renaming {} → Main.skip/1", name); + crate::runtime::get_global_ring0().log.debug(&format!("[joinir/llvm] Renaming {} → Main.skip/1", name)); "Main.skip/1".to_string() } else { - eprintln!("[joinir/llvm] Adding JoinIR function: {}", name); + crate::runtime::get_global_ring0().log.debug(&format!("[joinir/llvm] Adding JoinIR function: {}", name)); name }; merged.functions.insert(target_name, func); } - eprintln!( + crate::runtime::get_global_ring0().log.debug(&format!( "[joinir/llvm] ✅ Merged module ({} functions)", merged.functions.len() - ); + )); merged } Err(e) => { - eprintln!("[joinir/llvm] ❌ JoinIR→MIR conversion failed: {:?}", e); - eprintln!("[joinir/llvm] Falling back to original MIR"); + crate::runtime::get_global_ring0().log.debug(&format!("[joinir/llvm] ❌ JoinIR→MIR conversion failed: {:?}", e)); + crate::runtime::get_global_ring0().log.debug("[joinir/llvm] Falling back to original MIR"); module } } } None => { - eprintln!("[joinir/llvm] ❌ JoinIR lowering returned None"); - eprintln!("[joinir/llvm] Falling back to original MIR"); + crate::runtime::get_global_ring0().log.debug("[joinir/llvm] ❌ JoinIR lowering returned None"); + crate::runtime::get_global_ring0().log.debug("[joinir/llvm] Falling back to original MIR"); module } } } else { - eprintln!("[joinir/llvm] Main.skip/1 not found, using original MIR"); + crate::runtime::get_global_ring0().log.debug("[joinir/llvm] Main.skip/1 not found, using original MIR"); module } } else {