Skip to content

Commit 8335ddf

Browse files
committed
rdi: extend per-unit info with symbol ranges; build into baker
1 parent e7669ec commit 8335ddf

File tree

7 files changed

+71
-35
lines changed

7 files changed

+71
-35
lines changed

src/lib_rdi/rdi.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,14 @@ X(RDI_U32, archive_file_path_node)\
762762
X(RDI_U32, build_path_node)\
763763
X(RDI_Language, language)\
764764
X(RDI_U32, line_table_idx)\
765+
X(RDI_U32, procedures_first_idx)\
766+
X(RDI_U32, procedures_count)\
767+
X(RDI_U32, global_variables_first_idx)\
768+
X(RDI_U32, global_variables_count)\
769+
X(RDI_U32, thread_variables_first_idx)\
770+
X(RDI_U32, thread_variables_count)\
771+
X(RDI_U32, constants_first_idx)\
772+
X(RDI_U32, constants_count)\
765773

766774
#define RDI_LineTable_XList \
767775
X(RDI_U32, voffs_base_idx)\
@@ -1319,6 +1327,14 @@ RDI_U32 archive_file_path_node;
13191327
RDI_U32 build_path_node;
13201328
RDI_Language language;
13211329
RDI_U32 line_table_idx;
1330+
RDI_U32 procedures_first_idx;
1331+
RDI_U32 procedures_count;
1332+
RDI_U32 global_variables_first_idx;
1333+
RDI_U32 global_variables_count;
1334+
RDI_U32 thread_variables_first_idx;
1335+
RDI_U32 thread_variables_count;
1336+
RDI_U32 constants_first_idx;
1337+
RDI_U32 constants_count;
13221338
};
13231339

13241340
typedef struct RDI_LineTable RDI_LineTable;

src/lib_rdi_make/rdi_make.c

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,6 @@ rdim_memcpy_struct(dst, to_push); \
5151
} \
5252
rdim_memzero_struct(to_push);
5353

54-
#define RDIM_IdxedChunkListShallowCopy(list_type, chunk_type, src, ...) \
55-
list_type dst = {0};\
56-
RDI_U64 base_idx = 0;\
57-
for(chunk_type *src_n = src->first; src_n != 0; src_n = src_n->next)\
58-
{\
59-
chunk_type *dst_n = rdim_push_array(arena, chunk_type, 1);\
60-
RDIM_SLLQueuePush(dst.first, dst.last, dst_n);\
61-
dst.total_count += src_n->count;\
62-
dst.chunk_count += 1;\
63-
dst_n->count = src_n->count;\
64-
dst_n->cap = dst_n->count;\
65-
dst_n->base_idx = base_idx;\
66-
dst_n->v = src_n->v;\
67-
base_idx += dst_n->count;\
68-
}\
69-
return dst;
70-
7154
////////////////////////////////
7255
//~ rjf: Basic Helpers
7356

@@ -960,12 +943,6 @@ rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChu
960943
RDIM_IdxedChunkListConcatInPlace(RDIM_SymbolChunkNode, dst, to_push);
961944
}
962945

963-
RDI_PROC RDIM_SymbolChunkList
964-
rdim_symbol_chunk_list_shallow_copy(RDIM_Arena *arena, RDIM_SymbolChunkList *src)
965-
{
966-
RDIM_IdxedChunkListShallowCopy(RDIM_SymbolChunkList, RDIM_SymbolChunkNode, src);
967-
}
968-
969946
////////////////////////////////
970947
//~ rjf: [Building] Inline Site Info Building
971948

src/lib_rdi_make/rdi_make.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1475,7 +1475,6 @@ RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChun
14751475
RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap);
14761476
RDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol);
14771477
RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push);
1478-
RDI_PROC RDIM_SymbolChunkList rdim_symbol_chunk_list_shallow_copy(RDIM_Arena *arena, RDIM_SymbolChunkList *src);
14791478

14801479
////////////////////////////////
14811480
//~ rjf: [Building] Inline Site Info Building

src/rdi/rdi.mdesk

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,14 @@ RDI_UnitMemberTable:
600600
{build_path_node RDI_U32 ""}
601601
{language RDI_Language ""}
602602
{line_table_idx RDI_U32 ""}
603+
{procedures_first_idx RDI_U32 ""}
604+
{procedures_count RDI_U32 ""}
605+
{global_variables_first_idx RDI_U32 ""}
606+
{global_variables_count RDI_U32 ""}
607+
{thread_variables_first_idx RDI_U32 ""}
608+
{thread_variables_count RDI_U32 ""}
609+
{constants_first_idx RDI_U32 ""}
610+
{constants_count RDI_U32 ""}
603611
}
604612

605613
@xlist RDI_Unit_XList:

src/rdi_from_dwarf/rdi_from_dwarf.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3112,11 +3112,13 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params)
31123112
bake_params.udts = g_d2r_shared.udts;
31133113
bake_params.src_files = g_d2r_shared.src_files;
31143114
bake_params.line_tables = g_d2r_shared.line_tables;
3115+
#if 0 // TODO(rjf): @locpass
31153116
bake_params.global_variables = g_d2r_shared.gvars;
31163117
bake_params.thread_variables = g_d2r_shared.tvars;
31173118
bake_params.procedures = g_d2r_shared.procs;
31183119
bake_params.scopes = g_d2r_shared.scopes;
31193120
bake_params.inline_sites = g_d2r_shared.inline_sites;
3121+
#endif
31203122

31213123
scratch_end(scratch);
31223124
return bake_params;

src/rdi_from_pdb/rdi_from_pdb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3294,7 +3294,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params)
32943294
U64 sym_constants_chunk_cap = 2048;
32953295
U64 sym_scopes_chunk_cap = 4096;
32963296
U64 sym_inline_sites_chunk_cap = 2048;
3297-
RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx];
3297+
RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx > 0 ? sym_idx-1 : 0];
32983298
RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures;
32993299
RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables;
33003300
RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables;

src/rdi_make/rdi_make_local.c

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)