@@ -48,7 +48,7 @@ size_t jl_arr_xtralloc_limit = 0;
48
48
#define MAXINTVAL (((size_t)-1)>>1)
49
49
50
50
static jl_array_t * _new_array_ (jl_value_t * atype , uint32_t ndims , size_t * dims ,
51
- int isunboxed , int elsz )
51
+ int isunboxed , int elsz , int elalign )
52
52
{
53
53
jl_ptls_t ptls = jl_get_ptls_states ();
54
54
size_t i , tot , nel = 1 ;
@@ -87,11 +87,11 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
87
87
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
88
88
if (tot <= ARRAY_INLINE_NBYTES ) {
89
89
if (isunboxed && elsz >= 4 )
90
- tsz = JL_ARRAY_ALIGN (tsz , JL_SMALL_BYTE_ALIGNMENT ); // align data area
90
+ tsz = JL_ARRAY_ALIGN (tsz , elalign ); // align data area
91
91
size_t doffs = tsz ;
92
92
tsz += tot ;
93
93
tsz = JL_ARRAY_ALIGN (tsz , JL_SMALL_BYTE_ALIGNMENT ); // align whole object
94
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_SMALL_BYTE_ALIGNMENT , atype );
94
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , elalign , atype );
95
95
// No allocation or safepoint allowed after this
96
96
a -> flags .how = 0 ;
97
97
data = (char * )a + doffs ;
@@ -122,6 +122,7 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
122
122
a -> flags .ndims = ndims ;
123
123
a -> flags .ptrarray = !isunboxed ;
124
124
a -> elsize = elsz ;
125
+ a -> elalign = elalign ;
125
126
a -> flags .isshared = 0 ;
126
127
a -> flags .isaligned = 1 ;
127
128
a -> offset = 0 ;
@@ -147,14 +148,13 @@ static inline jl_array_t *_new_array(jl_value_t *atype, uint32_t ndims, size_t *
147
148
elsz = sizeof (void * );
148
149
al = elsz ;
149
150
}
150
-
151
- return _new_array_ (atype , ndims , dims , isunboxed , elsz );
151
+ return _new_array_ (atype , ndims , dims , isunboxed , elsz , al );
152
152
}
153
153
154
154
jl_array_t * jl_new_array_for_deserialization (jl_value_t * atype , uint32_t ndims , size_t * dims ,
155
- int isunboxed , int elsz )
155
+ int isunboxed , int elsz , int elalign )
156
156
{
157
- return _new_array_ (atype , ndims , dims , isunboxed , elsz );
157
+ return _new_array_ (atype , ndims , dims , isunboxed , elsz , elalign );
158
158
}
159
159
160
160
#ifndef JL_NDEBUG
@@ -197,6 +197,7 @@ JL_DLLEXPORT jl_array_t *jl_reshape_array(jl_value_t *atype, jl_array_t *data,
197
197
assert (isboxed == data -> flags .ptrarray );
198
198
if (!isboxed ) {
199
199
a -> elsize = elsz ;
200
+ a -> elalign = align ;
200
201
jl_value_t * ownerty = jl_typeof (owner );
201
202
size_t oldelsz = 0 , oldalign = 0 ;
202
203
if (ownerty == (jl_value_t * )jl_string_type ) {
@@ -213,6 +214,7 @@ JL_DLLEXPORT jl_array_t *jl_reshape_array(jl_value_t *atype, jl_array_t *data,
213
214
}
214
215
else {
215
216
a -> elsize = sizeof (void * );
217
+ a -> elalign = sizeof (void * );
216
218
a -> flags .ptrarray = 1 ;
217
219
}
218
220
@@ -266,6 +268,7 @@ JL_DLLEXPORT jl_array_t *jl_string_to_array(jl_value_t *str)
266
268
a -> data = jl_string_data (str );
267
269
a -> flags .isaligned = 0 ;
268
270
a -> elsize = 1 ;
271
+ a -> elalign = 0 ;
269
272
a -> flags .ptrarray = 0 ;
270
273
jl_array_data_owner (a ) = str ;
271
274
a -> flags .how = 3 ;
@@ -305,14 +308,15 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array_1d(jl_value_t *atype, void *data,
305
308
306
309
int ndimwords = jl_array_ndimwords (1 );
307
310
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
308
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_CACHE_BYTE_ALIGNMENT , atype );
311
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , align , atype );
309
312
// No allocation or safepoint allowed after this
310
313
a -> flags .pooled = tsz <= GC_MAX_SZCLASS ;
311
314
a -> data = data ;
312
315
#ifdef STORE_ARRAY_LEN
313
316
a -> length = nel ;
314
317
#endif
315
318
a -> elsize = elsz ;
319
+ a -> elalign = align ;
316
320
a -> flags .ptrarray = !isunboxed ;
317
321
a -> flags .ndims = 1 ;
318
322
a -> flags .isshared = 1 ;
@@ -371,14 +375,15 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data,
371
375
372
376
int ndimwords = jl_array_ndimwords (ndims );
373
377
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
374
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_CACHE_BYTE_ALIGNMENT , atype );
378
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , align , atype );
375
379
// No allocation or safepoint allowed after this
376
380
a -> flags .pooled = tsz <= GC_MAX_SZCLASS ;
377
381
a -> data = data ;
378
382
#ifdef STORE_ARRAY_LEN
379
383
a -> length = nel ;
380
384
#endif
381
385
a -> elsize = elsz ;
386
+ a -> elalign = align ;
382
387
a -> flags .ptrarray = !isunboxed ;
383
388
a -> flags .ndims = ndims ;
384
389
a -> offset = 0 ;
@@ -1042,9 +1047,10 @@ JL_DLLEXPORT void jl_array_sizehint(jl_array_t *a, size_t sz)
1042
1047
JL_DLLEXPORT jl_array_t * jl_array_copy (jl_array_t * ary )
1043
1048
{
1044
1049
size_t elsz = ary -> elsize ;
1050
+ size_t elalign = ary -> elalign ;
1045
1051
size_t len = jl_array_len (ary );
1046
1052
jl_array_t * new_ary = _new_array_ (jl_typeof (ary ), jl_array_ndims (ary ),
1047
- & ary -> nrows , !ary -> flags .ptrarray , elsz );
1053
+ & ary -> nrows , !ary -> flags .ptrarray , elsz , elalign );
1048
1054
memcpy (new_ary -> data , ary -> data , len * elsz );
1049
1055
// ensure isbits union arrays copy their selector bytes correctly
1050
1056
if (!ary -> flags .ptrarray && jl_is_uniontype (jl_tparam0 (jl_typeof (ary )))) {
0 commit comments