From a5e45bf44de100b9d8fc1781e9fe09837161e202 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 23 Apr 2026 19:34:13 +0300 Subject: [PATCH] builtin: fix [ARM64] - failed to build (fixes #26267) --- vlib/builtin/array.v | 20 ++++++++++++------- vlib/builtin/array_d_gcboehm_opt.v | 4 ++-- ...array_data_header_size_runtime.c.must_have | 4 ++++ .../array_data_header_size_runtime.vv | 3 +++ 4 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 vlib/v/gen/c/testdata/array_data_header_size_runtime.c.must_have create mode 100644 vlib/v/gen/c/testdata/array_data_header_size_runtime.vv diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index 39aeac228..e435415f5 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -39,17 +39,23 @@ mut: // Must be aligned to at least the maximum fundamental type alignment (pointer size) // so that the array data following the header is properly aligned. -const array_data_header_size = int(sizeof(voidptr)) +// +// Keep this as a function, not a const. When V bootstraps from generated C, a const +// would bake in the snapshot generator's pointer size instead of the target C ABI. +@[inline] +fn array_data_header_size() int { + return int(sizeof(voidptr)) +} @[inline] fn array_data_allocation_size(total_size u64) u64 { - return u64(array_data_header_size) + __at_least_one(total_size) + return u64(array_data_header_size()) + __at_least_one(total_size) } @[inline] fn alloc_array_data(total_size u64) voidptr { raw := vcalloc(array_data_allocation_size(total_size)) - return unsafe { &u8(raw) + array_data_header_size } + return unsafe { &u8(raw) + array_data_header_size() } } @[inline] @@ -57,7 +63,7 @@ fn alloc_array_data_uninit(total_size u64) voidptr { raw := unsafe { malloc_uninit(array_data_allocation_size(total_size)) } unsafe { (&ArrayDataHeader(raw)).has_slices = false - return &u8(raw) + array_data_header_size + return &u8(raw) + array_data_header_size() } } @@ -92,7 +98,7 @@ fn (a array) data_header() &ArrayDataHeader { return unsafe { nil } } base_data := unsafe { &u8(a.data) - u64(a.offset) } - return unsafe { &ArrayDataHeader(base_data - array_data_header_size) } + return unsafe { &ArrayDataHeader(base_data - array_data_header_size()) } } @[inline] @@ -372,7 +378,7 @@ pub fn (mut a array) ensure_cap(required int) { if a.flags.has(.noslices) && !a.flags.has(.is_slice) && !a.buffer_has_slices() { unsafe { if a.flags.has(.managed) { - free(&u8(a.data) - u64(array_data_header_size)) + free(&u8(a.data) - u64(array_data_header_size())) } else { free(a.data) } @@ -1150,7 +1156,7 @@ pub fn (a &array) free() { if mblock_ptr != unsafe { nil } { unsafe { if a.flags.has(.managed) { - free(mblock_ptr - array_data_header_size) + free(mblock_ptr - array_data_header_size()) } else { free(mblock_ptr) } diff --git a/vlib/builtin/array_d_gcboehm_opt.v b/vlib/builtin/array_d_gcboehm_opt.v index 4a44128b0..812b1bd30 100644 --- a/vlib/builtin/array_d_gcboehm_opt.v +++ b/vlib/builtin/array_d_gcboehm_opt.v @@ -8,7 +8,7 @@ module builtin @[inline] fn alloc_array_data_noscan(total_size u64) voidptr { raw := vcalloc_noscan(array_data_allocation_size(total_size)) - return unsafe { &u8(raw) + array_data_header_size } + return unsafe { &u8(raw) + array_data_header_size() } } @[inline] @@ -16,7 +16,7 @@ fn alloc_array_data_noscan_uninit(total_size u64) voidptr { raw := unsafe { malloc_noscan_uninit(array_data_allocation_size(total_size)) } unsafe { (&ArrayDataHeader(raw)).has_slices = false - return &u8(raw) + array_data_header_size + return &u8(raw) + array_data_header_size() } } diff --git a/vlib/v/gen/c/testdata/array_data_header_size_runtime.c.must_have b/vlib/v/gen/c/testdata/array_data_header_size_runtime.c.must_have new file mode 100644 index 000000000..c2ebcae66 --- /dev/null +++ b/vlib/v/gen/c/testdata/array_data_header_size_runtime.c.must_have @@ -0,0 +1,4 @@ +VV_LOC int builtin__array_data_header_size(void) { +return ((int)(sizeof(voidptr))); +return ((u8*)(raw)) + builtin__array_data_header_size(); +return ((ArrayDataHeader*)(base_data - builtin__array_data_header_size())); diff --git a/vlib/v/gen/c/testdata/array_data_header_size_runtime.vv b/vlib/v/gen/c/testdata/array_data_header_size_runtime.vv new file mode 100644 index 000000000..b939bb553 --- /dev/null +++ b/vlib/v/gen/c/testdata/array_data_header_size_runtime.vv @@ -0,0 +1,3 @@ +fn main() { + _ = []string{len: 2} +} -- 2.39.5