diff --git a/majit/majit-backend-cranelift/Cargo.toml b/majit/majit-backend-cranelift/Cargo.toml
index 4ba2adec2f7..1a4dff7ec73 100644
--- a/majit/majit-backend-cranelift/Cargo.toml
+++ b/majit/majit-backend-cranelift/Cargo.toml
@@ -33,6 +33,7 @@ dynasm = ["majit-metainterp/dynasm"]
cranelift = ["majit-metainterp/cranelift"]
[dev-dependencies]
+majit-gc = { workspace = true, features = ["gc_box"] }
majit-ir = { workspace = true, features = ["test-support"] }
majit-metainterp = { workspace = true }
smallvec = { workspace = true }
diff --git a/majit/majit-backend-cranelift/src/compiler.rs b/majit/majit-backend-cranelift/src/compiler.rs
index 4a34cf5d512..45863f70edd 100644
--- a/majit/majit-backend-cranelift/src/compiler.rs
+++ b/majit/majit-backend-cranelift/src/compiler.rs
@@ -1417,32 +1417,141 @@ fn cranelift_type_for(tp: &Type) -> cranelift_codegen::ir::Type {
}
thread_local! {
- /// `llmodel.py:58` `self.gc_ll_descr = get_ll_description(...)` — owned
- /// by the active cranelift backend on this thread. Stored as a
- /// thread-local so the backend-agnostic `majit_gc::ActiveGcGuardHooks`
- /// shims and trampoline-baked C addresses can reach the live allocator
- /// without taking a cranelift dependency. Mirrors
- /// `majit-backend-dynasm/src/runner.rs:46 DYNASM_ACTIVE_GC`.
- static CRANELIFT_ACTIVE_GC: RefCell