hara_native/jit/
trace_ir.rs1use crate::core::{IntrinsicOp, Value};
2
3#[derive(Debug, Clone, PartialEq)]
4pub enum TraceValue {
5 I64(i64),
6 Bool(bool),
7 Nil,
8 Indexed(Box<Value>),
9 VectorSlice(Box<NumericVectorSlice>),
10 Unsupported,
11}
12
13#[derive(Debug, Clone, PartialEq)]
14pub struct NumericVectorSlice {
15 pub values: Vec<i64>,
16 pub start: usize,
17}
18
19#[derive(Debug, Clone, PartialEq)]
20pub enum TraceOp {
21 GuardLocalI64 { local: u16 },
22 GuardLocalBool { local: u16 },
23 GuardLocalNil { local: u16 },
24 GuardLocalVectorI64 { local: u16 },
25 LoadLocal { local: u16 },
26 ConstantI64(i64),
27 ConstantBool(bool),
28 ConstantNil,
29 ConstantVectorI64 { vector: u16 },
30 BinaryI64(IntrinsicOp),
31 VectorCountI64,
32 VectorFirstI64,
33 VectorRestI64,
34 VectorSecondI64,
35 VectorNthI64,
36 StoreLocal { local: u16 },
37 GuardTruthy { expected: bool },
38 Pop,
39 LoopBackedge,
40}
41
42#[derive(Debug, Clone, PartialEq)]
43pub struct Trace {
44 pub function: u16,
45 pub header: u32,
46 pub resume_ip: u32,
47 pub operations: Vec<TraceOp>,
48 pub vectors: Vec<Vec<i64>>,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq)]
52pub enum ExitReason {
53 WrongTag,
54 BranchChanged,
55 Overflow,
56 DivisionByZero,
57 IndexOutOfBounds,
58 Unsupported,
59}
60
61#[derive(Debug, Clone, PartialEq)]
62pub struct ExitSnapshot {
63 pub function: u16,
64 pub instruction: u32,
65 pub locals: Vec<TraceValue>,
66 pub stack: Vec<TraceValue>,
67}
68
69#[derive(Debug, Clone, PartialEq)]
70pub enum TraceOutcome {
71 Completed {
72 iterations: u32,
73 },
74 SideExit {
75 reason: ExitReason,
76 iterations: u32,
77 snapshot: ExitSnapshot,
78 },
79}
80
81#[cfg(test)]
82mod tests {
83 use super::TraceValue;
84
85 #[test]
86 fn trace_values_keep_heap_values_indirect() {
87 assert!(std::mem::size_of::<TraceValue>() <= 16);
88 }
89}