@@ -1781,9 +1781,10 @@ static void jl_update_all_fptrs(jl_serializer_state *s)
1781
1781
jl_register_fptrs (sysimage_base , & fvars , linfos , sysimg_fvars_max );
1782
1782
}
1783
1783
1784
- static void write_gvars (jl_serializer_state * s , arraylist_t * globals ) JL_NOTSAFEPOINT
1784
+ static uint32_t write_gvars (jl_serializer_state * s , arraylist_t * globals , arraylist_t * external_fns ) JL_NOTSAFEPOINT
1785
1785
{
1786
- ios_ensureroom (s -> gvar_record , globals -> len * sizeof (reloc_t ));
1786
+ size_t len = globals -> len + external_fns -> leng
1787
+ ios_ensureroom (s -> gvar_record , len * sizeof (reloc_t ));
1787
1788
for (size_t i = 0 ; i < globals -> len ; i ++ ) {
1788
1789
void * g = globals -> items [i ];
1789
1790
void * b = ptrhash_get (& bindings , g );
@@ -1796,10 +1797,17 @@ static void write_gvars(jl_serializer_state *s, arraylist_t *globals) JL_NOTSAFE
1796
1797
uintptr_t reloc = get_reloc_for_item (item , 0 );
1797
1798
write_reloc_t (s -> gvar_record , reloc );
1798
1799
}
1800
+ for (size_t i = 0 ; i < external_fns -> len ; i ++ ) {
1801
+ jl_codeinstance_t * ci = external_fns -> items [i ];
1802
+ uintptr_t item = backref_id (s , (void * )ci , s -> link_ids_external_fnvars );
1803
+ uintptr_t reloc = get_reloc_for_item (item , 0 );
1804
+ write_reloc_t (s -> gvar_record , reloc );
1805
+ }
1806
+ return globals -> len + 1 ;
1799
1807
}
1800
1808
1801
1809
// Pointer relocation for native-code referenced global variables
1802
- static void jl_update_all_gvars (jl_serializer_state * s , int32_t external_fns_begin )
1810
+ static void jl_update_all_gvars (jl_serializer_state * s , uint32_t external_fns_begin )
1803
1811
{
1804
1812
if (sysimg_gvars_base == NULL )
1805
1813
return ;
@@ -1820,10 +1828,9 @@ static void jl_update_all_gvars(jl_serializer_state *s, int32_t external_fns_beg
1820
1828
}
1821
1829
else {
1822
1830
uintptr_t v = get_item_for_reloc (s , base , size , offset , s -> link_ids_external_fnvars , & external_fns_link_index );
1823
- jl_breakpoint ((jl_value_t * )v );
1824
1831
jl_code_instance_t * codeinst = (jl_code_instance_t * ) v ;
1825
- // TODO: use side-table to decide if call location is specsig or not instead of assuming
1826
- * sysimg_gvars (sysimg_gvars_base , gvname_index ) = codeinst -> isspecsig ? codeinst -> specptr .fptr : codeinst -> invoke ;
1832
+ assert ( codeinst -> isspecsig );
1833
+ * sysimg_gvars (sysimg_gvars_base , gvname_index ) = codeinst -> specptr .fptr ;
1827
1834
}
1828
1835
}
1829
1836
gvname_index += 1 ;
@@ -2315,12 +2322,12 @@ static void jl_save_system_image_to_stream(ios_t *f,
2315
2322
}
2316
2323
}
2317
2324
2325
+ uint32_t external_fns_begin = 0 ;
2318
2326
{ // step 2: build all the sysimg sections
2319
2327
write_padding (& sysimg , sizeof (uintptr_t ));
2320
2328
jl_write_values (& s );
2321
2329
jl_write_relocations (& s );
2322
- write_gvars (& s , & gvars );
2323
- // TODO write external_fns;
2330
+ external_fns_begin = write_gvars (& s , & gvars , & external_fns );
2324
2331
}
2325
2332
2326
2333
if (sysimg .size > ((uintptr_t )1 << RELOC_TAG_OFFSET )) {
@@ -2421,9 +2428,7 @@ static void jl_save_system_image_to_stream(ios_t *f,
2421
2428
ios_write (f , (char * )jl_array_data (s .link_ids_gvars ), jl_array_len (s .link_ids_gvars )* sizeof (uint64_t ));
2422
2429
write_uint32 (f , jl_array_len (s .link_ids_external_fnvars ));
2423
2430
ios_write (f , (char * )jl_array_data (s .link_ids_external_fnvars ), jl_array_len (s .link_ids_external_fnvars )* sizeof (uint64_t ));
2424
- // write the gvar boundary between global variables and external functions
2425
- write_int32 (f , jl_get_llvm_external_fns_begin (native_functions ));
2426
-
2431
+ write_uint32 (f , external_fns_begin );
2427
2432
jl_write_arraylist (s .s , & s .ccallable_list );
2428
2433
}
2429
2434
// Write the build_id key
@@ -2441,6 +2446,7 @@ static void jl_save_system_image_to_stream(ios_t *f,
2441
2446
arraylist_free (& s .relocs_list );
2442
2447
arraylist_free (& s .gctags_list );
2443
2448
arraylist_free (& gvars );
2449
+ arraylist_free (& external_fns );
2444
2450
htable_free (& field_replace );
2445
2451
if (worklist )
2446
2452
htable_free (& external_objects );
0 commit comments