@@ -782,14 +782,23 @@ static void jl_write_values(jl_serializer_state *s)
782782#define JL_ARRAY_ALIGN (jl_value , nbytes ) LLT_ALIGN(jl_value, nbytes)
783783 jl_array_t * ar = (jl_array_t * )v ;
784784 jl_value_t * et = jl_tparam0 (jl_typeof (v ));
785+ size_t alen = jl_array_len (ar );
786+ size_t datasize = alen * ar -> elsize ;
787+ size_t tot = datasize ;
788+ int isbitsunion = jl_array_isbitsunion (ar );
789+ if (isbitsunion )
790+ tot += alen ;
791+ else if (ar -> elsize == 1 )
792+ tot += 1 ;
785793 int ndimwords = jl_array_ndimwords (ar -> flags .ndims );
786- size_t tsz = JL_ARRAY_ALIGN ( sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
794+ size_t headersize = sizeof (jl_array_t ) + ndimwords * sizeof (size_t );
787795 // copy header
788- ios_write (s -> s , (char * )v , tsz );
796+ ios_write (s -> s , (char * )v , headersize );
797+ size_t alignment_amt = JL_SMALL_BYTE_ALIGNMENT ;
798+ if (tot >= ARRAY_CACHE_ALIGN_THRESHOLD )
799+ alignment_amt = JL_CACHE_BYTE_ALIGNMENT ;
789800 // make some header modifications in-place
790801 jl_array_t * newa = (jl_array_t * )& s -> s -> buf [reloc_offset ];
791- size_t alen = jl_array_len (ar );
792- size_t tot = alen * ar -> elsize ;
793802 if (newa -> flags .ndims == 1 )
794803 newa -> maxsize = alen ;
795804 newa -> offset = 0 ;
@@ -799,8 +808,7 @@ static void jl_write_values(jl_serializer_state *s)
799808
800809 // write data
801810 if (!ar -> flags .ptrarray && !ar -> flags .hasptr ) {
802- uintptr_t data = LLT_ALIGN (ios_pos (s -> const_data ), 16 );
803- // realign stream to max(data-align(array), sizeof(void*))
811+ uintptr_t data = LLT_ALIGN (ios_pos (s -> const_data ), alignment_amt );
804812 write_padding (s -> const_data , data - ios_pos (s -> const_data ));
805813 // write data and relocations
806814 newa -> data = NULL ; // relocation offset
@@ -815,22 +823,27 @@ static void jl_write_values(jl_serializer_state *s)
815823 write_pointer (s -> const_data );
816824 }
817825 else {
818- int isbitsunion = jl_array_isbitsunion (ar );
819- if (ar -> elsize == 1 && !isbitsunion )
820- tot += 1 ;
821- ios_write (s -> const_data , (char * )jl_array_data (ar ), tot );
822- if (isbitsunion )
826+ if (isbitsunion ) {
827+ ios_write (s -> const_data , (char * )jl_array_data (ar ), datasize );
823828 ios_write (s -> const_data , jl_array_typetagdata (ar ), alen );
829+ }
830+ else {
831+ ios_write (s -> const_data , (char * )jl_array_data (ar ), tot );
832+ }
824833 }
825834 }
826835 else {
827- newa -> data = (void * )tsz ; // relocation offset
836+ size_t data = LLT_ALIGN (ios_pos (s -> s ), alignment_amt );
837+ size_t padding_amt = data - ios_pos (s -> s );
838+ write_padding (s -> s , padding_amt );
839+ headersize += padding_amt ;
840+ newa -> data = (void * )headersize ; // relocation offset
828841 arraylist_push (& s -> relocs_list , (void * )(reloc_offset + offsetof(jl_array_t , data ))); // relocation location
829842 arraylist_push (& s -> relocs_list , (void * )(((uintptr_t )DataRef << RELOC_TAG_OFFSET ) + item )); // relocation target
830843 if (ar -> flags .hasptr ) {
831844 // copy all of the data first
832845 const char * data = (const char * )jl_array_data (ar );
833- ios_write (s -> s , data , tot );
846+ ios_write (s -> s , data , datasize );
834847 // the rewrite all of the embedded pointers to null+relocation
835848 uint16_t elsz = ar -> elsize ;
836849 size_t j , np = ((jl_datatype_t * )et )-> layout -> npointers ;
@@ -840,12 +853,12 @@ static void jl_write_values(jl_serializer_state *s)
840853 size_t offset = i * elsz + jl_ptr_offset (((jl_datatype_t * )et ), j ) * sizeof (jl_value_t * );
841854 jl_value_t * fld = * (jl_value_t * * )& data [offset ];
842855 if (fld != NULL ) {
843- arraylist_push (& s -> relocs_list , (void * )(uintptr_t )(reloc_offset + tsz + offset )); // relocation location
856+ arraylist_push (& s -> relocs_list , (void * )(uintptr_t )(reloc_offset + headersize + offset )); // relocation location
844857 arraylist_push (& s -> relocs_list , (void * )backref_id (s , fld )); // relocation target
845- memset (& s -> s -> buf [reloc_offset + tsz + offset ], 0 , sizeof (fld )); // relocation offset (none)
858+ memset (& s -> s -> buf [reloc_offset + headersize + offset ], 0 , sizeof (fld )); // relocation offset (none)
846859 }
847860 else {
848- assert (* (jl_value_t * * )& s -> s -> buf [reloc_offset + tsz + offset ] == NULL );
861+ assert (* (jl_value_t * * )& s -> s -> buf [reloc_offset + headersize + offset ] == NULL );
849862 }
850863 }
851864 }
0 commit comments