Skip to main content

hara_native/jit/
trace_ir.rs

1use 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}