Skip to main content

runmat_vm/interpreter/
debug.rs

1use once_cell::sync::OnceCell;
2use runmat_builtins::Value;
3
4fn env_flag(name: &'static str) -> bool {
5    static DEBUG_VARS: OnceCell<bool> = OnceCell::new();
6    static DEBUG_INDEX: OnceCell<bool> = OnceCell::new();
7    match name {
8        "RUNMAT_DEBUG_VARS" => {
9            *DEBUG_VARS.get_or_init(|| std::env::var(name).as_deref() == Ok("1"))
10        }
11        "RUNMAT_DEBUG_INDEX" => {
12            *DEBUG_INDEX.get_or_init(|| std::env::var(name).as_deref() == Ok("1"))
13        }
14        _ => std::env::var(name).as_deref() == Ok("1"),
15    }
16}
17
18fn store_var_filter() -> &'static str {
19    static FILTER: OnceCell<String> = OnceCell::new();
20    FILTER.get_or_init(|| std::env::var("RUNMAT_DEBUG_STORE_VAR").unwrap_or_default())
21}
22
23pub fn trace_load_var(pc: usize, var_index: usize, value: &Value) {
24    if env_flag("RUNMAT_DEBUG_VARS") {
25        match value {
26            Value::Tensor(t) => {
27                eprintln!("[vm] LoadVar var={} Tensor shape={:?}", var_index, t.shape)
28            }
29            Value::GpuTensor(h) => eprintln!(
30                "[vm] LoadVar var={} GpuTensor shape={:?}",
31                var_index, h.shape
32            ),
33            _ => {}
34        }
35    }
36    if env_flag("RUNMAT_DEBUG_INDEX") {
37        match value {
38            Value::GpuTensor(h) => log::debug!(
39                "[vm] LoadVar GPU tensor pc={} var={} shape={:?}",
40                pc,
41                var_index,
42                h.shape
43            ),
44            Value::Tensor(t) => log::debug!(
45                "[vm] LoadVar tensor pc={} var={} shape={:?}",
46                pc,
47                var_index,
48                t.shape
49            ),
50            _ => {}
51        }
52    }
53}
54
55pub fn trace_store_var(pc: usize, var_index: usize, value: &Value) {
56    if env_flag("RUNMAT_DEBUG_VARS") {
57        match value {
58            Value::Tensor(t) => {
59                eprintln!("[vm] StoreVar var={} Tensor shape={:?}", var_index, t.shape)
60            }
61            Value::GpuTensor(h) => eprintln!(
62                "[vm] StoreVar var={} GpuTensor shape={:?}",
63                var_index, h.shape
64            ),
65            _ => {}
66        }
67    }
68
69    let filter = store_var_filter();
70    let log_this = if filter.trim().is_empty() {
71        false
72    } else if filter.trim().eq_ignore_ascii_case("*") {
73        true
74    } else if let Ok(target) = filter.trim().parse::<usize>() {
75        target == var_index
76    } else {
77        false
78    };
79    if log_this {
80        log::debug!(
81            "[vm] StoreVar value pc={} var={} value={:?}",
82            pc,
83            var_index,
84            value
85        );
86    }
87
88    if env_flag("RUNMAT_DEBUG_INDEX") {
89        match value {
90            Value::GpuTensor(h) => log::debug!(
91                "[vm] StoreVar GPU tensor pc={} var={} shape={:?}",
92                pc,
93                var_index,
94                h.shape
95            ),
96            Value::Tensor(t) => log::debug!(
97                "[vm] StoreVar tensor pc={} var={} shape={:?}",
98                pc,
99                var_index,
100                t.shape
101            ),
102            _ => {}
103        }
104    }
105}
106
107pub fn trace_call_builtin(pc: usize, name: &str, arg_count: usize, stack: &[Value]) {
108    if env_flag("RUNMAT_DEBUG_STACK") {
109        log::debug!(
110            "[vm] CallBuiltin pc={} name={} argc={} stack_len={} top={:?}",
111            pc,
112            name,
113            arg_count,
114            stack.len(),
115            stack.last()
116        );
117    }
118}