wide rdi dumping

This commit is contained in:
Ryan Fleury
2025-09-15 13:02:32 -07:00
parent 26606d7895
commit cf94b3757e
+119 -42
View File
@@ -512,19 +512,46 @@ rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64
internal String8List internal String8List
rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags) rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags)
{ {
String8List strings = {0}; ProfBeginFunction();
Temp scratch = scratch_begin(&arena, 1);
String8 indent = str8_lit(" "); String8 indent = str8_lit(" ");
#define dump(str) str8_list_push(arena, &strings, (str))
#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__) //////////////////////////////
#define DumpSubset(name) if(flags & RDI_DumpSubsetFlag_##name) DeferLoop(dumpf("////////////////////////////////\n//~ %S\n\n%S:\n{", rdi_name_title_from_dump_subset_table[RDI_DumpSubset_##name], rdi_name_lowercase_from_dump_subset_table[RDI_DumpSubset_##name]), dump(str8_lit("}\n\n"))) //- rjf: set up
//
typedef struct DumpSubsetOutputNode DumpSubsetOutputNode;
struct DumpSubsetOutputNode
{
DumpSubsetOutputNode *next;
RDI_DumpSubset subset;
String8List *lane_strings;
};
local_persist DumpSubsetOutputNode *first_output_node = 0;
local_persist DumpSubsetOutputNode *last_output_node = 0;
local_persist String8List result_strings = {0};
String8List *strings = 0;
#define dump(str) str8_list_push(arena, strings, (str))
#define dumpf(...) str8_list_pushf(arena, strings, __VA_ARGS__)
#define DumpSubset(name) \
if(lane_idx() == 0)\
{\
DumpSubsetOutputNode *n = push_array(scratch.arena, DumpSubsetOutputNode, 1);\
SLLQueuePush(first_output_node, last_output_node, n);\
n->subset = RDI_DumpSubset_##name;\
n->lane_strings = push_array(scratch.arena, String8List, lane_count());\
}\
lane_sync();\
strings = &last_output_node->lane_strings[lane_idx()];\
lane_sync(); if(flags & RDI_DumpSubsetFlag_##name) ProfScope(#name)
////////////////////////////// //////////////////////////////
//- rjf: dump data sections //- rjf: dump data sections
// //
DumpSubset(DataSections) DumpSubset(DataSections)
{ {
dumpf("\n"); if(lane_idx() == 0) { dumpf("\n"); }
for EachIndex(idx, rdi->sections_count) Rng1U64 range = lane_range(rdi->sections_count);
for EachInRange(idx, range)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
RDI_SectionKind kind = (RDI_SectionKind)idx; RDI_SectionKind kind = (RDI_SectionKind)idx;
@@ -540,14 +567,17 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
// //
DumpSubset(TopLevelInfo) DumpSubset(TopLevelInfo)
{ {
RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); if(lane_idx() == 0)
Temp scratch = scratch_begin(&arena, 1); {
dumpf("\n"); RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);
dumpf(" arch: %S\n", rdi_string_from_arch(scratch.arena, tli->arch)); Temp scratch = scratch_begin(&arena, 1);
dumpf(" exe_name: '%S'\n", str8_from_rdi_string_idx(rdi, tli->exe_name_string_idx)); dumpf("\n");
dumpf(" voff_max: %#08llx\n", tli->voff_max); dumpf(" arch: %S\n", rdi_string_from_arch(scratch.arena, tli->arch));
dumpf(" producer_name: '%S'\n", str8_from_rdi_string_idx(rdi, tli->producer_name_string_idx)); dumpf(" exe_name: '%S'\n", str8_from_rdi_string_idx(rdi, tli->exe_name_string_idx));
scratch_end(scratch); dumpf(" voff_max: %#08llx\n", tli->voff_max);
dumpf(" producer_name: '%S'\n", str8_from_rdi_string_idx(rdi, tli->producer_name_string_idx));
scratch_end(scratch);
}
} }
////////////////////////////// //////////////////////////////
@@ -555,10 +585,14 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
// //
DumpSubset(BinarySections) DumpSubset(BinarySections)
{ {
if(lane_idx() == 0)
{
dumpf("\n // %-16s %-16s %-12s %-12s %-12s %s\n", "name", "flags", "voff_first", "voff_opl", "foff_first", "foff_opl");
}
U64 count = 0; U64 count = 0;
RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count); RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count);
dumpf("\n // %-16s %-16s %-12s %-12s %-12s %s\n", "name", "flags", "voff_first", "voff_opl", "foff_first", "foff_opl"); Rng1U64 range = lane_range(count);
for EachIndex(idx, count) for EachInRange(idx, range)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
RDI_BinarySection *bin_section = &v[idx]; RDI_BinarySection *bin_section = &v[idx];
@@ -581,11 +615,12 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
// //
DumpSubset(FilePaths) DumpSubset(FilePaths)
{ {
dumpf("\n"); if(lane_idx() == 0) { dumpf("\n"); }
U64 count = 0; U64 count = 0;
RDI_FilePathNode *v = rdi_table_from_name(rdi, FilePathNodes, &count); RDI_FilePathNode *v = rdi_table_from_name(rdi, FilePathNodes, &count);
RDI_FilePathNode *nil = &v[0]; RDI_FilePathNode *nil = &v[0];
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_FilePathNode *root = &v[idx]; RDI_FilePathNode *root = &v[idx];
if(root->parent_path_node != 0) { continue; } if(root->parent_path_node != 0) { continue; }
@@ -636,7 +671,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_SourceFile *v = rdi_table_from_name(rdi, SourceFiles, &count); RDI_SourceFile *v = rdi_table_from_name(rdi, SourceFiles, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_SourceFile *source_file = &v[idx]; RDI_SourceFile *source_file = &v[idx];
dumpf("\n { file_path_node_idx: %4u, source_line_map: %4u, path: %-192S } // source_file[%I64u]", dumpf("\n { file_path_node_idx: %4u, source_line_map: %4u, path: %-192S } // source_file[%I64u]",
@@ -645,7 +681,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
push_str8f(arena, "'%S'", str8_from_rdi_string_idx(rdi, source_file->normal_full_path_string_idx)), push_str8f(arena, "'%S'", str8_from_rdi_string_idx(rdi, source_file->normal_full_path_string_idx)),
idx); idx);
} }
dumpf("\n"); if(lane_idx() == lane_count()-1) { dumpf("\n"); }
} }
////////////////////////////// //////////////////////////////
@@ -655,7 +691,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_Unit *v = rdi_table_from_name(rdi, Units, &count); RDI_Unit *v = rdi_table_from_name(rdi, Units, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_Unit *unit = &v[idx]; RDI_Unit *unit = &v[idx];
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
@@ -678,10 +715,11 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
// //
DumpSubset(UnitVMap) DumpSubset(UnitVMap)
{ {
if(lane_idx() == 0) { dumpf("\n"); }
U64 count = 0; U64 count = 0;
RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count); RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count);
dumpf("\n"); Rng1U64 range = lane_range(count);
for EachIndex(idx, count) for EachInRange(idx, range)
{ {
dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx); dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx);
} }
@@ -694,7 +732,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_LineTable *v = rdi_table_from_name(rdi, LineTables, &count); RDI_LineTable *v = rdi_table_from_name(rdi, LineTables, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_LineTable *line_table = &v[idx]; RDI_LineTable *line_table = &v[idx];
RDI_ParsedLineTable parsed_line_table = {0}; RDI_ParsedLineTable parsed_line_table = {0};
@@ -730,7 +769,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_SourceLineMap *v = rdi_table_from_name(rdi, SourceLineMaps, &count); RDI_SourceLineMap *v = rdi_table_from_name(rdi, SourceLineMaps, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
RDI_ParsedSourceLineMap line_map = {0}; RDI_ParsedSourceLineMap line_map = {0};
@@ -762,7 +802,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_TypeNode *v = rdi_table_from_name(rdi, TypeNodes, &count); RDI_TypeNode *v = rdi_table_from_name(rdi, TypeNodes, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
RDI_TypeNode *type = &v[idx]; RDI_TypeNode *type = &v[idx];
@@ -853,7 +894,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_Member *all_members = rdi_table_from_name(rdi, Members, &all_members_count); RDI_Member *all_members = rdi_table_from_name(rdi, Members, &all_members_count);
U64 all_enum_members_count = 0; U64 all_enum_members_count = 0;
RDI_EnumMember *all_enum_members = rdi_table_from_name(rdi, EnumMembers, &all_enum_members_count); RDI_EnumMember *all_enum_members = rdi_table_from_name(rdi, EnumMembers, &all_enum_members_count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_UDT *udt = &v[idx]; RDI_UDT *udt = &v[idx];
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
@@ -910,7 +952,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count); RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_GlobalVariable *gvar = &v[idx]; RDI_GlobalVariable *gvar = &v[idx];
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
@@ -929,10 +972,11 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
// //
DumpSubset(GlobalVariablesVMap) DumpSubset(GlobalVariablesVMap)
{ {
if(lane_idx() == 0) { dumpf("\n"); }
U64 count = 0; U64 count = 0;
RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count); RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count);
dumpf("\n"); Rng1U64 range = lane_range(count);
for EachIndex(idx, count) for EachInRange(idx, range)
{ {
dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx); dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx);
} }
@@ -945,7 +989,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count); RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_ThreadVariable *tvar = &v[idx]; RDI_ThreadVariable *tvar = &v[idx];
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
@@ -966,7 +1011,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_Constant *v = rdi_table_from_name(rdi, Constants, &count); RDI_Constant *v = rdi_table_from_name(rdi, Constants, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_Constant *cnst = &v[idx]; RDI_Constant *cnst = &v[idx];
dumpf("\n '%S': // constant[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, cnst->name_string_idx), idx); dumpf("\n '%S': // constant[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, cnst->name_string_idx), idx);
@@ -983,7 +1029,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);
U64 count = 0; U64 count = 0;
RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_Procedure *proc = &v[idx]; RDI_Procedure *proc = &v[idx];
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
@@ -1023,7 +1070,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
U64 count = 0; U64 count = 0;
RDI_Scope *v = rdi_table_from_name(rdi, Scopes, &count); RDI_Scope *v = rdi_table_from_name(rdi, Scopes, &count);
RDI_Scope *nil = &v[0]; RDI_Scope *nil = &v[0];
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
if(v[idx].parent_scope_idx != 0) { continue; } if(v[idx].parent_scope_idx != 0) { continue; }
RDI_Scope *root = &v[idx]; RDI_Scope *root = &v[idx];
@@ -1132,10 +1180,11 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
// //
DumpSubset(ScopeVMap) DumpSubset(ScopeVMap)
{ {
if(lane_idx() == 0) { dumpf("\n"); }
U64 count = 0; U64 count = 0;
RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count); RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count);
dumpf("\n"); Rng1U64 range = lane_range(count);
for EachIndex(idx, count) for EachInRange(idx, range)
{ {
dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx); dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx);
} }
@@ -1148,7 +1197,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
RDI_InlineSite *v = rdi_table_from_name(rdi, InlineSites, &count); RDI_InlineSite *v = rdi_table_from_name(rdi, InlineSites, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_InlineSite *inline_site = &v[idx]; RDI_InlineSite *inline_site = &v[idx];
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
@@ -1165,7 +1215,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
inline_site_idx); inline_site_idx);
scratch_end(scratch); scratch_end(scratch);
} }
dumpf("\n"); if(lane_idx() == lane_count()-1) { dumpf("\n"); }
} }
////////////////////////////// //////////////////////////////
@@ -1176,7 +1226,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
U64 count = 0; U64 count = 0;
RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count); RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
RDI_ParsedNameMap name_map = {0}; RDI_ParsedNameMap name_map = {0};
rdi_parsed_from_name_map(rdi, &v[idx], &name_map); rdi_parsed_from_name_map(rdi, &v[idx], &name_map);
@@ -1226,15 +1277,41 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{ {
U64 count = 0; U64 count = 0;
U32 *v = rdi_table_from_name(rdi, StringTable, &count); U32 *v = rdi_table_from_name(rdi, StringTable, &count);
for EachIndex(idx, count) Rng1U64 range = lane_range(count);
for EachInRange(idx, range)
{ {
dumpf("\n \"%S\" // string[%I64u]", str8_from_rdi_string_idx(rdi, idx), idx); dumpf("\n \"%S\" // string[%I64u]", str8_from_rdi_string_idx(rdi, idx), idx);
} }
dumpf("\n"); if(lane_idx() == lane_count()-1) { dumpf("\n"); }
} }
//////////////////////////////
//- rjf: join results
//
lane_sync();
if(lane_idx() == 0)
{
for EachNode(n, DumpSubsetOutputNode, first_output_node)
{
String8List subset_strings = {0};
for EachIndex(idx, lane_count())
{
str8_list_concat_in_place(&subset_strings, &n->lane_strings[idx]);
}
if(subset_strings.total_size != 0)
{
str8_list_pushf(arena, &result_strings, "////////////////////////////////\n//~ %S\n\n%S:\n{", rdi_name_title_from_dump_subset_table[n->subset], rdi_name_lowercase_from_dump_subset_table[n->subset]);
str8_list_concat_in_place(&result_strings, &subset_strings);
str8_list_pushf(arena, &result_strings, "}\n\n");
}
}
}
lane_sync();
#undef DumpSubset #undef DumpSubset
#undef dumpf #undef dumpf
#undef dump #undef dump
return strings; scratch_end(scratch);
ProfEnd();
return result_strings;
} }