From 3c003c0c5a2d87da0b94915b5847a82afa0268d7 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Thu, 11 Aug 2022 19:51:57 +0000 Subject: [PATCH] Make jl_datatype_size reflect non-padded field size Padding is then added when creating the struct layout, but otherwise the memory layout should be unchanged. This is an alternative to the proposal in #46260. LLVM size and julia size should now be aligned. --- src/datatype.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/datatype.c b/src/datatype.c index 593a2ededd169..27c7fe8d23c6a 100644 --- a/src/datatype.c +++ b/src/datatype.c @@ -475,11 +475,14 @@ void jl_compute_field_offsets(jl_datatype_t *st) zeroinit = ((jl_datatype_t*)fld)->zeroinit; npointers += fld_npointers; } + desc[i].size = fsz; + fsz = LLT_ALIGN(fsz, al); } else { fsz = sizeof(void*); if (fsz > MAX_ALIGN) fsz = MAX_ALIGN; + desc[i].size = fsz; al = fsz; desc[i].isptr = 1; zeroinit = 1; @@ -503,7 +506,6 @@ void jl_compute_field_offsets(jl_datatype_t *st) } homogeneous &= firstty == fld; desc[i].offset = sz; - desc[i].size = fsz; if (__unlikely(max_offset - sz < fsz)) throw_ovf(should_malloc, desc, st, sz); sz += fsz; @@ -525,9 +527,7 @@ void jl_compute_field_offsets(jl_datatype_t *st) if (al > alignm) alignm = al; } - st->size = LLT_ALIGN(sz, alignm); - if (st->size > sz) - haspadding = 1; + st->size = sz; if (should_malloc && npointers) pointers = (uint32_t*)malloc_s(npointers * sizeof(uint32_t)); else @@ -1470,6 +1470,7 @@ static inline void memassign_safe(int hasptr, jl_value_t *parent, char *dst, con memmove_refs((void**)dst, (void**)src, nptr); jl_gc_multi_wb(parent, src); src = (jl_value_t*)((char*)src + nptr * sizeof(void*)); + dst += nptr * sizeof(void*); nb -= nptr * sizeof(void*); } else {