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
debug info data. Does not depend on `base`, and can be independently relocated
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
info file format. Does not depend on `base`, and can be independently
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();
String8 exe_path = demon_full_path_from_module(scratch.arena, module);
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);
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
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)
{
RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, filename_normalized.str, filename_normalized.size);
rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size);
if(node != 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)
{
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
{
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_line_map_from_source_file(rdbg, src, &line_map);
rdi_line_map_from_source_file(rdi, src, &line_map);
U32 voff_count = 0;
U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count);
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;
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)
{
RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, symbol_name.str, symbol_name.size);
rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, symbol_name.str, symbol_name.size);
if(node != 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)
{
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;
DEMON_Trap trap = {process, proc_vaddr + voff, (U64)bp};
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]);
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);
RDI_Parsed *rdbg = &dbgi->rdbg;
RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_GlobalVariables);
if(rdbg->global_variables != 0 && unparsed_map != 0)
RDI_Parsed *rdi = &dbgi->rdi;
RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_GlobalVariables);
if(rdi->global_variables != 0 && unparsed_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");
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)
{
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)
{
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_vaddr = global_var->voff + demon_base_vaddr_from_module(ctrl_demon_handle_from_ctrl(module));
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);
String8 exe_path = demon_full_path_from_module(scratch.arena, module);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, exe_path, max_U64);
RDI_Parsed *rdbg = &dbgi->rdbg;
RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Procedures);
RDI_Parsed *rdi = &dbgi->rdi;
RDI_NameMap *unparsed_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Procedures);
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
B32 entries_found = 0;
@@ -2162,15 +2162,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U32 procedure_id = 0;
{
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 *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)
{
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)
{
entries_found = 1;
@@ -2188,15 +2188,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U32 procedure_id = 0;
{
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 *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)
{
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)
{
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;
{
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 *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)
{
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)
{
entries_found = 1;
@@ -2265,15 +2265,15 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg)
U32 procedure_id = 0;
{
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 *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)
{
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)
{
entries_found = 1;
@@ -2871,7 +2871,7 @@ ctrl_thread__run(CTRL_Msg *msg)
{
String8 exe_path = demon_full_path_from_module(temp.arena, module);
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)
{
String8 string = condition_n->string;
@@ -2879,12 +2879,12 @@ ctrl_thread__run(CTRL_Msg *msg)
{
parse_ctx.arch = arch;
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.regs_map = ctrl_string2reg_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.member_map = eval_push_member_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, rdi, thread_rip_voff);
}
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);
@@ -2894,7 +2894,7 @@ ctrl_thread__run(CTRL_Msg *msg)
EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil};
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};
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
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};
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
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;
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);
}break;
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;
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);
}break;
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;
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);
}break;
case DBGI_FuzzySearchTarget_UDTs:
{
RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, element_idx);
RDI_TypeNode *type_node = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx);
RDI_UDT *udt = rdi_element_from_idx(rdi, udts, element_idx);
RDI_TypeNode *type_node = rdi_element_from_idx(rdi, type_nodes, udt->self_type_idx);
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);
}break;
case DBGI_FuzzySearchTarget_COUNT:{}break;
@@ -1017,7 +1017,7 @@ dbgi_parse_thread_entry_point(void *p)
}
//- 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;
if(do_task)
{
@@ -1053,7 +1053,7 @@ dbgi_parse_thread_entry_point(void *p)
bin->parse.arena = parse_arena;
bin->parse.dbg_path = push_str8_copy(parse_arena, dbg_path);
MemoryCopyStruct(&bin->parse.pe, &exe_pe_info);
MemoryCopyStruct(&bin->parse.rdbg, &rdi_parsed);
MemoryCopyStruct(&bin->parse.rdi, &rdi_parsed);
bin->parse.gen = bin->gen;
break;
}
@@ -1197,9 +1197,9 @@ dbgi_fuzzy_thread__entry_point(void *p)
//- rjf: exe_path -> dbgi_parse, raddbg
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 element_name_idx_off = 0;
U64 element_count = 0;
@@ -1212,34 +1212,34 @@ dbgi_fuzzy_thread__entry_point(void *p)
{
table_ptr_off = OffsetOf(RDI_Parsed, procedures);
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);
}break;
case DBGI_FuzzySearchTarget_GlobalVariables:
{
table_ptr_off = OffsetOf(RDI_Parsed, global_variables);
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);
}break;
case DBGI_FuzzySearchTarget_ThreadVariables:
{
table_ptr_off = OffsetOf(RDI_Parsed, thread_variables);
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);
}break;
case DBGI_FuzzySearchTarget_UDTs:
{
table_ptr_off = OffsetOf(RDI_Parsed, udts);
element_count = rdbg->udts_count;
element_count = rdi->udts_count;
element_size = sizeof(RDI_UDT);
}break;
}
DBGI_FuzzySearchItemChunkList items_list = {0};
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)
{
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)
{
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;
}
U32 name_idx = *name_idx_ptr;
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);
if(name.size == 0) { continue; }
FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name);
+2 -2
View File
@@ -18,7 +18,7 @@ struct DBGI_Parse
void *dbg_base;
FileProperties dbg_props;
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_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
+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);
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)
{
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;
}
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();
String8 path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg;
if(result.size == 0 && rdbg->scope_vmap != 0)
RDI_Parsed *rdi = &dbgi->rdi;
if(result.size == 0 && rdi->scope_vmap != 0)
{
U64 scope_idx = rdi_vmap_idx_from_voff(rdbg->scope_vmap, rdbg->scope_vmap_count, voff);
RDI_Scope *scope = &rdbg->scopes[scope_idx];
U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff);
RDI_Scope *scope = &rdi->scopes[scope_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;
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));
}
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);
RDI_GlobalVariable *global_var = &rdbg->global_variables[global_idx];
U64 global_idx = rdi_vmap_idx_from_voff(rdi->global_vmap, rdi->global_vmap_count, voff);
RDI_GlobalVariable *global_var = &rdi->global_variables[global_idx];
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));
}
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 = binary_n->next)
{
// rjf: binary -> rdbg
// rjf: binary -> rdi
DF_Entity *binary = binary_n->entity;
String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
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;
U32 src_id = 0;
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)
{
RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size);
rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);
if(node != 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)
{
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
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_line_map_from_source_file(rdbg, src, &line_map);
rdi_line_map_from_source_file(rdi, src, &line_map);
U64 line_idx = 0;
for(S64 line_num = line_num_range.min;
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)
{
U64 base_voff = voffs[idx];
U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff);
RDI_Unit *unit = &rdbg->units[unit_idx];
U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, base_voff);
RDI_Unit *unit = &rdi->units[unit_idx];
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);
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();
String8 path = df_full_path_from_entity(scratch.arena, binary);
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};
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);
RDI_Unit *unit = &rdbg->units[unit_idx];
U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, voff);
RDI_Unit *unit = &rdi->units[unit_idx];
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);
if(line_info_idx < unit_line_info.count)
{
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_SourceFile *file = &rdbg->source_files[line->file_idx];
RDI_SourceFile *file = &rdi->source_files[line->file_idx];
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;
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);
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_GlobalVariables,
@@ -3425,10 +3425,10 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name)
name_map_kind_idx += 1)
{
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_name_map_parse(rdbg, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, symbol_name.str, symbol_name.size);
rdi_name_map_parse(rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, symbol_name.str, symbol_name.size);
// rjf: node -> num
U64 entity_num = 0;
@@ -3443,7 +3443,7 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name)
default:
{
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)
{
entity_num = run[0]+1;
@@ -3459,14 +3459,14 @@ df_voff_from_binary_symbol_name(DF_Entity *binary, String8 symbol_name)
default:{}break;
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;
}break;
case RDI_NameMapKind_Procedures:
{
RDI_Procedure *procedure = rdi_element_from_idx(rdbg, procedures, entity_num-1);
RDI_Scope *scope = rdi_element_from_idx(rdbg, scopes, procedure->root_scope_idx);
voff = rdbg->scope_voffs[scope->voff_range_first];
RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, entity_num-1);
RDI_Scope *scope = rdi_element_from_idx(rdi, scopes, procedure->root_scope_idx);
voff = rdi->scope_voffs[scope->voff_range_first];
}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);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg;
RDI_NameMap *name_map = rdi_name_map_from_kind(rdbg, RDI_NameMapKind_Types);
RDI_Parsed *rdi = &dbgi->rdi;
RDI_NameMap *name_map = rdi_name_map_from_kind(rdi, RDI_NameMapKind_Types);
RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(rdbg, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size);
rdi_name_map_parse(rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size);
U64 entity_num = 0;
if(node != 0)
{
@@ -3512,7 +3512,7 @@ df_type_num_from_binary_name(DF_Entity *binary, String8 name)
default:
{
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)
{
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);
String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg;
EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdbg, voff);
RDI_Parsed *rdi = &dbgi->rdi;
EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdi, voff);
scratch_end(scratch);
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);
String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
DBGI_Parse *dbgi = dbgi_parse_from_exe_path(scope, binary_path, 0);
RDI_Parsed *rdbg = &dbgi->rdbg;
EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdbg, voff);
RDI_Parsed *rdi = &dbgi->rdi;
EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdi, voff);
scratch_end(scratch);
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);
String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
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);
EVAL_String2NumMap *reg_map = ctrl_string2reg_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.ip_voff = voff;
ctx.rdbg = rdbg;
ctx.rdi = rdi;
ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256);
ctx.regs_map = reg_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 = binary_n->next)
{
// rjf: binary -> rdbg
// rjf: binary -> rdi
DF_Entity *binary = binary_n->entity;
String8 binary_path = df_full_path_from_entity(scratch.arena, binary);
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;
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)
{
RDI_ParsedNameMap map = {0};
rdi_name_map_parse(rdbg, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &map, file_path_normalized.str, file_path_normalized.size);
rdi_name_map_parse(rdi, mapptr, &map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);
if(node != 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)
{
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
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_line_map_from_source_file(rdbg, src, &line_map);
rdi_line_map_from_source_file(rdi, src, &line_map);
U32 voff_count = 0;
U64 *voffs = rdi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count);
for(U64 idx = 0; idx < voff_count; idx += 1)
{
U64 base_voff = voffs[idx];
U64 unit_idx = rdi_vmap_idx_from_voff(rdbg->unit_vmap, rdbg->unit_vmap_count, base_voff);
RDI_Unit *unit = &rdbg->units[unit_idx];
U64 unit_idx = rdi_vmap_idx_from_voff(rdi->unit_vmap, rdi->unit_vmap_count, base_voff);
RDI_Unit *unit = &rdi->units[unit_idx];
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);
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;
@@ -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
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.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};
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
@@ -4237,7 +4237,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
//- rjf: apply dynamic type overrides
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);
@@ -4246,7 +4246,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, 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();
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_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)
{
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:
{
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;
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread);
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
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();
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);
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);
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;
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;
MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size);
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);
RDI_GlobalVariable *global_var = rdi_element_from_idx(rdbg, global_variables, global_idx);
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(rdi, global_variables, global_idx);
if(global_var->link_flags & RDI_LinkFlag_TypeScoped)
{
RDI_UDT *udt = rdi_element_from_idx(rdbg, udts, global_var->container_idx);
RDI_TypeNode *type = rdi_element_from_idx(rdbg, type_nodes, udt->self_type_idx);
RDI_UDT *udt = rdi_element_from_idx(rdi, udts, global_var->container_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 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;
@@ -4579,13 +4579,13 @@ 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)
df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval)
{
ProfBeginFunction();
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);
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;
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:
{
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};
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
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;
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_Kind dst_type_kind = tg_kind_from_key(dst_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 src_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, src_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, rdi, src_type_key);
//- rjf: get commit data based on destination type
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:
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 = push_str8_copy(scratch.arena, commit_data);
}break;
@@ -4749,7 +4749,7 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF
case 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 = push_str8_copy(scratch.arena, commit_data);
}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)
{
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)
{
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)
{
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)
{
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:
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 = push_str8_copy(scratch.arena, commit_data);
}break;
@@ -4914,7 +4914,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray mem
}
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};
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.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
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
//
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);
//////////////////////////////
//- 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);
//////////////////////////////
@@ -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;
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);
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
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")
{
//- 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);
//- 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")
{
//- 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)
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")
{
//- 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
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_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;
}
}
@@ -5308,7 +5308,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
DF_EvalLinkBaseChunkList link_bases = {0};
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
@@ -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)")
{
//- 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;
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
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
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);
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_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_value_mode_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 *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 *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);
////////////////////////////////
@@ -1604,14 +1604,14 @@ internal String8 df_eval_view_rule_from_key(DF_EvalView *eval_view, DF_ExpandKey
//- rjf: evaluation value string builder helpers
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
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
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_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;
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);
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);
@@ -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);
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)
{
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
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();
String8List list = {0};
@@ -6869,13 +6869,13 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
{
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" : "");
}
else
{
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" : "");
}
}
@@ -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
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;
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"));
@@ -6899,8 +6899,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
//- rjf: default - leaf cases
default:
{
DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdbg, ctrl_ctx, eval);
String8 string = df_string_from_simple_typed_eval(arena, graph, rdbg, flags, radix, value_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, rdi, flags, radix, value_eval);
space_taken += f_dim_from_tag_size_string(font, font_size, string).x;
str8_list_push(arena, &list, string);
}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);
// 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
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);
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 &&
@@ -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))
{
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;
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.mode = EVAL_EvalMode_Addr;
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)
{
String8 unknown = str8_lit("???");
@@ -7011,7 +7011,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
case TG_Kind_Array:
{
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_Kind direct_type_kind = tg_kind_from_key(direct_type_key);
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)
{
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)
{
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.offset = eval.offset + direct_type_byte_size*idx;
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;
str8_list_concat_in_place(&list, &element_strs);
if(idx+1 < array_count)
@@ -7111,7 +7111,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
if(depth < 4)
{
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);
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.offset = eval.offset + mem->off;
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;
str8_list_concat_in_place(&list, &member_strs);
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:
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 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 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->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);
row->expr = block->string;
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:
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);
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
{
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);
}
// 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 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 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->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);
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:
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)
{
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
{
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);
}
// 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 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 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->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);
row->expr = push_str8_copy(arena, enum_val->name);
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:
{
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);
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)
{
// 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
{
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);
}
// 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 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 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->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);
row->expr = push_str8f(arena, "[%I64u]", idx);
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:
{
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);
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);
// 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);
TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key);
// 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 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 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->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);
row->expr = push_str8f(arena, "[%I64u]", idx);
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)
{
// 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
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
{
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);
}
// 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 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 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->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);
row->expr = name;
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))
{
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);
}
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
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);
////////////////////////////////
+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 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_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;
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;
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 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 count_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, 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_size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, vertices_size_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->rdi, ctrl_ctx, vertices_base_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;
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);
@@ -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;
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_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.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);
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);
array_size = array_size_eval_value.imm_u64;
}
// 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);
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);
TG_Key type_key = eval.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 &&
(type_size_bytes == 2 ||
type_size_bytes == 4 ||
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)
{
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);
//- rjf: grab hsva
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval);
Vec4F32 rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdbg, process);
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->rdi, process);
Vec4F32 hsva = hsva_from_rgba(rgba);
//- rjf: build text box
@@ -572,8 +572,8 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba)
}
else
{
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval);
rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdbg, process);
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->rdi, process);
state->hsva = hsva = hsva_from_rgba(rgba);
state->memgen_idx = ctrl_memgen_idx();
}
@@ -623,7 +623,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba)
if(commit)
{
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();
}
@@ -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);
//- 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;
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_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;
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];
@@ -865,7 +865,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap)
state->last_open_frame_idx = df_frame_index();
//- 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;
//- 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_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;
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);
@@ -1112,7 +1112,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo)
state->last_open_frame_idx = df_frame_index();
//- 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;
//- 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);
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);
RDI_Parsed *rdbg = &dbgi->rdbg;
RDI_Parsed *rdi = &dbgi->rdi;
//- rjf: calculate top-level keys, expand root-level, grab root expansion node
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]);
// 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
{
@@ -1180,7 +1180,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
default:{}break;
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);
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);
@@ -1270,7 +1270,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
row->depth > 0 &&
!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)
{
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};
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);
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)
{
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;
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_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)
{
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);
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)
@@ -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);
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)
{
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
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);
RDI_Parsed *rdbg = &dbgi->rdbg;
RDI_Parsed *rdi = &dbgi->rdi;
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);
if(items_stale)
@@ -2929,9 +2929,9 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister)
//- 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))
{
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;
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);
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)
{
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;
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);
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);
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
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);
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);
}
}
@@ -7902,7 +7902,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
DBGI_Scope *scope = dbgi_scope_open();
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);
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)
{
String8 local_name = n->string;
@@ -7910,7 +7910,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
if(local_eval.mode == EVAL_EvalMode_Addr)
{
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_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng);
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->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->vaddr_range = vaddr_rng;
}
+118 -118
View File
@@ -331,7 +331,7 @@ eval_type_group_from_kind(TG_Kind kind){
}
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;
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);
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
{
@@ -350,7 +350,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key 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_Kind kind = tg_kind_from_key(key);
if(kind == TG_Kind_Bool ||
@@ -365,17 +365,17 @@ eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key 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)) &&
eval_kind_is_basic_or_enum(tg_kind_from_key(r)));
// replace enums with corresponding ints
TG_Key lt = eval_type_unwrap_enum(graph, rdbg, l);
TG_Key rt = eval_type_unwrap_enum(graph, rdbg, r);
TG_Key lt = eval_type_unwrap_enum(graph, rdi, l);
TG_Key rt = eval_type_unwrap_enum(graph, rdi, r);
// first promote each
TG_Key lp = eval_type_promote(graph, rdbg, lt);
TG_Key rp = eval_type_promote(graph, rdbg, rt);
TG_Key lp = eval_type_promote(graph, rdi, lt);
TG_Key rp = eval_type_promote(graph, rdi, rt);
TG_Kind lk = tg_kind_from_key(lp);
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
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;
// unwrap
TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l);
TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r);
TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdi, l);
TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdi, r);
if (tg_key_match(lu, ru)){
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_RRef:
{
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru);
if (eval_type_match(graph, rdbg, lud, rud)){
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru);
if (eval_type_match(graph, rdi, lud, rud)){
result = 1;
}
}break;
case TG_Kind_MemberPtr:
{
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru);
TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdbg, lu);
TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdbg, ru);
if (eval_type_match(graph, rdbg, lud, rud) &&
eval_type_match(graph, rdbg, luo, ruo)){
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru);
TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdi, lu);
TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdi, ru);
if (eval_type_match(graph, rdi, lud, rud) &&
eval_type_match(graph, rdi, luo, ruo)){
result = 1;
}
}break;
@@ -430,9 +430,9 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Array:
{
Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r);
if(lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key))
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, rdi, r);
if(lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key))
{
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:
{
Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r);
if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key))
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, rdi, r);
if (lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key))
{
B32 params_match = 1;
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;
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;
break;
@@ -466,11 +466,11 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Method:
{
Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r);
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, rdi, r);
if (lt->count == rt->count &&
eval_type_match(graph, rdbg, 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->direct_type_key, rt->direct_type_key) &&
eval_type_match(graph, rdi, lt->owner_type_key, rt->owner_type_key))
{
B32 params_match = 1;
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;
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;
break;
@@ -589,8 +589,8 @@ eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode){
//~ 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){
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, 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, rdi, type_key);
EVAL_IRTree *result = &eval_irtree_nil;
if (0 < byte_size && byte_size <= 8){
// build the read node
@@ -629,9 +629,9 @@ eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_
}
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;
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){
RDI_EvalOp op = RDI_EvalOp_Trunc;
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*
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;
TG_Kind in_kind = tg_kind_from_key(in);
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);
}
U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, in);
U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, out);
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, rdi, out);
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);
}
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 *result = tree;
switch (from_mode){
default:{}break;
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;
case EVAL_EvalMode_Reg:
{
@@ -715,7 +715,7 @@ eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap
}
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;
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:
{
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);
}break;
case EVAL_ExprKind_Array:
{
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);
}break;
@@ -758,7 +758,7 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_E
}
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();
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 *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, 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 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, rdi, leaf_ident_expr_map, exprr, eout);
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 r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.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, rdi, r.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_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.");
}
else{
direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype);
direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type);
direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type);
if (l_restype_kind == TG_Kind_Ptr){
if (direct_type_size == 0){
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
if (can_generate){
// 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){
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);
@@ -838,7 +838,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// how to compute the base address
EVAL_IRTree *base_tree = l.tree;
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
@@ -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 *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)){
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);
// determine which type to use
TG_Key check_type_key = l_restype;
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){
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);
}
@@ -921,7 +921,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (l_good && r_good){
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
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){
EVAL_IRTree *new_tree = l.tree;
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){
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_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 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_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, c_restype);
U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype_direct);
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, rdi, c_restype_direct);
// analyze situation
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){
EVAL_IRTree *new_tree = c.tree;
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
@@ -1032,10 +1032,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ExprKind_Address:
{
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()))
{
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);
// 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 *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);
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)
{
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);
U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype);
U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cast_type_key);
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, rdi, cast_type_key);
// analyze situation
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_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;
if (conversion_rule == RDI_EvalConversionKind_Legal){
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)){
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;
@@ -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_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;
// size of value expression
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;
}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);
if (type_kind != TG_Kind_Null){
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
@@ -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_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 c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key);
TG_Key p_type = eval_type_promote(graph, rdbg, c_restype);
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Key p_type = eval_type_promote(graph, rdi, c_restype);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
// analyze situation
@@ -1179,8 +1179,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// generate ir tree
if (can_generate){
EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype);
in_tree = eval_irtree_convert_hi(arena, graph, rdbg, in_tree, p_type, 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, rdi, in_tree, p_type, c_restype);
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 *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, 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 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, rdi, leaf_ident_expr_map, exprr, eout);
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 r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.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, rdi, r.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_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;
}
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 r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, r_restype);
U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, l_restype_direct);
U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, r_restype_direct);
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, rdi, r_restype);
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, rdi, r_restype_direct);
if (l_restype_direct_byte_size == r_restype_direct_byte_size){
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;
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;
}
@@ -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);
}
EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype);
l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, cv_type_key, 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, 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);
r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, cv_type_key, 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, rdi, r_tree, cv_type_key, r_restype);
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;
}
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, ptr->type_key);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct);
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, rdi, direct);
// generate ir tree
EVAL_IRTree *ptr_tree = ptr->tree;
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){
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);
@@ -1368,18 +1368,18 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ArithPath_PtrSub:
{
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct);
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, rdi, direct);
// generate ir tree
EVAL_IRTree *l_tree = l.tree;
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;
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);
@@ -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 *exprr = expr->children[2];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, 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 r = 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, exprc, 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, rdi, leaf_ident_expr_map, exprr, eout);
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 l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.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, rdi, l.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 l_restype_kind = tg_kind_from_key(l_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) &&
eval_kind_is_basic_or_enum(r_restype_kind)){
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{
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){
can_generate = 1;
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
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);
l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, final_type, 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, 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);
r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, final_type, 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, rdi, r_tree, final_type, r_restype);
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.");
}
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;
case EVAL_ExprKind_LeafIdent:
{
@@ -1553,7 +1553,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
else
{
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);
}
}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 TG_Key eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key);
internal TG_Key eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, 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_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, 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 *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_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
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_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, 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_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_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 *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 *rdi, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key);
////////////////////////////////
//~ 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 TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, 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 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 *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);
#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
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);
@@ -73,10 +73,10 @@ eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdbg, U64 voff)
//- rjf: voff -> tightest scope
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);
RDI_Scope *scope = &rdbg->scopes[scope_idx];
U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff);
RDI_Scope *scope = &rdi->scopes[scope_idx];
Task *task = push_array(scratch.arena, Task, 1);
task->scope = scope;
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
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);
RDI_Scope *scope = &rdbg->scopes[scope_idx];
U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff-1);
RDI_Scope *scope = &rdi->scopes[scope_idx];
if(scope != tightest_scope)
{
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
if(tightest_scope != 0)
{
for(RDI_Scope *scope = &rdbg->scopes[tightest_scope->parent_scope_idx];
scope != 0 && scope != &rdbg->scopes[0];
scope = &rdbg->scopes[scope->parent_scope_idx])
for(RDI_Scope *scope = &rdi->scopes[tightest_scope->parent_scope_idx];
scope != 0 && scope != &rdi->scopes[0];
scope = &rdi->scopes[scope->parent_scope_idx])
{
Task *task = push_array(scratch.arena, Task, 1);
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;
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;
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));
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 *
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
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);
tightest_scope = &rdbg->scopes[scope_idx];
U64 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, voff);
tightest_scope = &rdi->scopes[scope_idx];
}
//- rjf: tightest scope -> procedure
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;
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
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;
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);
//- 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;
for(U32 member_idx = udt->member_first;
member_idx < udt->member_first+udt->member_count;
member_idx += 1)
{
if(member_idx < 1 || rdbg->members_count <= member_idx)
if(member_idx < 1 || rdi->members_count <= member_idx)
{
break;
}
RDI_Member *m = &rdbg->members[member_idx];
RDI_Member *m = &rdi->members[member_idx];
if(m->kind == RDI_MemberKind_DataField)
{
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);
data_member_num += 1;
}
@@ -464,23 +464,23 @@ eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl)
//~ rjf: Parser Functions
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;
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_name_map_parse(rdbg, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdbg, &parsed_name_map, name.str, name.size);
rdi_name_map_parse(rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size);
if(node != 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)
{
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;
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)
{
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))
{
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);
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))
{
// 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
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);
RDI_Scope *scope = &ctx->rdbg->scopes[scope_idx];
U64 scope_idx = rdi_vmap_idx_from_voff(ctx->rdi->scope_vmap, ctx->rdi->scope_vmap_count, ctx->ip_voff);
RDI_Scope *scope = &ctx->rdi->scopes[scope_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;
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);
U64 last_past_scope_resolution_pos = 0;
for(;;)
@@ -843,8 +843,8 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
{
mapped_identifier = 1;
identifier_type_is_possibly_dynamically_overridden = 1;
RDI_Local *local_var = rdi_element_from_idx(ctx->rdbg, locals, local_num-1);
RDI_TypeNode *type_node = rdi_element_from_idx(ctx->rdbg, type_nodes, local_var->type_idx);
RDI_Local *local_var = rdi_element_from_idx(ctx->rdi, locals, local_num-1);
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);
// 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 += 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)
{
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)
{
default:{mapped_identifier = 0;}break;
case RDI_LocationKind_AddrBytecodeStream:
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;
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];
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_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;
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;
}
}
@@ -919,21 +919,21 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try global variables
if(mapped_identifier == 0)
{
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_GlobalVariables);
if(name_map != 0 && ctx->rdbg->global_variables != 0)
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_GlobalVariables);
if(name_map != 0 && ctx->rdi->global_variables != 0)
{
RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size);
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;
n != 0 && matches_count == 0;
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 = 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)
{
@@ -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
// in this case, I'm going to prefer the latest-added global.
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_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff);
loc_kind = RDI_LocationKind_AddrBytecodeStream;
loc_bytecode = eval_bytecode_from_oplist(arena, &oplist);
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);
}
mapped_identifier = 1;
@@ -961,34 +961,34 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try thread variables
if(mapped_identifier == 0)
{
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_ThreadVariables);
if(name_map != 0 && ctx->rdbg->global_variables != 0)
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_ThreadVariables);
if(name_map != 0 && ctx->rdi->global_variables != 0)
{
RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size);
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;
n != 0 && matches_count == 0;
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 = 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)
{
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_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off);
loc_kind = RDI_LocationKind_AddrBytecodeStream;
loc_bytecode = eval_bytecode_from_oplist(arena, &oplist);
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);
}
mapped_identifier = 1;
@@ -999,36 +999,36 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try procedures
if(mapped_identifier == 0)
{
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdbg, RDI_NameMapKind_Procedures);
if(name_map != 0 && ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_voffs)
RDI_NameMap *name_map = rdi_name_map_from_kind(ctx->rdi, RDI_NameMapKind_Procedures);
if(name_map != 0 && ctx->rdi->procedures != 0 && ctx->rdi->scopes != 0 && ctx->rdi->scope_voffs)
{
RDI_ParsedNameMap parsed_name_map = {0};
rdi_name_map_parse(ctx->rdbg, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size);
rdi_name_map_parse(ctx->rdi, name_map, &parsed_name_map);
RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size);
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;
n != 0 && matches_count == 0;
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 = 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)
{
U32 match_idx = matches[0];
RDI_Procedure *procedure = &ctx->rdbg->procedures[match_idx];
RDI_Scope *scope = &ctx->rdbg->scopes[procedure->root_scope_idx];
U64 voff = ctx->rdbg->scope_voffs[scope->voff_range_first];
RDI_Procedure *procedure = &ctx->rdi->procedures[match_idx];
RDI_Scope *scope = &ctx->rdi->scopes[procedure->root_scope_idx];
U64 voff = ctx->rdi->scope_voffs[scope->voff_range_first];
EVAL_OpList oplist = {0};
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff);
loc_kind = RDI_LocationKind_ValBytecodeStream;
loc_bytecode = eval_bytecode_from_oplist(arena, &oplist);
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);
}
mapped_identifier = 1;
@@ -1039,7 +1039,7 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
//- rjf: try types
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))
{
mapped_identifier = 1;
+4 -4
View File
@@ -67,7 +67,7 @@ struct EVAL_ParseCtx
{
Architecture arch;
U64 ip_voff;
RDI_Parsed *rdbg;
RDI_Parsed *rdi;
TG_Graph *type_graph;
EVAL_String2NumMap *regs_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
internal EVAL_String2NumMap *eval_push_locals_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 *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 *rdi, U64 voff);
////////////////////////////////
//~ rjf: Tokenization Functions
@@ -101,7 +101,7 @@ internal EVAL_TokenArray eval_token_array_make_first_opl(EVAL_Token *first, EVAL
////////////////////////////////
//~ 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_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);
+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);
// parse raw data as raddbg
RDI_Parsed rdbg = {0};
RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdbg);
RDI_Parsed rdi = {0};
RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdi);
// usage example: print out all procedure symbol names
#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;
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);
}
#endif
// usage example: print out all user-defined-type names
#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_TypeNode *type = &rdbg.type_nodes[udt->self_type_idx];
RDI_UDT *udt = &rdi.udts[udt_idx];
RDI_TypeNode *type = &rdi.type_nodes[udt->self_type_idx];
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);
}
#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
// 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
// example, given a `type_idx`, I will index into `rdbg.type_nodes`. given a
// `udt_idx`, I will index into `rdbg.udts`. given a `scope_idx`, I will
// index into `rdbg.scopes`. and so on.
// example, given a `type_idx`, I will index into `rdi.type_nodes`. given a
// `udt_idx`, I will index into `rdi.udts`. given a `scope_idx`, I will
// index into `rdi.scopes`. and so on.
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
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;
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;
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;
}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:
{
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];
TG_Kind kind = tg_kind_from_rdi_type_kind(rdbg_type->kind);
RDI_TypeNode *rdi_type = &rdi->type_nodes[type_node_idx];
TG_Kind kind = tg_kind_from_rdi_type_kind(rdi_type->kind);
//- 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
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
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
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 = 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;
member_idx < udt->member_first+udt->member_count;
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;
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);
}
TG_Member *dst = &members[member_idx-udt->member_first];
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->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;
}
}
@@ -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->kind = kind;
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->members = members;
}
//- 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
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
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);
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
TG_EnumVal *enum_vals = 0;
U32 enum_vals_count = 0;
{
U32 udt_idx = rdbg_type->user_defined.udt_idx;
if(0 <= udt_idx && udt_idx < rdbg->udts_count)
U32 udt_idx = rdi_type->user_defined.udt_idx;
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 = 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;
member_idx < udt->member_first+udt->member_count;
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];
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;
}
}
@@ -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->kind = kind;
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->enum_vals = enum_vals;
type->direct_type_key = direct_type_key;
}
//- 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
B32 direct_type_is_good = 0;
TG_Key direct_type_key = zero_struct;
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);
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_byte_size = (U64)direct_type_node->byte_size;
}
// rjf: construct based on kind
switch(rdbg_type->kind)
switch(rdi_type->kind)
{
case RDI_TypeKind_Modifier:
{
TG_Flags flags = 0;
if(rdbg_type->flags & RDI_TypeModifierFlag_Const)
if(rdi_type->flags & RDI_TypeModifierFlag_Const)
{
flags |= TG_Flag_Const;
}
if(rdbg_type->flags & RDI_TypeModifierFlag_Volatile)
if(rdi_type->flags & RDI_TypeModifierFlag_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->kind = kind;
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;
}break;
case RDI_TypeKind_Function:
{
U32 count = rdbg_type->constructed.count;
U32 idx_run_first = rdbg_type->constructed.param_idx_run_first;
U32 count = rdi_type->constructed.count;
U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
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)
{
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];
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);
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.
// the return type, instead of being encoded via the `direct` type, is
// encoded via the first parameter.
U32 count = rdbg_type->constructed.count;
U32 idx_run_first = rdbg_type->constructed.param_idx_run_first;
U32 count = rdi_type->constructed.count;
U32 idx_run_first = rdi_type->constructed.param_idx_run_first;
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)
{
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];
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);
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
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);
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->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
else if(rdbg_type->kind == RDI_TypeKind_Alias)
else if(rdi_type->kind == RDI_TypeKind_Alias)
{
// rjf: unpack name
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
TG_Key direct_type_key = zero_struct;
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);
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;
}
@@ -608,11 +608,11 @@ tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, TG_K
}
//- 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
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
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
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;
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:
{
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;
scratch_end(scratch);
}break;
@@ -814,16 +814,16 @@ tg_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 *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_direct_from_graph_rdi_key(graph, rdbg, 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, rdi, key);
key = tg_unwrapped_from_graph_rdi_key(graph, rdi, key);
return 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;
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:
{
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;
scratch_end(scratch);
}break;
@@ -842,14 +842,14 @@ tg_owner_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 *rdbg, TG_Key key)
tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{
TG_Key result = key;
B32 passed_ptr = 0;
for(;;)
{
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)
{
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
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;
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_Alias)
{
result = tg_direct_from_graph_rdi_key(graph, rdbg, result);
result = tg_direct_from_graph_rdi_key(graph, rdi, result);
}
else
{
@@ -895,7 +895,7 @@ tg_unwrapped_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 *rdbg, TG_Key key)
tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{
U64 result = 0;
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:
{
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;
scratch_end(scratch);
}break;
@@ -945,12 +945,12 @@ 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)
tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{
TG_MemberArray result = {0};
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)
{
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
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);
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};
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;
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);
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 = 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);
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];
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);
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
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};
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:
{
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, str8_lit(" "));
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:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, prec, skip_return);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdi, direct, out, prec, skip_return);
}break;
case TG_Kind_Modifier:
{
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_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)
{
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:
{
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, str8_lit(" "));
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:;
{
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, str8_lit(" "));
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:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, skip_return);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, skip_return);
if(prec == 1)
{
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)
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 2, 0);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, 0);
}
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:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("*"));
}break;
case TG_Kind_LRef:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("&"));
}break;
case TG_Kind_RRef:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("&&"));
}break;
case TG_Kind_MemberPtr:
{
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_lhs_string_from_key(arena, graph, rdbg, direct, out, 1, skip_return);
TG_Type *container = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, type->owner_type_key);
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, rdi, type->owner_type_key);
if(container->kind != TG_Kind_Null)
{
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
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);
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:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, prec);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdi, direct, out, prec);
}break;
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_MemberPtr:
{
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 1);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdi, direct, out, 1);
}break;
case TG_Kind_Array:
{
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)
{
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, count_str);
str8_list_push(arena, out, str8_lit("]"));
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2);
scratch_end(scratch);
}break;
case TG_Kind_Function:
{
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)
{
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)
{
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);
str8_list_push(arena, out, param_str_trimmed);
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(")"));
}
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdbg, key);
tg_rhs_string_from_key(arena, graph, rdbg, direct, out, 2);
TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key);
tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2);
scratch_end(scratch);
}break;
}
}
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);
String8List list = {0};
tg_lhs_string_from_key(scratch.arena, graph, rdbg, key, &list, 0, 0);
tg_rhs_string_from_key(scratch.arena, graph, rdbg, key, &list, 0);
tg_lhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0, 0);
tg_rhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0);
String8 result = str8_list_join(arena, &list, 0);
scratch_end(scratch);
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
internal TG_Type *tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, 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_unwrapped_direct_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 *rdbg, 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_unwrapped_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 *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 *rdi, 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 *rdi, 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 *rdi, 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_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_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, 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_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, 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 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 *rdi, TG_Key key);
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 *rdi, TG_Key key, String8List *out, U32 prec);
internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key);
#endif // TYPE_GRAPH_H