@@ -192,8 +192,21 @@ static const int jl_gc_sizeclasses[JL_GC_N_POOLS] = {
192
192
// 64, 32, 160, 64, 16, 64, 112, 128, bytes lost
193
193
};
194
194
195
- STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass (size_t sz, size_t alignment)
195
+ STATIC_INLINE size_t JL_CONST_FUNC jl_gc_alignsz (size_t sz, size_t alignment)
196
196
{
197
+ // The pools are aligned with JL_HEAP_ALIGNMENT and no bigger alignment is possible.
198
+ assert (alignment <= JL_HEAP_ALIGNMENT);
199
+ // Alignment need to be powers of two
200
+ assert ((alignment & (alignment - 1 )) == 0 );
201
+ size_t alsz = LLT_ALIGN (sz, alignment);
202
+ return alignment ? alsz : sz;
203
+ }
204
+
205
+ // Use jl_gc_alignsz to obtain the right sz.
206
+ STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass (size_t sz)
207
+ {
208
+ // Check that the object fits in the largest pool.
209
+ assert (sz <= GC_MAX_SZCLASS + sizeof (jl_taggedvalue_t ));
197
210
#ifdef _P64
198
211
if (sz <= 8 )
199
212
return 0 ;
@@ -227,17 +240,20 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, size_t alignme
227
240
const size_t allocsz = sz + sizeof (jl_taggedvalue_t );
228
241
if (allocsz < sz) // overflow in adding offs, size was "negative"
229
242
jl_throw (jl_memory_exception);
243
+ const size_t alignsz = jl_gc_alignsz (allocsz, alignment);
230
244
jl_value_t *v;
231
- if (allocsz <= GC_MAX_SZCLASS + sizeof (jl_taggedvalue_t )) {
232
- int pool_id = jl_gc_szclass (allocsz, alignment );
245
+ if (alignsz <= GC_MAX_SZCLASS + sizeof (jl_taggedvalue_t )) {
246
+ int pool_id = jl_gc_szclass (alignsz );
233
247
jl_gc_pool_t *p = &ptls->heap .norm_pools [pool_id];
234
248
int osize;
235
- if (jl_is_constexpr (allocsz )) {
249
+ if (jl_is_constexpr (alignsz )) {
236
250
osize = jl_gc_sizeclasses[pool_id];
237
251
}
238
252
else {
239
253
osize = p->osize ;
240
254
}
255
+ assert ((size_t )osize >= alignment &&
256
+ (alignment == 0 || (osize & (alignment - 1 )) == 0 ));
241
257
v = jl_gc_pool_alloc (ptls, (char *)p - (char *)ptls, osize);
242
258
}
243
259
else {
0 commit comments