From cbaff6acd1f67affddc5451e3813fd7399bd8b4b Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 27 Apr 2026 16:45:58 +0300 Subject: [PATCH] builtin: C.GC_register_displacement --- vlib/builtin/builtin_d_gcboehm.c.v | 2 ++ vlib/v/gen/c/cmain.v | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/vlib/builtin/builtin_d_gcboehm.c.v b/vlib/builtin/builtin_d_gcboehm.c.v index 5f7f35899..549825d13 100644 --- a/vlib/builtin/builtin_d_gcboehm.c.v +++ b/vlib/builtin/builtin_d_gcboehm.c.v @@ -255,6 +255,8 @@ pub type FnGC_WarnCB = fn (const_msg &char, arg usize) fn C.GC_get_warn_proc() FnGC_WarnCB fn C.GC_set_warn_proc(cb FnGC_WarnCB) +fn C.GC_register_displacement(offset usize) + // gc_get_warn_proc returns the current callback fn, that will be used for printing GC warnings. pub fn gc_get_warn_proc() FnGC_WarnCB { return C.GC_get_warn_proc() diff --git a/vlib/v/gen/c/cmain.v b/vlib/v/gen/c/cmain.v index db70ba3de..5bf06d7aa 100644 --- a/vlib/v/gen/c/cmain.v +++ b/vlib/v/gen/c/cmain.v @@ -167,6 +167,10 @@ fn (mut g Gen) gen_boehm_gc_init() { g.writeln('\tGC_allow_register_threads();') } g.writeln('\tGC_INIT();') + // Register V's array data header displacement so Boehm always recognises + // the interior pointer kept in `array.data` (which is offset by + // `array_data_header_size()` bytes from the GC allocation start). + g.writeln('\tGC_register_displacement(sizeof(void*));') if g.pref.os == .linux && !g.pref.no_builtin { g.writeln('\tbuiltin__gc_restore_roots_after_debugger_init(__v_gc_debugger_workaround);') } @@ -186,6 +190,7 @@ fn (mut g Gen) gen_windows_shared_library_boehm_init() { g.writeln('\tGC_set_free_space_divisor(2);') } g.writeln('\tGC_INIT();') + g.writeln('\tGC_register_displacement(sizeof(void*));') g.writeln('#endif') } -- 2.39.5