feat(joinir): Phase 195 - Unified JoinLoopTrace for all JoinIR debug output

Created centralized tracing module for JoinIR loop lowering operations,
consolidating scattered eprintln! calls into a single SSOT interface.

# Implementation

1. **Created trace.rs module** (~233 lines)
   - JoinLoopTrace struct with env var controls
   - Unified API: pattern(), varmap(), joinir_stats(), phi(), merge(), etc.
   - Global singleton via trace() function
   - Supports 5 env vars: NYASH_TRACE_VARMAP, NYASH_JOINIR_DEBUG,
     NYASH_OPTION_C_DEBUG, NYASH_JOINIR_MAINLINE_DEBUG, NYASH_LOOPFORM_DEBUG

2. **Updated debug.rs** - Delegates trace_varmap() to JoinLoopTrace

3. **Updated routing.rs** - All eprintln! replaced with trace calls (10 instances)

4. **Updated pattern routers** - All 3 patterns now use unified trace
   - pattern1_minimal.rs: 6 replacements
   - pattern2_with_break.rs: 6 replacements
   - pattern3_with_if_phi.rs: 6 replacements
   - router.rs: 2 replacements

5. **Updated merge/block_allocator.rs** - 6 eprintln! → trace calls

# Benefits

- **Single Source of Truth**: All trace control through environment variables
- **Consistent Format**: Unified [trace:*] prefix for easy filtering
- **Zero Overhead**: No output when env vars unset
- **Easy Extension**: Add new trace points via existing API
- **Better Debug Experience**: Structured output with clear categories

# Testing

 cargo build --release - Success
 NYASH_TRACE_VARMAP=1 - Shows varmap traces only
 NYASH_JOINIR_DEBUG=1 - Shows joinir + blocks + routing traces
 No env vars - No debug output
 apps/tests/loop_min_while.hako - All tests pass

# Related

- Phase 191-194 groundwork (modular merge structure)
- NYASH_TRACE_VARMAP added today for variable_map debugging
- Consolidates ~80 scattered eprintln! calls across JoinIR

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-05 22:23:51 +09:00
parent 67e2bfada4
commit abfe0b198b
9 changed files with 422 additions and 195 deletions

View File

@ -115,23 +115,23 @@ pub fn route_loop_pattern(
builder: &mut MirBuilder,
ctx: &LoopPatternContext,
) -> Result<Option<ValueId>, String> {
use super::super::trace;
// Patterns are already sorted by priority in the table
// (Pattern 3 with priority 30 comes first, then Pattern 1 with priority 10, etc.)
// This ensures Pattern 3 is checked before Pattern 1, avoiding incorrect routing.
for entry in LOOP_PATTERNS {
if (entry.detect)(builder, ctx) {
// Log which pattern matched (for debugging)
if ctx.debug || std::env::var("NYASH_TRACE_VARMAP").is_ok() {
eprintln!("[route] Pattern '{}' matched for function '{}'", entry.name, ctx.func_name);
}
// Phase 195: Use unified trace for pattern matching
trace::trace().pattern("route", entry.name, true);
return (entry.lower)(builder, ctx);
}
}
// No pattern matched - fall through to legacy path
if ctx.debug {
eprintln!("[route] No pattern matched for function '{}', falling back to legacy", ctx.func_name);
trace::trace().debug("route", &format!("No pattern matched for function '{}', falling back to legacy", ctx.func_name));
}
Ok(None)
}