rdi dump parseability pass

This commit is contained in:
Ryan Fleury
2025-06-20 09:08:25 -07:00
parent ad995374bb
commit 995f65ee1a
+122 -105
View File
@@ -516,13 +516,14 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
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", rdi_name_title_from_dump_subset_table[RDI_DumpSubset_##name]), dump(str8_lit("\n")))
#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: dump data sections
//
DumpSubset(DataSections) DeferLoop(dumpf("data_sections:\n{\n"), dumpf("}\n"))
DumpSubset(DataSections)
{
dumpf("\n");
for EachIndex(idx, rdi->sections_count)
{
Temp scratch = scratch_begin(&arena, 1);
@@ -537,10 +538,11 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
//////////////////////////////
//- rjf: dump top-level-info
//
DumpSubset(TopLevelInfo) DeferLoop(dumpf("top_level_info:\n{\n"), dumpf("}\n"))
DumpSubset(TopLevelInfo)
{
RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);
Temp scratch = scratch_begin(&arena, 1);
dumpf("\n");
dumpf(" arch: %S\n", rdi_string_from_arch(scratch.arena, tli->arch));
dumpf(" exe_name: '%S'\n", str8_from_rdi_string_idx(rdi, tli->exe_name_string_idx));
dumpf(" voff_max: %#08llx\n", tli->voff_max);
@@ -551,11 +553,11 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
//////////////////////////////
//- rjf: dump binary sections
//
DumpSubset(BinarySections) DeferLoop(dumpf("binary_sections:\n{\n"), dumpf("}\n"))
DumpSubset(BinarySections)
{
U64 count = 0;
RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count);
dumpf(" // %-16s %-16s %-12s %-12s %-12s %s\n", "name", "flags", "voff_first", "voff_opl", "foff_first", "foff_opl");
dumpf("\n // %-16s %-16s %-12s %-12s %-12s %s\n", "name", "flags", "voff_first", "voff_opl", "foff_first", "foff_opl");
for EachIndex(idx, count)
{
Temp scratch = scratch_begin(&arena, 1);
@@ -577,8 +579,9 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
//////////////////////////////
//- rjf: dump file paths
//
DumpSubset(FilePaths) DeferLoop(dumpf("file_path_tree:\n{\n"), dumpf("}\n"))
DumpSubset(FilePaths)
{
dumpf("\n");
U64 count = 0;
RDI_FilePathNode *v = rdi_table_from_name(rdi, FilePathNodes, &count);
RDI_FilePathNode *nil = &v[0];
@@ -629,25 +632,26 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
//////////////////////////////
//- rjf: dump source files
//
DumpSubset(SourceFiles) DeferLoop(dumpf("source_files:\n{\n"), dumpf("}\n"))
DumpSubset(SourceFiles)
{
U64 count = 0;
RDI_SourceFile *v = rdi_table_from_name(rdi, SourceFiles, &count);
for EachIndex(idx, count)
{
RDI_SourceFile *source_file = &v[idx];
dumpf(" { file_path_node_idx: %4u, source_line_map: %4u, path: %-192S } // source_file[%I64u]\n",
dumpf("\n { file_path_node_idx: %4u, source_line_map: %4u, path: %-192S } // source_file[%I64u]",
source_file->file_path_node_idx,
source_file->source_line_map_idx,
push_str8f(arena, "'%S'", str8_from_rdi_string_idx(rdi, source_file->normal_full_path_string_idx)),
idx);
}
dumpf("\n");
}
//////////////////////////////
//- rjf: dump units
//
DumpSubset(Units) DeferLoop(dumpf("units:\n{"), dumpf("}\n"))
DumpSubset(Units)
{
U64 count = 0;
RDI_Unit *v = rdi_table_from_name(rdi, Units, &count);
@@ -656,14 +660,14 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_Unit *unit = &v[idx];
Temp scratch = scratch_begin(&arena, 1);
dumpf("\n // unit[%I64u]\n {\n", idx);
dumpf(" unit_name: '%S'\n", str8_from_rdi_string_idx(rdi, unit->unit_name_string_idx));
dumpf(" compiler_name: '%S'\n", str8_from_rdi_string_idx(rdi, unit->compiler_name_string_idx));
dumpf(" source_file_path: %u\n", unit->source_file_path_node);
dumpf(" object_file_path: %u\n", unit->object_file_path_node);
dumpf(" unit_name: '%S'\n", str8_from_rdi_string_idx(rdi, unit->unit_name_string_idx));
dumpf(" compiler_name: '%S'\n", str8_from_rdi_string_idx(rdi, unit->compiler_name_string_idx));
dumpf(" source_file_path: %u\n", unit->source_file_path_node);
dumpf(" object_file_path: %u\n", unit->object_file_path_node);
dumpf(" archive_file_path: %u\n", unit->archive_file_path_node);
dumpf(" build_path: %u\n", unit->build_path_node);
dumpf(" language: %S\n", rdi_string_from_language(scratch.arena, unit->language));
dumpf(" line_table_idx: %u\n", unit->line_table_idx);
dumpf(" build_path: %u\n", unit->build_path_node);
dumpf(" language: %S\n", rdi_string_from_language(scratch.arena, unit->language));
dumpf(" line_table_idx: %u\n", unit->line_table_idx);
dumpf(" }\n");
scratch_end(scratch);
}
@@ -672,10 +676,11 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
//////////////////////////////
//- rjf: dump unit vmap
//
DumpSubset(UnitVMap) DeferLoop(dumpf("unit_vmap:\n{\n"), dumpf("}\n"))
DumpSubset(UnitVMap)
{
U64 count = 0;
RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count);
dumpf("\n");
for EachIndex(idx, count)
{
dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx);
@@ -694,7 +699,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_LineTable *line_table = &v[idx];
RDI_ParsedLineTable parsed_line_table = {0};
rdi_parsed_from_line_table(rdi, line_table, &parsed_line_table);
dumpf("line_table[%I64u]:\n", idx);
dumpf("\n // line_table[%I64u]\n {\n", idx);
for EachIndex(line_idx, parsed_line_table.count)
{
U64 first = parsed_line_table.voffs[line_idx];
@@ -707,13 +712,14 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
}
if(col == 0)
{
dumpf(" [0x%08I64x,0x%08I64x) file=%u; line=%u\n", first, opl, line->file_idx, line->line_num);
dumpf(" { [0x%08I64x, 0x%08I64x) file: %u, line: %u }\n", first, opl, line->file_idx, line->line_num);
}
else
{
dumpf(" [0x%08I64x,0x%08I64x) file=%u; line=%u; columns=[%u,%u)\n", first, opl, line->file_idx, line->line_num, col->col_first, col->col_opl);
dumpf(" { [0x%08I64x, 0x%08I64x) file: %u, line: %u, columns: [%u, %u) }\n", first, opl, line->file_idx, line->line_num, col->col_first, col->col_opl);
}
}
dumpf(" }\n");
}
}
@@ -729,7 +735,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
Temp scratch = scratch_begin(&arena, 1);
RDI_ParsedSourceLineMap line_map = {0};
rdi_parsed_from_source_line_map(rdi, &v[idx], &line_map);
dumpf("source_line_map[%I64u]:\n", idx);
dumpf("\n // source_line_map[%I64u]\n {\n", idx);
for EachIndex(line_num_idx, line_map.count)
{
Temp temp = temp_begin(scratch.arena);
@@ -741,9 +747,10 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
str8_list_pushf(temp.arena, &list, "%#llx", line_map.voffs[voff_idx]);
}
String8 voffs_string = str8_list_join(temp.arena, &list, &(StringJoin){.sep = str8_lit(", ")});
dumpf(" %u: %S\n", line_map.nums[line_num_idx], voffs_string);
dumpf(" %u: (%S)\n", line_map.nums[line_num_idx], voffs_string);
temp_end(temp);
}
dumpf(" }\n");
scratch_end(scratch);
}
}
@@ -761,25 +768,25 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_TypeNode *type = &v[idx];
String8 type_kind_str = {0};
type_kind_str.str = rdi_string_from_type_kind(type->kind, &type_kind_str.size);
dumpf("type[%I64u]:\n", idx);
dumpf(" kind =%S\n", type_kind_str);
dumpf("\n // type[%I64u]\n {\n", idx);
dumpf(" kind: %S\n", type_kind_str);
if(type->kind == RDI_TypeKind_Modifier)
{
dumpf(" flags =%S\n", rdi_string_from_type_modifier_flags(scratch.arena, type->flags));
dumpf(" flags: %S\n", rdi_string_from_type_modifier_flags(scratch.arena, type->flags));
}
else if(type->flags != 0)
{
dumpf(" flags=%#x (missing stringizer path)\n", type->flags);
dumpf(" flags: %#x (missing stringizer path)\n", type->flags);
}
dumpf(" byte_size =%u\n", type->byte_size);
dumpf(" byte_size: %u\n", type->byte_size);
if(RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind <= RDI_TypeKind_LastBuiltIn)
{
dumpf(" built_in.name ='%S'\n", str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx));
dumpf(" name: '%S'\n", str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx));
}
else if(type->kind == RDI_TypeKind_Array)
{
dumpf(" constructed.direct_type =%u\n", type->constructed.direct_type_idx);
dumpf(" constructed.array_count =%u\n", type->constructed.count);
dumpf(" constructed__direct_type: %u\n", type->constructed.direct_type_idx);
dumpf(" constructed__array_count: %u\n", type->constructed.count);
}
else if(type->kind == RDI_TypeKind_Function)
{
@@ -791,8 +798,8 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
str8_list_pushf(scratch.arena, &param_idx_strings, "%u", param_idx_array[param_idx]);
}
String8 param_idx_str = str8_list_join(scratch.arena, &param_idx_strings, &(StringJoin){.pre = str8_lit("["), .sep = str8_lit(", "), .post = str8_lit("]")});
dumpf(" constructed.params =%S\n", param_idx_str);
dumpf(" return_type =%u\n", type->constructed.direct_type_idx);
dumpf(" constructed__params: %S\n", param_idx_str);
dumpf(" return_type: %u\n", type->constructed.direct_type_idx);
}
else if(type->kind == RDI_TypeKind_Method)
{
@@ -811,25 +818,26 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
str8_list_pushf(scratch.arena, &param_idx_strings, "%u", param_idx_array[param_idx]);
}
String8 param_idx_str = str8_list_join(scratch.arena, &param_idx_strings, &(StringJoin){.pre = str8_lit("["), .sep = str8_lit(", "), .post = str8_lit("]")});
dumpf(" constructed.this_type =%S\n", this_type_str);
dumpf(" constructed.params =%S\n", param_idx_str);
dumpf(" return_type =%u\n", type->constructed.direct_type_idx);
dumpf(" constructed__this_type: %S\n", this_type_str);
dumpf(" constructed__params: %S\n", param_idx_str);
dumpf(" return_type: %u\n", type->constructed.direct_type_idx);
}
else if(RDI_TypeKind_FirstConstructed <= type->kind && type->kind <= RDI_TypeKind_LastConstructed)
{
dumpf(" constructed.direct_type =%u\n", type->constructed.direct_type_idx);
dumpf(" constructed__direct_type: %u\n", type->constructed.direct_type_idx);
}
else if(RDI_TypeKind_FirstUserDefined <= type->kind && type->kind <= RDI_TypeKind_LastUserDefined)
{
dumpf(" user_defined.name ='%S'\n", str8_from_rdi_string_idx(rdi, type->user_defined.name_string_idx));
dumpf(" user_defined.direct_type=%u\n", type->user_defined.direct_type_idx);
dumpf(" user_defined.udt =%u\n", type->user_defined.udt_idx);
dumpf(" name: '%S'\n", str8_from_rdi_string_idx(rdi, type->user_defined.name_string_idx));
dumpf(" user_defined__direct_type: %u\n", type->user_defined.direct_type_idx);
dumpf(" user_defined__udt: %u\n", type->user_defined.udt_idx);
}
else if(type->kind == RDI_TypeKind_Bitfield)
{
dumpf(" bitfield.off =%u\n", type->bitfield.off);
dumpf(" bitfield.size =%u\n", type->bitfield.size);
dumpf(" bitfield__off: %u\n", type->bitfield.off);
dumpf(" bitfield__size: %u\n", type->bitfield.size);
}
dumpf(" }\n");
scratch_end(scratch);
}
}
@@ -849,12 +857,12 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{
RDI_UDT *udt = &v[idx];
Temp scratch = scratch_begin(&arena, 1);
dumpf("udt[%I64u]:\n", idx);
dumpf(" self_type=%u\n", udt->self_type_idx);
dumpf(" flags =%S\n", rdi_string_from_udt_flags(scratch.arena, udt->flags));
dumpf("\n // udt[%I64u]\n {\n", idx);
dumpf(" self_type: %u\n", udt->self_type_idx);
dumpf(" flags: `%S`\n", rdi_string_from_udt_flags(scratch.arena, udt->flags));
if(udt->file_idx != 0)
{
dumpf(" loc ={file=%u; line=%u; col=%u}\n", udt->file_idx, udt->line, udt->col);
dumpf(" loc: {file: %u, line: %u, col: %u}\n", udt->file_idx, udt->line, udt->col);
}
if(udt->flags & RDI_UDTFlag_EnumMembers)
{
@@ -862,14 +870,14 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
U32 member_lo = ClampTop(udt->member_first, member_hi);
if(member_lo < member_hi)
{
dumpf(" enum_members=\n");
dumpf(" {\n");
dumpf(" enum_members:\n");
dumpf(" {\n");
for(U32 enum_member_idx = member_lo; enum_member_idx < member_hi; enum_member_idx += 1)
{
RDI_EnumMember *enum_member = &all_enum_members[enum_member_idx];
dumpf(" { %llu, '%S' }\n", enum_member->val, str8_from_rdi_string_idx(rdi, enum_member->name_string_idx));
dumpf(" '%S': %I64u\n", str8_from_rdi_string_idx(rdi, enum_member->name_string_idx), enum_member->val);
}
dumpf(" }\n");
dumpf(" }\n");
}
}
else
@@ -878,18 +886,19 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
U32 member_lo = ClampTop(udt->member_first, member_hi);
if(member_lo < member_hi)
{
dumpf(" members=\n");
dumpf(" {\n");
dumpf(" members:\n");
dumpf(" {\n");
for(U32 member_idx = member_lo; member_idx < member_hi; member_idx += 1)
{
RDI_Member *member = &all_members[member_idx];
String8 kind_str = rdi_string_from_member_kind(scratch.arena, member->kind);
String8 name_str = str8_from_rdi_string_idx(rdi, member->name_string_idx);
dumpf(" { kind=%S, type=%u, off=%u, name='%S' }\n", kind_str, member->type_idx, member->off, name_str);
dumpf(" '%S': { kind: %S, type: %u, off: %u }\n", name_str, kind_str, member->type_idx, member->off);
}
dumpf(" }\n");
dumpf(" }\n");
}
}
dumpf(" }\n");
scratch_end(scratch);
}
}
@@ -905,12 +914,12 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{
RDI_GlobalVariable *gvar = &v[idx];
Temp scratch = scratch_begin(&arena, 1);
dumpf("global_variable[%I64u]:\n", idx);
dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, gvar->name_string_idx));
dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, gvar->link_flags));
dumpf(" voff =%#08x\n", gvar->voff);
dumpf(" type_idx =%u\n", gvar->type_idx);
dumpf(" container_idx=%u\n", gvar->container_idx);
dumpf("\n '%S': // global_variable[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, gvar->name_string_idx), idx);
dumpf(" link_flags: `%S`\n", rdi_string_from_link_flags(scratch.arena, gvar->link_flags));
dumpf(" voff: %#08x\n", gvar->voff);
dumpf(" type_idx: %u\n", gvar->type_idx);
dumpf(" container_idx: %u\n", gvar->container_idx);
dumpf(" }\n");
scratch_end(scratch);
}
}
@@ -922,9 +931,10 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{
U64 count = 0;
RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count);
dumpf("\n");
for EachIndex(idx, count)
{
dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx);
dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx);
}
}
@@ -939,12 +949,12 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{
RDI_ThreadVariable *tvar = &v[idx];
Temp scratch = scratch_begin(&arena, 1);
dumpf("thread_variable[%I64u]:\n", idx);
dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, tvar->name_string_idx));
dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, tvar->link_flags));
dumpf(" tls_off =%#08x\n", tvar->tls_off);
dumpf(" type_idx =%u\n", tvar->type_idx);
dumpf(" container_idx=%u\n", tvar->container_idx);
dumpf("\n '%S': // thread_variable[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, tvar->name_string_idx), idx);
dumpf(" link_flags: `%S`\n", rdi_string_from_link_flags(scratch.arena, tvar->link_flags));
dumpf(" tls_off: %#08x\n", tvar->tls_off);
dumpf(" type_idx: %u\n", tvar->type_idx);
dumpf(" container_idx: %u\n", tvar->container_idx);
dumpf(" }\n");
scratch_end(scratch);
}
}
@@ -959,9 +969,9 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
for EachIndex(idx, count)
{
RDI_Constant *cnst = &v[idx];
dumpf("constant[%I64u]:\n", idx);
dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, cnst->name_string_idx));
dumpf(" type_idx ='%u'\n", cnst->type_idx);
dumpf("\n '%S': // constant[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, cnst->name_string_idx), idx);
dumpf(" type_idx: %u\n", cnst->type_idx);
dumpf(" }\n");
}
}
@@ -978,19 +988,19 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_Procedure *proc = &v[idx];
Temp scratch = scratch_begin(&arena, 1);
String8List frame_base_location_strings = rdi_strings_from_locations(scratch.arena, rdi, tli->arch, r1u64(proc->frame_base_location_first, proc->frame_base_location_opl));
dumpf("procedure[%I64u]:\n", idx);
dumpf(" name ='%S'\n", str8_from_rdi_string_idx(rdi, proc->name_string_idx));
dumpf(" link_name ='%S'\n", str8_from_rdi_string_idx(rdi, proc->link_name_string_idx));
dumpf(" link_flags =%S\n", rdi_string_from_link_flags(scratch.arena, proc->link_flags));
dumpf(" type_idx =%u\n", proc->type_idx);
dumpf(" root_scope_idx =%u\n", proc->root_scope_idx);
dumpf(" container_idx =%u\n", proc->container_idx);
dumpf(" frame_base (first=%u, opl=%u)=\n", proc->frame_base_location_first, proc->frame_base_location_opl);
dumpf(" {\n");
dumpf("\n '%S': // procedure[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, proc->name_string_idx), idx);
dumpf(" link_name: '%S'\n", str8_from_rdi_string_idx(rdi, proc->link_name_string_idx));
dumpf(" link_flags: `%S`\n", rdi_string_from_link_flags(scratch.arena, proc->link_flags));
dumpf(" type_idx: %u\n", proc->type_idx);
dumpf(" root_scope_idx: %u\n", proc->root_scope_idx);
dumpf(" container_idx: %u\n", proc->container_idx);
dumpf(" frame_base: // (first: %u, opl: %u)\n", proc->frame_base_location_first, proc->frame_base_location_opl);
dumpf(" {\n");
for(String8Node *n = frame_base_location_strings.first; n != 0; n = n->next)
{
dumpf(" %S\n", n->string);
dumpf(" %S\n", n->string);
}
dumpf(" }\n");
dumpf(" }\n");
scratch_end(scratch);
}
@@ -1001,6 +1011,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
//
DumpSubset(Scopes)
{
dumpf("\n");
RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);
U64 scope_voffs_count = 0;
U64 *scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &scope_voffs_count);
@@ -1013,7 +1024,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{
if(v[idx].parent_scope_idx != 0) { continue; }
RDI_Scope *root = &v[idx];
S64 depth = 0;
S64 depth = 1;
for(RDI_Scope *scope = root, *rec_next = nil; scope != nil; scope = rec_next)
{
// rjf: scope list(voff_range) => string
@@ -1048,17 +1059,17 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
}
// rjf: dump
dumpf("%.*sscope[%I64u]:\n", depth*2, indent.str, (U64)(scope - v));
dumpf("%.*s// scope[%I64u]\n", depth*2, indent.str, (U64)(scope - v));
dumpf("%.*s{\n", depth*2, indent.str);
dumpf("%.*s proc_idx =%u ('%S')\n", depth*2, indent.str, scope->proc_idx, procedure_name);
dumpf("%.*s first_child_scope_idx =%u\n", depth*2, indent.str, scope->first_child_scope_idx);
dumpf("%.*s next_sibling_scope_idx=%u\n", depth*2, indent.str, scope->next_sibling_scope_idx);
dumpf("%.*s proc_idx: %u // %S\n", depth*2, indent.str, scope->proc_idx, procedure_name);
dumpf("%.*s first_child_scope_idx: %u\n", depth*2, indent.str, scope->first_child_scope_idx);
dumpf("%.*s next_sibling_scope_idx: %u\n", depth*2, indent.str, scope->next_sibling_scope_idx);
if(scope->inline_site_idx != 0)
{
dumpf("%.*s inline_site_idx =%u ('%S')\n", depth*2, indent.str, scope->inline_site_idx, inline_site_name);
dumpf("%.*s inline_site_idx: %u ('%S')\n", depth*2, indent.str, scope->inline_site_idx, inline_site_name);
}
dumpf("%.*s voff_ranges =%S\n", depth*2, indent.str, voff_range_list_string);
dumpf("%.*s locals=\n", depth*2, indent.str);
dumpf("%.*s voff_ranges: %S\n", depth*2, indent.str, voff_range_list_string);
dumpf("%.*s locals:\n", depth*2, indent.str);
dumpf("%.*s {\n", depth*2, indent.str);
{
U32 local_lo = ClampTop(scope->local_first, locals_count);
@@ -1069,11 +1080,11 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{
Temp scratch = scratch_begin(&arena, 1);
RDI_Local *local_ptr = &locals[local_idx];
dumpf("%.*s local[%u]:\n", depth*2, indent.str, local_idx);
dumpf("%.*s kind =%S\n", depth*2, indent.str, rdi_string_from_local_kind(scratch.arena, local_ptr->kind));
dumpf("%.*s name ='%S'\n", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx));
dumpf("%.*s type_idx=%u\n", depth*2, indent.str, local_ptr->type_idx);
dumpf("%.*s locations=\n", depth*2, indent.str);
dumpf("%.*s '%S': // local[%u]\n", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx), local_idx);
dumpf("%.*s {\n", depth*2, indent.str);
dumpf("%.*s kind: %S\n", depth*2, indent.str, rdi_string_from_local_kind(scratch.arena, local_ptr->kind));
dumpf("%.*s type_idx: %u\n", depth*2, indent.str, local_ptr->type_idx);
dumpf("%.*s locations:\n", depth*2, indent.str);
dumpf("%.*s {\n", depth*2, indent.str);
if(local_ptr->location_first < local_ptr->location_opl)
{
@@ -1084,6 +1095,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
}
}
dumpf("%.*s }\n", depth*2, indent.str);
dumpf("%.*s }\n", depth*2, indent.str);
scratch_end(scratch);
}
}
@@ -1101,7 +1113,7 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
p != nil;
p = rdi_element_from_name_idx(rdi, Scopes, p->parent_scope_idx), depth -= 1)
{
dumpf("%.*s} [/%I64u] \n", depth*2, indent.str, (U64)(p-v));
dumpf("%.*s} // scope[/%I64u] \n", depth*2, indent.str, (U64)(p-v));
if(p->next_sibling_scope_idx != 0)
{
rec_next = rdi_element_from_name_idx(rdi, Scopes, p->next_sibling_scope_idx);
@@ -1119,9 +1131,10 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
{
U64 count = 0;
RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count);
dumpf("\n");
for EachIndex(idx, count)
{
dumpf("%I64x -> #%I64u\n", v[idx].voff, v[idx].idx);
dumpf(" {0x%I64x => %I64u}\n", v[idx].voff, v[idx].idx);
}
}
@@ -1137,17 +1150,19 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_InlineSite *inline_site = &v[idx];
Temp scratch = scratch_begin(&arena, 1);
String8 inline_site_idx = push_str8f(scratch.arena, "inline_site[%u]", idx);
String8 type_idx = push_str8f(scratch.arena, "type_idx = %u,", inline_site->type_idx);
String8 owner_type_idx = push_str8f(scratch.arena, "owner_type_idx = %u,", inline_site->owner_type_idx);
String8 line_table_idx = push_str8f(scratch.arena, "line_table_idx = %u,", inline_site->line_table_idx);
dumpf("%-20S = { %-25S %-25S %-25S name = '%-20S' }\n",
inline_site_idx,
String8 type_idx = push_str8f(scratch.arena, "type_idx: %u,", inline_site->type_idx);
String8 owner_type_idx = push_str8f(scratch.arena, "owner_type_idx: %u,", inline_site->owner_type_idx);
String8 line_table_idx = push_str8f(scratch.arena, "line_table_idx: %u,", inline_site->line_table_idx);
String8 name = push_str8f(scratch.arena, "'%S'", str8_from_rdi_string_idx(rdi, inline_site->name_string_idx));
dumpf("\n { %-25S %-25S %-25S name: %-64S } // %S",
type_idx,
owner_type_idx,
line_table_idx,
str8_from_rdi_string_idx(rdi, inline_site->name_string_idx));
name,
inline_site_idx);
scratch_end(scratch);
}
dumpf("\n");
}
//////////////////////////////
@@ -1160,14 +1175,13 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count);
for EachIndex(idx, count)
{
if(idx > 0) { dumpf("\n"); }
RDI_ParsedNameMap name_map = {0};
rdi_parsed_from_name_map(rdi, &v[idx], &name_map);
dumpf("name_map[%S]:\n", rdi_string_from_name_map_kind(idx));
dumpf("\n // name_map[%I64u] (%S)\n {\n", idx, rdi_string_from_name_map_kind(idx));
for EachIndex(bucket_idx, name_map.bucket_count)
{
if(name_map.buckets[bucket_idx].node_count == 0) { continue; }
dumpf(" bucket[%I64u]:\n", bucket_idx);
dumpf(" %I64u:\n {\n", bucket_idx, bucket_idx);
RDI_NameMapNode *node_ptr = name_map.nodes + name_map.buckets[bucket_idx].first_node;
RDI_NameMapNode *node_opl = node_ptr + name_map.buckets[bucket_idx].node_count;
for(;node_ptr < node_opl; node_ptr += 1)
@@ -1191,10 +1205,12 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
}
indices = str8_list_join(scratch.arena, &idx_strings, &(StringJoin){.sep = str8_lit(", ")});
}
dumpf(" match \"%S\": %S\n", str, indices);
dumpf(" \"%S\": %S\n", str, indices);
temp_end(temp);
}
dumpf(" }\n");
}
dumpf(" }\n");
}
scratch_end(scratch);
}
@@ -1208,8 +1224,9 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla
U32 *v = rdi_table_from_name(rdi, StringTable, &count);
for EachIndex(idx, count)
{
dumpf("string[%I64u]: \"%S\"\n", idx, str8_from_rdi_string_idx(rdi, idx));
dumpf("\n \"%S\" // string[%I64u]", str8_from_rdi_string_idx(rdi, idx), idx);
}
dumpf("\n");
}
#undef DumpSubset