separate per-name-map baking stages from each other, and from top-level name map section build; do them all independently

This commit is contained in:
Ryan Fleury
2024-02-22 14:45:09 -08:00
parent 50f7d53db2
commit 0e352f92df
6 changed files with 171 additions and 112 deletions
+22 -16
View File
@@ -2959,7 +2959,7 @@ rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams
//- rjf: name maps //- rjf: name maps
RDI_PROC RDIM_BakeSectionList RDI_PROC RDIM_BakeSectionList
rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT])
{ {
RDIM_BakeSectionList sections = {0}; RDIM_BakeSectionList sections = {0};
@@ -2986,10 +2986,26 @@ rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStr
RDI_NameMap *dst_map = &dst_maps[dst_map_idx]; RDI_NameMap *dst_map = &dst_maps[dst_map_idx];
RDIM_BakeNameMap *src_map = name_maps[k]; RDIM_BakeNameMap *src_map = name_maps[k];
if(src_map == 0 || src_map->name_count == 0) { continue; } if(src_map == 0 || src_map->name_count == 0) { continue; }
dst_map->kind = k;
dst_map->bucket_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); // TODO(rjf): @u64_to_u32
dst_map->node_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); // TODO(rjf): @u64_to_u32
dst_map_idx += 1;
}
}
// rjf: bake name map // rjf: push section for all name maps
RDI_U32 baked_buckets_count = src_map->name_count; rdim_bake_section_list_push_new(arena, &sections, dst_maps, sizeof(RDI_NameMap)*name_map_count, RDI_DataSectionTag_NameMaps, 0);
RDI_U32 baked_nodes_count = src_map->name_count; return sections;
}
RDI_PROC RDIM_BakeSectionList
rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map)
{
RDIM_BakeSectionList sections = {0};
if(map != 0 && map->name_count != 0)
{
RDI_U32 baked_buckets_count = map->name_count;
RDI_U32 baked_nodes_count = map->name_count;
RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count);
RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count);
{ {
@@ -3010,7 +3026,7 @@ rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStr
RDI_U64 count; RDI_U64 count;
}; };
RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count);
for(RDIM_BakeNameMapNode *node = src_map->first; for(RDIM_BakeNameMapNode *node = map->first;
node != 0; node != 0;
node = node->order_next) node = node->order_next)
{ {
@@ -3079,20 +3095,10 @@ rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStr
rdim_scratch_end(scratch); rdim_scratch_end(scratch);
} }
// rjf: fill output header, and push sections for buckets/nodes // rjf: sections for buckets/nodes
dst_map->kind = k;
dst_map->bucket_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); // TODO(rjf): @u64_to_u32
dst_map->node_data_idx = (RDI_U32)rdim_bake_section_idx_from_params_tag_idx(params, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); // TODO(rjf): @u64_to_u32
rdim_bake_section_list_push_new(arena, &sections, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k); rdim_bake_section_list_push_new(arena, &sections, baked_buckets, sizeof(RDI_NameMapBucket)* baked_buckets_count, RDI_DataSectionTag_NameMapBuckets, (RDI_U64)k);
rdim_bake_section_list_push_new(arena, &sections, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k); rdim_bake_section_list_push_new(arena, &sections, baked_nodes, sizeof(RDI_NameMapNode) * baked_nodes_count, RDI_DataSectionTag_NameMapNodes, (RDI_U64)k);
// rjf: inc
dst_map_idx += 1;
} }
}
// rjf: push section for all name maps
rdim_bake_section_list_push_new(arena, &sections, dst_maps, sizeof(RDI_NameMap)*name_map_count, RDI_DataSectionTag_NameMaps, 0);
return sections; return sections;
} }
+2 -1
View File
@@ -1178,7 +1178,8 @@ RDI_PROC RDIM_BakeSectionList rdim_bake_scope_section_list_from_params(RDIM_Aren
RDI_PROC RDIM_BakeSectionList rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); RDI_PROC RDIM_BakeSectionList rdim_bake_scope_vmap_section_list_from_params(RDIM_Arena *arena, RDIM_BakeParams *params);
//- rjf: name maps //- rjf: name maps
RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); RDI_PROC RDIM_BakeSectionList rdim_bake_top_level_name_map_section_list_from_params_maps(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]);
RDI_PROC RDIM_BakeSectionList rdim_bake_name_map_section_list_from_params_kind_map(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeParams *params, RDI_NameMapKind k, RDIM_BakeNameMap *map);
//- rjf: file paths //- rjf: file paths
RDI_PROC RDIM_BakeSectionList rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree); RDI_PROC RDIM_BakeSectionList rdim_bake_file_path_section_list_from_path_tree(RDIM_Arena *arena, RDIM_BakeStringMap *strings, RDIM_BakePathTree *path_tree);
+33 -7
View File
@@ -3518,11 +3518,11 @@ p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p)
} }
internal void * internal void *
p2r_bake_name_maps_task__entry_point(Arena *arena, void *p) p2r_bake_name_map_task__entry_point(Arena *arena, void *p)
{ {
P2R_BakeNameMapsIn *in = (P2R_BakeNameMapsIn *)p; P2R_BakeNameMapIn *in = (P2R_BakeNameMapIn *)p;
RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1); RDIM_BakeSectionList *s = push_array(arena, RDIM_BakeSectionList, 1);
ProfScope("bake name maps") *s = rdim_bake_name_map_section_list_from_params_maps(arena, in->strings, in->idx_runs, in->params, in->name_maps); ProfScope("bake name map %i", in->kind) *s = rdim_bake_name_map_section_list_from_params_kind_map(arena, in->strings, in->idx_runs, in->params, in->kind, in->map);
return s; return s;
} }
@@ -3541,6 +3541,7 @@ p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p)
internal P2R_Bake2Serialize * internal P2R_Bake2Serialize *
p2r_bake(Arena *arena, P2R_Convert2Bake *in) p2r_bake(Arena *arena, P2R_Convert2Bake *in)
{ {
Temp scratch = scratch_begin(&arena, 1);
RDIM_BakeParams *params = &in->bake_params; RDIM_BakeParams *params = &in->bake_params;
RDIM_BakeSectionList sections = {0}; RDIM_BakeSectionList sections = {0};
@@ -3634,12 +3635,33 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
//- rjf: kick off pass 3 tasks //- rjf: kick off pass 3 tasks
P2R_BakeTypeNodesIn bake_type_nodes_in = {strings, idx_runs, params}; P2R_BakeTypeNodesIn bake_type_nodes_in = {strings, idx_runs, params};
TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, 0, &bake_type_nodes_in); TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, 0, &bake_type_nodes_in);
P2R_BakeNameMapsIn bake_name_maps_in = {strings, idx_runs, params}; TS_TicketList bake_name_maps_tickets = {0};
MemoryCopyArray(bake_name_maps_in.name_maps, name_maps); for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1);
TS_Ticket bake_name_maps_ticket = ts_kickoff(p2r_bake_name_maps_task__entry_point, 0, &bake_name_maps_in); k < RDI_NameMapKind_COUNT;
k = (RDI_NameMapKind)(k+1))
{
if(name_maps[k] == 0 || name_maps[k]->name_count == 0)
{
continue;
}
P2R_BakeNameMapIn *in = push_array(scratch.arena, P2R_BakeNameMapIn, 1);
in->strings = strings;
in->idx_runs = idx_runs;
in->params = params;
in->kind = k;
in->map = name_maps[k];
ts_ticket_list_push(scratch.arena, &bake_name_maps_tickets, ts_kickoff(p2r_bake_name_map_task__entry_point, 0, in));
}
P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs}; P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs};
TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, 0, &bake_idx_runs_in); TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, 0, &bake_idx_runs_in);
//- rjf: bake top-level name maps section
ProfScope("top level name maps section")
{
RDIM_BakeSectionList s = rdim_bake_top_level_name_map_section_list_from_params_maps(arena, strings, idx_runs, params, name_maps);
rdim_bake_section_list_concat_in_place(&sections, &s);
}
//- rjf: join units //- rjf: join units
ProfScope("units") ProfScope("units")
{ {
@@ -3734,9 +3756,12 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
//- rjf: join name maps //- rjf: join name maps
ProfScope("name map") ProfScope("name map")
{ {
RDIM_BakeSectionList *s = ts_join_struct(bake_name_maps_ticket, max_U64, RDIM_BakeSectionList); for(TS_TicketNode *n = bake_name_maps_tickets.first; n != 0; n = n->next)
{
RDIM_BakeSectionList *s = ts_join_struct(n->v, max_U64, RDIM_BakeSectionList);
rdim_bake_section_list_concat_in_place(&sections, s); rdim_bake_section_list_concat_in_place(&sections, s);
} }
}
//- rjf: join index runs //- rjf: join index runs
ProfScope("idx runs") ProfScope("idx runs")
@@ -3748,6 +3773,7 @@ p2r_bake(Arena *arena, P2R_Convert2Bake *in)
//- rjf: fill & return //- rjf: fill & return
P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1); P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1);
out->sections = sections; out->sections = sections;
scratch_end(scratch);
return out; return out;
} }
+5 -4
View File
@@ -326,13 +326,14 @@ struct P2R_BakeTypeNodesIn
RDIM_BakeParams *params; RDIM_BakeParams *params;
}; };
typedef struct P2R_BakeNameMapsIn P2R_BakeNameMapsIn; typedef struct P2R_BakeNameMapIn P2R_BakeNameMapIn;
struct P2R_BakeNameMapsIn struct P2R_BakeNameMapIn
{ {
RDIM_BakeStringMap *strings; RDIM_BakeStringMap *strings;
RDIM_BakeIdxRunMap *idx_runs; RDIM_BakeIdxRunMap *idx_runs;
RDIM_BakeParams *params; RDIM_BakeParams *params;
RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]; RDI_NameMapKind kind;
RDIM_BakeNameMap *map;
}; };
typedef struct P2R_BakeIdxRunsIn P2R_BakeIdxRunsIn; typedef struct P2R_BakeIdxRunsIn P2R_BakeIdxRunsIn;
@@ -428,7 +429,7 @@ internal void *p2r_bake_strings_task__entry_point(Arena *arena, void *p);
//- rjf: pass 3: idx-run-map-dependent debug info stream builds //- rjf: pass 3: idx-run-map-dependent debug info stream builds
internal void *p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p); internal void *p2r_bake_type_nodes_task__entry_point(Arena *arena, void *p);
internal void *p2r_bake_name_maps_task__entry_point(Arena *arena, void *p); internal void *p2r_bake_name_map_task__entry_point(Arena *arena, void *p);
internal void *p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p); internal void *p2r_bake_idx_runs_task__entry_point(Arena *arena, void *p);
//////////////////////////////// ////////////////////////////////
+9
View File
@@ -8,6 +8,15 @@ ts_ticket_zero(void)
return ticket; return ticket;
} }
internal void
ts_ticket_list_push(Arena *arena, TS_TicketList *list, TS_Ticket ticket)
{
TS_TicketNode *n = push_array(arena, TS_TicketNode, 1);
n->v = ticket;
SLLQueuePush(list->first, list->last, n);
list->count += 1;
}
//////////////////////////////// ////////////////////////////////
//~ rjf: Top-Level Layer Initialization //~ rjf: Top-Level Layer Initialization
+16
View File
@@ -16,6 +16,21 @@ struct TS_Ticket
U64 u64[2]; U64 u64[2];
}; };
typedef struct TS_TicketNode TS_TicketNode;
struct TS_TicketNode
{
TS_TicketNode *next;
TS_Ticket v;
};
typedef struct TS_TicketList TS_TicketList;
struct TS_TicketList
{
TS_TicketNode *first;
TS_TicketNode *last;
U64 count;
};
//////////////////////////////// ////////////////////////////////
//~ rjf: Task Request Types //~ rjf: Task Request Types
@@ -96,6 +111,7 @@ global TS_Shared *ts_shared = 0;
//~ rjf: Basic Type Functions //~ rjf: Basic Type Functions
internal TS_Ticket ts_ticket_zero(void); internal TS_Ticket ts_ticket_zero(void);
internal void ts_ticket_list_push(Arena *arena, TS_TicketList *list, TS_Ticket ticket);
//////////////////////////////// ////////////////////////////////
//~ rjf: Top-Level Layer Initialization //~ rjf: Top-Level Layer Initialization