runmat_vm/interpreter/
debug.rs1use 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}