@@ -54,7 +54,7 @@ size_t jl_arr_xtralloc_limit = 0;
54
54
#define MAXINTVAL (((size_t)-1)>>1)
55
55
56
56
static jl_array_t * _new_array_ (jl_value_t * atype , uint32_t ndims , size_t * dims ,
57
- int isunboxed , int elsz )
57
+ int isunboxed , int elsz , int elalign )
58
58
{
59
59
jl_ptls_t ptls = jl_get_ptls_states ();
60
60
size_t i , tot , nel = 1 ;
@@ -89,11 +89,11 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
89
89
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
90
90
if (tot <= ARRAY_INLINE_NBYTES ) {
91
91
if (isunboxed && elsz >= 4 )
92
- tsz = JL_ARRAY_ALIGN (tsz , JL_SMALL_BYTE_ALIGNMENT ); // align data area
92
+ tsz = JL_ARRAY_ALIGN (tsz , elalign ); // align data area
93
93
size_t doffs = tsz ;
94
94
tsz += tot ;
95
95
tsz = JL_ARRAY_ALIGN (tsz , JL_SMALL_BYTE_ALIGNMENT ); // align whole object
96
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_SMALL_BYTE_ALIGNMENT , atype );
96
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , elalign , atype );
97
97
// No allocation or safepoint allowed after this
98
98
a -> flags .how = 0 ;
99
99
data = (char * )a + doffs ;
@@ -123,6 +123,7 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
123
123
a -> flags .ndims = ndims ;
124
124
a -> flags .ptrarray = !isunboxed ;
125
125
a -> elsize = elsz ;
126
+ a -> elalign = elalign ;
126
127
a -> flags .isshared = 0 ;
127
128
a -> flags .isaligned = 1 ;
128
129
a -> offset = 0 ;
@@ -141,18 +142,20 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
141
142
142
143
static inline jl_array_t * _new_array (jl_value_t * atype , uint32_t ndims , size_t * dims )
143
144
{
144
- int isunboxed = 0 , elsz = sizeof (void * );
145
+ int isunboxed = 0 , elsz = sizeof (void * ), elalign = JL_SMALL_BYTE_ALIGNMENT ;
145
146
jl_value_t * el_type = jl_tparam0 (atype );
146
147
isunboxed = store_unboxed (el_type );
147
- if (isunboxed )
148
+ if (isunboxed ) {
148
149
elsz = jl_datatype_size (el_type );
149
- return _new_array_ (atype , ndims , dims , isunboxed , elsz );
150
+ elalign = jl_datatype_size (el_type );
151
+ }
152
+ return _new_array_ (atype , ndims , dims , isunboxed , elsz , elalign );
150
153
}
151
154
152
155
jl_array_t * jl_new_array_for_deserialization (jl_value_t * atype , uint32_t ndims , size_t * dims ,
153
- int isunboxed , int elsz )
156
+ int isunboxed , int elsz , int elalign )
154
157
{
155
- return _new_array_ (atype , ndims , dims , isunboxed , elsz );
158
+ return _new_array_ (atype , ndims , dims , isunboxed , elsz , elalign );
156
159
}
157
160
158
161
#ifndef NDEBUG
@@ -194,6 +197,7 @@ JL_DLLEXPORT jl_array_t *jl_reshape_array(jl_value_t *atype, jl_array_t *data,
194
197
if (!data -> flags .ptrarray ) {
195
198
a -> elsize = jl_datatype_size (el_type );
196
199
unsigned align = jl_datatype_align (el_type );
200
+ a -> elalign = align ;
197
201
jl_value_t * ownerty = jl_typeof (owner );
198
202
unsigned oldalign = (ownerty == (jl_value_t * )jl_string_type ? 1 :
199
203
jl_datatype_align (jl_tparam0 (ownerty )));
@@ -205,6 +209,7 @@ JL_DLLEXPORT jl_array_t *jl_reshape_array(jl_value_t *atype, jl_array_t *data,
205
209
}
206
210
else {
207
211
a -> elsize = sizeof (void * );
212
+ a -> elalign = sizeof (void * );
208
213
a -> flags .ptrarray = 1 ;
209
214
}
210
215
@@ -258,6 +263,7 @@ JL_DLLEXPORT jl_array_t *jl_string_to_array(jl_value_t *str)
258
263
a -> data = jl_string_data (str );
259
264
a -> flags .isaligned = 0 ;
260
265
a -> elsize = 1 ;
266
+ a -> elalign = 0 ;
261
267
a -> flags .ptrarray = 0 ;
262
268
jl_array_data_owner (a ) = str ;
263
269
a -> flags .how = 3 ;
@@ -294,14 +300,15 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array_1d(jl_value_t *atype, void *data,
294
300
295
301
int ndimwords = jl_array_ndimwords (1 );
296
302
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
297
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_CACHE_BYTE_ALIGNMENT , atype );
303
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , align , atype );
298
304
// No allocation or safepoint allowed after this
299
305
a -> flags .pooled = tsz <= GC_MAX_SZCLASS ;
300
306
a -> data = data ;
301
307
#ifdef STORE_ARRAY_LEN
302
308
a -> length = nel ;
303
309
#endif
304
310
a -> elsize = elsz ;
311
+ a -> elalign = align ;
305
312
a -> flags .ptrarray = !isunboxed ;
306
313
a -> flags .ndims = 1 ;
307
314
a -> flags .isshared = 1 ;
@@ -357,14 +364,15 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data,
357
364
358
365
int ndimwords = jl_array_ndimwords (ndims );
359
366
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
360
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_CACHE_BYTE_ALIGNMENT , atype );
367
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , align , atype );
361
368
// No allocation or safepoint allowed after this
362
369
a -> flags .pooled = tsz <= GC_MAX_SZCLASS ;
363
370
a -> data = data ;
364
371
#ifdef STORE_ARRAY_LEN
365
372
a -> length = nel ;
366
373
#endif
367
374
a -> elsize = elsz ;
375
+ a -> elalign = align ;
368
376
a -> flags .ptrarray = !isunboxed ;
369
377
a -> flags .ndims = ndims ;
370
378
a -> offset = 0 ;
@@ -938,8 +946,9 @@ JL_DLLEXPORT void jl_array_sizehint(jl_array_t *a, size_t sz)
938
946
JL_DLLEXPORT jl_array_t * jl_array_copy (jl_array_t * ary )
939
947
{
940
948
size_t elsz = ary -> elsize ;
949
+ int elalign = ary -> elalign ;
941
950
jl_array_t * new_ary = _new_array_ (jl_typeof (ary ), jl_array_ndims (ary ),
942
- & ary -> nrows , !ary -> flags .ptrarray , elsz );
951
+ & ary -> nrows , !ary -> flags .ptrarray , elsz , elalign );
943
952
memcpy (new_ary -> data , ary -> data , jl_array_len (ary ) * elsz );
944
953
return new_ary ;
945
954
}
0 commit comments