Skip to main content

tidepool_codegen/
layout.rs

1//! Canonical VMContext and HeapObject layout constants for codegen.
2//!
3//! These constants define the frozen layout of the VMContext struct and
4//! the various heap object types as `i32`/`i64` values suitable for
5//! Cranelift IR emission. `tidepool_heap::layout` defines the same
6//! layout using native Rust types for runtime use — the two modules
7//! must stay in sync.
8
9// --- VMContext field offsets (i32 for Cranelift) ---
10
11/// Offset of alloc_ptr within VMContext.
12pub const VMCTX_ALLOC_PTR_OFFSET: i32 = 0;
13/// Offset of alloc_limit within VMContext.
14pub const VMCTX_ALLOC_LIMIT_OFFSET: i32 = 8;
15/// Offset of gc_trigger within VMContext.
16pub const VMCTX_GC_TRIGGER_OFFSET: i32 = 16;
17/// Offset of tail_callee within VMContext.
18pub const VMCTX_TAIL_CALLEE_OFFSET: i32 = 24;
19/// Offset of tail_arg within VMContext.
20pub const VMCTX_TAIL_ARG_OFFSET: i32 = 32;
21
22// --- Heap object tags (u8) ---
23
24pub const TAG_CLOSURE: u8 = 0;
25pub const TAG_THUNK: u8 = 1;
26pub const TAG_CON: u8 = 2;
27pub const TAG_LIT: u8 = 3;
28pub const TAG_FORWARDED: u8 = 0xFF;
29
30// --- Thunk state tags (u8) ---
31
32pub const THUNK_UNEVALUATED: u8 = 0;
33pub const THUNK_BLACKHOLE: u8 = 1;
34pub const THUNK_EVALUATED: u8 = 2;
35
36// --- HeapObject layout constants (i32/u64 for Cranelift and Rust) ---
37
38pub const HEAP_HEADER_SIZE: u64 = 8;
39
40// Closure layout
41pub const CLOSURE_CODE_PTR_OFFSET: i32 = 8;
42pub const CLOSURE_NUM_CAPTURED_OFFSET: i32 = 16;
43pub const CLOSURE_CAPTURED_OFFSET: i32 = 24;
44
45// Con layout
46pub const CON_TAG_OFFSET: i32 = 8;
47pub const CON_NUM_FIELDS_OFFSET: i32 = 16;
48pub const CON_FIELDS_OFFSET: i32 = 24;
49
50// Lit layout
51pub const LIT_TAG_OFFSET: i32 = 8;
52pub const LIT_VALUE_OFFSET: i32 = 16;
53pub const LIT_TOTAL_SIZE: u64 = 24;
54
55// Lit tags (i64 for builder.ins().iconst)
56pub const LIT_TAG_INT: i64 = 0;
57pub const LIT_TAG_WORD: i64 = 1;
58pub const LIT_TAG_CHAR: i64 = 2;
59pub const LIT_TAG_FLOAT: i64 = 3;
60pub const LIT_TAG_DOUBLE: i64 = 4;
61pub const LIT_TAG_STRING: i64 = 5;
62pub const LIT_TAG_ADDR: i64 = 6;
63pub const LIT_TAG_BYTEARRAY: i64 = 7;
64pub const LIT_TAG_SMALLARRAY: i64 = 8;
65pub const LIT_TAG_ARRAY: i64 = 9;
66
67// Thunk layout
68pub const THUNK_STATE_OFFSET: i32 = 8;
69pub const THUNK_CODE_PTR_OFFSET: i32 = 16;
70pub const THUNK_CAPTURED_OFFSET: i32 = 24;
71pub const THUNK_MIN_SIZE: u64 = 24;
72pub const THUNK_INDIRECTION_OFFSET: i32 = 16;