@@ -284,12 +284,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
284284 //////////////////////////////////////////////////////////////
285285 //- rjf: @rdim_bake_stage form joined symbol lists, from all units
286286 //
287+ typedef struct UnitSymbolRanges UnitSymbolRanges ;
288+ struct UnitSymbolRanges
289+ {
290+ U64 procedures_first_idx ;
291+ U64 procedures_count ;
292+ U64 global_variables_first_idx ;
293+ U64 global_variables_count ;
294+ U64 thread_variables_first_idx ;
295+ U64 thread_variables_count ;
296+ U64 constants_first_idx ;
297+ U64 constants_count ;
298+ };
287299 RDIM_SymbolChunkList * all_global_variables = 0 ;
288300 RDIM_SymbolChunkList * all_thread_variables = 0 ;
289301 RDIM_SymbolChunkList * all_constants = 0 ;
290302 RDIM_SymbolChunkList * all_procedures = 0 ;
291303 RDIM_ScopeChunkList * all_scopes = 0 ;
292304 RDIM_InlineSiteChunkList * all_inline_sites = 0 ;
305+ UnitSymbolRanges * unit_symbol_ranges = 0 ;
293306 if (lane_idx () == 0 )
294307 {
295308 all_global_variables = push_array (scratch .arena , RDIM_SymbolChunkList , 1 );
@@ -298,20 +311,28 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
298311 all_procedures = push_array (scratch .arena , RDIM_SymbolChunkList , 1 );
299312 all_scopes = push_array (scratch .arena , RDIM_ScopeChunkList , 1 );
300313 all_inline_sites = push_array (scratch .arena , RDIM_InlineSiteChunkList , 1 );
314+ unit_symbol_ranges = push_array (scratch .arena , UnitSymbolRanges , params -> units .total_count );
315+ U64 unit_idx = 0 ;
301316 for EachNode (unit_n , RDIM_UnitChunkNode , params -> units .first )
302317 {
303318 for EachIndex (unit_n_idx , unit_n -> count )
304319 {
305320 RDIM_Unit * unit = & unit_n -> v [unit_n_idx ];
306- RDIM_SymbolChunkList global_variables_shallow_copy = rdim_symbol_chunk_list_shallow_copy (scratch .arena , & unit -> global_variables );
307- RDIM_SymbolChunkList thread_variables_shallow_copy = rdim_symbol_chunk_list_shallow_copy (scratch .arena , & unit -> thread_variables );
308- RDIM_SymbolChunkList constants_shallow_copy = rdim_symbol_chunk_list_shallow_copy (scratch .arena , & unit -> constants );
309- RDIM_SymbolChunkList procedures_shallow_copy = rdim_symbol_chunk_list_shallow_copy (scratch .arena , & unit -> procedures );
310- rdim_symbol_chunk_list_concat_in_place (all_global_variables , & global_variables_shallow_copy );
311- rdim_symbol_chunk_list_concat_in_place (all_thread_variables , & thread_variables_shallow_copy );
312- rdim_symbol_chunk_list_concat_in_place (all_constants , & constants_shallow_copy );
313- rdim_symbol_chunk_list_concat_in_place (all_procedures , & procedures_shallow_copy );
314- // TODO(rjf): @locpass scopes, inline sites
321+ unit_symbol_ranges [unit_idx ].procedures_first_idx = all_procedures -> total_count + 1 ;
322+ unit_symbol_ranges [unit_idx ].procedures_count = unit -> procedures .total_count ;
323+ unit_symbol_ranges [unit_idx ].global_variables_first_idx = all_global_variables -> total_count + 1 ;
324+ unit_symbol_ranges [unit_idx ].global_variables_count = unit -> global_variables .total_count ;
325+ unit_symbol_ranges [unit_idx ].thread_variables_first_idx = all_thread_variables -> total_count + 1 ;
326+ unit_symbol_ranges [unit_idx ].thread_variables_count = unit -> thread_variables .total_count ;
327+ unit_symbol_ranges [unit_idx ].constants_first_idx = all_constants -> total_count + 1 ;
328+ unit_symbol_ranges [unit_idx ].constants_count = unit -> constants .total_count ;
329+ rdim_symbol_chunk_list_concat_in_place (all_global_variables , & unit -> global_variables );
330+ rdim_symbol_chunk_list_concat_in_place (all_thread_variables , & unit -> thread_variables );
331+ rdim_symbol_chunk_list_concat_in_place (all_constants , & unit -> constants );
332+ rdim_symbol_chunk_list_concat_in_place (all_procedures , & unit -> procedures );
333+ rdim_scope_chunk_list_concat_in_place (all_scopes , & unit -> scopes );
334+ rdim_inline_site_chunk_list_concat_in_place (all_inline_sites , & unit -> inline_sites );
335+ unit_idx += 1 ;
315336 }
316337 }
317338 }
@@ -321,6 +342,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
321342 lane_sync_u64 (& all_procedures , 0 );
322343 lane_sync_u64 (& all_scopes , 0 );
323344 lane_sync_u64 (& all_inline_sites , 0 );
345+ lane_sync_u64 (& unit_symbol_ranges , 0 );
324346
325347 //////////////////////////////////////////////////////////////
326348 //- rjf: @rdim_bake_stage bake vmaps
@@ -3328,11 +3350,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
33283350 //- rjf: bake units
33293351 ProfScope ("bake units" )
33303352 {
3353+ U64 base_unit_idx = 0 ;
33313354 for EachNode (n , RDIM_UnitChunkNode , params -> units .first )
33323355 {
33333356 Rng1U64 range = lane_range (n -> count );
33343357 for EachInRange (n_idx , range )
33353358 {
3359+ U64 unit_idx = base_unit_idx + n_idx ;
3360+ UnitSymbolRanges * symbol_ranges = & unit_symbol_ranges [unit_idx ];
33363361 RDIM_Unit * src = & n -> v [n_idx ];
33373362 RDI_Unit * dst = & baked_units [n -> base_idx + n_idx + 1 ];
33383363 dst -> unit_name_string_idx = rdim_bake_idx_from_string (bake_strings , src -> unit_name );
@@ -3343,7 +3368,16 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params)
33433368 dst -> build_path_node = rdim_bake_path_node_idx_from_string (path_tree , src -> build_path );
33443369 dst -> language = src -> language ;
33453370 dst -> line_table_idx = (RDI_U32 )rdim_idx_from_line_table (src -> line_table ); // TODO(rjf): @u64_to_u32
3346- }
3371+ dst -> procedures_first_idx = (RDI_U32 )symbol_ranges -> procedures_first_idx ; // TODO(rjf): @u64_to_u32
3372+ dst -> procedures_count = (RDI_U32 )symbol_ranges -> procedures_count ; // TODO(rjf): @u64_to_u32
3373+ dst -> global_variables_first_idx = (RDI_U32 )symbol_ranges -> global_variables_first_idx ; // TODO(rjf): @u64_to_u32
3374+ dst -> global_variables_count = (RDI_U32 )symbol_ranges -> global_variables_count ; // TODO(rjf): @u64_to_u32
3375+ dst -> thread_variables_first_idx = (RDI_U32 )symbol_ranges -> thread_variables_first_idx ; // TODO(rjf): @u64_to_u32
3376+ dst -> thread_variables_count = (RDI_U32 )symbol_ranges -> thread_variables_count ; // TODO(rjf): @u64_to_u32
3377+ dst -> constants_first_idx = (RDI_U32 )symbol_ranges -> constants_first_idx ; // TODO(rjf): @u64_to_u32
3378+ dst -> constants_count = (RDI_U32 )symbol_ranges -> constants_count ; // TODO(rjf): @u64_to_u32
3379+ }
3380+ base_unit_idx += n -> count ;
33473381 }
33483382 }
33493383
0 commit comments