further raddbgi -> rdi naming pass

This commit is contained in:
Ryan Fleury
2024-02-13 15:56:30 -08:00
parent b9f010dff6
commit 816f94ef71
17 changed files with 597 additions and 597 deletions
+1 -1
View File
@@ -277,7 +277,7 @@ A list of the layers in the codebase and their associated namespaces is below:
- `lib_raddbgi_make` (`RDIM_`): Standalone library for constructing RADDBGI - `lib_raddbgi_make` (`RDIM_`): Standalone library for constructing RADDBGI
debug info data. Does not depend on `base`, and can be independently relocated debug info data. Does not depend on `base`, and can be independently relocated
to other codebases. to other codebases.
- `lib_raddbgi_format` (`RADDBGI_`): Standalone library for defining the core - `lib_raddbgi_format` (`RDI_`): Standalone library which defines the core
RADDBGI types and helper functions for reading and writing the RADDBGI debug RADDBGI types and helper functions for reading and writing the RADDBGI debug
info file format. Does not depend on `base`, and can be independently info file format. Does not depend on `base`, and can be independently
relocated to other codebases. relocated to other codebases.
+40 -40
View File
@@ -204,7 +204,7 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE
DBGI_Scope *scope = dbgi_scope_open(); DBGI_Scope *scope = dbgi_scope_open();
String8 exe_path = demon_full_path_from_module(scratch.arena, module); String8 exe_path = demon_full_path_from_module(scratch.arena, module);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
U64 base_vaddr = demon_base_vaddr_from_module(module); U64 base_vaddr = demon_base_vaddr_from_module(module);
for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next)
{ {
@@ -229,16 +229,16 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE
// rjf: filename -> src_id // rjf: filename -> src_id
U32 src_id = 0; U32 src_id = 0;
{ {
RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths);
if(mapptr != 0) if(mapptr != 0)
{ {
RDI_ParsedNameMap map = {0}; RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map); rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, filename_normalized.str, filename_normalized.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size);
if(node != 0) if(node != 0)
{ {
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
src_id = ids[0]; src_id = ids[0];
@@ -249,9 +249,9 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE
// rjf: src_id * pt -> push // rjf: src_id * pt -> push
{ {
RDI_SourceFile *src = rdi_element_from_idx(rdbg, source_files, src_id); RDI_SourceFile *src = rdi_element_from_idx(rdi, source_files, src_id);
RDI_ParsedLineMap line_map = {0}; RDI_ParsedLineMap line_map = {0};
rdi_line_map_from_source_file(rdbg, src, &line_map); rdi_line_map_from_source_file(rdi, src, &line_map);
U32 voff_count = 0; U32 voff_count = 0;
U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count);
for(U32 i = 0; i < voff_count; i += 1) for(U32 i = 0; i < voff_count; i += 1)
@@ -268,21 +268,21 @@ ctrl_append_resolved_module_user_bp_traps(Arena *arena, DEMON_Handle process, DE
{ {
String8 symbol_name = bp->string; String8 symbol_name = bp->string;
U64 voff = bp->u64; U64 voff = bp->u64;
if(rdbg != 0 && rdbg->procedures != 0) if(rdi != 0 && rdi->procedures != 0)
{ {
RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Procedures); RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures);
if(mapptr != 0) if(mapptr != 0)
{ {
RDI_ParsedNameMap map = {0}; RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map); rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, symbol_name.str, symbol_name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, symbol_name.str, symbol_name.size);
if(node != 0) if(node != 0)
{ {
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
for(U32 match_i = 0; match_i < id_count; match_i += 1) for(U32 match_i = 0; match_i < id_count; match_i += 1)
{ {
U64 proc_voff = rdi_first_voff_from_proc(rdbg, ids[match_i]); U64 proc_voff = rdi_first_voff_from_proc(rdi, ids[match_i]);
U64 proc_vaddr = proc_voff + base_vaddr; U64 proc_vaddr = proc_voff + base_vaddr;
DEMON_Trap trap = {process, proc_vaddr + voff, (U64)bp}; DEMON_Trap trap = {process, proc_vaddr + voff, (U64)bp};
demon_trap_chunk_list_push(arena, traps_out, 256, &trap); demon_trap_chunk_list_push(arena, traps_out, 256, &trap);
@@ -1643,21 +1643,21 @@ ctrl_thread__next_demon_event(Arena *arena, CTRL_Msg *msg, DEMON_RunCtrls *run_c
CTRL_Handle module = ctrl_handle_from_demon(modules.handles[0]); CTRL_Handle module = ctrl_handle_from_demon(modules.handles[0]);
String8 module_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module)); String8 module_path = demon_full_path_from_module(scratch.arena, ctrl_demon_handle_from_ctrl(module));
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, module_path, max_U64);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_GlobalVariables); RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_GlobalVariables);
if(rdbg->global_variables != 0 && unparsed_map != 0) if(rdi->global_variables != 0 && unparsed_map != 0)
{ {
RDI_ParsedNameMap map = {0}; RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, unparsed_map, &map); rdi_name_map_parse(rdi, unparsed_map, &map);
String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); String8 name = str8_lit("__asan_shadow_memory_dynamic_address");
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);
if(node != 0) if(node != 0)
{ {
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, ids[0]); RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, ids[0]);
U64 global_var_voff = global_var->voff; U64 global_var_voff = global_var->voff;
U64 global_var_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module)); U64 global_var_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module));
Architecture arch = demon_arch_from_object(ev->thread); Architecture arch = demon_arch_from_object(ev->thread);
@@ -2148,10 +2148,10 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U64 module_base_vaddr = demon_base_vaddr_from_module(module); U64 module_base_vaddr = demon_base_vaddr_from_module(module);
String8 exe_path = demon_full_path_from_module(scratch.arena, module); String8 exe_path = demon_full_path_from_module(scratch.arena, module);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Procedures); RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures);
RDI_ParsedNameMap map = {0}; RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, unparsed_map, &map); rdi_name_map_parse(rdi, unparsed_map, &map);
//- rjf: add trap for user-specified entry point, if specified //- rjf: add trap for user-specified entry point, if specified
B32 entries_found = 0; B32 entries_found = 0;
@@ -2162,15 +2162,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U32 procedure_id = 0; U32 procedure_id = 0;
{ {
String8 name = n->string; String8 name = n->string;
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
procedure_id = ids[0]; procedure_id = ids[0];
} }
} }
U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); U64 voff = rdi_first_voff_from_proc(rdi, procedure_id);
if(voff != 0) if(voff != 0)
{ {
entries_found = 1; entries_found = 1;
@@ -2188,15 +2188,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U32 procedure_id = 0; U32 procedure_id = 0;
{ {
String8 name = n->string; String8 name = n->string;
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
procedure_id = ids[0]; procedure_id = ids[0];
} }
} }
U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); U64 voff = rdi_first_voff_from_proc(rdi, procedure_id);
if(voff != 0) if(voff != 0)
{ {
DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff}; DEMON_Trap trap = {run_ctrls.run_entities[process_idx], module_base_vaddr + voff};
@@ -2221,15 +2221,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U32 procedure_id = 0; U32 procedure_id = 0;
{ {
String8 name = hi_entry_points[idx]; String8 name = hi_entry_points[idx];
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
procedure_id = ids[0]; procedure_id = ids[0];
} }
} }
U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); U64 voff = rdi_first_voff_from_proc(rdi, procedure_id);
if(voff != 0) if(voff != 0)
{ {
entries_found = 1; entries_found = 1;
@@ -2265,15 +2265,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U32 procedure_id = 0; U32 procedure_id = 0;
{ {
String8 name = lo_entry_points[idx]; String8 name = lo_entry_points[idx];
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, name.str, name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
procedure_id = ids[0]; procedure_id = ids[0];
} }
} }
U64 voff = rdi_first_voff_from_proc(rdbg, procedure_id); U64 voff = rdi_first_voff_from_proc(rdi, procedure_id);
if(voff != 0) if(voff != 0)
{ {
entries_found = 1; entries_found = 1;
@@ -2871,7 +2871,7 @@ ctrl_thread__run(CTRL_Msg *msg)
{ {
String8 exe_path = demon_full_path_from_module(temp.arena, module); String8 exe_path = demon_full_path_from_module(temp.arena, module);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next)
{ {
String8 string = condition_n->string; String8 string = condition_n->string;
@@ -2879,12 +2879,12 @@ ctrl_thread__run(CTRL_Msg *msg)
{ {
parse_ctx.arch = arch; parse_ctx.arch = arch;
parse_ctx.ip_voff = thread_rip_voff; parse_ctx.ip_voff = thread_rip_voff;
parse_ctx.rdbg = rdbg; parse_ctx.rdi = rdi;
parse_ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); parse_ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256);
parse_ctx.regs_map = ctrl_string2reg_from_arch(arch); parse_ctx.regs_map = ctrl_string2reg_from_arch(arch);
parse_ctx.reg_alias_map = ctrl_string2alias_from_arch(arch); parse_ctx.reg_alias_map = ctrl_string2alias_from_arch(arch);
parse_ctx.locals_map = eval_push_locals_map_from_rdi_voff(temp.arena, rdbg, thread_rip_voff); parse_ctx.locals_map = eval_push_locals_map_from_rdi_voff(temp.arena, rdi, thread_rip_voff);
parse_ctx.member_map = eval_push_member_map_from_rdi_voff(temp.arena, rdbg, thread_rip_voff); parse_ctx.member_map = eval_push_member_map_from_rdi_voff(temp.arena, rdi, thread_rip_voff);
} }
EVAL_TokenArray tokens = eval_token_array_from_text(temp.arena, string); EVAL_TokenArray tokens = eval_token_array_from_text(temp.arena, string);
EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(temp.arena, &parse_ctx, string, &tokens); EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(temp.arena, &parse_ctx, string, &tokens);
@@ -2894,7 +2894,7 @@ ctrl_thread__run(CTRL_Msg *msg)
EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil};
if(parse_has_expr && errors.count == 0) if(parse_has_expr && errors.count == 0)
{ {
ir_tree_and_type = eval_irtree_and_type_from_expr(temp.arena, parse_ctx.type_graph, rdbg, &eval_string2expr_map_nil, parse.expr, &errors); ir_tree_and_type = eval_irtree_and_type_from_expr(temp.arena, parse_ctx.type_graph, rdi, &eval_string2expr_map_nil, parse.expr, &errors);
} }
EVAL_OpList op_list = {0}; EVAL_OpList op_list = {0};
if(parse_has_expr && ir_tree_and_type.tree != &eval_irtree_nil) if(parse_has_expr && ir_tree_and_type.tree != &eval_irtree_nil)
+21 -21
View File
@@ -111,7 +111,7 @@ dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemAr
} }
internal String8 internal String8
dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx) dbgi_fuzzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, DBGI_FuzzySearchTarget target, U64 element_idx)
{ {
String8 result = {0}; String8 result = {0};
switch(target) switch(target)
@@ -119,31 +119,31 @@ dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_Fuzzy
// NOTE(rjf): no default - warn if we miss a case // NOTE(rjf): no default - warn if we miss a case
case DBGI_FuzzySearchTarget_Procedures: case DBGI_FuzzySearchTarget_Procedures:
{ {
RDI_Procedure *proc = rdi_element_from_idx(rdbg, procedures, element_idx); RDI_Procedure *proc = rdi_element_from_idx(rdi, procedures, element_idx);
U64 name_size = 0; U64 name_size = 0;
U8 *name_base = rdi_string_from_idx(rdbg, proc->name_string_idx, &name_size); U8 *name_base = rdi_string_from_idx(rdi, proc->name_string_idx, &name_size);
result = str8(name_base, name_size); result = str8(name_base, name_size);
}break; }break;
case DBGI_FuzzySearchTarget_GlobalVariables: case DBGI_FuzzySearchTarget_GlobalVariables:
{ {
RDI_GlobalVariable *gvar = rdi_element_from_idx(rdbg, global_variables, element_idx); RDI_GlobalVariable *gvar = rdi_element_from_idx(rdi, global_variables, element_idx);
U64 name_size = 0; U64 name_size = 0;
U8 *name_base = rdi_string_from_idx(rdbg, gvar->name_string_idx, &name_size); U8 *name_base = rdi_string_from_idx(rdi, gvar->name_string_idx, &name_size);
result = str8(name_base, name_size); result = str8(name_base, name_size);
}break; }break;
case DBGI_FuzzySearchTarget_ThreadVariables: case DBGI_FuzzySearchTarget_ThreadVariables:
{ {
RDI_ThreadVariable *tvar = rdi_element_from_idx(rdbg, thread_variables, element_idx); RDI_ThreadVariable *tvar = rdi_element_from_idx(rdi, thread_variables, element_idx);
U64 name_size = 0; U64 name_size = 0;
U8 *name_base = rdi_string_from_idx(rdbg, tvar->name_string_idx, &name_size); U8 *name_base = rdi_string_from_idx(rdi, tvar->name_string_idx, &name_size);
result = str8(name_base, name_size); result = str8(name_base, name_size);
}break; }break;
case DBGI_FuzzySearchTarget_UDTs: case DBGI_FuzzySearchTarget_UDTs:
{ {
RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, element_idx); RDI_UDT *udt = rdi_element_from_idx(rdi, udts, element_idx);
RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, udt->self_type_idx);
U64 name_size = 0; U64 name_size = 0;
U8 *name_base = rdi_string_from_idx(rdbg, type_node->user_defined.name_string_idx, &name_size); U8 *name_base = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name_size);
result = str8(name_base, name_size); result = str8(name_base, name_size);
}break; }break;
case DBGI_FuzzySearchTarget_COUNT:{}break; case DBGI_FuzzySearchTarget_COUNT:{}break;
@@ -1017,7 +1017,7 @@ dbgi_parse_thread_entry_point(void *p)
} }
//- rjf: parse raddbg info //- rjf: parse raddbg info
RDI_Parsed rdi_parsed = dbgi_parse_nil.rdbg; RDI_Parsed rdi_parsed = dbgi_parse_nil.rdi;
U64 arch_addr_size = 8; U64 arch_addr_size = 8;
if(do_task) if(do_task)
{ {
@@ -1053,7 +1053,7 @@ dbgi_parse_thread_entry_point(void *p)
bin->parse.arena = parse_arena; bin->parse.arena = parse_arena;
bin->parse.dbg_path = push_str8_copy(parse_arena, dbg_path); bin->parse.dbg_path = push_str8_copy(parse_arena, dbg_path);
MemoryCopyStruct(&bin->parse.pe, &exe_pe_info); MemoryCopyStruct(&bin->parse.pe, &exe_pe_info);
MemoryCopyStruct(&bin->parse.rdbg, &rdi_parsed); MemoryCopyStruct(&bin->parse.rdi, &rdi_parsed);
bin->parse.gen = bin->gen; bin->parse.gen = bin->gen;
break; break;
} }
@@ -1197,9 +1197,9 @@ dbgi_fuzzy_thread__entry_point(void *p)
//- rjf: exe_path -> dbgi_parse, raddbg //- rjf: exe_path -> dbgi_parse, raddbg
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
//- rjf: rdbg * query -> item list //- rjf: rdi * query -> item list
U64 table_ptr_off = 0; U64 table_ptr_off = 0;
U64 element_name_idx_off = 0; U64 element_name_idx_off = 0;
U64 element_count = 0; U64 element_count = 0;
@@ -1212,34 +1212,34 @@ dbgi_fuzzy_thread__entry_point(void *p)
{ {
table_ptr_off = OffsetOf(RDI_Parsed, procedures); table_ptr_off = OffsetOf(RDI_Parsed, procedures);
element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx); element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx);
element_count = rdbg->procedures_count; element_count = rdi->procedures_count;
element_size = sizeof(RDI_Procedure); element_size = sizeof(RDI_Procedure);
}break; }break;
case DBGI_FuzzySearchTarget_GlobalVariables: case DBGI_FuzzySearchTarget_GlobalVariables:
{ {
table_ptr_off = OffsetOf(RDI_Parsed, global_variables); table_ptr_off = OffsetOf(RDI_Parsed, global_variables);
element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx); element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx);
element_count = rdbg->global_variables_count; element_count = rdi->global_variables_count;
element_size = sizeof(RDI_GlobalVariable); element_size = sizeof(RDI_GlobalVariable);
}break; }break;
case DBGI_FuzzySearchTarget_ThreadVariables: case DBGI_FuzzySearchTarget_ThreadVariables:
{ {
table_ptr_off = OffsetOf(RDI_Parsed, thread_variables); table_ptr_off = OffsetOf(RDI_Parsed, thread_variables);
element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx); element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx);
element_count = rdbg->thread_variables_count; element_count = rdi->thread_variables_count;
element_size = sizeof(RDI_ThreadVariable); element_size = sizeof(RDI_ThreadVariable);
}break; }break;
case DBGI_FuzzySearchTarget_UDTs: case DBGI_FuzzySearchTarget_UDTs:
{ {
table_ptr_off = OffsetOf(RDI_Parsed, udts); table_ptr_off = OffsetOf(RDI_Parsed, udts);
element_count = rdbg->udts_count; element_count = rdi->udts_count;
element_size = sizeof(RDI_UDT); element_size = sizeof(RDI_UDT);
}break; }break;
} }
DBGI_FuzzySearchItemChunkList items_list = {0}; DBGI_FuzzySearchItemChunkList items_list = {0};
if(task_is_good) if(task_is_good)
{ {
void *table_base = (U8*)rdbg + table_ptr_off; void *table_base = (U8*)rdi + table_ptr_off;
for(U64 idx = 1; task_is_good && idx < element_count; idx += 1) for(U64 idx = 1; task_is_good && idx < element_count; idx += 1)
{ {
void *element = (U8 *)(*(void **)table_base) + element_size*idx; void *element = (U8 *)(*(void **)table_base) + element_size*idx;
@@ -1247,12 +1247,12 @@ dbgi_fuzzy_thread__entry_point(void *p)
if(target == DBGI_FuzzySearchTarget_UDTs) if(target == DBGI_FuzzySearchTarget_UDTs)
{ {
RDI_UDT *udt = (RDI_UDT *)element; RDI_UDT *udt = (RDI_UDT *)element;
RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, udt->self_type_idx);
name_idx_ptr = &type_node->user_defined.name_string_idx; name_idx_ptr = &type_node->user_defined.name_string_idx;
} }
U32 name_idx = *name_idx_ptr; U32 name_idx = *name_idx_ptr;
U64 name_size = 0; U64 name_size = 0;
U8 *name_base = rdi_string_from_idx(rdbg, name_idx, &name_size); U8 *name_base = rdi_string_from_idx(rdi, name_idx, &name_size);
String8 name = str8(name_base, name_size); String8 name = str8(name_base, name_size);
if(name.size == 0) { continue; } if(name.size == 0) { continue; }
FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name); FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name);
+2 -2
View File
@@ -18,7 +18,7 @@ struct DBGI_Parse
void *dbg_base; void *dbg_base;
FileProperties dbg_props; FileProperties dbg_props;
PE_BinInfo pe; PE_BinInfo pe;
RDI_Parsed rdbg; RDI_Parsed rdi;
}; };
//////////////////////////////// ////////////////////////////////
@@ -379,7 +379,7 @@ internal void dbgi_ensure_tctx_inited(void);
internal U64 dbgi_hash_from_string(String8 string); internal U64 dbgi_hash_from_string(String8 string);
internal U64 dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemArray *array, U64 element_idx); internal U64 dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemArray *array, U64 element_idx);
internal String8 dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RDI_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx); internal String8 dbgi_fuzzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, DBGI_FuzzySearchTarget target, U64 element_idx);
//////////////////////////////// ////////////////////////////////
//~ rjf: Forced Override Cache Functions //~ rjf: Forced Override Cache Functions
+102 -102
View File
@@ -1085,10 +1085,10 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams
DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, query); DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, query);
if(eval.errors.count == 0) if(eval.errors.count == 0)
{ {
TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, eval.type_key)); TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, eval.type_key));
if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef)
{ {
eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdbg, ctrl_ctx, eval); eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdi, ctrl_ctx, eval);
prefer_imm = 1; prefer_imm = 1;
} }
U64 u64 = !prefer_imm && eval.offset ? eval.offset : eval.imm_u64; U64 u64 = !prefer_imm && eval.offset ? eval.offset : eval.imm_u64;
@@ -3196,23 +3196,23 @@ df_symbol_name_from_binary_voff(Arena *arena, DF_Entity *binary, U64 voff)
DBGI_Scope *scope = dbgi_scope_open(); DBGI_Scope *scope = dbgi_scope_open();
String8 path = df_full_path_from_entity(scratch.arena, binary); String8 path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
if(result.size == 0 && rdbg->scope_vmap != 0) if(result.size == 0 && rdi->scope_vmap != 0)
{ {
U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff);
RDI_Scope *scope = &rdbg->scopes[scope_idx]; RDI_Scope *scope = &rdi->scopes[scope_idx];
U64 proc_idx = scope->proc_idx; U64 proc_idx = scope->proc_idx;
RDI_Procedure *procedure = &rdbg->procedures[proc_idx]; RDI_Procedure *procedure = &rdi->procedures[proc_idx];
U64 name_size = 0; U64 name_size = 0;
U8 *name_ptr = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);
result = push_str8_copy(arena, str8(name_ptr, name_size)); result = push_str8_copy(arena, str8(name_ptr, name_size));
} }
if(result.size == 0 && rdbg->global_vmap != 0) if(result.size == 0 && rdi->global_vmap != 0)
{ {
U64 global_idx = rdi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, voff); U64 global_idx = rdi_vmap_idx_from_voff(rdi->global_vmap, rdi->global_vmap_count, voff);
RDI_GlobalVariable *global_var = &rdbg->global_variables[global_idx]; RDI_GlobalVariable *global_var = &rdi->global_variables[global_idx];
U64 name_size = 0; U64 name_size = 0;
U8 *name_ptr = rdi_string_from_idx(rdbg, global_var->name_string_idx, &name_size); U8 *name_ptr = rdi_string_from_idx(rdi, global_var->name_string_idx, &name_size);
result = push_str8_copy(arena, str8(name_ptr, name_size)); result = push_str8_copy(arena, str8(name_ptr, name_size));
} }
dbgi_scope_close(scope); dbgi_scope_close(scope);
@@ -3259,27 +3259,27 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit
binary_n != 0; binary_n != 0;
binary_n = binary_n->next) binary_n = binary_n->next)
{ {
// rjf: binary -> rdbg // rjf: binary -> rdi
DF_Entity *binary = binary_n->entity; DF_Entity *binary = binary_n->entity;
String8 binary_path = df_full_path_from_entity(scratch.arena, binary); String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
// rjf: file_path_normalized * rdbg -> src_id // rjf: file_path_normalized * rdi -> src_id
B32 good_src_id = 0; B32 good_src_id = 0;
U32 src_id = 0; U32 src_id = 0;
if(dbgi != &dbgi_parse_nil) if(dbgi != &dbgi_parse_nil)
{ {
RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths);
if(mapptr != 0) if(mapptr != 0)
{ {
RDI_ParsedNameMap map = {0}; RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map); rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);
if(node != 0) if(node != 0)
{ {
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
good_src_id = 1; good_src_id = 1;
@@ -3292,9 +3292,9 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit
// rjf: good src-id -> look up line info for visible range // rjf: good src-id -> look up line info for visible range
if(good_src_id) if(good_src_id)
{ {
RDI_SourceFile *src = rdbg->source_files+src_id; RDI_SourceFile *src = rdi->source_files+src_id;
RDI_ParsedLineMap line_map = {0}; RDI_ParsedLineMap line_map = {0};
rdi_line_map_from_source_file(rdbg, src, &line_map); rdi_line_map_from_source_file(rdi, src, &line_map);
U64 line_idx = 0; U64 line_idx = 0;
for(S64 line_num = line_num_range.min; for(S64 line_num = line_num_range.min;
line_num <= line_num_range.max; line_num <= line_num_range.max;
@@ -3306,10 +3306,10 @@ df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entit
for(U64 idx = 0; idx < voff_count; idx += 1) for(U64 idx = 0; idx < voff_count; idx += 1)
{ {
U64 base_voff = voffs[idx]; U64 base_voff = voffs[idx];
U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, base_voff);
RDI_Unit *unit = &rdbg->units[unit_idx]; RDI_Unit *unit = &rdi->units[unit_idx];
RDI_ParsedLineInfo unit_line_info = {0}; RDI_ParsedLineInfo unit_line_info = {0};
rdi_line_info_from_unit(rdbg, unit, &unit_line_info); rdi_line_info_from_unit(rdi, unit, &unit_line_info);
U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff);
if(unit_line_info.voffs != 0) if(unit_line_info.voffs != 0)
{ {
@@ -3347,23 +3347,23 @@ df_text_line_dasm2src_info_from_binary_voff(DF_Entity *binary, U64 voff)
DBGI_Scope *scope = dbgi_scope_open(); DBGI_Scope *scope = dbgi_scope_open();
String8 path = df_full_path_from_entity(scratch.arena, binary); String8 path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
DF_TextLineDasm2SrcInfo result = {0}; DF_TextLineDasm2SrcInfo result = {0};
result.file = result.binary = &df_g_nil_entity; result.file = result.binary = &df_g_nil_entity;
if(rdbg->unit_vmap != 0 && rdbg->units != 0 && rdbg->source_files != 0) if(rdi->unit_vmap != 0 && rdi->units != 0 && rdi->source_files != 0)
{ {
U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, voff); U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, voff);
RDI_Unit *unit = &rdbg->units[unit_idx]; RDI_Unit *unit = &rdi->units[unit_idx];
RDI_ParsedLineInfo unit_line_info = {0}; RDI_ParsedLineInfo unit_line_info = {0};
rdi_line_info_from_unit(rdbg, unit, &unit_line_info); rdi_line_info_from_unit(rdi, unit, &unit_line_info);
U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff); U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff);
if(line_info_idx < unit_line_info.count) if(line_info_idx < unit_line_info.count)
{ {
RDI_Line *line = &unit_line_info.lines[line_info_idx]; RDI_Line *line = &unit_line_info.lines[line_info_idx];
RDI_Column *column = (line_info_idx < unit_line_info.col_count) ? &unit_line_info.cols[line_info_idx] : 0; RDI_Column *column = (line_info_idx < unit_line_info.col_count) ? &unit_line_info.cols[line_info_idx] : 0;
RDI_SourceFile *file = &rdbg->source_files[line->file_idx]; RDI_SourceFile *file = &rdi->source_files[line->file_idx];
String8 file_normalized_full_path = {0}; String8 file_normalized_full_path = {0};
file_normalized_full_path.str = rdi_string_from_idx(rdbg, file->normal_full_path_string_idx, &file_normalized_full_path.size); file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size);
result.binary = binary; result.binary = binary;
if(line->file_idx != 0 && file_normalized_full_path.size != 0) if(line->file_idx != 0 && file_normalized_full_path.size != 0)
{ {
@@ -3412,7 +3412,7 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name)
{ {
String8 binary_path = df_full_path_from_entity(scratch.arena, binary); String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
RDI_NameMapKind name_map_kinds[] = RDI_NameMapKind name_map_kinds[] =
{ {
RDI_NameMapKind_GlobalVariables, RDI_NameMapKind_GlobalVariables,
@@ -3425,10 +3425,10 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name)
name_map_kind_idx += 1) name_map_kind_idx += 1)
{ {
RDI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; RDI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx];
RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, name_map_kind); RDI_NameMap *name_map = rdi_name_map_from_kind(rdi, name_map_kind);
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(rdbg, name_map, &parsed_name_map); rdi_name_map_parse(rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, symbol_name.str, symbol_name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, symbol_name.str, symbol_name.size);
// rjf: node -> num // rjf: node -> num
U64 entity_num = 0; U64 entity_num = 0;
@@ -3443,7 +3443,7 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name)
default: default:
{ {
U32 num = 0; U32 num = 0;
U32 *run = rdi_matches_from_map_node(rdbg, node, &num); U32 *run = rdi_matches_from_map_node(rdi, node, &num);
if(num != 0) if(num != 0)
{ {
entity_num = run[0]+1; entity_num = run[0]+1;
@@ -3459,14 +3459,14 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name)
default:{}break; default:{}break;
case RDI_NameMapKind_GlobalVariables: case RDI_NameMapKind_GlobalVariables:
{ {
RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, entity_num-1); RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, entity_num-1);
voff = global_var->voff; voff = global_var->voff;
}break; }break;
case RDI_NameMapKind_Procedures: case RDI_NameMapKind_Procedures:
{ {
RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, entity_num-1); RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, entity_num-1);
RDI_Scope *scope = rdi_element_from_idx(rdbg, scopes, procedure->root_scope_idx); RDI_Scope *scope = rdi_element_from_idx(rdi, scopes, procedure->root_scope_idx);
voff = rdbg->scope_voffs[scope->voff_range_first]; voff = rdi->scope_voffs[scope->voff_range_first];
}break; }break;
} }
@@ -3495,11 +3495,11 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name)
{ {
String8 binary_path = df_full_path_from_entity(scratch.arena, binary); String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Types); RDI_NameMap *name_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Types);
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(rdbg, name_map, &parsed_name_map); rdi_name_map_parse(rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size);
U64 entity_num = 0; U64 entity_num = 0;
if(node != 0) if(node != 0)
{ {
@@ -3512,7 +3512,7 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name)
default: default:
{ {
U32 num = 0; U32 num = 0;
U32 *run = rdi_matches_from_map_node(rdbg, node, &num); U32 *run = rdi_matches_from_map_node(rdi, node, &num);
if(num != 0) if(num != 0)
{ {
entity_num = run[0]+1; entity_num = run[0]+1;
@@ -3697,8 +3697,8 @@ df_push_locals_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity *
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
String8 binary_path = df_full_path_from_entity(scratch.arena, binary); String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdbg, voff); EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdi, voff);
scratch_end(scratch); scratch_end(scratch);
return result; return result;
} }
@@ -3709,8 +3709,8 @@ df_push_member_map_from_binary_voff(Arena *arena, DBGI_Scope *scope, DF_Entity *
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
String8 binary_path = df_full_path_from_entity(scratch.arena, binary); String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdbg, voff); EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdi, voff);
scratch_end(scratch); scratch_end(scratch);
return result; return result;
} }
@@ -3987,7 +3987,7 @@ df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64
DF_Entity *binary = df_binary_file_from_module(module); DF_Entity *binary = df_binary_file_from_module(module);
String8 binary_path = df_full_path_from_entity(scratch.arena, binary); String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
Architecture arch = df_architecture_from_entity(process); Architecture arch = df_architecture_from_entity(process);
EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch(arch); EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch(arch);
EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch); EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch);
@@ -3999,7 +3999,7 @@ df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64
{ {
ctx.arch = arch; ctx.arch = arch;
ctx.ip_voff = voff; ctx.ip_voff = voff;
ctx.rdbg = rdbg; ctx.rdi = rdi;
ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256);
ctx.regs_map = reg_map; ctx.regs_map = reg_map;
ctx.reg_alias_map = reg_alias_map; ctx.reg_alias_map = reg_alias_map;
@@ -4031,26 +4031,26 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt)
binary_n != 0; binary_n != 0;
binary_n = binary_n->next) binary_n = binary_n->next)
{ {
// rjf: binary -> rdbg // rjf: binary -> rdi
DF_Entity *binary = binary_n->entity; DF_Entity *binary = binary_n->entity;
String8 binary_path = df_full_path_from_entity(scratch.arena, binary); String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
// rjf: file_path_normalized * rdbg -> src_id // rjf: file_path_normalized * rdi -> src_id
B32 good_src_id = 0; B32 good_src_id = 0;
U32 src_id = 0; U32 src_id = 0;
{ {
RDI_NameMap *mapptr = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_NormalSourcePaths); RDI_NameMap *mapptr = rdi_name_map_from_kind(rdi, RDI_NameMapKind_NormalSourcePaths);
if(mapptr != 0) if(mapptr != 0)
{ {
RDI_ParsedNameMap map = {0}; RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map); rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);
if(node != 0) if(node != 0)
{ {
U32 id_count = 0; U32 id_count = 0;
U32 *ids = rdi_matches_from_map_node(rdbg, node, &id_count); U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);
if(id_count > 0) if(id_count > 0)
{ {
good_src_id = 1; good_src_id = 1;
@@ -4063,18 +4063,18 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt)
// rjf: good src-id -> look up line info for visible range // rjf: good src-id -> look up line info for visible range
if(good_src_id) if(good_src_id)
{ {
RDI_SourceFile *src = rdbg->source_files+src_id; RDI_SourceFile *src = rdi->source_files+src_id;
RDI_ParsedLineMap line_map = {0}; RDI_ParsedLineMap line_map = {0};
rdi_line_map_from_source_file(rdbg, src, &line_map); rdi_line_map_from_source_file(rdi, src, &line_map);
U32 voff_count = 0; U32 voff_count = 0;
U64 *voffs = rdi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count); U64 *voffs = rdi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count);
for(U64 idx = 0; idx < voff_count; idx += 1) for(U64 idx = 0; idx < voff_count; idx += 1)
{ {
U64 base_voff = voffs[idx]; U64 base_voff = voffs[idx];
U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff); U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, base_voff);
RDI_Unit *unit = &rdbg->units[unit_idx]; RDI_Unit *unit = &rdi->units[unit_idx];
RDI_ParsedLineInfo unit_line_info = {0}; RDI_ParsedLineInfo unit_line_info = {0};
rdi_line_info_from_unit(rdbg, unit, &unit_line_info); rdi_line_info_from_unit(rdi, unit, &unit_line_info);
U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff);
Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]);
S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num;
@@ -4113,7 +4113,7 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt)
//- rjf: bad ctx -> reset with graceful defaults //- rjf: bad ctx -> reset with graceful defaults
if(good_ctx == 0) if(good_ctx == 0)
{ {
ctx.rdbg = &dbgi_parse_nil.rdbg; ctx.rdi = &dbgi_parse_nil.rdi;
ctx.type_graph = tg_graph_begin(8, 256); ctx.type_graph = tg_graph_begin(8, 256);
ctx.regs_map = &eval_string2num_map_nil; ctx.regs_map = &eval_string2num_map_nil;
ctx.regs_map = &eval_string2num_map_nil; ctx.regs_map = &eval_string2num_map_nil;
@@ -4179,7 +4179,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil};
if(parse_has_expr && errors.count == 0) if(parse_has_expr && errors.count == 0)
{ {
ir_tree_and_type = eval_irtree_and_type_from_expr(arena, parse_ctx->type_graph, parse_ctx->rdbg, macro_map, parse.expr, &errors); ir_tree_and_type = eval_irtree_and_type_from_expr(arena, parse_ctx->type_graph, parse_ctx->rdi, macro_map, parse.expr, &errors);
} }
//- rjf: get list of ops //- rjf: get list of ops
@@ -4237,7 +4237,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
//- rjf: apply dynamic type overrides //- rjf: apply dynamic type overrides
if(parse.expr != 0 && parse.expr->kind != EVAL_ExprKind_Cast) if(parse.expr != 0 && parse.expr->kind != EVAL_ExprKind_Cast)
{ {
result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, result); result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, result);
} }
scratch_end(scratch); scratch_end(scratch);
@@ -4246,7 +4246,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
} }
internal DF_Eval internal DF_Eval
df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval)
{ {
ProfBeginFunction(); ProfBeginFunction();
DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread);
@@ -4262,7 +4262,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl
{ {
TG_Key type_key = eval.type_key; TG_Key type_key = eval.type_key;
TG_Kind type_kind = tg_kind_from_key(type_key); TG_Kind type_kind = tg_kind_from_key(type_key);
U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= 8) if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= 8)
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
@@ -4292,7 +4292,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl
case EVAL_EvalMode_Reg: case EVAL_EvalMode_Reg:
{ {
TG_Key type_key = eval.type_key; TG_Key type_key = eval.type_key;
U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
U64 reg_off = eval.offset; U64 reg_off = eval.offset;
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread);
if(unwind.first != 0) if(unwind.first != 0)
@@ -4316,7 +4316,7 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl
} }
internal DF_Eval internal DF_Eval
df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval)
{ {
ProfBeginFunction(); ProfBeginFunction();
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
@@ -4330,11 +4330,11 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCt
TG_Kind type_kind = tg_kind_from_key(type_key); TG_Kind type_kind = tg_kind_from_key(type_key);
if(type_kind == TG_Kind_Ptr) if(type_kind == TG_Kind_Ptr)
{ {
TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, type_key); TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, type_key);
TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key); TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key);
if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class) if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class)
{ {
TG_Type *ptee_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, ptee_type_key); TG_Type *ptee_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, ptee_type_key);
B32 has_vtable = 0; B32 has_vtable = 0;
for(U64 idx = 0; idx < ptee_type->count; idx += 1) for(U64 idx = 0; idx < ptee_type->count; idx += 1)
{ {
@@ -4363,12 +4363,12 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCt
U64 vtable_vaddr = 0; U64 vtable_vaddr = 0;
MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size); MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size);
U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr); U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr);
U64 global_idx = rdi_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff); U64 global_idx = rdi_vmap_idx_from_voff(rdi->global_vmap, rdi->global_vmap_count, vtable_voff);
RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, global_idx); RDI_GlobalVariable *global_var = rdi_element_from_idx(rdi, global_variables, global_idx);
if(global_var->link_flags & RDI_LinkFlag_TypeScoped) if(global_var->link_flags & RDI_LinkFlag_TypeScoped)
{ {
RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, global_var->container_idx); RDI_UDT *udt = rdi_element_from_idx(rdi, udts, global_var->container_idx);
RDI_TypeNode *type = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx); RDI_TypeNode *type = rdi_element_from_idx(rdi, type_nodes, udt->self_type_idx);
TG_Key derived_type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), (U64)udt->self_type_idx); TG_Key derived_type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), (U64)udt->self_type_idx);
TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0); TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0);
eval.type_key = ptr_to_derived_type_key; eval.type_key = ptr_to_derived_type_key;
@@ -4579,13 +4579,13 @@ df_string_from_ascii_value(Arena *arena, U8 val)
} }
internal String8 internal String8
df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval)
{ {
ProfBeginFunction(); ProfBeginFunction();
String8 result = {0}; String8 result = {0};
TG_Key type_key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, eval.type_key); TG_Key type_key = tg_unwrapped_from_graph_rdi_key(graph, rdi, eval.type_key);
TG_Kind type_kind = tg_kind_from_key(type_key); TG_Kind type_kind = tg_kind_from_key(type_key);
U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
U8 digit_group_separator = 0; U8 digit_group_separator = 0;
if(!(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) if(!(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules))
{ {
@@ -4653,7 +4653,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg
case TG_Kind_Enum: case TG_Kind_Enum:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type_key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type_key);
String8 constant_name = {0}; String8 constant_name = {0};
for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) for(U64 val_idx = 0; val_idx < type->count; val_idx += 1)
{ {
@@ -4693,7 +4693,7 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg
//- rjf: writing values back to child processes //- rjf: writing values back to child processes
internal B32 internal B32
df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval)
{ {
B32 result = 0; B32 result = 0;
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
@@ -4705,8 +4705,8 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF
TG_Key src_type_key = src_eval.type_key; TG_Key src_type_key = src_eval.type_key;
TG_Kind dst_type_kind = tg_kind_from_key(dst_type_key); TG_Kind dst_type_kind = tg_kind_from_key(dst_type_key);
TG_Kind src_type_kind = tg_kind_from_key(src_type_key); TG_Kind src_type_kind = tg_kind_from_key(src_type_key);
U64 dst_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, dst_type_key); U64 dst_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, dst_type_key);
U64 src_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, src_type_key); U64 src_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, src_type_key);
//- rjf: get commit data based on destination type //- rjf: get commit data based on destination type
String8 commit_data = {0}; String8 commit_data = {0};
@@ -4726,7 +4726,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF
case TG_Kind_LRef: case TG_Kind_LRef:
if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || src_type_kind == TG_Kind_Ptr) if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || src_type_kind == TG_Kind_Ptr)
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval);
commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size);
commit_data = push_str8_copy(scratch.arena, commit_data); commit_data = push_str8_copy(scratch.arena, commit_data);
}break; }break;
@@ -4749,7 +4749,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF
case TG_Kind_Bool: case TG_Kind_Bool:
if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool)
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval);
commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size);
commit_data = push_str8_copy(scratch.arena, commit_data); commit_data = push_str8_copy(scratch.arena, commit_data);
}break; }break;
@@ -4761,7 +4761,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF
src_type_kind == TG_Kind_F64) src_type_kind == TG_Kind_F64)
{ {
F32 value = 0; F32 value = 0;
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval);
switch(src_type_kind) switch(src_type_kind)
{ {
case TG_Kind_F32:{value = value_eval.imm_f32;}break; case TG_Kind_F32:{value = value_eval.imm_f32;}break;
@@ -4779,7 +4779,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF
src_type_kind == TG_Kind_F64) src_type_kind == TG_Kind_F64)
{ {
F64 value = 0; F64 value = 0;
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval);
switch(src_type_kind) switch(src_type_kind)
{ {
case TG_Kind_F32:{value = (F64)value_eval.imm_f32;}break; case TG_Kind_F32:{value = (F64)value_eval.imm_f32;}break;
@@ -4794,7 +4794,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF
case TG_Kind_Enum: case TG_Kind_Enum:
if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool)
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, src_eval); DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval);
commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size);
commit_data = push_str8_copy(scratch.arena, commit_data); commit_data = push_str8_copy(scratch.arena, commit_data);
}break; }break;
@@ -4914,7 +4914,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray mem
} }
internal DF_EvalLinkBaseChunkList internal DF_EvalLinkBaseChunkList
df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap)
{ {
DF_EvalLinkBaseChunkList list = {0}; DF_EvalLinkBaseChunkList list = {0};
for(DF_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) for(DF_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;)
@@ -4948,7 +4948,7 @@ df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed
base_eval.mode, base_eval.mode,
base_eval.offset + link_member_off, base_eval.offset + link_member_off,
}; };
DF_Eval link_member_value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, link_member_eval); DF_Eval link_member_value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, link_member_eval);
// rjf: advance to next link // rjf: advance to next link
last_eval = base_eval; last_eval = base_eval;
@@ -5047,13 +5047,13 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
////////////////////////////// //////////////////////////////
//- rjf: apply view rules & resolve eval //- rjf: apply view rules & resolve eval
// //
eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, cfg_table); eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, cfg_table);
////////////////////////////// //////////////////////////////
//- rjf: unpack eval //- rjf: unpack eval
// //
TG_Key eval_type_key = tg_unwrapped_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key); TG_Key eval_type_key = tg_unwrapped_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, eval.type_key);
TG_Kind eval_type_kind = tg_kind_from_key(eval_type_key); TG_Kind eval_type_kind = tg_kind_from_key(eval_type_key);
////////////////////////////// //////////////////////////////
@@ -5084,9 +5084,9 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
TG_Kind ptr_type_kind = TG_Kind_Null; TG_Kind ptr_type_kind = TG_Kind_Null;
if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef)
{ {
TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, eval_type_key); TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, eval_type_key);
TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key);
DF_Eval ptr_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval ptr_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
// rjf: ptrs to udts // rjf: ptrs to udts
if(parent_is_expanded && if(parent_is_expanded &&
@@ -5199,7 +5199,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
ProfScope("build viz blocks for UDT members") ProfScope("build viz blocks for UDT members")
{ {
//- rjf: type -> filtered data members //- rjf: type -> filtered data members
TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key);
TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table);
//- rjf: build blocks for all members, split by sub-expansions //- rjf: build blocks for all members, split by sub-expansions
@@ -5255,7 +5255,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
ProfScope("build viz blocks for UDT type-eval enums") ProfScope("build viz blocks for UDT type-eval enums")
{ {
//- rjf: type -> full type info //- rjf: type -> full type info
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key);
//- rjf: build block for all members (cannot be expanded) //- rjf: build block for all members (cannot be expanded)
DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1);
@@ -5277,7 +5277,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
ProfScope("(structs, unions, classes) descend to members & make block(s), with linked list view") ProfScope("(structs, unions, classes) descend to members & make block(s), with linked list view")
{ {
//- rjf: type -> data members //- rjf: type -> data members
TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, udt_eval.type_key); TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key);
//- rjf: find link member //- rjf: find link member
TG_Member *link_member = 0; TG_Member *link_member = 0;
@@ -5290,7 +5290,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
{ {
link_member = mem; link_member = mem;
link_member_type_kind = tg_kind_from_key(link_member->type_key); link_member_type_kind = tg_kind_from_key(link_member->type_key);
link_member_ptee_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key); link_member_ptee_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, link_member->type_key);
break; break;
} }
} }
@@ -5308,7 +5308,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
DF_EvalLinkBaseChunkList link_bases = {0}; DF_EvalLinkBaseChunkList link_bases = {0};
if(link_member_is_good) if(link_member_is_good)
{ {
link_bases = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, link_member->type_key, link_member->off, ctrl_ctx, udt_eval, 512); link_bases = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, link_member->type_key, link_member->off, ctrl_ctx, udt_eval, 512);
} }
//- rjf: build blocks for all links, split by sub-expansions //- rjf: build blocks for all links, split by sub-expansions
@@ -5371,10 +5371,10 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
ProfScope("(arrays) descend to elements & make block(s)") ProfScope("(arrays) descend to elements & make block(s)")
{ {
//- rjf: unpack array type info //- rjf: unpack array type info
TG_Type *array_type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, arr_eval.type_key); TG_Type *array_type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, arr_eval.type_key);
U64 array_count = array_type->count; U64 array_count = array_type->count;
TG_Key element_type_key = array_type->direct_type_key; TG_Key element_type_key = array_type->direct_type_key;
U64 element_type_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, element_type_key); U64 element_type_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, element_type_key);
//- rjf: build blocks for all elements, split by sub-expansions //- rjf: build blocks for all elements, split by sub-expansions
DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1);
@@ -5612,7 +5612,7 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz
// rjf: determine exandability, editability // rjf: determine exandability, editability
if(tg_kind_from_key(eval.type_key) != TG_Kind_Null) if(tg_kind_from_key(eval.type_key) != TG_Kind_Null)
{ {
for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, t)) for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, t))
{ {
TG_Kind kind = tg_kind_from_key(t); TG_Kind kind = tg_kind_from_key(t);
if(kind == TG_Kind_Null) if(kind == TG_Kind_Null)
+5 -5
View File
@@ -1579,8 +1579,8 @@ internal B32 df_eval_memory_read(void *u, void *out, U64 addr, U64 size);
internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 vaddr); internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DBGI_Scope *scope, DF_Entity *process, U64 vaddr);
internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt); internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt);
internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string); internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string);
internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg); internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg);
//////////////////////////////// ////////////////////////////////
@@ -1604,14 +1604,14 @@ internal String8 df_eval_view_rule_from_key(DF_EvalView *eval_view, DF_ExpandKey
//- rjf: evaluation value string builder helpers //- rjf: evaluation value string builder helpers
internal String8 df_string_from_ascii_value(Arena *arena, U8 val); internal String8 df_string_from_ascii_value(Arena *arena, U8 val);
internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval);
//- rjf: writing values back to child processes //- rjf: writing values back to child processes
internal B32 df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); internal B32 df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval);
//- rjf: type helpers //- rjf: type helpers
internal TG_MemberArray df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg); internal TG_MemberArray df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg);
internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap);
internal DF_EvalLinkBase df_eval_link_base_from_chunk_list_index(DF_EvalLinkBaseChunkList *list, U64 idx); internal DF_EvalLinkBase df_eval_link_base_from_chunk_list_index(DF_EvalLinkBaseChunkList *list, U64 idx);
internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *arena, DF_EvalLinkBaseChunkList *chunks); internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *arena, DF_EvalLinkBaseChunkList *chunks);
+41 -41
View File
@@ -5232,7 +5232,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
default:{}break; default:{}break;
case EVAL_EvalMode_Addr: case EVAL_EvalMode_Addr:
{ {
U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key);
size = Min(size, 64); size = Min(size, 64);
Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size);
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0);
@@ -5289,7 +5289,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
{ {
String8 commit_string = str8(ws->hover_eval_txt_buffer, ws->hover_eval_txt_size); String8 commit_string = str8(ws->hover_eval_txt_buffer, ws->hover_eval_txt_size);
DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, commit_string); DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, commit_string);
B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdbg, &ctrl_ctx, row->eval, write_eval); B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, row->eval, write_eval);
if(success == 0) if(success == 0)
{ {
DF_CmdParams params = df_cmd_params_from_window(ws); DF_CmdParams params = df_cmd_params_from_window(ws);
@@ -6858,7 +6858,7 @@ df_eval_escaped_from_raw_string(Arena *arena, String8 raw)
} }
internal String8List internal String8List
df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table)
{ {
ProfBeginFunction(); ProfBeginFunction();
String8List list = {0}; String8List list = {0};
@@ -6869,13 +6869,13 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
{ {
if(opt_member != 0) if(opt_member != 0)
{ {
U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, opt_member->type_key); U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, opt_member->type_key);
str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size > 1 ? "s" : ""); str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size > 1 ? "s" : "");
} }
else else
{ {
String8 basic_type_kind_string = tg_kind_basic_string_table[tg_kind_from_key(eval.type_key)]; String8 basic_type_kind_string = tg_kind_basic_string_table[tg_kind_from_key(eval.type_key)];
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, eval.type_key); U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval.type_key);
str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size > 1 ? "s" : ""); str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size > 1 ? "s" : "");
} }
} }
@@ -6883,7 +6883,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
//- rjf: non-type path: descend recursively & produce single-line value strings //- rjf: non-type path: descend recursively & produce single-line value strings
else if(max_size > 0) else if(max_size > 0)
{ {
TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(graph, rdbg, eval.type_key)); TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(graph, rdi, eval.type_key));
U32 radix = default_radix; U32 radix = default_radix;
DF_CfgVal *dec_cfg = df_cfg_val_from_string(cfg_table, str8_lit("dec")); DF_CfgVal *dec_cfg = df_cfg_val_from_string(cfg_table, str8_lit("dec"));
DF_CfgVal *hex_cfg = df_cfg_val_from_string(cfg_table, str8_lit("hex")); DF_CfgVal *hex_cfg = df_cfg_val_from_string(cfg_table, str8_lit("hex"));
@@ -6899,8 +6899,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
//- rjf: default - leaf cases //- rjf: default - leaf cases
default: default:
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, eval);
String8 string = df_string_from_simple_typed_eval(arena, graph, rdbg, flags, radix, value_eval); String8 string = df_string_from_simple_typed_eval(arena, graph, rdi, flags, radix, value_eval);
space_taken += f_dim_from_tag_size_string(font, font_size, string).x; space_taken += f_dim_from_tag_size_string(font, font_size, string).x;
str8_list_push(arena, &list, string); str8_list_push(arena, &list, string);
}break; }break;
@@ -6920,11 +6920,11 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
B32 has_array = (array_cfg != &df_g_nil_cfg_val); B32 has_array = (array_cfg != &df_g_nil_cfg_val);
// rjf: get ptr value // rjf: get ptr value
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, eval);
// rjf: get pointed-at info // rjf: get pointed-at info
TG_Kind type_kind = tg_kind_from_key(eval.type_key); TG_Kind type_kind = tg_kind_from_key(eval.type_key);
TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(graph, rdbg, eval.type_key); TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(graph, rdi, eval.type_key);
TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key);
B32 direct_type_has_content = (direct_type_kind != TG_Kind_Null && direct_type_kind != TG_Kind_Void && value_eval.imm_u64 != 0); B32 direct_type_has_content = (direct_type_kind != TG_Kind_Null && direct_type_kind != TG_Kind_Void && value_eval.imm_u64 != 0);
B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && value_eval.imm_u64 != 0 && B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && value_eval.imm_u64 != 0 &&
@@ -6940,7 +6940,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
if(!no_addr || (direct_type_has_content == 0 && direct_type_is_string == 0)) if(!no_addr || (direct_type_has_content == 0 && direct_type_is_string == 0))
{ {
did_ptr_value = 1; did_ptr_value = 1;
String8 string = df_string_from_simple_typed_eval(arena, graph, rdbg, flags, radix, value_eval); String8 string = df_string_from_simple_typed_eval(arena, graph, rdi, flags, radix, value_eval);
space_taken += f_dim_from_tag_size_string(font, font_size, string).x; space_taken += f_dim_from_tag_size_string(font, font_size, string).x;
str8_list_push(arena, &list, string); str8_list_push(arena, &list, string);
} }
@@ -6985,7 +6985,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
pted_eval.type_key = direct_type_key; pted_eval.type_key = direct_type_key;
pted_eval.mode = EVAL_EvalMode_Addr; pted_eval.mode = EVAL_EvalMode_Addr;
pted_eval.offset = value_eval.imm_u64; pted_eval.offset = value_eval.imm_u64;
String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdbg, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table);
if(pted_strs.total_size == 0) if(pted_strs.total_size == 0)
{ {
String8 unknown = str8_lit("???"); String8 unknown = str8_lit("???");
@@ -7011,7 +7011,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
case TG_Kind_Array: case TG_Kind_Array:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *eval_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, eval.type_key); TG_Type *eval_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, eval.type_key);
TG_Key direct_type_key = eval_type->direct_type_key; TG_Key direct_type_key = eval_type->direct_type_key;
TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key);
U64 array_count = eval_type->count; U64 array_count = eval_type->count;
@@ -7055,7 +7055,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
{ {
if(depth < 3) if(depth < 3)
{ {
U64 direct_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type_key); U64 direct_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type_key);
for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1)
{ {
DF_Eval element_eval = zero_struct; DF_Eval element_eval = zero_struct;
@@ -7063,7 +7063,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
element_eval.mode = eval.mode; element_eval.mode = eval.mode;
element_eval.offset = eval.offset + direct_type_byte_size*idx; element_eval.offset = eval.offset + direct_type_byte_size*idx;
MemoryCopyArray(element_eval.imm_u128, eval.imm_u128); MemoryCopyArray(element_eval.imm_u128, eval.imm_u128);
String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdbg, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table);
space_taken += f_dim_from_tag_size_string_list(font, font_size, element_strs).x; space_taken += f_dim_from_tag_size_string_list(font, font_size, element_strs).x;
str8_list_concat_in_place(&list, &element_strs); str8_list_concat_in_place(&list, &element_strs);
if(idx+1 < array_count) if(idx+1 < array_count)
@@ -7111,7 +7111,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
if(depth < 4) if(depth < 4)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdbg, eval.type_key); TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdi, eval.type_key);
TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table);
for(U64 member_idx = 0; member_idx < filtered_data_members.count && max_size > space_taken; member_idx += 1) for(U64 member_idx = 0; member_idx < filtered_data_members.count && max_size > space_taken; member_idx += 1)
{ {
@@ -7121,7 +7121,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
member_eval.mode = eval.mode; member_eval.mode = eval.mode;
member_eval.offset = eval.offset + mem->off; member_eval.offset = eval.offset + mem->off;
MemoryCopyArray(member_eval.imm_u128, eval.imm_u128); MemoryCopyArray(member_eval.imm_u128, eval.imm_u128);
String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdbg, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table);
space_taken += f_dim_from_tag_size_string_list(font, font_size, member_strs).x; space_taken += f_dim_from_tag_size_string_list(font, font_size, member_strs).x;
str8_list_concat_in_place(&list, &member_strs); str8_list_concat_in_place(&list, &member_strs);
if(member_idx+1 < filtered_data_members.count) if(member_idx+1 < filtered_data_members.count)
@@ -7286,8 +7286,8 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
case DF_EvalVizBlockKind_Root: case DF_EvalVizBlockKind_Root:
if(visible_idx_range.max > visible_idx_range.min) if(visible_idx_range.max > visible_idx_range.min)
{ {
String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table);
String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table);
DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, block->key, block->eval); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, block->key, block->eval);
row->expr = block->string; row->expr = block->string;
row->display_value = str8_list_join(arena, &display_strings, 0); row->display_value = str8_list_join(arena, &display_strings, 0);
@@ -7312,7 +7312,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
case DF_EvalVizBlockKind_Members: case DF_EvalVizBlockKind_Members:
if(block_type_kind != TG_Kind_Null) if(block_type_kind != TG_Kind_Null)
{ {
TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key);
TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, &block->cfg_table); TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, &block->cfg_table);
for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < filtered_data_members.count; idx += 1) for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < filtered_data_members.count; idx += 1)
{ {
@@ -7337,13 +7337,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval // rjf: apply view rules to eval
{ {
member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, member_eval); member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, member_eval);
member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, member_eval, &view_rule_table); member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, member_eval, &view_rule_table);
} }
// rjf: build & push row // rjf: build & push row
String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table);
String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table);
DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, member_eval); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, member_eval);
if(member->kind == TG_MemberKind_Padding) if(member->kind == TG_MemberKind_Padding)
{ {
@@ -7370,7 +7370,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
case DF_EvalVizBlockKind_EnumMembers: case DF_EvalVizBlockKind_EnumMembers:
if(block_type_kind == TG_Kind_Enum) if(block_type_kind == TG_Kind_Enum)
{ {
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key);
for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < type->count; idx += 1) for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < type->count; idx += 1)
{ {
TG_EnumVal *enum_val = &type->enum_vals[idx]; TG_EnumVal *enum_val = &type->enum_vals[idx];
@@ -7391,13 +7391,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval // rjf: apply view rules to eval
{ {
eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table);
} }
// rjf: build & push row // rjf: build & push row
String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table);
String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table);
DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval);
row->expr = push_str8_copy(arena, enum_val->name); row->expr = push_str8_copy(arena, enum_val->name);
row->display_value = str8_list_join(arena, &display_strings, 0); row->display_value = str8_list_join(arena, &display_strings, 0);
@@ -7414,9 +7414,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// //
case DF_EvalVizBlockKind_Elements: case DF_EvalVizBlockKind_Elements:
{ {
TG_Key direct_type_key = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, block->eval.type_key); TG_Key direct_type_key = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key);
TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key);
U64 direct_type_key_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, direct_type_key); U64 direct_type_key_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, direct_type_key);
for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1)
{ {
// rjf: get keys for this row // rjf: get keys for this row
@@ -7438,13 +7438,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval // rjf: apply view rules to eval
{ {
elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, elem_eval); elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, elem_eval);
elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, elem_eval, &view_rule_table); elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, elem_eval, &view_rule_table);
} }
// rjf: build row // rjf: build row
String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table);
String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table);
DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, elem_eval); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, elem_eval);
row->expr = push_str8f(arena, "[%I64u]", idx); row->expr = push_str8f(arena, "[%I64u]", idx);
row->display_value = str8_list_join(arena, &display_strings, 0); row->display_value = str8_list_join(arena, &display_strings, 0);
@@ -7465,7 +7465,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// //
case DF_EvalVizBlockKind_Links: case DF_EvalVizBlockKind_Links:
{ {
DF_EvalLinkBaseChunkList link_base_chunks = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdbg, block->link_member_type_key, block->link_member_off, ctrl_ctx, block->eval, 512); DF_EvalLinkBaseChunkList link_base_chunks = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->link_member_type_key, block->link_member_off, ctrl_ctx, block->eval, 512);
DF_EvalLinkBaseArray link_bases = df_eval_link_base_array_from_chunk_list(scratch.arena, &link_base_chunks); DF_EvalLinkBaseArray link_bases = df_eval_link_base_array_from_chunk_list(scratch.arena, &link_base_chunks);
for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1)
{ {
@@ -7489,13 +7489,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User);
// rjf: apply view rules to eval // rjf: apply view rules to eval
link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, link_eval); link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, link_eval);
link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, link_eval, &view_rule_table); link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, link_eval, &view_rule_table);
TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key); TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key);
// rjf: build row // rjf: build row
String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table);
String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table);
DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, link_eval); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, link_eval);
row->expr = push_str8f(arena, "[%I64u]", idx); row->expr = push_str8f(arena, "[%I64u]", idx);
row->display_value = str8_list_join(arena, &display_strings, 0); row->display_value = str8_list_join(arena, &display_strings, 0);
@@ -7534,7 +7534,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1)
{ {
// rjf: unpack info about this row // rjf: unpack info about this row
String8 name = dbgi_fuzzy_item_string_from_rdbg_target_element_idx(parse_ctx->rdbg, block->dbgi_target, block->backing_search_items.v[idx].idx); String8 name = dbgi_fuzzy_item_string_from_rdi_target_element_idx(parse_ctx->rdi, block->dbgi_target, block->backing_search_items.v[idx].idx);
// rjf: get keys for this row // rjf: get keys for this row
DF_ExpandKey parent_key = block->parent_key; DF_ExpandKey parent_key = block->parent_key;
@@ -7551,13 +7551,13 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval // rjf: apply view rules to eval
{ {
eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table);
} }
// rjf: build row // rjf: build row
String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table);
String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table);
DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval); DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval);
row->expr = name; row->expr = name;
row->display_value = str8_list_join(arena, &display_strings, 0); row->display_value = str8_list_join(arena, &display_strings, 0);
@@ -9735,7 +9735,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
if(!tg_key_match(tg_key_zero(), eval.type_key)) if(!tg_key_match(tg_key_zero(), eval.type_key))
{ {
DF_CfgTable cfg_table = {0}; DF_CfgTable cfg_table = {0};
String8List eval_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, 10, params->font, params->font_size, params->font_size*60.f, 0, eval, 0, &cfg_table); String8List eval_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, 10, params->font, params->font_size, params->font_size*60.f, 0, eval, 0, &cfg_table);
eval_string = str8_list_join(scratch.arena, &eval_strings, 0); eval_string = str8_list_join(scratch.arena, &eval_strings, 0);
} }
ui_spacer(ui_em(1.5f, 1.f)); ui_spacer(ui_em(1.5f, 1.f));
+1 -1
View File
@@ -961,7 +961,7 @@ internal void df_window_update_and_render(Arena *arena, OS_EventList *events, DF
//~ rjf: Eval Viz //~ rjf: Eval Viz
internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw); internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw);
internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table);
internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks);
//////////////////////////////// ////////////////////////////////
+20 -20
View File
@@ -223,10 +223,10 @@ df_view_rule_hooks__bitmap_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx
String8 height_expr = str8_list_join(scratch.arena, &height_expr_strs, 0); String8 height_expr = str8_list_join(scratch.arena, &height_expr_strs, 0);
String8 fmt_string = fmt_cfg->first->string; String8 fmt_string = fmt_cfg->first->string;
DF_Eval width_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, width_expr); DF_Eval width_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, width_expr);
DF_Eval width_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, width_eval); DF_Eval width_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, width_eval);
info.width = width_eval_value.imm_u64; info.width = width_eval_value.imm_u64;
DF_Eval height_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, height_expr); DF_Eval height_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, height_expr);
DF_Eval height_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, height_eval); DF_Eval height_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, height_eval);
info.height = height_eval_value.imm_u64; info.height = height_eval_value.imm_u64;
if(fmt_string.size != 0) if(fmt_string.size != 0)
{ {
@@ -276,9 +276,9 @@ df_view_rule_hooks__geo_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ct
DF_Eval count_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, count_expr); DF_Eval count_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, count_expr);
DF_Eval vertices_base_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_base_expr); DF_Eval vertices_base_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_base_expr);
DF_Eval vertices_size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_size_expr); DF_Eval vertices_size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_size_expr);
DF_Eval count_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, count_eval); DF_Eval count_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, count_eval);
DF_Eval vertices_base_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, vertices_base_eval); DF_Eval vertices_base_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_base_eval);
DF_Eval vertices_size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, vertices_size_eval); DF_Eval vertices_size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_size_eval);
U64 vertices_base_vaddr = vertices_base_val_eval.imm_u64 ? vertices_base_val_eval.imm_u64 : vertices_base_val_eval.offset; U64 vertices_base_vaddr = vertices_base_val_eval.imm_u64 ? vertices_base_val_eval.imm_u64 : vertices_base_val_eval.offset;
result.index_count = count_val_eval.imm_u64; result.index_count = count_val_eval.imm_u64;
result.vertices_vaddr_range = r1u64(vertices_base_vaddr, vertices_base_vaddr+vertices_size_val_eval.imm_u64); result.vertices_vaddr_range = r1u64(vertices_base_vaddr, vertices_base_vaddr+vertices_size_val_eval.imm_u64);
@@ -306,7 +306,7 @@ df_view_rule_hooks__txt_topology_info_from_cfg(DBGI_Scope *scope, DF_CtrlCtx *ct
lang_string = lang_cfg->first->string; lang_string = lang_cfg->first->string;
String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join); String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join);
DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr); DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr);
DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, size_eval); DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, size_eval);
result.lang = txt_lang_kind_from_extension(lang_string); result.lang = txt_lang_kind_from_extension(lang_string);
result.size_cap = size_val_eval.imm_u64; result.size_cap = size_val_eval.imm_u64;
} }
@@ -337,13 +337,13 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array)
} }
String8 array_size_expr = str8_list_join(scratch.arena, &array_size_expr_strs, 0); String8 array_size_expr = str8_list_join(scratch.arena, &array_size_expr_strs, 0);
DF_Eval array_size_eval = df_eval_from_string(arena, dbgi_scope, ctrl_ctx, parse_ctx, macro_map, array_size_expr); DF_Eval array_size_eval = df_eval_from_string(arena, dbgi_scope, ctrl_ctx, parse_ctx, macro_map, array_size_expr);
DF_Eval array_size_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, array_size_eval); DF_Eval array_size_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, array_size_eval);
eval_error_list_concat_in_place(&eval.errors, &array_size_eval.errors); eval_error_list_concat_in_place(&eval.errors, &array_size_eval.errors);
array_size = array_size_eval_value.imm_u64; array_size = array_size_eval_value.imm_u64;
} }
// rjf: apply array size to type // rjf: apply array size to type
TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type_key);
TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, array_size); TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, array_size);
eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0);
} }
@@ -373,13 +373,13 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap)
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Key type_key = eval.type_key; TG_Key type_key = eval.type_key;
TG_Kind type_kind = tg_kind_from_key(type_key); TG_Kind type_kind = tg_kind_from_key(type_key);
U64 type_size_bytes = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdbg, type_key); U64 type_size_bytes = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type_key);
if(TG_Kind_Char8 <= type_kind && type_kind <= TG_Kind_S256 && if(TG_Kind_Char8 <= type_kind && type_kind <= TG_Kind_S256 &&
(type_size_bytes == 2 || (type_size_bytes == 2 ||
type_size_bytes == 4 || type_size_bytes == 4 ||
type_size_bytes == 8)) type_size_bytes == 8))
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
if(value_eval.mode == EVAL_EvalMode_Value) if(value_eval.mode == EVAL_EvalMode_Value)
{ {
switch(type_size_bytes) switch(type_size_bytes)
@@ -498,8 +498,8 @@ DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba)
DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process);
//- rjf: grab hsva //- rjf: grab hsva
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
Vec4F32 rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdbg, process); Vec4F32 rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process);
Vec4F32 hsva = hsva_from_rgba(rgba); Vec4F32 hsva = hsva_from_rgba(rgba);
//- rjf: build text box //- rjf: build text box
@@ -572,8 +572,8 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba)
} }
else else
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdbg, process); rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process);
state->hsva = hsva = hsva_from_rgba(rgba); state->hsva = hsva = hsva_from_rgba(rgba);
state->memgen_idx = ctrl_memgen_idx(); state->memgen_idx = ctrl_memgen_idx();
} }
@@ -623,7 +623,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba)
if(commit) if(commit)
{ {
Vec4F32 rgba = rgba_from_hsva(hsva); Vec4F32 rgba = rgba_from_hsva(hsva);
df_view_rule_hooks__eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, rgba); df_view_rule_hooks__eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, rgba);
state->memgen_idx = ctrl_memgen_idx(); state->memgen_idx = ctrl_memgen_idx();
} }
@@ -678,7 +678,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text)
DF_TxtTopologyInfo top = df_view_rule_hooks__txt_topology_info_from_cfg(dbgi_scope, ctrl_ctx, parse_ctx, macro_map, cfg); DF_TxtTopologyInfo top = df_view_rule_hooks__txt_topology_info_from_cfg(dbgi_scope, ctrl_ctx, parse_ctx, macro_map, cfg);
//- rjf: resolve to address value & range //- rjf: resolve to address value & range
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset;
Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048));
@@ -844,7 +844,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap)
DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(bitmap) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(bitmap)
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset;
DF_BitmapTopologyInfo topology = df_view_rule_hooks__bitmap_topology_info_from_cfg(scope, ctrl_ctx, parse_ctx, macro_map, cfg); DF_BitmapTopologyInfo topology = df_view_rule_hooks__bitmap_topology_info_from_cfg(scope, ctrl_ctx, parse_ctx, macro_map, cfg);
U64 expected_size = topology.width*topology.height*r_tex2d_format_bytes_per_pixel_table[topology.fmt]; U64 expected_size = topology.width*topology.height*r_tex2d_format_bytes_per_pixel_table[topology.fmt];
@@ -865,7 +865,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap)
state->last_open_frame_idx = df_frame_index(); state->last_open_frame_idx = df_frame_index();
//- rjf: resolve to address value //- rjf: resolve to address value
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset;
//- rjf: unpack thread/process of eval //- rjf: unpack thread/process of eval
@@ -1087,7 +1087,7 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo)
DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo)
{ {
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset;
UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText))
ui_labelf("0x%I64x -> Geometry", base_vaddr); ui_labelf("0x%I64x -> Geometry", base_vaddr);
@@ -1112,7 +1112,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo)
state->last_open_frame_idx = df_frame_index(); state->last_open_frame_idx = df_frame_index();
//- rjf: resolve to address value //- rjf: resolve to address value
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset;
//- rjf: extract extra geo topology info from view rule //- rjf: extract extra geo topology info from view rule
+19 -19
View File
@@ -751,7 +751,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF
DF_Entity *binary = df_binary_file_from_module(module); DF_Entity *binary = df_binary_file_from_module(module);
String8 exe_path = df_full_path_from_entity(scratch.arena, binary); String8 exe_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
//- rjf: calculate top-level keys, expand root-level, grab root expansion node //- rjf: calculate top-level keys, expand root-level, grab root expansion node
DF_ExpandKey parent_key = df_expand_key_make(5381, 0); DF_ExpandKey parent_key = df_expand_key_make(5381, 0);
@@ -842,7 +842,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF
last_vb = df_eval_viz_block_split_and_continue(arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]); last_vb = df_eval_viz_block_split_and_continue(arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]);
// rjf: grab name for the expanded row // rjf: grab name for the expanded row
String8 name = dbgi_fuzzy_item_string_from_rdbg_target_element_idx(&dbgi->rdbg, dbgi_target, sub_expand_keys[sub_expand_idx].child_num); String8 name = dbgi_fuzzy_item_string_from_rdi_target_element_idx(&dbgi->rdi, dbgi_target, sub_expand_keys[sub_expand_idx].child_num);
// rjf: recurse for sub-expansion // rjf: recurse for sub-expansion
{ {
@@ -1180,7 +1180,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
default:{}break; default:{}break;
case EVAL_EvalMode_Addr: case EVAL_EvalMode_Addr:
{ {
U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key);
size = Min(size, 64); size = Min(size, 64);
Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size);
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0);
@@ -1270,7 +1270,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
row->depth > 0 && row->depth > 0 &&
!row_expanded) !row_expanded)
{ {
U64 next_off = (row->eval.offset + tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key)); U64 next_off = (row->eval.offset + tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key));
if(next_off%64 != 0 && row->eval.offset/64 < next_off/64) if(next_off%64 != 0 && row->eval.offset/64 < next_off/64)
{ {
ui_set_next_fixed_x(0); ui_set_next_fixed_x(0);
@@ -1346,7 +1346,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
String8List inheritance_chain_type_names = {0}; String8List inheritance_chain_type_names = {0};
for(TG_KeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next) for(TG_KeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next)
{ {
String8 inherited_type_name = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, n->v); String8 inherited_type_name = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, n->v);
inherited_type_name = str8_skip_chop_whitespace(inherited_type_name); inherited_type_name = str8_skip_chop_whitespace(inherited_type_name);
str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name); str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name);
} }
@@ -1399,9 +1399,9 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
if(parse.expr != &eval_expr_nil && errors.count == 0) if(parse.expr != &eval_expr_nil && errors.count == 0)
{ {
ui_labelf("Type:"); ui_labelf("Type:");
ir_tree_and_type = eval_irtree_and_type_from_expr(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, &eval_string2expr_map_nil, parse.expr, &errors); ir_tree_and_type = eval_irtree_and_type_from_expr(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, &eval_string2expr_map_nil, parse.expr, &errors);
TG_Key type_key = ir_tree_and_type.type_key; TG_Key type_key = ir_tree_and_type.type_key;
String8 type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, type_key); String8 type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, type_key);
UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText)) UI_TextColor(df_rgba_from_theme_color(DF_ThemeColor_WeakText))
ui_label(type_string); ui_label(type_string);
} }
@@ -1554,7 +1554,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
UI_FocusActive((cell_selected && ewv->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) UI_FocusActive((cell_selected && ewv->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off)
{ {
TG_Key key = row->eval.type_key; TG_Key key = row->eval.type_key;
String8 string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, key); String8 string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, key);
string = str8_skip_chop_whitespace(string); string = str8_skip_chop_whitespace(string);
UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###type_%I64x", row_hash); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###type_%I64x", row_hash);
if(!tg_key_match(key, tg_key_zero())) UI_Parent(box) if(!tg_key_match(key, tg_key_zero())) UI_Parent(box)
@@ -1691,7 +1691,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &macro_map, commit_string); DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &macro_map, commit_string);
B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdbg, &ctrl_ctx, commit_row->eval, write_eval); B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, commit_row->eval, write_eval);
if(success == 0) if(success == 0)
{ {
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
@@ -2918,7 +2918,7 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister)
//- rjf: query -> raddbg, filtered items //- rjf: query -> raddbg, filtered items
U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))};
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100); DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, os_now_microseconds()+100);
RDI_Parsed *rdbg = &dbgi->rdbg; RDI_Parsed *rdi = &dbgi->rdi;
B32 items_stale = 0; B32 items_stale = 0;
DBGI_FuzzySearchItemArray items = dbgi_fuzzy_search_items_from_key_exe_query(scope, fuzzy_search_key, exe_path, query, DBGI_FuzzySearchTarget_Procedures, os_now_microseconds()+100, &items_stale); DBGI_FuzzySearchItemArray items = dbgi_fuzzy_search_items_from_key_exe_query(scope, fuzzy_search_key, exe_path, query, DBGI_FuzzySearchTarget_Procedures, os_now_microseconds()+100, &items_stale);
if(items_stale) if(items_stale)
@@ -2929,9 +2929,9 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister)
//- rjf: submit best match when hitting enter w/ no selection //- rjf: submit best match when hitting enter w/ no selection
if(slv->cursor.y == 0 && items.count != 0 && os_key_press(ui_events(), ui_window(), 0, OS_Key_Return)) if(slv->cursor.y == 0 && items.count != 0 && os_key_press(ui_events(), ui_window(), 0, OS_Key_Return))
{ {
RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, items.v[0].idx); RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, items.v[0].idx);
U64 name_size = 0; U64 name_size = 0;
U8 *name_base = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);
String8 name = str8(name_base, name_size); String8 name = str8(name_base, name_size);
if(name.size != 0) if(name.size != 0)
{ {
@@ -2967,11 +2967,11 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister)
UI_Focus((slv->cursor.y == idx+1) ? UI_FocusKind_On : UI_FocusKind_Off) UI_Focus((slv->cursor.y == idx+1) ? UI_FocusKind_On : UI_FocusKind_Off)
{ {
DBGI_FuzzySearchItem *item = &items.v[idx]; DBGI_FuzzySearchItem *item = &items.v[idx];
RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, item->idx); RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, item->idx);
U64 name_size = 0; U64 name_size = 0;
U8 *name_base = rdi_string_from_idx(rdbg, procedure->name_string_idx, &name_size); U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);
String8 name = str8(name_base, name_size); String8 name = str8(name_base, name_size);
RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, procedure->type_idx); RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, procedure->type_idx);
TG_Key type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), procedure->type_idx); TG_Key type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), procedure->type_idx);
ui_set_next_hover_cursor(OS_Cursor_HandPoint); ui_set_next_hover_cursor(OS_Cursor_HandPoint);
UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|
@@ -2987,7 +2987,7 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister)
ui_box_equip_fuzzy_match_ranges(box, &item->match_ranges); ui_box_equip_fuzzy_match_ranges(box, &item->match_ranges);
if(!tg_key_match(tg_key_zero(), type_key)) if(!tg_key_match(tg_key_zero(), type_key))
{ {
String8 type_string = tg_string_from_key(scratch.arena, graph, rdbg, type_key); String8 type_string = tg_string_from_key(scratch.arena, graph, rdi, type_key);
df_code_label(0.5f, 0, df_rgba_from_theme_color(DF_ThemeColor_WeakText), type_string); df_code_label(0.5f, 0, df_rgba_from_theme_color(DF_ThemeColor_WeakText), type_string);
} }
} }
@@ -7902,7 +7902,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
DBGI_Scope *scope = dbgi_scope_open(); DBGI_Scope *scope = dbgi_scope_open();
U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count);
EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_rip_vaddr); EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_rip_vaddr);
RDI_Parsed *rdbg = parse_ctx.rdbg; RDI_Parsed *rdi = parse_ctx.rdi;
for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next) for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next)
{ {
String8 local_name = n->string; String8 local_name = n->string;
@@ -7910,7 +7910,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
if(local_eval.mode == EVAL_EvalMode_Addr) if(local_eval.mode == EVAL_EvalMode_Addr)
{ {
TG_Kind local_eval_type_kind = tg_kind_from_key(local_eval.type_key); TG_Kind local_eval_type_kind = tg_kind_from_key(local_eval.type_key);
U64 local_eval_type_size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, rdbg, local_eval.type_key); U64 local_eval_type_size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, rdi, local_eval.type_key);
Rng1U64 vaddr_rng = r1u64(local_eval.offset, local_eval.offset+local_eval_type_size); Rng1U64 vaddr_rng = r1u64(local_eval.offset, local_eval.offset+local_eval_type_size);
Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng);
if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min)
@@ -7919,7 +7919,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
{ {
annotation->name_string = push_str8_copy(scratch.arena, local_name); annotation->name_string = push_str8_copy(scratch.arena, local_name);
annotation->kind_string = str8_lit("Local"); annotation->kind_string = str8_lit("Local");
annotation->type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdbg, local_eval.type_key); annotation->type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, local_eval.type_key);
annotation->color = color_gen_table[(vaddr_rng.min/8)%ArrayCount(color_gen_table)]; annotation->color = color_gen_table[(vaddr_rng.min/8)%ArrayCount(color_gen_table)];
annotation->vaddr_range = vaddr_rng; annotation->vaddr_range = vaddr_rng;
} }
+118 -118
View File
@@ -331,7 +331,7 @@ eval_type_group_from_kind(TG_Kind kind){
} }
internal TG_Key internal TG_Key
eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
TG_Key result = key; TG_Key result = key;
for(B32 good = 1; good;) for(B32 good = 1; good;)
@@ -339,7 +339,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
TG_Kind kind = tg_kind_from_key(key); TG_Kind kind = tg_kind_from_key(key);
if(kind == TG_Kind_Enum) if(kind == TG_Kind_Enum)
{ {
result = tg_direct_from_graph_rdi_key(graph, rdbg, result); result = tg_direct_from_graph_rdi_key(graph, rdi, result);
} }
else else
{ {
@@ -350,7 +350,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
} }
internal TG_Key internal TG_Key
eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key){ eval_type_promote(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key){
TG_Key result = key; TG_Key result = key;
TG_Kind kind = tg_kind_from_key(key); TG_Kind kind = tg_kind_from_key(key);
if(kind == TG_Kind_Bool || if(kind == TG_Kind_Bool ||
@@ -365,17 +365,17 @@ eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key){
} }
internal TG_Key internal TG_Key
eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){
Assert(eval_kind_is_basic_or_enum(tg_kind_from_key(l)) && Assert(eval_kind_is_basic_or_enum(tg_kind_from_key(l)) &&
eval_kind_is_basic_or_enum(tg_kind_from_key(r))); eval_kind_is_basic_or_enum(tg_kind_from_key(r)));
// replace enums with corresponding ints // replace enums with corresponding ints
TG_Key lt = eval_type_unwrap_enum(graph, rdbg, l); TG_Key lt = eval_type_unwrap_enum(graph, rdi, l);
TG_Key rt = eval_type_unwrap_enum(graph, rdbg, r); TG_Key rt = eval_type_unwrap_enum(graph, rdi, r);
// first promote each // first promote each
TG_Key lp = eval_type_promote(graph, rdbg, lt); TG_Key lp = eval_type_promote(graph, rdi, lt);
TG_Key rp = eval_type_promote(graph, rdbg, rt); TG_Key rp = eval_type_promote(graph, rdi, rt);
TG_Kind lk = tg_kind_from_key(lp); TG_Kind lk = tg_kind_from_key(lp);
TG_Kind rk = tg_kind_from_key(rp); TG_Kind rk = tg_kind_from_key(rp);
@@ -384,12 +384,12 @@ eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
} }
internal B32 internal B32
eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){ eval_type_match(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){
B32 result = 0; B32 result = 0;
// unwrap // unwrap
TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l); TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdi, l);
TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r); TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdi, r);
if (tg_key_match(lu, ru)){ if (tg_key_match(lu, ru)){
result = 1; result = 1;
@@ -408,21 +408,21 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_LRef: case TG_Kind_LRef:
case TG_Kind_RRef: case TG_Kind_RRef:
{ {
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu); TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru); TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru);
if (eval_type_match(graph, rdbg, lud, rud)){ if (eval_type_match(graph, rdi, lud, rud)){
result = 1; result = 1;
} }
}break; }break;
case TG_Kind_MemberPtr: case TG_Kind_MemberPtr:
{ {
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu); TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru); TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru);
TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdbg, lu); TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdi, lu);
TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdbg, ru); TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdi, ru);
if (eval_type_match(graph, rdbg, lud, rud) && if (eval_type_match(graph, rdi, lud, rud) &&
eval_type_match(graph, rdbg, luo, ruo)){ eval_type_match(graph, rdi, luo, ruo)){
result = 1; result = 1;
} }
}break; }break;
@@ -430,9 +430,9 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Array: case TG_Kind_Array:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r);
if(lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) if(lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key))
{ {
result = 1; result = 1;
} }
@@ -442,9 +442,9 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Function: case TG_Kind_Function:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r);
if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key)) if (lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key))
{ {
B32 params_match = 1; B32 params_match = 1;
TG_Key *lp = lt->param_type_keys; TG_Key *lp = lt->param_type_keys;
@@ -452,7 +452,7 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
U64 count = lt->count; U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{ {
if(!eval_type_match(graph, rdbg, *lp, *rp)) if(!eval_type_match(graph, rdi, *lp, *rp))
{ {
params_match = 0; params_match = 0;
break; break;
@@ -466,11 +466,11 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Method: case TG_Kind_Method:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l); TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r); TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r);
if (lt->count == rt->count && if (lt->count == rt->count &&
eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key) && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key) &&
eval_type_match(graph, rdbg, lt->owner_type_key, rt->owner_type_key)) eval_type_match(graph, rdi, lt->owner_type_key, rt->owner_type_key))
{ {
B32 params_match = 1; B32 params_match = 1;
TG_Key *lp = lt->param_type_keys; TG_Key *lp = lt->param_type_keys;
@@ -478,7 +478,7 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
U64 count = lt->count; U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{ {
if(!eval_type_match(graph, rdbg, *lp, *rp)) if(!eval_type_match(graph, rdi, *lp, *rp))
{ {
params_match = 0; params_match = 0;
break; break;
@@ -589,8 +589,8 @@ eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode){
//~ allen: EVAL IR-Tree High Level Helpers //~ allen: EVAL IR-Tree High Level Helpers
internal EVAL_IRTree* internal EVAL_IRTree*
eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
EVAL_IRTree *result = &eval_irtree_nil; EVAL_IRTree *result = &eval_irtree_nil;
if (0 < byte_size && byte_size <= 8){ if (0 < byte_size && byte_size <= 8){
// build the read node // build the read node
@@ -629,9 +629,9 @@ eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_
} }
internal EVAL_IRTree* internal EVAL_IRTree*
eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){ eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){
EVAL_IRTree *result = c; EVAL_IRTree *result = c;
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
if (byte_size < 64){ if (byte_size < 64){
RDI_EvalOp op = RDI_EvalOp_Trunc; RDI_EvalOp op = RDI_EvalOp_Trunc;
TG_Kind kind = tg_kind_from_key(type_key); TG_Kind kind = tg_kind_from_key(type_key);
@@ -648,7 +648,7 @@ eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *
} }
internal EVAL_IRTree* internal EVAL_IRTree*
eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in){ eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key out, TG_Key in){
EVAL_IRTree *result = c; EVAL_IRTree *result = c;
TG_Kind in_kind = tg_kind_from_key(in); TG_Kind in_kind = tg_kind_from_key(in);
TG_Kind out_kind = tg_kind_from_key(out); TG_Kind out_kind = tg_kind_from_key(out);
@@ -659,24 +659,24 @@ eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRT
{ {
result = eval_irtree_convert_lo(arena, result, out_group, in_group); result = eval_irtree_convert_lo(arena, result, out_group, in_group);
} }
U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, in); U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, in);
U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, out); U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, out);
if(out_byte_size < in_byte_size && eval_kind_is_integer(out_kind)) if(out_byte_size < in_byte_size && eval_kind_is_integer(out_kind))
{ {
result = eval_irtree_trunc(arena, graph, rdbg, result, out); result = eval_irtree_trunc(arena, graph, rdi, result, out);
} }
return(result); return(result);
} }
internal EVAL_IRTree* internal EVAL_IRTree*
eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_EvalMode from_mode, eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_EvalMode from_mode,
EVAL_IRTree *tree, TG_Key type_key){ EVAL_IRTree *tree, TG_Key type_key){
EVAL_IRTree *result = tree; EVAL_IRTree *result = tree;
switch (from_mode){ switch (from_mode){
default:{}break; default:{}break;
case EVAL_EvalMode_Addr: case EVAL_EvalMode_Addr:
{ {
result = eval_irtree_mem_read_type(arena, graph, rdbg, tree, type_key); result = eval_irtree_mem_read_type(arena, graph, rdi, tree, type_key);
}break; }break;
case EVAL_EvalMode_Reg: case EVAL_EvalMode_Reg:
{ {
@@ -715,7 +715,7 @@ eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap
} }
internal TG_Key internal TG_Key
eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout){ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_Expr *expr, EVAL_ErrorList *eout){
TG_Key result = zero_struct; TG_Key result = zero_struct;
EVAL_ExprKind kind = expr->kind; EVAL_ExprKind kind = expr->kind;
@@ -732,14 +732,14 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_E
case EVAL_ExprKind_Ptr: case EVAL_ExprKind_Ptr:
{ {
TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdbg, expr->children[0], eout); TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, expr->children[0], eout);
result = tg_cons_type_make(graph, TG_Kind_Ptr, direct_type_key, 0); result = tg_cons_type_make(graph, TG_Kind_Ptr, direct_type_key, 0);
}break; }break;
case EVAL_ExprKind_Array: case EVAL_ExprKind_Array:
{ {
EVAL_Expr *child_expr = expr->child_and_constant.child; EVAL_Expr *child_expr = expr->child_and_constant.child;
TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdbg, child_expr, eout); TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, child_expr, eout);
result = tg_cons_type_make(graph, TG_Kind_Array, direct_type_key, expr->child_and_constant.u64); result = tg_cons_type_make(graph, TG_Kind_Array, direct_type_key, expr->child_and_constant.u64);
}break; }break;
@@ -758,7 +758,7 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_E
} }
internal EVAL_IRTreeAndType internal EVAL_IRTreeAndType
eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout)
{ {
ProfBeginFunction(); ProfBeginFunction();
EVAL_IRTreeAndType result = {0}; EVAL_IRTreeAndType result = {0};
@@ -777,12 +777,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1]; EVAL_Expr *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if (l.tree->op != 0 && r.tree->op != 0){ if (l.tree->op != 0 && r.tree->op != 0){
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
TG_Kind r_restype_kind = tg_kind_from_key(r_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
@@ -795,8 +795,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type."); eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type.");
} }
else{ else{
direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type); direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type);
if (l_restype_kind == TG_Kind_Ptr){ if (l_restype_kind == TG_Kind_Ptr){
if (direct_type_size == 0){ if (direct_type_size == 0){
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types.");
@@ -829,7 +829,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// generate ir tree // generate ir tree
if (can_generate){ if (can_generate){
// how to compute the index // how to compute the index
EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
if (direct_type_size > 1){ if (direct_type_size > 1){
EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size);
index_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, index_tree, const_tree); index_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, index_tree, const_tree);
@@ -838,7 +838,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// how to compute the base address // how to compute the base address
EVAL_IRTree *base_tree = l.tree; EVAL_IRTree *base_tree = l.tree;
if (l_resolve){ if (l_resolve){
base_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, base_tree, l_restype); base_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, base_tree, l_restype);
} }
// how to compute the final address // how to compute the final address
@@ -857,17 +857,17 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1]; EVAL_Expr *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){ if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
// determine which type to use // determine which type to use
TG_Key check_type_key = l_restype; TG_Key check_type_key = l_restype;
TG_Kind check_type_kind = l_restype_kind; TG_Kind check_type_kind = l_restype_kind;
if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){ if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){
check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
check_type_kind = tg_kind_from_key(check_type_key); check_type_kind = tg_kind_from_key(check_type_key);
} }
@@ -921,7 +921,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (l_good && r_good){ if (l_good && r_good){
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdbg, check_type_key); TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdi, check_type_key);
// lookup member // lookup member
String8 member_name = exprr->name; String8 member_name = exprr->name;
@@ -953,7 +953,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (can_generate){ if (can_generate){
EVAL_IRTree *new_tree = l.tree; EVAL_IRTree *new_tree = l.tree;
if (l_resolve){ if (l_resolve){
new_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, new_tree, l_restype); new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, new_tree, l_restype);
} }
if (r_off != 0){ if (r_off != 0){
EVAL_IRTree *const_tree = eval_irtree_const_u(arena, r_off); EVAL_IRTree *const_tree = eval_irtree_const_u(arena, r_off);
@@ -975,13 +975,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
{ {
EVAL_Expr *exprc = expr->children[0]; EVAL_Expr *exprc = expr->children[0];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
if (c.tree->op != 0){ if (c.tree->op != 0){
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, c_restype); TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, c_restype);
U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype_direct); U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype_direct);
// analyze situation // analyze situation
B32 can_generate = 0; B32 can_generate = 0;
@@ -1018,7 +1018,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (can_generate){ if (can_generate){
EVAL_IRTree *new_tree = c.tree; EVAL_IRTree *new_tree = c.tree;
if (c_resolve){ if (c_resolve){
new_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
} }
// fill result // fill result
@@ -1032,10 +1032,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ExprKind_Address: case EVAL_ExprKind_Address:
{ {
EVAL_Expr *exprc = expr->children[0]; EVAL_Expr *exprc = expr->children[0];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero())) if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero()))
{ {
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
// analyze situation // analyze situation
@@ -1064,16 +1064,16 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1]; EVAL_Expr *exprr = expr->children[1];
TG_Key cast_type_key = eval_type_from_type_expr(arena, graph, rdbg, exprl, eout); TG_Key cast_type_key = eval_type_from_type_expr(arena, graph, rdi, exprl, eout);
TG_Kind cast_type_kind = tg_kind_from_key(cast_type_key); TG_Kind cast_type_kind = tg_kind_from_key(cast_type_key);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if(cast_type_kind != TG_Kind_Null && c.tree->op != 0) if(cast_type_kind != TG_Kind_Null && c.tree->op != 0)
{ {
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype); U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype);
U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cast_type_key); U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, cast_type_key);
// analyze situation // analyze situation
U8 in_group = eval_type_group_from_kind(c_restype_kind); U8 in_group = eval_type_group_from_kind(c_restype_kind);
@@ -1086,14 +1086,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case RDI_EvalConversionKind_Noop: case RDI_EvalConversionKind_Noop:
case RDI_EvalConversionKind_Legal: case RDI_EvalConversionKind_Legal:
{ {
EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
EVAL_IRTree *new_tree = in_tree; EVAL_IRTree *new_tree = in_tree;
if (conversion_rule == RDI_EvalConversionKind_Legal){ if (conversion_rule == RDI_EvalConversionKind_Legal){
new_tree = eval_irtree_convert_lo(arena, in_tree, out_group, in_group); new_tree = eval_irtree_convert_lo(arena, in_tree, out_group, in_group);
} }
if (cast_type_byte_size < c_restype_byte_size && eval_kind_is_integer(cast_type_kind)){ if (cast_type_byte_size < c_restype_byte_size && eval_kind_is_integer(cast_type_kind)){
new_tree = eval_irtree_trunc(arena, graph, rdbg, in_tree, cast_type_key); new_tree = eval_irtree_trunc(arena, graph, rdi, in_tree, cast_type_key);
} }
result.tree = new_tree; result.tree = new_tree;
@@ -1126,13 +1126,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ExprKind_Array: case EVAL_ExprKind_Array:
case EVAL_ExprKind_Func: case EVAL_ExprKind_Func:
{ {
type_key = eval_type_from_type_expr(arena, graph, rdbg, exprc, eout); type_key = eval_type_from_type_expr(arena, graph, rdi, exprc, eout);
}break; }break;
// size of value expression // size of value expression
default: default:
{ {
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
type_key = c.type_key; type_key = c.type_key;
}break; }break;
} }
@@ -1141,7 +1141,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
TG_Kind type_kind = tg_kind_from_key(type_key); TG_Kind type_kind = tg_kind_from_key(type_key);
if (type_kind != TG_Kind_Null){ if (type_kind != TG_Kind_Null){
can_generate = 1; can_generate = 1;
size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key); size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
} }
// generate ir tree // generate ir tree
@@ -1160,10 +1160,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
{ {
EVAL_Expr *exprc = expr->children[0]; EVAL_Expr *exprc = expr->children[0];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
if (c.tree->op != 0){ if (c.tree->op != 0){
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Key p_type = eval_type_promote(graph, rdbg, c_restype); TG_Key p_type = eval_type_promote(graph, rdi, c_restype);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
// analyze situation // analyze situation
@@ -1179,8 +1179,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// generate ir tree // generate ir tree
if (can_generate){ if (can_generate){
EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
in_tree = eval_irtree_convert_hi(arena, graph, rdbg, in_tree, p_type, c_restype); in_tree = eval_irtree_convert_hi(arena, graph, rdi, in_tree, p_type, c_restype);
EVAL_IRTree *new_tree = eval_irtree_unary_op(arena, op, c_group, in_tree); EVAL_IRTree *new_tree = eval_irtree_unary_op(arena, op, c_group, in_tree);
@@ -1214,12 +1214,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0]; EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1]; EVAL_Expr *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if (l.tree->op != 0 && r.tree->op != 0){ if (l.tree->op != 0 && r.tree->op != 0){
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
TG_Kind r_restype_kind = tg_kind_from_key(r_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
@@ -1267,10 +1267,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
arith_path = EVAL_ArithPath_PtrAdd; arith_path = EVAL_ArithPath_PtrAdd;
} }
if (l_is_pointer_like && r_is_pointer_like){ if (l_is_pointer_like && r_is_pointer_like){
TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, r_restype); TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, r_restype);
U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, l_restype_direct); U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, l_restype_direct);
U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, r_restype_direct); U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, r_restype_direct);
if (l_restype_direct_byte_size == r_restype_direct_byte_size){ if (l_restype_direct_byte_size == r_restype_direct_byte_size){
arith_path = EVAL_ArithPath_PtrSub; arith_path = EVAL_ArithPath_PtrSub;
} }
@@ -1289,9 +1289,9 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
TG_Key cv_type_key = zero_struct; TG_Key cv_type_key = zero_struct;
if (both_basic){ if (both_basic){
cv_type_key = eval_type_coerce(graph, rdbg, l_restype, r_restype); cv_type_key = eval_type_coerce(graph, rdi, l_restype, r_restype);
} }
else if (is_comparison && eval_type_match(graph, rdbg, l_restype, r_restype)){ else if (is_comparison && eval_type_match(graph, rdi, l_restype, r_restype)){
cv_type_key = l_restype; cv_type_key = l_restype;
} }
@@ -1313,11 +1313,11 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
final_type_key = tg_key_basic(TG_Kind_Bool); final_type_key = tg_key_basic(TG_Kind_Bool);
} }
EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype); EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype);
l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, cv_type_key, l_restype); l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, cv_type_key, l_restype);
EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, cv_type_key, r_restype); r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, cv_type_key, r_restype);
EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, cv_group, l_tree, r_tree); EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, cv_group, l_tree, r_tree);
@@ -1339,16 +1339,16 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
ptr_is_decay = r_is_decay; ptr_is_decay = r_is_decay;
} }
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, ptr->type_key); TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, ptr->type_key);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct); U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct);
// generate ir tree // generate ir tree
EVAL_IRTree *ptr_tree = ptr->tree; EVAL_IRTree *ptr_tree = ptr->tree;
if (!ptr_is_decay){ if (!ptr_is_decay){
ptr_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, ptr->mode, ptr_tree, ptr->type_key); ptr_tree = eval_irtree_resolve_to_value(arena, graph, rdi, ptr->mode, ptr_tree, ptr->type_key);
} }
EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, integer->mode, integer->tree, integer->type_key); EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdi, integer->mode, integer->tree, integer->type_key);
if (direct_type_size > 1){ if (direct_type_size > 1){
EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size);
integer_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, integer_tree, const_tree); integer_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, integer_tree, const_tree);
@@ -1368,18 +1368,18 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ArithPath_PtrSub: case EVAL_ArithPath_PtrSub:
{ {
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype); TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct); U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct);
// generate ir tree // generate ir tree
EVAL_IRTree *l_tree = l.tree; EVAL_IRTree *l_tree = l.tree;
if (!l_is_decay){ if (!l_is_decay){
l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype); l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype);
} }
EVAL_IRTree *r_tree = r.tree; EVAL_IRTree *r_tree = r.tree;
if (!r_is_decay){ if (!r_is_decay){
r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
} }
EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l_tree, r_tree); EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l_tree, r_tree);
@@ -1404,15 +1404,15 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[1]; EVAL_Expr *exprl = expr->children[1];
EVAL_Expr *exprr = expr->children[2]; EVAL_Expr *exprr = expr->children[2];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout); EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout); EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout); EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){ if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key); TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key); TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key); TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype); TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype); TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
TG_Kind r_restype_kind = tg_kind_from_key(r_restype); TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
@@ -1427,10 +1427,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (eval_kind_is_basic_or_enum(l_restype_kind) && if (eval_kind_is_basic_or_enum(l_restype_kind) &&
eval_kind_is_basic_or_enum(r_restype_kind)){ eval_kind_is_basic_or_enum(r_restype_kind)){
can_generate = 1; can_generate = 1;
final_type = eval_type_coerce(graph, rdbg, l_restype, r_restype); final_type = eval_type_coerce(graph, rdi, l_restype, r_restype);
} }
else{ else{
if (eval_type_match(graph, rdbg, l_restype, r_restype)){ if (eval_type_match(graph, rdi, l_restype, r_restype)){
if (l_restype_kind == TG_Kind_Ptr){ if (l_restype_kind == TG_Kind_Ptr){
can_generate = 1; can_generate = 1;
final_type = l_restype; final_type = l_restype;
@@ -1447,13 +1447,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// generate ir tree // generate ir tree
if (can_generate){ if (can_generate){
EVAL_IRTree *c_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype); EVAL_IRTree *c_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype); EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype);
l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, final_type, l_restype); l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, final_type, l_restype);
EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype); EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, final_type, r_restype); r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, final_type, r_restype);
EVAL_IRTree *new_tree = eval_irtree_conditional(arena, c_tree, l_tree, r_tree); EVAL_IRTree *new_tree = eval_irtree_conditional(arena, c_tree, l_tree, r_tree);
@@ -1540,7 +1540,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
{ {
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left side of assignment must be an identifier."); eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left side of assignment must be an identifier.");
} }
result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, expr->children[1], eout); result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, expr->children[1], eout);
}break; }break;
case EVAL_ExprKind_LeafIdent: case EVAL_ExprKind_LeafIdent:
{ {
@@ -1553,7 +1553,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
else else
{ {
eval_string2expr_map_inc_poison(leaf_ident_expr_map, name); eval_string2expr_map_inc_poison(leaf_ident_expr_map, name);
result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, leaf_ident_expr, eout); result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, leaf_ident_expr, eout);
eval_string2expr_map_dec_poison(leaf_ident_expr_map, name); eval_string2expr_map_dec_poison(leaf_ident_expr_map, name);
} }
}break; }break;
+10 -10
View File
@@ -42,11 +42,11 @@ internal EVAL_Expr* eval_expr_leaf_type(Arena *arena, void *location, TG_Key typ
internal RDI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind); internal RDI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind);
internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Key eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Key eval_type_promote(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Key eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r); internal TG_Key eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r);
internal B32 eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r); internal B32 eval_type_match(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r);
internal B32 eval_kind_is_integer(TG_Kind kind); internal B32 eval_kind_is_integer(TG_Kind kind);
internal B32 eval_kind_is_signed(TG_Kind kind); internal B32 eval_kind_is_signed(TG_Kind kind);
@@ -65,18 +65,18 @@ internal EVAL_IRTree* eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecod
//////////////////////////////// ////////////////////////////////
//~ allen: EVAL IR-Tree High Level Helpers //~ allen: EVAL IR-Tree High Level Helpers
internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key);
internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in); internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in);
internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key); internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key);
internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in); internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key out, TG_Key in);
internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key);
//////////////////////////////// ////////////////////////////////
//~ allen: EVAL Compiler Phases //~ allen: EVAL Compiler Phases
internal void eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap *map, EVAL_Expr *expr, EVAL_ErrorList *eout); internal void eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap *map, EVAL_Expr *expr, EVAL_ErrorList *eout);
internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout); internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_Expr *expr, EVAL_ErrorList *eout);
internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout);
internal void eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out); internal void eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out);
#endif //EVAL_COMPILER_H #endif //EVAL_COMPILER_H
+81 -81
View File
@@ -57,7 +57,7 @@ global read_only S64 eval_g_max_precedence = 15;
//~ rjf: Map Building Fast Paths //~ rjf: Map Building Fast Paths
internal EVAL_String2NumMap * internal EVAL_String2NumMap *
eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
@@ -73,10 +73,10 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff)
//- rjf: voff -> tightest scope //- rjf: voff -> tightest scope
RDI_Scope *tightest_scope = 0; RDI_Scope *tightest_scope = 0;
if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) if(rdi->scope_vmap != 0 && rdi->scopes != 0)
{ {
U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff);
RDI_Scope *scope = &rdbg->scopes[scope_idx]; RDI_Scope *scope = &rdi->scopes[scope_idx];
Task *task = push_array(scratch.arena, Task, 1); Task *task = push_array(scratch.arena, Task, 1);
task->scope = scope; task->scope = scope;
SLLQueuePush(first_task, last_task, task); SLLQueuePush(first_task, last_task, task);
@@ -84,10 +84,10 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff)
} }
//- rjf: voff-1 -> scope //- rjf: voff-1 -> scope
if(voff > 0 && rdbg->scope_vmap != 0 && rdbg->scopes != 0) if(voff > 0 && rdi->scope_vmap != 0 && rdi->scopes != 0)
{ {
U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff-1); U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff-1);
RDI_Scope *scope = &rdbg->scopes[scope_idx]; RDI_Scope *scope = &rdi->scopes[scope_idx];
if(scope != tightest_scope) if(scope != tightest_scope)
{ {
Task *task = push_array(scratch.arena, Task, 1); Task *task = push_array(scratch.arena, Task, 1);
@@ -99,9 +99,9 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff)
//- rjf: tightest scope -> walk up the tree & build tasks for each parent scope //- rjf: tightest scope -> walk up the tree & build tasks for each parent scope
if(tightest_scope != 0) if(tightest_scope != 0)
{ {
for(RDI_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx]; for(RDI_Scope *scope = &rdi->scopes[tightest_scope->parent_scope_idx];
scope != 0 && scope != &rdbg->scopes[0]; scope != 0 && scope != &rdi->scopes[0];
scope = &rdbg->scopes[scope->parent_scope_idx]) scope = &rdi->scopes[scope->parent_scope_idx])
{ {
Task *task = push_array(scratch.arena, Task, 1); Task *task = push_array(scratch.arena, Task, 1);
task->scope = scope; task->scope = scope;
@@ -122,9 +122,9 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff)
U32 local_opl_idx = scope->local_first + scope->local_count; U32 local_opl_idx = scope->local_first + scope->local_count;
for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1)
{ {
RDI_Local *local_var = &rdbg->locals[local_idx]; RDI_Local *local_var = &rdi->locals[local_idx];
U64 local_name_size = 0; U64 local_name_size = 0;
U8 *local_name_str = rdi_string_from_idx(rdbg, local_var->name_string_idx, &local_name_size); U8 *local_name_str = rdi_string_from_idx(rdi, local_var->name_string_idx, &local_name_size);
String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size));
eval_string2num_map_insert(arena, map, name, (U64)local_idx+1); eval_string2num_map_insert(arena, map, name, (U64)local_idx+1);
} }
@@ -136,35 +136,35 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff)
} }
internal EVAL_String2NumMap * internal EVAL_String2NumMap *
eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff) eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff)
{ {
//- rjf: voff -> tightest scope //- rjf: voff -> tightest scope
RDI_Scope *tightest_scope = 0; RDI_Scope *tightest_scope = 0;
if(rdbg->scope_vmap != 0 && rdbg->scopes != 0) if(rdi->scope_vmap != 0 && rdi->scopes != 0)
{ {
U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff); U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff);
tightest_scope = &rdbg->scopes[scope_idx]; tightest_scope = &rdi->scopes[scope_idx];
} }
//- rjf: tightest scope -> procedure //- rjf: tightest scope -> procedure
RDI_Procedure *procedure = 0; RDI_Procedure *procedure = 0;
if(tightest_scope != 0 && rdbg->procedures != 0) if(tightest_scope != 0 && rdi->procedures != 0)
{ {
U32 proc_idx = tightest_scope->proc_idx; U32 proc_idx = tightest_scope->proc_idx;
if(0 < proc_idx && proc_idx < rdbg->procedures_count) if(0 < proc_idx && proc_idx < rdi->procedures_count)
{ {
procedure = &rdbg->procedures[proc_idx]; procedure = &rdi->procedures[proc_idx];
} }
} }
//- rjf: procedure -> udt //- rjf: procedure -> udt
RDI_UDT *udt = 0; RDI_UDT *udt = 0;
if(procedure != 0 && rdbg->udts != 0 && procedure->link_flags & RDI_LinkFlag_TypeScoped) if(procedure != 0 && rdi->udts != 0 && procedure->link_flags & RDI_LinkFlag_TypeScoped)
{ {
U32 udt_idx = procedure->container_idx; U32 udt_idx = procedure->container_idx;
if(0 < udt_idx && udt_idx < rdbg->udts_count) if(0 < udt_idx && udt_idx < rdi->udts_count)
{ {
udt = &rdbg->udts[udt_idx]; udt = &rdi->udts[udt_idx];
} }
} }
@@ -173,22 +173,22 @@ eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff)
*map = eval_string2num_map_make(arena, 64); *map = eval_string2num_map_make(arena, 64);
//- rjf: udt -> fill member map //- rjf: udt -> fill member map
if(udt != 0 && !(udt->flags & RDI_UserDefinedTypeFlag_EnumMembers) && rdbg->members != 0) if(udt != 0 && !(udt->flags & RDI_UserDefinedTypeFlag_EnumMembers) && rdi->members != 0)
{ {
U64 data_member_num = 1; U64 data_member_num = 1;
for(U32 member_idx = udt->member_first; for(U32 member_idx = udt->member_first;
member_idx < udt->member_first+udt->member_count; member_idx < udt->member_first+udt->member_count;
member_idx += 1) member_idx += 1)
{ {
if(member_idx < 1 || rdbg->members_count <= member_idx) if(member_idx < 1 || rdi->members_count <= member_idx)
{ {
break; break;
} }
RDI_Member *m = &rdbg->members[member_idx]; RDI_Member *m = &rdi->members[member_idx];
if(m->kind == RDI_MemberKind_DataField) if(m->kind == RDI_MemberKind_DataField)
{ {
String8 name = {0}; String8 name = {0};
name.str = rdi_string_from_idx(rdbg, m->name_string_idx, &name.size); name.str = rdi_string_from_idx(rdi, m->name_string_idx, &name.size);
eval_string2num_map_insert(arena, map, name, data_member_num); eval_string2num_map_insert(arena, map, name, data_member_num);
data_member_num += 1; data_member_num += 1;
} }
@@ -464,23 +464,23 @@ eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl)
//~ rjf: Parser Functions //~ rjf: Parser Functions
internal TG_Key internal TG_Key
eval_leaf_type_from_name(RDI_Parsed *rdbg, String8 name) eval_leaf_type_from_name(RDI_Parsed *rdi, String8 name)
{ {
TG_Key key = zero_struct; TG_Key key = zero_struct;
B32 found = 0; B32 found = 0;
if(rdbg->type_nodes != 0) if(rdi->type_nodes != 0)
{ {
RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Types); RDI_NameMap *name_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Types);
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(rdbg, name_map, &parsed_name_map); rdi_name_map_parse(rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size);
if(node != 0) if(node != 0)
{ {
U32 match_count = 0; U32 match_count = 0;
U32 *matches = rdi_matches_from_map_node(rdbg, node, &match_count); U32 *matches = rdi_matches_from_map_node(rdi, node, &match_count);
if(match_count != 0) if(match_count != 0)
{ {
RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, matches[0]); RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, matches[0]);
found = type_node->kind != RDI_TypeKind_NULL; found = type_node->kind != RDI_TypeKind_NULL;
key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)matches[0]); key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)matches[0]);
} }
@@ -569,7 +569,7 @@ eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text,
if(token.kind == EVAL_TokenKind_Identifier) if(token.kind == EVAL_TokenKind_Identifier)
{ {
String8 token_string = str8_substr(text, token.range); String8 token_string = str8_substr(text, token.range);
TG_Key type_key = eval_leaf_type_from_name(ctx->rdbg, token_string); TG_Key type_key = eval_leaf_type_from_name(ctx->rdi, token_string);
if(!tg_key_match(tg_key_zero(), type_key)) if(!tg_key_match(tg_key_zero(), type_key))
{ {
token_it += 1; token_it += 1;
@@ -680,7 +680,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
String8 some_type_identifier_maybe_string = str8_substr(text, some_type_identifier_maybe.range); String8 some_type_identifier_maybe_string = str8_substr(text, some_type_identifier_maybe.range);
if(some_type_identifier_maybe.kind == EVAL_TokenKind_Identifier) if(some_type_identifier_maybe.kind == EVAL_TokenKind_Identifier)
{ {
TG_Key type_key = eval_leaf_type_from_name(ctx->rdbg, some_type_identifier_maybe_string); TG_Key type_key = eval_leaf_type_from_name(ctx->rdi, some_type_identifier_maybe_string);
if(!tg_key_match(type_key, tg_key_zero()) || str8_match(some_type_identifier_maybe_string, str8_lit("unsigned"), 0)) if(!tg_key_match(type_key, tg_key_zero()) || str8_match(some_type_identifier_maybe_string, str8_lit("unsigned"), 0))
{ {
// rjf: move past open paren // rjf: move past open paren
@@ -798,14 +798,14 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: form namespaceified fallback versions of this lookup string //- rjf: form namespaceified fallback versions of this lookup string
String8List namespaceified_token_strings = {0}; String8List namespaceified_token_strings = {0};
if(ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_vmap != 0) if(ctx->rdi->procedures != 0 && ctx->rdi->scopes != 0 && ctx->rdi->scope_vmap != 0)
{ {
U64 scope_idx = rdi_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff); U64 scope_idx = rdi_vmap_idx_from_voff(ctx->rdi->scope_vmap, ctx->rdi->scope_vmap_count, ctx->ip_voff);
RDI_Scope *scope = &ctx->rdbg->scopes[scope_idx]; RDI_Scope *scope = &ctx->rdi->scopes[scope_idx];
U64 proc_idx = scope->proc_idx; U64 proc_idx = scope->proc_idx;
RDI_Procedure *procedure = &ctx->rdbg->procedures[proc_idx]; RDI_Procedure *procedure = &ctx->rdi->procedures[proc_idx];
U64 name_size = 0; U64 name_size = 0;
U8 *name_ptr = rdi_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size); U8 *name_ptr = rdi_string_from_idx(ctx->rdi, procedure->name_string_idx, &name_size);
String8 containing_procedure_name = str8(name_ptr, name_size); String8 containing_procedure_name = str8(name_ptr, name_size);
U64 last_past_scope_resolution_pos = 0; U64 last_past_scope_resolution_pos = 0;
for(;;) for(;;)
@@ -843,8 +843,8 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
{ {
mapped_identifier = 1; mapped_identifier = 1;
identifier_type_is_possibly_dynamically_overridden = 1; identifier_type_is_possibly_dynamically_overridden = 1;
RDI_Local *local_var = rdi_element_from_idx(ctx->rdbg, locals, local_num-1); RDI_Local *local_var = rdi_element_from_idx(ctx->rdi, locals, local_num-1);
RDI_TypeNode *type_node = rdi_element_from_idx(ctx->rdbg, type_nodes, local_var->type_idx); RDI_TypeNode *type_node = rdi_element_from_idx(ctx->rdi, type_nodes, local_var->type_idx);
type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)local_var->type_idx); type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)local_var->type_idx);
// rjf: grab location info // rjf: grab location info
@@ -852,19 +852,19 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
loc_block_idx < local_var->location_opl; loc_block_idx < local_var->location_opl;
loc_block_idx += 1) loc_block_idx += 1)
{ {
RDI_LocationBlock *block = &ctx->rdbg->location_blocks[loc_block_idx]; RDI_LocationBlock *block = &ctx->rdi->location_blocks[loc_block_idx];
if(block->scope_off_first <= ctx->ip_voff && ctx->ip_voff < block->scope_off_opl) if(block->scope_off_first <= ctx->ip_voff && ctx->ip_voff < block->scope_off_opl)
{ {
loc_kind = *((RDI_LocationKind *)(ctx->rdbg->location_data + block->location_data_off)); loc_kind = *((RDI_LocationKind *)(ctx->rdi->location_data + block->location_data_off));
switch(loc_kind) switch(loc_kind)
{ {
default:{mapped_identifier = 0;}break; default:{mapped_identifier = 0;}break;
case RDI_LocationKind_AddrBytecodeStream: case RDI_LocationKind_AddrBytecodeStream:
case RDI_LocationKind_ValBytecodeStream: case RDI_LocationKind_ValBytecodeStream:
{ {
U8 *bytecode_base = ctx->rdbg->location_data + block->location_data_off + sizeof(RDI_LocationKind); U8 *bytecode_base = ctx->rdi->location_data + block->location_data_off + sizeof(RDI_LocationKind);
U64 bytecode_size = 0; U64 bytecode_size = 0;
for(U64 idx = 0; idx < ctx->rdbg->location_data_size; idx += 1) for(U64 idx = 0; idx < ctx->rdi->location_data_size; idx += 1)
{ {
U8 op = bytecode_base[idx]; U8 op = bytecode_base[idx];
if(op == 0) if(op == 0)
@@ -880,11 +880,11 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
case RDI_LocationKind_AddrRegisterPlusU16: case RDI_LocationKind_AddrRegisterPlusU16:
case RDI_LocationKind_AddrAddrRegisterPlusU16: case RDI_LocationKind_AddrAddrRegisterPlusU16:
{ {
MemoryCopy(&loc_reg_u16, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg_u16)); MemoryCopy(&loc_reg_u16, (ctx->rdi->location_data + block->location_data_off), sizeof(loc_reg_u16));
}break; }break;
case RDI_LocationKind_ValRegister: case RDI_LocationKind_ValRegister:
{ {
MemoryCopy(&loc_reg, (ctx->rdbg->location_data + block->location_data_off), sizeof(loc_reg)); MemoryCopy(&loc_reg, (ctx->rdi->location_data + block->location_data_off), sizeof(loc_reg));
}break; }break;
} }
} }
@@ -919,21 +919,21 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try global variables //- rjf: try global variables
if(mapped_identifier == 0) if(mapped_identifier == 0)
{ {
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_GlobalVariables); RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_GlobalVariables);
if(name_map != 0 && ctx->rdbg->global_variables != 0) if(name_map != 0 && ctx->rdi->global_variables != 0)
{ {
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0; U32 matches_count = 0;
U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count);
for(String8Node *n = namespaceified_token_strings.first; for(String8Node *n = namespaceified_token_strings.first;
n != 0 && matches_count == 0; n != 0 && matches_count == 0;
n = n->next) n = n->next)
{ {
node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size);
matches_count = 0; matches_count = 0;
matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count);
} }
if(matches_count != 0) if(matches_count != 0)
{ {
@@ -942,15 +942,15 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
// don't know of a magic hash table fixup path in PDBs, so // don't know of a magic hash table fixup path in PDBs, so
// in this case, I'm going to prefer the latest-added global. // in this case, I'm going to prefer the latest-added global.
U32 match_idx = matches[matches_count-1]; U32 match_idx = matches[matches_count-1];
RDI_GlobalVariable *global_var = &ctx->rdbg->global_variables[match_idx]; RDI_GlobalVariable *global_var = &ctx->rdi->global_variables[match_idx];
EVAL_OpList oplist = {0}; EVAL_OpList oplist = {0};
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff); eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff);
loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_kind = RDI_LocationKind_AddrBytecodeStream;
loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); loc_bytecode = eval_bytecode_from_oplist(arena, &oplist);
U32 type_idx = global_var->type_idx; U32 type_idx = global_var->type_idx;
if(type_idx < ctx->rdbg->type_nodes_count) if(type_idx < ctx->rdi->type_nodes_count)
{ {
RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; RDI_TypeNode *type_node = &ctx->rdi->type_nodes[type_idx];
type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx);
} }
mapped_identifier = 1; mapped_identifier = 1;
@@ -961,34 +961,34 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try thread variables //- rjf: try thread variables
if(mapped_identifier == 0) if(mapped_identifier == 0)
{ {
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_ThreadVariables); RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_ThreadVariables);
if(name_map != 0 && ctx->rdbg->global_variables != 0) if(name_map != 0 && ctx->rdi->global_variables != 0)
{ {
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0; U32 matches_count = 0;
U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count);
for(String8Node *n = namespaceified_token_strings.first; for(String8Node *n = namespaceified_token_strings.first;
n != 0 && matches_count == 0; n != 0 && matches_count == 0;
n = n->next) n = n->next)
{ {
node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size);
matches_count = 0; matches_count = 0;
matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count);
} }
if(matches_count != 0) if(matches_count != 0)
{ {
U32 match_idx = matches[0]; U32 match_idx = matches[0];
RDI_ThreadVariable *thread_var = &ctx->rdbg->thread_variables[match_idx]; RDI_ThreadVariable *thread_var = &ctx->rdi->thread_variables[match_idx];
EVAL_OpList oplist = {0}; EVAL_OpList oplist = {0};
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off); eval_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off);
loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_kind = RDI_LocationKind_AddrBytecodeStream;
loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); loc_bytecode = eval_bytecode_from_oplist(arena, &oplist);
U32 type_idx = thread_var->type_idx; U32 type_idx = thread_var->type_idx;
if(type_idx < ctx->rdbg->type_nodes_count) if(type_idx < ctx->rdi->type_nodes_count)
{ {
RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; RDI_TypeNode *type_node = &ctx->rdi->type_nodes[type_idx];
type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx);
} }
mapped_identifier = 1; mapped_identifier = 1;
@@ -999,36 +999,36 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try procedures //- rjf: try procedures
if(mapped_identifier == 0) if(mapped_identifier == 0)
{ {
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_Procedures); RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_Procedures);
if(name_map != 0 && ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_voffs) if(name_map != 0 && ctx->rdi->procedures != 0 && ctx->rdi->scopes != 0 && ctx->rdi->scope_voffs)
{ {
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map); rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0; U32 matches_count = 0;
U32 *matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count);
for(String8Node *n = namespaceified_token_strings.first; for(String8Node *n = namespaceified_token_strings.first;
n != 0 && matches_count == 0; n != 0 && matches_count == 0;
n = n->next) n = n->next)
{ {
node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size);
matches_count = 0; matches_count = 0;
matches = rdi_matches_from_map_node(ctx->rdbg, node, &matches_count); matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count);
} }
if(matches_count != 0) if(matches_count != 0)
{ {
U32 match_idx = matches[0]; U32 match_idx = matches[0];
RDI_Procedure *procedure = &ctx->rdbg->procedures[match_idx]; RDI_Procedure *procedure = &ctx->rdi->procedures[match_idx];
RDI_Scope *scope = &ctx->rdbg->scopes[procedure->root_scope_idx]; RDI_Scope *scope = &ctx->rdi->scopes[procedure->root_scope_idx];
U64 voff = ctx->rdbg->scope_voffs[scope->voff_range_first]; U64 voff = ctx->rdi->scope_voffs[scope->voff_range_first];
EVAL_OpList oplist = {0}; EVAL_OpList oplist = {0};
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff); eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff);
loc_kind = RDI_LocationKind_ValBytecodeStream; loc_kind = RDI_LocationKind_ValBytecodeStream;
loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); loc_bytecode = eval_bytecode_from_oplist(arena, &oplist);
U32 type_idx = procedure->type_idx; U32 type_idx = procedure->type_idx;
if(type_idx < ctx->rdbg->type_nodes_count) if(type_idx < ctx->rdi->type_nodes_count)
{ {
RDI_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx]; RDI_TypeNode *type_node = &ctx->rdi->type_nodes[type_idx];
type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx);
} }
mapped_identifier = 1; mapped_identifier = 1;
@@ -1039,7 +1039,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try types //- rjf: try types
if(mapped_identifier == 0) if(mapped_identifier == 0)
{ {
type_key = eval_leaf_type_from_name(ctx->rdbg, token_string); type_key = eval_leaf_type_from_name(ctx->rdi, token_string);
if(!tg_key_match(tg_key_zero(), type_key)) if(!tg_key_match(tg_key_zero(), type_key))
{ {
mapped_identifier = 1; mapped_identifier = 1;
+4 -4
View File
@@ -67,7 +67,7 @@ struct EVAL_ParseCtx
{ {
Architecture arch; Architecture arch;
U64 ip_voff; U64 ip_voff;
RDI_Parsed *rdbg; RDI_Parsed *rdi;
TG_Graph *type_graph; TG_Graph *type_graph;
EVAL_String2NumMap *regs_map; EVAL_String2NumMap *regs_map;
EVAL_String2NumMap *reg_alias_map; EVAL_String2NumMap *reg_alias_map;
@@ -85,8 +85,8 @@ global read_only EVAL_ParseResult eval_parse_result_nil = {0, &eval_expr_nil};
//////////////////////////////// ////////////////////////////////
//~ rjf: Debug-Info-Driven Map Building Fast Paths //~ rjf: Debug-Info-Driven Map Building Fast Paths
internal EVAL_String2NumMap *eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff); internal EVAL_String2NumMap *eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff);
internal EVAL_String2NumMap *eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff); internal EVAL_String2NumMap *eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff);
//////////////////////////////// ////////////////////////////////
//~ rjf: Tokenization Functions //~ rjf: Tokenization Functions
@@ -101,7 +101,7 @@ internal EVAL_TokenArray eval_token_array_make_first_opl(EVAL_Token *first, EVAL
//////////////////////////////// ////////////////////////////////
//~ rjf: Parser Functions //~ rjf: Parser Functions
internal TG_Key eval_leaf_type_from_name(RDI_Parsed *rdbg, String8 name); internal TG_Key eval_leaf_type_from_name(RDI_Parsed *rdi, String8 name);
internal EVAL_ParseResult eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); internal EVAL_ParseResult eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens);
internal EVAL_ParseResult eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence); internal EVAL_ParseResult eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence);
internal EVAL_ParseResult eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); internal EVAL_ParseResult eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens);
+12 -12
View File
@@ -22,28 +22,28 @@ int main(int argument_count, char **arguments)
uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size); uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size);
// parse raw data as raddbg // parse raw data as raddbg
RDI_Parsed rdbg = {0}; RDI_Parsed rdi = {0};
RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdbg); RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdi);
// usage example: print out all procedure symbol names // usage example: print out all procedure symbol names
#if 1 #if 1
for(uint64_t procedure_idx = 0; procedure_idx < rdbg.procedure_count; procedure_idx += 1) for(uint64_t procedure_idx = 0; procedure_idx < rdi.procedure_count; procedure_idx += 1)
{ {
RDI_Procedure *procedure = &rdbg.procedures[procedure_idx]; RDI_Procedure *procedure = &rdi.procedures[procedure_idx];
uint64_t name_size = 0; uint64_t name_size = 0;
uint8_t *name = rdi_string_from_idx(&rdbg, procedure->name_string_idx, &name_size); uint8_t *name = rdi_string_from_idx(&rdi, procedure->name_string_idx, &name_size);
printf("[%I64u] %.*s\n", procedure_idx, (int)name_size, name); printf("[%I64u] %.*s\n", procedure_idx, (int)name_size, name);
} }
#endif #endif
// usage example: print out all user-defined-type names // usage example: print out all user-defined-type names
#if 0 #if 0
for(uint64_t udt_idx = 0; udt_idx < rdbg.udt_count; udt_idx += 1) for(uint64_t udt_idx = 0; udt_idx < rdi.udt_count; udt_idx += 1)
{ {
RDI_UDT *udt = &rdbg.udts[udt_idx]; RDI_UDT *udt = &rdi.udts[udt_idx];
RDI_TypeNode *type = &rdbg.type_nodes[udt->self_type_idx]; RDI_TypeNode *type = &rdi.type_nodes[udt->self_type_idx];
uint64_t name_size = 0; uint64_t name_size = 0;
uint8_t *name = rdi_string_from_idx(&rdbg, type->user_defined.name_string_idx, &name_size); uint8_t *name = rdi_string_from_idx(&rdi, type->user_defined.name_string_idx, &name_size);
printf("[%I64u] %.*s\n", udt_idx, (int)name_size, name); printf("[%I64u] %.*s\n", udt_idx, (int)name_size, name);
} }
#endif #endif
@@ -51,9 +51,9 @@ int main(int argument_count, char **arguments)
// for getting more info, look at the `RDI_Parsed` structure. all data is // for getting more info, look at the `RDI_Parsed` structure. all data is
// represented as a bunch of flat plain-old-data tables. data which must // represented as a bunch of flat plain-old-data tables. data which must
// reference other data uses indices into that other data's table. for // reference other data uses indices into that other data's table. for
// example, given a `type_idx`, I will index into `rdbg.type_nodes`. given a // example, given a `type_idx`, I will index into `rdi.type_nodes`. given a
// `udt_idx`, I will index into `rdbg.udts`. given a `scope_idx`, I will // `udt_idx`, I will index into `rdi.udts`. given a `scope_idx`, I will
// index into `rdbg.scopes`. and so on. // index into `rdi.scopes`. and so on.
return 0; return 0;
} }
+108 -108
View File
@@ -279,7 +279,7 @@ tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_type_key, U64 u64
//~ rjf: Graph Introspection API //~ rjf: Graph Introspection API
internal TG_Type * internal TG_Type *
tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
TG_Type *type = &tg_type_nil; TG_Type *type = &tg_type_nil;
U64 reg_byte_count = 0; U64 reg_byte_count = 0;
@@ -324,7 +324,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
}break; }break;
case TG_Kind_Array: case TG_Kind_Array:
{ {
U64 ptee_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cons_type->direct_type_key); U64 ptee_size = tg_byte_size_from_graph_rdi_key(graph, rdi, cons_type->direct_type_key);
type->byte_size = ptee_size * type->count; type->byte_size = ptee_size * type->count;
}break; }break;
} }
@@ -336,20 +336,20 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
case TG_KeyKind_Ext: case TG_KeyKind_Ext:
{ {
U64 type_node_idx = key.u64[0]; U64 type_node_idx = key.u64[0];
if(0 <= type_node_idx && type_node_idx < rdbg->type_nodes_count) if(0 <= type_node_idx && type_node_idx < rdi->type_nodes_count)
{ {
RDI_TypeNode *rdbg_type = &rdbg->type_nodes[type_node_idx]; RDI_TypeNode *rdi_type = &rdi->type_nodes[type_node_idx];
TG_Kind kind = tg_kind_from_rdi_type_kind(rdbg_type->kind); TG_Kind kind = tg_kind_from_rdi_type_kind(rdi_type->kind);
//- rjf: record types => unpack name * members & produce //- rjf: record types => unpack name * members & produce
if(RDI_TypeKind_FirstRecord <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastRecord) if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord)
{ {
// rjf: unpack name // rjf: unpack name
String8 name = {0}; String8 name = {0};
name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
// rjf: unpack UDT info // rjf: unpack UDT info
RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, rdbg_type->user_defined.udt_idx); RDI_UDT *udt = rdi_element_from_idx(rdi, udts, rdi_type->user_defined.udt_idx);
// rjf: unpack members // rjf: unpack members
TG_Member *members = 0; TG_Member *members = 0;
@@ -357,23 +357,23 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
{ {
members_count = udt->member_count; members_count = udt->member_count;
members = push_array(arena, TG_Member, members_count); members = push_array(arena, TG_Member, members_count);
if(members_count != 0 && 0 <= udt->member_first && udt->member_first+udt->member_count <= rdbg->members_count) if(members_count != 0 && 0 <= udt->member_first && udt->member_first+udt->member_count <= rdi->members_count)
{ {
for(U32 member_idx = udt->member_first; for(U32 member_idx = udt->member_first;
member_idx < udt->member_first+udt->member_count; member_idx < udt->member_first+udt->member_count;
member_idx += 1) member_idx += 1)
{ {
RDI_Member *src = &rdbg->members[member_idx]; RDI_Member *src = &rdi->members[member_idx];
TG_Kind member_type_kind = TG_Kind_Null; TG_Kind member_type_kind = TG_Kind_Null;
if(src->type_idx < rdbg->type_nodes_count) if(src->type_idx < rdi->type_nodes_count)
{ {
RDI_TypeNode *member_type = &rdbg->type_nodes[src->type_idx]; RDI_TypeNode *member_type = &rdi->type_nodes[src->type_idx];
member_type_kind = tg_kind_from_rdi_type_kind(member_type->kind); member_type_kind = tg_kind_from_rdi_type_kind(member_type->kind);
} }
TG_Member *dst = &members[member_idx-udt->member_first]; TG_Member *dst = &members[member_idx-udt->member_first];
dst->kind = tg_member_kind_from_rdi_member_kind(src->kind); dst->kind = tg_member_kind_from_rdi_member_kind(src->kind);
dst->type_key = tg_key_ext(member_type_kind, (U64)src->type_idx); dst->type_key = tg_key_ext(member_type_kind, (U64)src->type_idx);
dst->name.str = rdi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size);
dst->off = (U64)src->off; dst->off = (U64)src->off;
} }
} }
@@ -383,46 +383,46 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
type = push_array(arena, TG_Type, 1); type = push_array(arena, TG_Type, 1);
type->kind = kind; type->kind = kind;
type->name = push_str8_copy(arena, name); type->name = push_str8_copy(arena, name);
type->byte_size = (U64)rdbg_type->byte_size; type->byte_size = (U64)rdi_type->byte_size;
type->count = members_count; type->count = members_count;
type->members = members; type->members = members;
} }
//- rjf: enum types => unpack name * values & produce //- rjf: enum types => unpack name * values & produce
else if(rdbg_type->kind == RDI_TypeKind_Enum) else if(rdi_type->kind == RDI_TypeKind_Enum)
{ {
// rjf: unpack name // rjf: unpack name
String8 name = {0}; String8 name = {0};
name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
// rjf: unpack direct type // rjf: unpack direct type
TG_Key direct_type_key = zero_struct; TG_Key direct_type_key = zero_struct;
if(rdbg_type->user_defined.direct_type_idx < type_node_idx) if(rdi_type->user_defined.direct_type_idx < type_node_idx)
{ {
RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; RDI_TypeNode *direct_type_node = &rdi->type_nodes[rdi_type->user_defined.direct_type_idx];
TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind);
direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->user_defined.direct_type_idx);
} }
// rjf: unpack members // rjf: unpack members
TG_EnumVal *enum_vals = 0; TG_EnumVal *enum_vals = 0;
U32 enum_vals_count = 0; U32 enum_vals_count = 0;
{ {
U32 udt_idx = rdbg_type->user_defined.udt_idx; U32 udt_idx = rdi_type->user_defined.udt_idx;
if(0 <= udt_idx && udt_idx < rdbg->udts_count) if(0 <= udt_idx && udt_idx < rdi->udts_count)
{ {
RDI_UDT *udt = &rdbg->udts[udt_idx]; RDI_UDT *udt = &rdi->udts[udt_idx];
enum_vals_count = udt->member_count; enum_vals_count = udt->member_count;
enum_vals = push_array(arena, TG_EnumVal, enum_vals_count); enum_vals = push_array(arena, TG_EnumVal, enum_vals_count);
if(0 <= udt->member_first && udt->member_first+udt->member_count < rdbg->enum_members_count) if(0 <= udt->member_first && udt->member_first+udt->member_count < rdi->enum_members_count)
{ {
for(U32 member_idx = udt->member_first; for(U32 member_idx = udt->member_first;
member_idx < udt->member_first+udt->member_count; member_idx < udt->member_first+udt->member_count;
member_idx += 1) member_idx += 1)
{ {
RDI_EnumMember *src = &rdbg->enum_members[member_idx]; RDI_EnumMember *src = &rdi->enum_members[member_idx];
TG_EnumVal *dst = &enum_vals[member_idx-udt->member_first]; TG_EnumVal *dst = &enum_vals[member_idx-udt->member_first];
dst->name.str = rdi_string_from_idx(rdbg, src->name_string_idx, &dst->name.size); dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size);
dst->val = src->val; dst->val = src->val;
} }
} }
@@ -433,39 +433,39 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
type = push_array(arena, TG_Type, 1); type = push_array(arena, TG_Type, 1);
type->kind = kind; type->kind = kind;
type->name = push_str8_copy(arena, name); type->name = push_str8_copy(arena, name);
type->byte_size = (U64)rdbg_type->byte_size; type->byte_size = (U64)rdi_type->byte_size;
type->count = enum_vals_count; type->count = enum_vals_count;
type->enum_vals = enum_vals; type->enum_vals = enum_vals;
type->direct_type_key = direct_type_key; type->direct_type_key = direct_type_key;
} }
//- rjf: constructed types //- rjf: constructed types
if(RDI_TypeKind_FirstConstructed <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastConstructed) if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed)
{ {
// rjf: unpack direct type // rjf: unpack direct type
B32 direct_type_is_good = 0; B32 direct_type_is_good = 0;
TG_Key direct_type_key = zero_struct; TG_Key direct_type_key = zero_struct;
U64 direct_type_byte_size = 0; U64 direct_type_byte_size = 0;
if(rdbg_type->constructed.direct_type_idx < type_node_idx) if(rdi_type->constructed.direct_type_idx < type_node_idx)
{ {
RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->constructed.direct_type_idx]; RDI_TypeNode *direct_type_node = &rdi->type_nodes[rdi_type->constructed.direct_type_idx];
TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind);
direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->constructed.direct_type_idx); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->constructed.direct_type_idx);
direct_type_is_good = 1; direct_type_is_good = 1;
direct_type_byte_size = (U64)direct_type_node->byte_size; direct_type_byte_size = (U64)direct_type_node->byte_size;
} }
// rjf: construct based on kind // rjf: construct based on kind
switch(rdbg_type->kind) switch(rdi_type->kind)
{ {
case RDI_TypeKind_Modifier: case RDI_TypeKind_Modifier:
{ {
TG_Flags flags = 0; TG_Flags flags = 0;
if(rdbg_type->flags & RDI_TypeModifierFlag_Const) if(rdi_type->flags & RDI_TypeModifierFlag_Const)
{ {
flags |= TG_Flag_Const; flags |= TG_Flag_Const;
} }
if(rdbg_type->flags & RDI_TypeModifierFlag_Volatile) if(rdi_type->flags & RDI_TypeModifierFlag_Volatile)
{ {
flags |= TG_Flag_Volatile; flags |= TG_Flag_Volatile;
} }
@@ -490,15 +490,15 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
type = push_array(arena, TG_Type, 1); type = push_array(arena, TG_Type, 1);
type->kind = kind; type->kind = kind;
type->direct_type_key = direct_type_key; type->direct_type_key = direct_type_key;
type->count = rdbg_type->constructed.count; type->count = rdi_type->constructed.count;
type->byte_size = direct_type_byte_size * type->count; type->byte_size = direct_type_byte_size * type->count;
}break; }break;
case RDI_TypeKind_Function: case RDI_TypeKind_Function:
{ {
U32 count = rdbg_type->constructed.count; U32 count = rdi_type->constructed.count;
U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
U32 check_count = 0; U32 check_count = 0;
U32 *idx_run = rdi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);
if(check_count == count) if(check_count == count)
{ {
type = push_array(arena, TG_Type, 1); type = push_array(arena, TG_Type, 1);
@@ -512,7 +512,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
U32 param_type_idx = idx_run[idx]; U32 param_type_idx = idx_run[idx];
if(param_type_idx < type_node_idx) if(param_type_idx < type_node_idx)
{ {
RDI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; RDI_TypeNode *param_type_node = &rdi->type_nodes[param_type_idx];
TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind);
type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx);
} }
@@ -528,10 +528,10 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
// NOTE(rjf): for methods, the `direct` type points at the owner type. // NOTE(rjf): for methods, the `direct` type points at the owner type.
// the return type, instead of being encoded via the `direct` type, is // the return type, instead of being encoded via the `direct` type, is
// encoded via the first parameter. // encoded via the first parameter.
U32 count = rdbg_type->constructed.count; U32 count = rdi_type->constructed.count;
U32 idx_run_first = rdbg_type->constructed.param_idx_run_first; U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
U32 check_count = 0; U32 check_count = 0;
U32 *idx_run = rdi_idx_run_from_first_count(rdbg, idx_run_first, count, &check_count); U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);
if(check_count == count) if(check_count == count)
{ {
type = push_array(arena, TG_Type, 1); type = push_array(arena, TG_Type, 1);
@@ -545,7 +545,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
U32 param_type_idx = idx_run[idx]; U32 param_type_idx = idx_run[idx];
if(param_type_idx < type_node_idx) if(param_type_idx < type_node_idx)
{ {
RDI_TypeNode *param_type_node = &rdbg->type_nodes[param_type_idx]; RDI_TypeNode *param_type_node = &rdi->type_nodes[param_type_idx];
TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind);
type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx);
} }
@@ -566,11 +566,11 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
{ {
// rjf: unpack owner type // rjf: unpack owner type
TG_Key owner_type_key = zero_struct; TG_Key owner_type_key = zero_struct;
if(rdbg_type->constructed.owner_type_idx < type_node_idx) if(rdi_type->constructed.owner_type_idx < type_node_idx)
{ {
RDI_TypeNode *owner_type_node = &rdbg->type_nodes[rdbg_type->constructed.owner_type_idx]; RDI_TypeNode *owner_type_node = &rdi->type_nodes[rdi_type->constructed.owner_type_idx];
TG_Kind owner_type_kind = tg_kind_from_rdi_type_kind(owner_type_node->kind); TG_Kind owner_type_kind = tg_kind_from_rdi_type_kind(owner_type_node->kind);
owner_type_key = tg_key_ext(owner_type_kind, (U64)rdbg_type->constructed.owner_type_idx); owner_type_key = tg_key_ext(owner_type_kind, (U64)rdi_type->constructed.owner_type_idx);
} }
type = push_array(arena, TG_Type, 1); type = push_array(arena, TG_Type, 1);
type->kind = kind; type->kind = kind;
@@ -582,20 +582,20 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
} }
//- rjf: alias types //- rjf: alias types
else if(rdbg_type->kind == RDI_TypeKind_Alias) else if(rdi_type->kind == RDI_TypeKind_Alias)
{ {
// rjf: unpack name // rjf: unpack name
String8 name = {0}; String8 name = {0};
name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
// rjf: unpack direct type // rjf: unpack direct type
TG_Key direct_type_key = zero_struct; TG_Key direct_type_key = zero_struct;
U64 direct_type_byte_size = 0; U64 direct_type_byte_size = 0;
if(rdbg_type->user_defined.direct_type_idx < type_node_idx) if(rdi_type->user_defined.direct_type_idx < type_node_idx)
{ {
RDI_TypeNode *direct_type_node = &rdbg->type_nodes[rdbg_type->user_defined.direct_type_idx]; RDI_TypeNode *direct_type_node = &rdi->type_nodes[rdi_type->user_defined.direct_type_idx];
TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind);
direct_type_key = tg_key_ext(direct_type_kind, (U64)rdbg_type->user_defined.direct_type_idx); direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->user_defined.direct_type_idx);
direct_type_byte_size = direct_type_node->byte_size; direct_type_byte_size = direct_type_node->byte_size;
} }
@@ -608,11 +608,11 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
} }
//- rjf: incomplete types //- rjf: incomplete types
else if(RDI_TypeKind_FirstIncomplete <= rdbg_type->kind && rdbg_type->kind <= RDI_TypeKind_LastIncomplete) else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete)
{ {
// rjf: unpack name // rjf: unpack name
String8 name = {0}; String8 name = {0};
name.str = rdi_string_from_idx(rdbg, rdbg_type->user_defined.name_string_idx, &name.size); name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);
// rjf: produce // rjf: produce
type = push_array(arena, TG_Type, 1); type = push_array(arena, TG_Type, 1);
@@ -795,7 +795,7 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
} }
internal TG_Key internal TG_Key
tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
TG_Key result = zero_struct; TG_Key result = zero_struct;
switch(key.kind) switch(key.kind)
@@ -805,7 +805,7 @@ tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
case TG_KeyKind_Cons: case TG_KeyKind_Cons:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
result = type->direct_type_key; result = type->direct_type_key;
scratch_end(scratch); scratch_end(scratch);
}break; }break;
@@ -814,16 +814,16 @@ tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
} }
internal TG_Key internal TG_Key
tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, key); key = tg_unwrapped_from_graph_rdi_key(graph, rdi, key);
key = tg_direct_from_graph_rdi_key(graph, rdbg, key); key = tg_direct_from_graph_rdi_key(graph, rdi, key);
key = tg_unwrapped_from_graph_rdi_key(graph, rdbg, key); key = tg_unwrapped_from_graph_rdi_key(graph, rdi, key);
return key; return key;
} }
internal TG_Key internal TG_Key
tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
TG_Key result = zero_struct; TG_Key result = zero_struct;
switch(key.kind) switch(key.kind)
@@ -833,7 +833,7 @@ tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
case TG_KeyKind_Cons: case TG_KeyKind_Cons:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
result = type->owner_type_key; result = type->owner_type_key;
scratch_end(scratch); scratch_end(scratch);
}break; }break;
@@ -842,14 +842,14 @@ tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
} }
internal TG_Key internal TG_Key
tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
TG_Key result = key; TG_Key result = key;
B32 passed_ptr = 0; B32 passed_ptr = 0;
for(;;) for(;;)
{ {
TG_Kind kind = tg_kind_from_key(result); TG_Kind kind = tg_kind_from_key(result);
result = tg_direct_from_graph_rdi_key(graph, rdbg, result); result = tg_direct_from_graph_rdi_key(graph, rdi, result);
if(kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef) if(kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef)
{ {
passed_ptr = 1; passed_ptr = 1;
@@ -874,7 +874,7 @@ tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
} }
internal TG_Key internal TG_Key
tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
TG_Key result = key; TG_Key result = key;
for(B32 good = 1; good;) for(B32 good = 1; good;)
@@ -884,7 +884,7 @@ tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
kind == TG_Kind_Modifier || kind == TG_Kind_Modifier ||
kind == TG_Kind_Alias) kind == TG_Kind_Alias)
{ {
result = tg_direct_from_graph_rdi_key(graph, rdbg, result); result = tg_direct_from_graph_rdi_key(graph, rdi, result);
} }
else else
{ {
@@ -895,7 +895,7 @@ tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
} }
internal U64 internal U64
tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
U64 result = 0; U64 result = 0;
switch(key.kind) switch(key.kind)
@@ -910,7 +910,7 @@ tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
case TG_KeyKind_Cons: case TG_KeyKind_Cons:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
result = type->byte_size; result = type->byte_size;
scratch_end(scratch); scratch_end(scratch);
}break; }break;
@@ -945,12 +945,12 @@ tg_member_copy(Arena *arena, TG_Member *src)
} }
internal TG_MemberArray internal TG_MemberArray
tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
TG_MemberArray result = {0}; TG_MemberArray result = {0};
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
{ {
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
if(type->members != 0) if(type->members != 0)
{ {
result.count = type->count; result.count = type->count;
@@ -967,7 +967,7 @@ tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, T
} }
internal TG_MemberArray internal TG_MemberArray
tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Kind root_type_kind = tg_kind_from_key(key); TG_Kind root_type_kind = tg_kind_from_key(key);
@@ -976,7 +976,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd
TG_MemberList members_list = {0}; TG_MemberList members_list = {0};
B32 members_need_offset_sort = 0; B32 members_need_offset_sort = 0;
{ {
TG_Type *root_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *root_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
typedef struct Task Task; typedef struct Task Task;
struct Task struct Task
{ {
@@ -1015,7 +1015,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd
t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain); t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain);
tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key); tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key);
t->type_key = type->members[member_idx].type_key; t->type_key = type->members[member_idx].type_key;
t->type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type->members[member_idx].type_key); t->type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type->members[member_idx].type_key);
SLLQueuePush(first_task, last_task, t); SLLQueuePush(first_task, last_task, t);
members_need_offset_sort = 1; members_need_offset_sort = 1;
} }
@@ -1064,7 +1064,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd
TG_Member *member = &members.v[idx]; TG_Member *member = &members.v[idx];
if(idx+1 < members.count) if(idx+1 < members.count)
{ {
U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, member->type_key); U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, member->type_key);
Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size); Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size);
if(member[1].off > member_byte_range.max) if(member[1].off > member_byte_range.max)
{ {
@@ -1111,7 +1111,7 @@ tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rd
} }
internal void internal void
tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return) tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec, B32 skip_return)
{ {
String8 keyword = {0}; String8 keyword = {0};
TG_Kind kind = tg_kind_from_key(key); TG_Kind kind = tg_kind_from_key(key);
@@ -1120,7 +1120,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
default: default:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, push_str8_copy(arena, type->name));
str8_list_push(arena, out, str8_lit(" ")); str8_list_push(arena, out, str8_lit(" "));
scratch_end(scratch); scratch_end(scratch);
@@ -1128,16 +1128,16 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
case TG_Kind_Bitfield: case TG_Kind_Bitfield:
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, prec, skip_return); tg_lhs_string_from_key(arena, graph, rdi, direct, out, prec, skip_return);
}break; }break;
case TG_Kind_Modifier: case TG_Kind_Modifier:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
TG_Key direct = type->direct_type_key; TG_Key direct = type->direct_type_key;
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
if(type->flags & TG_Flag_Const) if(type->flags & TG_Flag_Const)
{ {
str8_list_push(arena, out, str8_lit("const ")); str8_list_push(arena, out, str8_lit("const "));
@@ -1161,7 +1161,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
case TG_Kind_Alias: case TG_Kind_Alias:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, push_str8_copy(arena, type->name));
str8_list_push(arena, out, str8_lit(" ")); str8_list_push(arena, out, str8_lit(" "));
scratch_end(scratch); scratch_end(scratch);
@@ -1174,7 +1174,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
fwd_udt:; fwd_udt:;
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
str8_list_push(arena, out, keyword); str8_list_push(arena, out, keyword);
str8_list_push(arena, out, str8_lit(" ")); str8_list_push(arena, out, str8_lit(" "));
str8_list_push(arena, out, push_str8_copy(arena, type->name)); str8_list_push(arena, out, push_str8_copy(arena, type->name));
@@ -1184,8 +1184,8 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
case TG_Kind_Array: case TG_Kind_Array:
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, skip_return); tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, skip_return);
if(prec == 1) if(prec == 1)
{ {
str8_list_push(arena, out, str8_lit("(")); str8_list_push(arena, out, str8_lit("("));
@@ -1196,8 +1196,8 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
{ {
if(!skip_return) if(!skip_return)
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, 0); tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, 0);
} }
if(prec == 1) if(prec == 1)
{ {
@@ -1207,32 +1207,32 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
case TG_Kind_Ptr: case TG_Kind_Ptr:
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("*")); str8_list_push(arena, out, str8_lit("*"));
}break; }break;
case TG_Kind_LRef: case TG_Kind_LRef:
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("&")); str8_list_push(arena, out, str8_lit("&"));
}break; }break;
case TG_Kind_RRef: case TG_Kind_RRef:
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("&&")); str8_list_push(arena, out, str8_lit("&&"));
}break; }break;
case TG_Kind_MemberPtr: case TG_Kind_MemberPtr:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
TG_Key direct = type->direct_type_key; TG_Key direct = type->direct_type_key;
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return); tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
TG_Type *container = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type->owner_type_key); TG_Type *container = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type->owner_type_key);
if(container->kind != TG_Kind_Null) if(container->kind != TG_Kind_Null)
{ {
str8_list_push(arena, out, push_str8_copy(arena, container->name)); str8_list_push(arena, out, push_str8_copy(arena, container->name));
@@ -1248,7 +1248,7 @@ tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
} }
internal void internal void
tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec) tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec)
{ {
TG_Kind kind = tg_kind_from_key(key); TG_Kind kind = tg_kind_from_key(key);
switch(kind) switch(kind)
@@ -1257,8 +1257,8 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
case TG_Kind_Bitfield: case TG_Kind_Bitfield:
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, prec); tg_rhs_string_from_key(arena, graph, rdi, direct, out, prec);
}break; }break;
case TG_Kind_Modifier: case TG_Kind_Modifier:
@@ -1267,14 +1267,14 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
case TG_Kind_RRef: case TG_Kind_RRef:
case TG_Kind_MemberPtr: case TG_Kind_MemberPtr:
{ {
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 1); tg_rhs_string_from_key(arena, graph, rdi, direct, out, 1);
}break; }break;
case TG_Kind_Array: case TG_Kind_Array:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
if(prec == 1) if(prec == 1)
{ {
str8_list_push(arena, out, str8_lit(")")); str8_list_push(arena, out, str8_lit(")"));
@@ -1283,15 +1283,15 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
str8_list_push(arena, out, str8_lit("[")); str8_list_push(arena, out, str8_lit("["));
str8_list_push(arena, out, count_str); str8_list_push(arena, out, count_str);
str8_list_push(arena, out, str8_lit("]")); str8_list_push(arena, out, str8_lit("]"));
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2);
scratch_end(scratch); scratch_end(scratch);
}break; }break;
case TG_Kind_Function: case TG_Kind_Function:
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, key); TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key);
if(prec == 1) if(prec == 1)
{ {
str8_list_push(arena, out, str8_lit(")")); str8_list_push(arena, out, str8_lit(")"));
@@ -1310,7 +1310,7 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
for(U64 param_idx = 0; param_idx < param_count; param_idx += 1) for(U64 param_idx = 0; param_idx < param_count; param_idx += 1)
{ {
TG_Key param_type_key = param_type_keys[param_idx]; TG_Key param_type_key = param_type_keys[param_idx];
String8 param_str = tg_string_from_key(arena, graph, rdbg, param_type_key); String8 param_str = tg_string_from_key(arena, graph, rdi, param_type_key);
String8 param_str_trimmed = str8_skip_chop_whitespace(param_str); String8 param_str_trimmed = str8_skip_chop_whitespace(param_str);
str8_list_push(arena, out, param_str_trimmed); str8_list_push(arena, out, param_str_trimmed);
if(param_idx+1 < param_count) if(param_idx+1 < param_count)
@@ -1320,20 +1320,20 @@ tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key k
} }
str8_list_push(arena, out, str8_lit(")")); str8_list_push(arena, out, str8_lit(")"));
} }
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key); TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2); tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2);
scratch_end(scratch); scratch_end(scratch);
}break; }break;
} }
} }
internal String8 internal String8
tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key) tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
String8List list = {0}; String8List list = {0};
tg_lhs_string_from_key(scratch.arena, graph, rdbg, key, &list, 0, 0); tg_lhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0, 0);
tg_rhs_string_from_key(scratch.arena, graph, rdbg, key, &list, 0); tg_rhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0);
String8 result = str8_list_join(arena, &list, 0); String8 result = str8_list_join(arena, &list, 0);
scratch_end(scratch); scratch_end(scratch);
return result; return result;
+12 -12
View File
@@ -225,19 +225,19 @@ internal TG_Key tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_t
//////////////////////////////// ////////////////////////////////
//~ rjf: Graph Introspection API //~ rjf: Graph Introspection API
internal TG_Type *tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Type *tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Key tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Key tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Key tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Key tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Key tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Key tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Key tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Key tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Key tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_Key tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal U64 tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal U64 tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_Kind tg_kind_from_key(TG_Key key); internal TG_Kind tg_kind_from_key(TG_Key key);
internal TG_Member *tg_member_copy(Arena *arena, TG_Member *src); internal TG_Member *tg_member_copy(Arena *arena, TG_Member *src);
internal TG_MemberArray tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_MemberArray tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal TG_MemberArray tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal TG_MemberArray tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec, B32 skip_return); internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec, B32 skip_return);
internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key, String8List *out, U32 prec); internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec);
internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key); internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
#endif // TYPE_GRAPH_H #endif // TYPE_GRAPH_H