diff --git a/build.bat b/build.bat index 340fd41f..3448e77b 100644 --- a/build.bat +++ b/build.bat @@ -43,7 +43,7 @@ if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=add :: --- Compile/Link Line Definitions ------------------------------------------ set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 -set clang_common= -I..\src\ -I..\local\ -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf +set clang_common= -I..\src\ -I..\local\ -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index 040c0004..c45f96c8 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -183,7 +183,7 @@ #endif #if !defined(BUILD_ISSUES_LINK_STRING_LITERAL) -# define BUILD_ISSUES_LINK_STRING_LITERAL "https://github.com/EpicGames/raddebugger/issues" +# define BUILD_ISSUES_LINK_STRING_LITERAL "https://github.com/EpicGamesExt/raddebugger/issues" #endif #define BUILD_TITLE_STRING_LITERAL BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ") - " __DATE__ "" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 2b470039..e29865ba 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -900,15 +900,15 @@ ctrl_init(void) U64 reg_count = regs_reg_code_count_from_architecture(arch); String8 *alias_names = regs_alias_code_string_table_from_architecture(arch); U64 alias_count = regs_alias_code_count_from_architecture(arch); - ctrl_state->arch_string2reg_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); - ctrl_state->arch_string2alias_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); + ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); + ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); for(U64 idx = 1; idx < reg_count; idx += 1) { - eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); + e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); } for(U64 idx = 1; idx < alias_count; idx += 1) { - eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); + e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); } } ctrl_state->process_memory_cache.slots_count = 256; @@ -2713,13 +2713,13 @@ ctrl_reg_gen(void) //- rjf: name -> register/alias hash tables, for eval -internal EVAL_String2NumMap * +internal E_String2NumMap * ctrl_string2reg_from_arch(Architecture arch) { return &ctrl_state->arch_string2reg_tables[arch]; } -internal EVAL_String2NumMap * +internal E_String2NumMap * ctrl_string2alias_from_arch(Architecture arch) { return &ctrl_state->arch_string2alias_tables[arch]; @@ -3789,11 +3789,11 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, //- rjf: eval helpers internal B32 -ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) +ctrl_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range) { DMN_Handle process = *(DMN_Handle *)u; - U64 read_size = dmn_process_read(process, r1u64(addr, addr+size), out); - B32 result = (read_size == size); + U64 read_size = dmn_process_read(process, vaddr_range, out); + B32 result = (read_size == dim_1u64(vaddr_range)); return result; } @@ -4518,11 +4518,11 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: unpack info about thread attached to event // CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->thread); + CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); Architecture arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); CTRL_Entity *module = &ctrl_entity_nil; { - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); for(CTRL_Entity *m = process->first; m != &ctrl_entity_nil; m = m->next) { if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, thread_rip_vaddr)) @@ -4536,7 +4536,6 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ////////////////////////// //- rjf: extract module-dependent info // - CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); U64 thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min; ////////////////////////// @@ -4630,61 +4629,93 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) if(conditions.node_count != 0) ProfScope("evaluate hit stop conditions") { DI_Scope *di_scope = di_scope_open(); - DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) { - ProfBegin("compile expression"); - String8 string = condition_n->string; - EVAL_ParseCtx parse_ctx = zero_struct; + // rjf: count all modules + U64 all_modules_count = 0; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) { - parse_ctx.arch = arch; - parse_ctx.ip_voff = thread_rip_voff; - 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, rdi, thread_rip_voff); - parse_ctx.member_map = eval_push_member_map_from_rdi_voff(temp.arena, rdi, thread_rip_voff); + if(child->kind == CTRL_EntityKind_Module) + { + all_modules_count += 1; + } } - EVAL_TokenArray tokens = eval_token_array_from_text(temp.arena, string); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(temp.arena, &parse_ctx, string, &tokens); - EVAL_ErrorList errors = parse.errors; - B32 parse_has_expr = (parse.expr != &eval_expr_nil); - B32 parse_is_type = (parse_has_expr && parse.expr->kind == EVAL_ExprKind_TypeIdent); - EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; - if(parse_has_expr && errors.count == 0) + + // rjf: form evaluation context + E_Ctx ectx = zero_struct; + ProfScope("form evaluation context") { - ir_tree_and_type = eval_irtree_and_type_from_expr(temp.arena, parse_ctx.type_graph, rdi, &eval_string2expr_map_nil, parse.expr, &errors); + E_Ctx *ctx = &ectx; + ctx->arch = arch; + ctx->ip_vaddr = thread_rip_vaddr; + ctx->ip_voff = thread_rip_voff; + ctx->rdis_count = all_modules_count; + ctx->rdis = push_array(temp.arena, RDI_Parsed *, ctx->rdis_count); + ctx->rdis_vaddr_ranges = push_array(temp.arena, Rng1U64, ctx->rdis_count); + RDI_Parsed *primary_rdi = &di_rdi_parsed_nil; + { + U64 primary_idx = 0; + U64 idx = 0; + for(CTRL_Entity *m = process->first; + m != &ctrl_entity_nil && idx < all_modules_count; + m = m->next) + { + if(m->kind != CTRL_EntityKind_Module) + { + continue; + } + + // rjf: unpack + CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(m, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; + + // rjf: fill + ctx->rdis[idx] = di_rdi_from_key(di_scope, &dbgi_key, max_U64); + ctx->rdis_vaddr_ranges[idx] = m->vaddr_range; + + // rjf: pick primary module + if(m == module) + { + primary_idx = idx; + } + + // rjf: inc + idx += 1; + } + if(primary_idx != 0) + { + Swap(RDI_Parsed *, ctx->rdis[0], ctx->rdis[primary_idx]); + Swap(Rng1U64, ctx->rdis_vaddr_ranges[0], ctx->rdis_vaddr_ranges[primary_idx]); + } + primary_rdi = ctx->rdis[0]; + } + ctx->regs_map = ctrl_string2reg_from_arch(ctx->arch); + ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->arch); + ctx->locals_map = e_push_locals_map_from_rdi_voff(temp.arena, primary_rdi, thread_rip_voff); + ctx->member_map = e_push_member_map_from_rdi_voff(temp.arena, primary_rdi, thread_rip_voff); + ctx->macro_map = &e_string2expr_map_nil; + // TODO(rjf): ctx->macro_map = ...; + ctx->memory_read_user_data = &event->process; + ctx->memory_read = ctrl_eval_memory_read; + ctx->reg_size = regs_block_size_from_architecture(ctx->arch); + ctx->reg_data = push_array(temp.arena, U8, ctx->reg_size); + dmn_thread_read_reg_block(event->thread, ctx->reg_data); + ctx->module_base = push_array(temp.arena, U64, 1); + ctx->module_base[0]= module->vaddr_range.min; + ctx->tls_base = push_array(temp.arena, U64, 1); + // TODO(rjf): ctx->tls_base[0]= ...; + e_select_ctx(ctx); } - EVAL_OpList op_list = {0}; - if(parse_has_expr && ir_tree_and_type.tree != &eval_irtree_nil) + + // rjf: evaluate + E_Eval eval = zero_struct; + ProfScope("evaluate expression") { - eval_oplist_from_irtree(scratch.arena, ir_tree_and_type.tree, &op_list); + eval = e_eval_from_string(temp.arena, condition_n->string); } - String8 bytecode = {0}; - if(parse_has_expr && parse_is_type == 0 && op_list.encoded_size != 0) - { - bytecode = eval_bytecode_from_oplist(scratch.arena, &op_list); - } - ProfEnd(); - EVAL_Result eval = {0}; - if(bytecode.size != 0) ProfScope("evaluate expression") - { - U64 module_base = module->vaddr_range.min; - U64 tls_base = dmn_tls_root_vaddr_from_thread(event->thread); - EVAL_Machine machine = {0}; - machine.u = &event->process; - machine.arch = arch; - machine.memory_read = ctrl_eval_memory_read; - machine.reg_size = regs_block_size_from_architecture(arch); - machine.reg_data = push_array(scratch.arena, U8, machine.reg_size); - dmn_thread_read_reg_block(event->thread, machine.reg_data); - machine.module_base = &module_base; - machine.tls_base = &tls_base; - eval = eval_interpret(&machine, bytecode); - } - if(eval.code == EVAL_ResultCode_Good && eval.value.u64 == 0) + + // rjf: interpret evaluation + if(eval.code == E_InterpretationCode_Good && eval.value.u64 == 0) { hit_user_bp = 0; hit_conditional_bp_but_filtered = 1; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 09c07e42..0a4a8615 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -561,8 +561,8 @@ struct CTRL_State CTRL_WakeupFunctionType *wakeup_hook; // rjf: name -> register/alias hash tables for eval - EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; - EVAL_String2NumMap arch_string2alias_tables[Architecture_COUNT]; + E_String2NumMap arch_string2reg_tables[Architecture_COUNT]; + E_String2NumMap arch_string2alias_tables[Architecture_COUNT]; // rjf: caches CTRL_ProcessMemoryCache process_memory_cache; @@ -788,8 +788,8 @@ internal U64 ctrl_mem_gen(void); internal U64 ctrl_reg_gen(void); //- rjf: name -> register/alias hash tables, for eval -internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); -internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); +internal E_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); +internal E_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); //////////////////////////////// //~ rjf: Control-Thread Functions @@ -817,7 +817,7 @@ internal void ctrl_thread__module_close(CTRL_MachineID machine_id, DMN_Handle mo internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); //- rjf: eval helpers -internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size); +internal B32 ctrl_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range); //- rjf: log flusher internal void ctrl_thread__flush_info_log(String8 string); diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index a92c940e..b03880bd 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -492,15 +492,15 @@ dasm_parse_thread__entry_point(void *p) for(;;) { Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + DI_Scope *di_scope = di_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); //- rjf: get next request U128 hash = {0}; DASM_Params params = {0}; dasm_u2p_dequeue_req(scratch.arena, &hash, ¶ms); U64 change_gen = fs_change_gen(); - HS_Scope *hs_scope = hs_scope_open(); - DI_Scope *di_scope = di_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); //- rjf: unpack hash U64 slot_idx = hash.u64[1]%dasm_shared->slots_count; diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index d7e55266..a675c47c 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -140,11 +140,11 @@ di_scope_close(DI_Scope *scope) for(DI_Touch *t = scope->first_touch, *next = 0; t != 0; t = next) { next = t->next; - SLLStackPush(di_tctx->free_touch, t); if(t->node != 0) { ins_atomic_u64_dec_eval(&t->node->touch_count); } + SLLStackPush(di_tctx->free_touch, t); } SLLStackPush(di_tctx->free_scope, scope); } @@ -435,6 +435,12 @@ di_rdi_from_key(DI_Scope *scope, DI_Key *key, U64 endt_us) break; } + //- rjf: node refcount == 0? this node is being destroyed + if(node->ref_count == 0) + { + break; + } + //- rjf: parse done -> touch, grab result if(node != 0 && node->parse_done) { diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 26389970..be92ae2b 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -849,7 +849,7 @@ df_cmd_params_has_slot(DF_CmdParams *params, DF_CmdParamSlot slot) } internal String8 -df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams *params, DF_CmdSpec *spec, String8 query) +df_cmd_params_apply_spec_query(Arena *arena, DF_CmdParams *params, DF_CmdSpec *spec, String8 query) { String8 error = {0}; B32 prefer_imm = 0; @@ -890,21 +890,17 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams use_numeric_eval: { Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - U64 vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx->unwind_count); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, vaddr); - DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, query); - if(eval.errors.count == 0) + E_Eval eval = e_eval_from_string(scratch.arena, query); + if(eval.msgs.max_kind != E_MsgKind_Null) { - 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) + E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(eval.type_key)); + if(eval_type_kind == E_TypeKind_Ptr || + eval_type_kind == E_TypeKind_LRef || + eval_type_kind == E_TypeKind_RRef) { - eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdi, ctrl_ctx, eval); - prefer_imm = 1; + eval = e_value_eval_from_eval(eval); } - U64 u64 = !prefer_imm && eval.offset ? eval.offset : eval.imm_u64; + U64 u64 = eval.value.u64; switch(spec->info.query.slot) { default:{}break; @@ -944,7 +940,6 @@ df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams { error = push_str8f(scratch.arena, "Couldn't evaluate \"%S\" as an address", query); } - di_scope_close(scope); scratch_end(scratch); }break; } @@ -3573,19 +3568,19 @@ df_architecture_from_entity(DF_Entity *entity) return entity->arch; } -internal EVAL_String2NumMap * +internal E_String2NumMap * df_push_locals_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff) { RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdi, voff); + E_String2NumMap *result = e_push_locals_map_from_rdi_voff(arena, rdi, voff); return result; } -internal EVAL_String2NumMap * +internal E_String2NumMap * df_push_member_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff) { RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdi, voff); + E_String2NumMap *result = e_push_member_map_from_rdi_voff(arena, rdi, voff); return result; } @@ -3808,9 +3803,9 @@ df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_RunFlags flags, CTRL_Tra df_state->ctrl_last_run_traps = ctrl_trap_list_copy(df_state->ctrl_last_run_arena, &run_traps_copy); df_state->ctrl_is_running = 1; - // rjf: set control context to top unwind - df_state->ctrl_ctx.unwind_count = 0; - df_state->ctrl_ctx.inline_depth = 0; + // rjf: reset selected frame to top unwind + df_state->base_interact_regs.v.unwind_count = 0; + df_state->base_interact_regs.v.inline_depth = 0; scratch_end(scratch); } @@ -3824,18 +3819,18 @@ df_ctrl_last_stop_event(void) } //////////////////////////////// -//~ rjf: Evaluation +//~ rjf: Evaluation Context internal B32 -df_eval_memory_read(void *u, void *out, U64 addr, U64 size) +df_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range) { DF_Entity *process = (DF_Entity *)u; Assert(process->kind == DF_EntityKind_Process); Temp scratch = scratch_begin(0, 0); B32 result = 0; - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(addr, addr+size), 0); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); String8 data = slice.data; - if(data.size == size) + if(data.size == dim_1u64(vaddr_range)) { result = 1; MemoryCopy(out, data.str, data.size); @@ -3844,443 +3839,18 @@ df_eval_memory_read(void *u, void *out, U64 addr, U64 size) return result; } -internal EVAL_ParseCtx -df_eval_parse_ctx_from_process_vaddr(DI_Scope *scope, DF_Entity *process, U64 vaddr) +internal E_Eval +df_eval_from_eval_cfg_table(Arena *arena, E_Eval eval, DF_CfgTable *cfg) { - Temp scratch = scratch_begin(0, 0); - - //- rjf: extract info - DF_Entity *module = df_module_from_process_vaddr(process, vaddr); - U64 voff = df_voff_from_vaddr(module, vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); - 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); - EVAL_String2NumMap *locals_map = df_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, voff); - EVAL_String2NumMap *member_map = df_query_cached_member_map_from_dbgi_key_voff(&dbgi_key, voff); - - //- rjf: build ctx - EVAL_ParseCtx ctx = zero_struct; - { - ctx.arch = arch; - ctx.ip_voff = voff; - 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; - ctx.locals_map = locals_map; - ctx.member_map = member_map; - } - scratch_end(scratch); - return ctx; -} - -internal EVAL_ParseCtx -df_eval_parse_ctx_from_src_loc(DI_Scope *scope, DF_Entity *file, TxtPt pt) -{ - Temp scratch = scratch_begin(0, 0); - EVAL_ParseCtx ctx = zero_struct; - DI_KeyList dbgi_keys = df_push_active_dbgi_key_list(scratch.arena); - DF_TextLineSrc2DasmInfoList src2dasm_list = {0}; - - //- rjf: search for line info in all binaries for this file:pt - DF_EntityList overrides = df_possible_overrides_from_entity(scratch.arena, file); - for(DF_EntityNode *override_n = overrides.first; - override_n != 0; - override_n = override_n->next) - { - DF_Entity *override = override_n->entity; - String8 file_path = df_full_path_from_entity(scratch.arena, override); - String8 file_path_normalized = lower_from_str8(scratch.arena, file_path); - for(DI_KeyNode *dbgi_key_n = dbgi_keys.first; - dbgi_key_n != 0; - dbgi_key_n = dbgi_key_n->next) - { - // rjf: key -> rdi - DI_Key key = dbgi_key_n->v; - RDI_Parsed *rdi = di_rdi_from_key(scope, &key, 0); - - // rjf: file_path_normalized * rdi -> src_id - B32 good_src_id = 0; - U32 src_id = 0; - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(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(rdi, node, &id_count); - if(id_count > 0) - { - good_src_id = 1; - src_id = ids[0]; - } - } - } - - // rjf: good src-id -> look up line info for visible range - if(good_src_id) - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &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_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &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; - DF_TextLineSrc2DasmInfoNode *src2dasm_n = push_array(scratch.arena, DF_TextLineSrc2DasmInfoNode, 1); - src2dasm_n->v.voff_range = range; - src2dasm_n->v.remap_line = (S64)actual_line; - src2dasm_n->v.dbgi_key = key; - SLLQueuePush(src2dasm_list.first, src2dasm_list.last, src2dasm_n); - src2dasm_list.count += 1; - } - } - } - } - - //- rjf: try to form ctx from line info - B32 good_ctx = 0; - if(src2dasm_list.count != 0) - { - for(DF_TextLineSrc2DasmInfoNode *n = src2dasm_list.first; n != 0; n = n->next) - { - DF_TextLineSrc2DasmInfo *src2dasm = &n->v; - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &src2dasm->dbgi_key); - if(modules.count != 0) - { - DF_Entity *module = modules.first->entity; - DF_Entity *process = df_entity_ancestor_from_kind(module, DF_EntityKind_Process); - U64 voff = src2dasm->voff_range.min; - U64 vaddr = df_vaddr_from_voff(module, voff); - ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, vaddr); - good_ctx = 1; - break; - } - } - } - - //- rjf: bad ctx -> reset with graceful defaults - if(good_ctx == 0) - { - ctx.rdi = &di_rdi_parsed_nil; - ctx.type_graph = tg_graph_begin(8, 256); - ctx.regs_map = &eval_string2num_map_nil; - ctx.regs_map = &eval_string2num_map_nil; - ctx.reg_alias_map = &eval_string2num_map_nil; - ctx.locals_map = &eval_string2num_map_nil; - ctx.member_map = &eval_string2num_map_nil; - } - - scratch_end(scratch); - return ctx; -} - -internal DF_Eval -df_eval_from_string(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: unpack arguments - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); - DF_Entity *process = thread->parent; - U64 unwind_count = ctrl_ctx->unwind_count; - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - Architecture arch = df_architecture_from_entity(thread); - U64 reg_size = regs_block_size_from_architecture(arch); - U64 thread_unwind_ip_vaddr = 0; - void *thread_unwind_regs_block = push_array(scratch.arena, U8, reg_size); - if(unwind.frames.count != 0) - { - thread_unwind_regs_block = unwind.frames.v[unwind_count%unwind.frames.count].regs; - thread_unwind_ip_vaddr = regs_rip_from_arch_block(arch, thread_unwind_regs_block); - } - - //- rjf: unpack module info & produce eval machine - DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr); - U64 module_base = df_base_vaddr_from_module(module); - U64 tls_base = df_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, thread_unwind_ip_vaddr); - EVAL_Machine machine = {0}; - machine.u = (void *)thread->parent; - machine.arch = arch; - machine.memory_read = df_eval_memory_read; - machine.reg_data = thread_unwind_regs_block; - machine.reg_size = reg_size; - machine.module_base = &module_base; - machine.tls_base = &tls_base; - - //- rjf: lex & parse - EVAL_TokenArray tokens = eval_token_array_from_text(arena, string); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(arena, parse_ctx, string, &tokens); - EVAL_ErrorList errors = parse.errors; - B32 parse_has_expr = (parse.expr != &eval_expr_nil); - B32 parse_is_type = (parse_has_expr && parse.expr->kind == EVAL_ExprKind_TypeIdent); - - //- rjf: produce IR tree & type - 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->rdi, macro_map, parse.expr, &errors); - } - - //- rjf: get list of ops - EVAL_OpList op_list = {0}; - if(parse_has_expr && ir_tree_and_type.tree != &eval_irtree_nil) - { - eval_oplist_from_irtree(arena, ir_tree_and_type.tree, &op_list); - } - - //- rjf: get bytecode string - String8 bytecode = {0}; - if(parse_has_expr && parse_is_type == 0 && op_list.encoded_size != 0) - { - bytecode = eval_bytecode_from_oplist(arena, &op_list); - } - - //- rjf: evaluate - EVAL_Result eval = {0}; - if(bytecode.size != 0) - { - eval = eval_interpret(&machine, bytecode); - } - - //- rjf: fill result - DF_Eval result = zero_struct; - { - result.type_key = ir_tree_and_type.type_key; - result.mode = ir_tree_and_type.mode; - switch(result.mode) - { - default: - case EVAL_EvalMode_Value: - { - MemoryCopyArray(result.imm_u128, eval.value.u128); - }break; - case EVAL_EvalMode_Addr: - { - result.offset = eval.value.u64; - }break; - case EVAL_EvalMode_Reg: - { - U64 reg_off = (eval.value.u64 & 0x0000ffff) >> 0; - U64 reg_size = (eval.value.u64 & 0xffff0000) >> 16; - result.offset = reg_off; - (void)reg_size; - }break; - } - result.errors = errors; - if(EVAL_ResultCode_Good < eval.code && eval.code < EVAL_ResultCode_COUNT) - { - eval_error(arena, &result.errors, EVAL_ErrorKind_InterpretationError, 0, eval_result_code_display_strings[eval.code]); - } - } - - //- 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->rdi, ctrl_ctx, result); - } - - //- rjf: try to resolve basic integral values into symbols - if((result.mode == EVAL_EvalMode_Value || result.mode == EVAL_EvalMode_Reg) && parse.expr->kind != EVAL_ExprKind_Cast && - (tg_key_match(result.type_key, tg_key_basic(TG_Kind_S64)) || - tg_key_match(result.type_key, tg_key_basic(TG_Kind_U64)) || - tg_key_match(result.type_key, tg_key_basic(TG_Kind_S32)) || - tg_key_match(result.type_key, tg_key_basic(TG_Kind_U32)))) - { - U64 vaddr = result.imm_u64; - DF_Entity *module = df_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 voff = df_voff_from_vaddr(module, vaddr); - String8 symbol_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); - if(symbol_name.size != 0) - { - result.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, tg_key_basic(TG_Kind_Void), 0); - } - } - - scratch_end(scratch); - ProfEnd(); - return result; -} - -internal DF_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); - DF_Entity *process = thread->parent; - switch(eval.mode) - { - //- rjf: no work to be done. already in value mode - default: - case EVAL_EvalMode_Value:{}break; - - //- rjf: address => resolve into value, if leaf - case EVAL_EvalMode_Addr: - { - 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, rdi, type_key); - if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= sizeof(U64)*2) - { - Temp scratch = scratch_begin(0, 0); - Rng1U64 vaddr_range = r1u64(eval.offset, eval.offset + type_byte_size); - if(dim_1u64(vaddr_range) == type_byte_size) - { - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); - String8 data = slice.data; - MemoryZeroArray(eval.imm_u128); - MemoryCopy(eval.imm_u128, data.str, Min(data.size, sizeof(U64)*2)); - eval.mode = EVAL_EvalMode_Value; - - // rjf: mask&shift, for bitfields - if(type_kind == TG_Kind_Bitfield && type_byte_size <= sizeof(U64)) - { - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type_key); - U64 valid_bits_mask = 0; - for(U64 idx = 0; idx < type->count; idx += 1) - { - valid_bits_mask |= (1<> type->off; - eval.imm_u64 = eval.imm_u64 & valid_bits_mask; - eval.type_key = type->direct_type_key; - } - - // rjf: manually sign-extend - switch(type_kind) - { - default: break; - case TG_Kind_S8: {eval.imm_s64 = (S64)*((S8 *)&eval.imm_u64);}break; - case TG_Kind_S16: {eval.imm_s64 = (S64)*((S16 *)&eval.imm_u64);}break; - case TG_Kind_S32: {eval.imm_s64 = (S64)*((S32 *)&eval.imm_u64);}break; - } - } - scratch_end(scratch); - } - }break; - - //- rjf: register => resolve into value - case EVAL_EvalMode_Reg: - { - TG_Key type_key = eval.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.frames.count != 0) - { - CTRL_UnwindFrame *frame = &unwind.frames.v[ctrl_ctx->unwind_count%unwind.frames.count]; - MemoryCopy(&eval.imm_u128[0], ((U8 *)frame->regs + reg_off), Min(type_byte_size, sizeof(U64)*2)); - } - eval.mode = EVAL_EvalMode_Value; - }break; - } - - ProfEnd(); - return eval; -} - -internal DF_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); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - Architecture arch = df_architecture_from_entity(thread); - DF_Entity *process = thread->parent; - U64 unwind_count = ctrl_ctx->unwind_count; - U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); - TG_Key type_key = eval.type_key; - 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, 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, rdi, ptee_type_key); - B32 has_vtable = 0; - for(U64 idx = 0; idx < ptee_type->count; idx += 1) - { - if(ptee_type->members[idx].kind == TG_MemberKind_VirtualMethod) - { - has_vtable = 1; - break; - } - } - if(has_vtable) - { - U64 ptr_vaddr = eval.offset; - U64 addr_size = bit_size_from_arch(arch)/8; - CTRL_ProcessMemorySlice ptr_value_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, - r1u64(ptr_vaddr, ptr_vaddr+addr_size), 0); - String8 ptr_value_memory = ptr_value_slice.data; - if(ptr_value_memory.size >= addr_size) - { - U64 class_base_vaddr = 0; - MemoryCopy(&class_base_vaddr, ptr_value_memory.str, addr_size); - CTRL_ProcessMemorySlice vtable_base_ptr_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, - r1u64(class_base_vaddr, class_base_vaddr+addr_size), 0); - String8 vtable_base_ptr_memory = vtable_base_ptr_slice.data; - if(vtable_base_ptr_memory.size >= addr_size) - { - 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_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); - if(global_var->link_flags & RDI_LinkFlag_TypeScoped) - { - RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); - RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, 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; - } - } - } - } - } - } - scratch_end(scratch); - ProfEnd(); - return eval; -} - -internal DF_Eval -df_eval_from_eval_cfg_table(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg) -{ - ProfBeginFunction(); - - //- rjf: apply view rules for(DF_CfgVal *val = cfg->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) { DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string); if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_EvalResolution) { - eval = spec->info.eval_resolution(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, val); - goto end_resolve; + eval = spec->info.eval_resolution(arena, eval, val); + break; } } - end_resolve:; - ProfEnd(); return eval; } @@ -4461,13 +4031,12 @@ df_string_from_ascii_value(Arena *arena, U8 val) } internal String8 -df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) +df_string_from_simple_typed_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 radix, E_Eval eval) { - ProfBeginFunction(); String8 result = {0}; - 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, rdi, type_key); + E_TypeKey type_key = e_type_unwrap(eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + U64 type_byte_size = e_type_byte_size_from_key(type_key); U8 digit_group_separator = 0; if(!(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) { @@ -4477,25 +4046,25 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, { default:{}break; - case TG_Kind_Handle: + case E_TypeKind_Handle: { U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - result = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); + result = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); }break; - case TG_Kind_Char8: - case TG_Kind_Char16: - case TG_Kind_Char32: - case TG_Kind_UChar8: - case TG_Kind_UChar16: - case TG_Kind_UChar32: + case E_TypeKind_Char8: + case E_TypeKind_Char16: + case E_TypeKind_Char32: + case E_TypeKind_UChar8: + case E_TypeKind_UChar16: + case E_TypeKind_UChar32: { - String8 char_str = df_string_from_ascii_value(arena, eval.imm_s64); + String8 char_str = df_string_from_ascii_value(arena, eval.value.s64); if(char_str.size != 0) { if(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) { - String8 imm_string = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); + String8 imm_string = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); result = push_str8f(arena, "'%S' (%S)", char_str, imm_string); } else @@ -4505,54 +4074,54 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, } else { - result = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); + result = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); } }break; - case TG_Kind_S8: - case TG_Kind_S16: - case TG_Kind_S32: - case TG_Kind_S64: + case E_TypeKind_S8: + case E_TypeKind_S16: + case E_TypeKind_S32: + case E_TypeKind_S64: { U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - result = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); + result = str8_from_s64(arena, eval.value.s64, radix, 0, digit_group_separator); }break; - case TG_Kind_U8: - case TG_Kind_U16: - case TG_Kind_U32: - case TG_Kind_U64: + case E_TypeKind_U8: + case E_TypeKind_U16: + case E_TypeKind_U32: + case E_TypeKind_U64: { U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - result = str8_from_u64(arena, eval.imm_u64, radix, min_digits, digit_group_separator); + result = str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator); }break; - case TG_Kind_U128: + case E_TypeKind_U128: { Temp scratch = scratch_begin(&arena, 1); U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - String8 upper64 = str8_from_u64(scratch.arena, eval.imm_u128[0], radix, min_digits, digit_group_separator); - String8 lower64 = str8_from_u64(scratch.arena, eval.imm_u128[1], radix, min_digits, digit_group_separator); + String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128[0], radix, min_digits, digit_group_separator); + String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128[1], radix, min_digits, digit_group_separator); result = push_str8f(arena, "%S:%S", upper64, lower64); scratch_end(scratch); }break; - case TG_Kind_F32: {result = push_str8f(arena, "%f", eval.imm_f32);}break; - case TG_Kind_F64: {result = push_str8f(arena, "%f", eval.imm_f64);}break; - case TG_Kind_Bool:{result = push_str8f(arena, "%s", eval.imm_u64 ? "true" : "false");}break; - case TG_Kind_Ptr: {result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; - case TG_Kind_LRef:{result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; - case TG_Kind_RRef:{result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; - case TG_Kind_Function:{result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; + case E_TypeKind_F32: {result = push_str8f(arena, "%f", eval.value.f32);}break; + case E_TypeKind_F64: {result = push_str8f(arena, "%f", eval.value.f64);}break; + case E_TypeKind_Bool:{result = push_str8f(arena, "%s", eval.value.u64 ? "true" : "false");}break; + case E_TypeKind_Ptr: {result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; + case E_TypeKind_LRef:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; + case E_TypeKind_RRef:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; + case E_TypeKind_Function:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; - case TG_Kind_Enum: + case E_TypeKind_Enum: { Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type_key); + E_Type *type = e_type_from_key(scratch.arena, type_key); String8 constant_name = {0}; for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) { - if(eval.imm_u64 == type->enum_vals[val_idx].val) + if(eval.value.u64 == type->enum_vals[val_idx].val) { constant_name = type->enum_vals[val_idx].name; break; @@ -4562,11 +4131,11 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, { if(constant_name.size != 0) { - result = push_str8f(arena, "0x%I64x (%S)", eval.imm_u64, constant_name); + result = push_str8f(arena, "0x%I64x (%S)", eval.value.u64, constant_name); } else { - result = push_str8f(arena, "0x%I64x (%I64u)", eval.imm_u64, eval.imm_u64); + result = push_str8f(arena, "0x%I64x (%I64u)", eval.value.u64, eval.value.u64); } } else if(constant_name.size != 0) @@ -4575,37 +4144,35 @@ df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, } else { - result = push_str8f(arena, "0x%I64x (%I64u)", eval.imm_u64, eval.imm_u64); + result = push_str8f(arena, "0x%I64x (%I64u)", eval.value.u64, eval.value.u64); } scratch_end(scratch); }break; } - - ProfEnd(); return result; } //- rjf: writing values back to child processes internal B32 -df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) +df_commit_eval_value(E_Eval dst_eval, E_Eval src_eval) { B32 result = 0; Temp scratch = scratch_begin(0, 0); //- rjf: unpack arguments - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = thread->parent; - TG_Key dst_type_key = dst_eval.type_key; - TG_Key src_type_key = src_eval.type_key; - TG_Kind dst_type_kind = tg_kind_from_key(dst_type_key); - TG_Kind src_type_kind = tg_kind_from_key(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); + E_TypeKey dst_type_key = dst_eval.type_key; + E_TypeKey src_type_key = src_eval.type_key; + E_TypeKind dst_type_kind = e_type_kind_from_key(dst_type_key); + E_TypeKind src_type_kind = e_type_kind_from_key(src_type_key); + U64 dst_type_byte_size = e_type_byte_size_from_key(dst_type_key); + U64 src_type_byte_size = e_type_byte_size_from_key(src_type_key); //- rjf: get commit data based on destination type String8 commit_data = {0}; - if(src_eval.errors.count == 0) + if(src_eval.msgs.max_kind == E_MsgKind_Null) { result = 1; switch(dst_type_kind) @@ -4617,80 +4184,80 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_ }break; //- rjf: pointers - case TG_Kind_Ptr: - case TG_Kind_LRef: - if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || src_type_kind == TG_Kind_Ptr) + case E_TypeKind_Ptr: + case E_TypeKind_LRef: + if((E_TypeKind_Char8 <= src_type_kind && src_type_kind <= E_TypeKind_Bool) || src_type_kind == E_TypeKind_Ptr) { - 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); + E_Eval value_eval = e_value_eval_from_eval(src_eval); + commit_data = str8((U8 *)&value_eval.value.u64, dst_type_byte_size); commit_data = push_str8_copy(scratch.arena, commit_data); }break; //- rjf: integers - case TG_Kind_Char8: - case TG_Kind_Char16: - case TG_Kind_Char32: - case TG_Kind_S8: - case TG_Kind_S16: - case TG_Kind_S32: - case TG_Kind_S64: - case TG_Kind_UChar8: - case TG_Kind_UChar16: - case TG_Kind_UChar32: - case TG_Kind_U8: - case TG_Kind_U16: - case TG_Kind_U32: - case TG_Kind_U64: - case TG_Kind_Bool: - if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) + case E_TypeKind_Char8: + case E_TypeKind_Char16: + case E_TypeKind_Char32: + case E_TypeKind_S8: + case E_TypeKind_S16: + case E_TypeKind_S32: + case E_TypeKind_S64: + case E_TypeKind_UChar8: + case E_TypeKind_UChar16: + case E_TypeKind_UChar32: + case E_TypeKind_U8: + case E_TypeKind_U16: + case E_TypeKind_U32: + case E_TypeKind_U64: + case E_TypeKind_Bool: + if(E_TypeKind_Char8 <= src_type_kind && src_type_kind <= E_TypeKind_Bool) { - 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); + E_Eval value_eval = e_value_eval_from_eval(src_eval); + commit_data = str8((U8 *)&value_eval.value.u64, dst_type_byte_size); commit_data = push_str8_copy(scratch.arena, commit_data); }break; //- rjf: float32s - case TG_Kind_F32: - if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || - src_type_kind == TG_Kind_F32 || - src_type_kind == TG_Kind_F64) + case E_TypeKind_F32: + if((E_TypeKind_Char8 <= src_type_kind && src_type_kind <= E_TypeKind_Bool) || + src_type_kind == E_TypeKind_F32 || + src_type_kind == E_TypeKind_F64) { F32 value = 0; - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); + E_Eval value_eval = e_value_eval_from_eval(src_eval); switch(src_type_kind) { - case TG_Kind_F32:{value = value_eval.imm_f32;}break; - case TG_Kind_F64:{value = (F32)value_eval.imm_f64;}break; - default:{value = (F32)value_eval.imm_s64;}break; + case E_TypeKind_F32:{value = value_eval.value.f32;}break; + case E_TypeKind_F64:{value = (F32)value_eval.value.f64;}break; + default:{value = (F32)value_eval.value.s64;}break; } commit_data = str8((U8 *)&value, sizeof(F32)); commit_data = push_str8_copy(scratch.arena, commit_data); }break; //- rjf: float64s - case TG_Kind_F64: - if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || - src_type_kind == TG_Kind_F32 || - src_type_kind == TG_Kind_F64) + case E_TypeKind_F64: + if((E_TypeKind_Char8 <= src_type_kind && src_type_kind <= E_TypeKind_Bool) || + src_type_kind == E_TypeKind_F32 || + src_type_kind == E_TypeKind_F64) { F64 value = 0; - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); + E_Eval value_eval = e_value_eval_from_eval(src_eval); switch(src_type_kind) { - case TG_Kind_F32:{value = (F64)value_eval.imm_f32;}break; - case TG_Kind_F64:{value = value_eval.imm_f64;}break; - default:{value = (F64)value_eval.imm_s64;}break; + case E_TypeKind_F32:{value = (F64)value_eval.value.f32;}break; + case E_TypeKind_F64:{value = value_eval.value.f64;}break; + default:{value = (F64)value_eval.value.s64;}break; } commit_data = str8((U8 *)&value, sizeof(F64)); commit_data = push_str8_copy(scratch.arena, commit_data); }break; //- rjf: enums - case TG_Kind_Enum: - if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) + case E_TypeKind_Enum: + if(E_TypeKind_Char8 <= src_type_kind && src_type_kind <= E_TypeKind_Bool) { - 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); + E_Eval value_eval = e_value_eval_from_eval(src_eval); + commit_data = str8((U8 *)&value_eval.value.u64, dst_type_byte_size); commit_data = push_str8_copy(scratch.arena, commit_data); }break; } @@ -4702,21 +4269,21 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_ switch(dst_eval.mode) { default:{}break; - case EVAL_EvalMode_Addr: + case E_Mode_Addr: { - ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.offset, dst_eval.offset+commit_data.size), commit_data.str); + ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.value.u64, dst_eval.value.u64+commit_data.size), commit_data.str); }break; - case EVAL_EvalMode_Reg: + case E_Mode_Reg: { CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); Architecture arch = df_architecture_from_entity(thread); U64 reg_block_size = regs_block_size_from_architecture(arch); if(unwind.frames.count != 0 && - (0 <= dst_eval.offset && dst_eval.offset+commit_data.size < reg_block_size)) + (0 <= dst_eval.value.u64 && dst_eval.value.u64+commit_data.size < reg_block_size)) { void *new_regs = push_array(scratch.arena, U8, reg_block_size); MemoryCopy(new_regs, unwind.frames.v[0].regs, reg_block_size); - MemoryCopy((U8 *)new_regs+dst_eval.offset, commit_data.str, commit_data.size); + MemoryCopy((U8 *)new_regs+dst_eval.value.u64, commit_data.str, commit_data.size); result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, new_regs); } }break; @@ -4729,12 +4296,12 @@ df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_ //- rjf: type helpers -internal TG_MemberArray -df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg) +internal E_MemberArray +df_filtered_data_members_from_members_cfg_table(Arena *arena, E_MemberArray members, DF_CfgTable *cfg) { DF_CfgVal *only = df_cfg_val_from_string(cfg, str8_lit("only")); DF_CfgVal *omit = df_cfg_val_from_string(cfg, str8_lit("omit")); - TG_MemberArray filtered_members = members; + E_MemberArray filtered_members = members; if(only != &df_g_nil_cfg_val || omit != &df_g_nil_cfg_val) { Temp scratch = scratch_begin(&arena, 1); @@ -4742,7 +4309,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray mem struct DF_TypeMemberLooseNode { DF_TypeMemberLooseNode *next; - TG_Member *member; + E_Member *member; }; DF_TypeMemberLooseNode *first_member = 0; DF_TypeMemberLooseNode *last_member = 0; @@ -4795,7 +4362,7 @@ df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray mem // rjf: bake { filtered_members.count = member_count; - filtered_members.v = push_array_no_zero(arena, TG_Member, filtered_members.count); + filtered_members.v = push_array_no_zero(arena, E_Member, filtered_members.count); U64 idx = 0; for(DF_TypeMemberLooseNode *n = first_member; n != 0; n = n->next, idx += 1) { @@ -4809,13 +4376,13 @@ 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 *rdi, 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, E_TypeKey link_member_type_key, U64 link_member_off, E_Eval eval, U64 cap) { DF_EvalLinkBaseChunkList list = {0}; - for(DF_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) + for(E_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) { // rjf: check this ptr's validity - if(base_eval.offset == 0 || (base_eval.offset == last_eval.offset && base_eval.mode == last_eval.mode)) + if(base_eval.value.u64 == 0 || (base_eval.value.u64 == last_eval.value.u64 && base_eval.mode == last_eval.mode)) { break; } @@ -4831,24 +4398,24 @@ df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed SLLQueuePush(list.first, list.last, chunk); } chunk->b[chunk->count].mode = base_eval.mode; - chunk->b[chunk->count].offset = base_eval.offset; + chunk->b[chunk->count].offset = base_eval.value.u64; chunk->count += 1; list.count += 1; } // rjf: grab link member - DF_Eval link_member_eval = + E_Eval link_member_eval = { - link_member_type_key, + .value = {.u64 = base_eval.value.u64 + link_member_off}, base_eval.mode, - base_eval.offset + link_member_off, + .type_key = link_member_type_key, }; - DF_Eval link_member_value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, link_member_eval); + E_Eval link_member_value_eval = e_value_eval_from_eval(link_member_eval); // rjf: advance to next link last_eval = base_eval; - base_eval.mode = EVAL_EvalMode_Addr; - base_eval.offset = link_member_value_eval.imm_u64; + base_eval.mode = E_Mode_Addr; + base_eval.value.u64 = link_member_value_eval.value.u64; } return list; } @@ -4928,7 +4495,7 @@ df_eval_viz_block_end(DF_EvalVizBlockList *list, DF_EvalVizBlock *block) } internal void -df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out) +df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -4937,19 +4504,19 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView //- rjf: determine if this key is expanded // DF_ExpandNode *node = df_expand_node_from_key(&eval_view->expand_tree_table, key); - B32 parent_is_expanded = (node != 0 && node->expanded && !tg_key_match(tg_key_zero(), eval.type_key)); + B32 parent_is_expanded = (node != 0 && node->expanded && !e_type_key_match(e_type_key_zero(), eval.type_key)); ////////////////////////////// //- rjf: apply view rules & resolve eval // - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, cfg_table); + eval = e_dynamically_typed_eval_from_eval(eval); + eval = df_eval_from_eval_cfg_table(arena, eval, cfg_table); ////////////////////////////// //- rjf: unpack eval // - 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); + E_TypeKey eval_type_key = e_type_unwrap(eval.type_key); + E_TypeKind eval_type_kind = e_type_kind_from_key(eval_type_key); String8 eval_string = push_str8_copy(arena, string); ////////////////////////////// @@ -4964,7 +4531,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView block->semantic_idx_range = r1u64(key.child_num-1, key.child_num+0); if(opt_member != 0) { - block->member = tg_member_copy(arena, opt_member); + block->member = e_type_member_copy(arena, opt_member); } df_eval_viz_block_end(list_out, block); } @@ -4972,49 +4539,49 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView ////////////////////////////// //- rjf: (pointers) extract type & info to use for members and/or arrays // - DF_Eval udt_eval = eval; - DF_Eval arr_eval = eval; - DF_Eval ptr_eval = zero_struct; - TG_Kind udt_type_kind = eval_type_kind; - TG_Kind arr_type_kind = eval_type_kind; - 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) + E_Eval udt_eval = eval; + E_Eval arr_eval = eval; + E_Eval ptr_eval = zero_struct; + E_TypeKind udt_type_kind = eval_type_kind; + E_TypeKind arr_type_kind = eval_type_kind; + E_TypeKind ptr_type_kind = E_TypeKind_Null; + if(eval_type_kind == E_TypeKind_Ptr || eval_type_kind == E_TypeKind_LRef || eval_type_kind == E_TypeKind_RRef) { - 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->rdi, ctrl_ctx, eval); + E_TypeKey direct_type_key = e_type_ptee_from_key(eval_type_key); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + E_Eval ptr_val_eval = e_value_eval_from_eval(eval); // rjf: ptrs to udts if(parent_is_expanded && - (direct_type_kind == TG_Kind_Struct || - direct_type_kind == TG_Kind_Union || - direct_type_kind == TG_Kind_Class || - direct_type_kind == TG_Kind_IncompleteStruct || - direct_type_kind == TG_Kind_IncompleteUnion || - direct_type_kind == TG_Kind_IncompleteClass)) + (direct_type_kind == E_TypeKind_Struct || + direct_type_kind == E_TypeKind_Union || + direct_type_kind == E_TypeKind_Class || + direct_type_kind == E_TypeKind_IncompleteStruct || + direct_type_kind == E_TypeKind_IncompleteUnion || + direct_type_kind == E_TypeKind_IncompleteClass)) { udt_eval.type_key = direct_type_key; - udt_eval.mode = EVAL_EvalMode_Addr; - udt_eval.offset = ptr_val_eval.imm_u64; - udt_type_kind = tg_kind_from_key(direct_type_key); + udt_eval.mode = E_Mode_Addr; + udt_eval.value = ptr_val_eval.value; + udt_type_kind = e_type_kind_from_key(direct_type_key); } // rjf: ptrs to arrays - if(direct_type_kind == TG_Kind_Array) + if(direct_type_kind == E_TypeKind_Array) { arr_eval.type_key = direct_type_key; - arr_eval.mode = EVAL_EvalMode_Addr; - arr_eval.offset = ptr_val_eval.imm_u64; - arr_type_kind = tg_kind_from_key(direct_type_key); + arr_eval.mode = E_Mode_Addr; + arr_eval.value = ptr_val_eval.value; + arr_type_kind = e_type_kind_from_key(direct_type_key); } // rjf: ptrs to ptrs - if(direct_type_kind == TG_Kind_Ptr || direct_type_kind == TG_Kind_LRef || direct_type_kind == TG_Kind_RRef) + if(direct_type_kind == E_TypeKind_Ptr || direct_type_kind == E_TypeKind_LRef || direct_type_kind == E_TypeKind_RRef) { ptr_eval.type_key = direct_type_key; - ptr_eval.mode = EVAL_EvalMode_Addr; - ptr_eval.offset = ptr_val_eval.imm_u64; - ptr_type_kind = tg_kind_from_key(direct_type_key); + ptr_eval.mode = E_Mode_Addr; + ptr_eval.value = ptr_val_eval.value; + ptr_type_kind = e_type_kind_from_key(direct_type_key); } } @@ -5061,9 +4628,9 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView //- rjf: get linked list viz view rule info for structs if(expand_rule == DF_EvalVizExpandRule_Default && parent_is_expanded && - (udt_type_kind == TG_Kind_Struct || - udt_type_kind == TG_Kind_Union || - udt_type_kind == TG_Kind_Class)) + (udt_type_kind == E_TypeKind_Struct || + udt_type_kind == E_TypeKind_Union || + udt_type_kind == E_TypeKind_Class)) { DF_CfgVal *list_cfg = df_cfg_val_from_string(cfg_table, str8_lit("list")); if(list_cfg != &df_g_nil_cfg_val) @@ -5082,21 +4649,21 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView expand_view_rule_cfg != &df_g_nil_cfg_val) ProfScope("build viz blocks for lens") { - expand_view_rule_spec->info.viz_block_prod(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, eval, string, cfg_table, parent_key, key, depth+1, expand_view_rule_cfg->last, list_out); + expand_view_rule_spec->info.viz_block_prod(arena, eval_view, eval, string, cfg_table, parent_key, key, depth+1, expand_view_rule_cfg->last, list_out); } ////////////////////////////// //- rjf: (structs, unions, classes) descend to members & make block(s), normally // if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && - (udt_type_kind == TG_Kind_Struct || - udt_type_kind == TG_Kind_Union || - udt_type_kind == TG_Kind_Class)) + (udt_type_kind == E_TypeKind_Struct || + udt_type_kind == E_TypeKind_Union || + udt_type_kind == E_TypeKind_Class)) 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->rdi, udt_eval.type_key); - TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); + E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, udt_eval.type_key); + E_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 DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Members, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); @@ -5130,14 +4697,14 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); } } - TG_Member *member = &filtered_data_members.v[child_idx]; - DF_Eval child_eval = zero_struct; + E_Member *member = &filtered_data_members.v[child_idx]; + E_Eval child_eval = zero_struct; { child_eval.type_key = member->type_key; child_eval.mode = udt_eval.mode; - child_eval.offset = udt_eval.offset + member->off; + child_eval.value.u64 = udt_eval.value.u64 + member->off; } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, child->key, member->name, child_eval, member, &child_cfg, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, child->key, member->name, child_eval, member, &child_cfg, depth+1, list_out); } } df_eval_viz_block_end(list_out, last_vb); @@ -5147,12 +4714,12 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView //- rjf: (enums) descend to members & make block(s) // if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && - udt_eval.mode == EVAL_EvalMode_NULL && - udt_type_kind == TG_Kind_Enum) + udt_eval.mode == E_Mode_Null && + udt_type_kind == E_TypeKind_Enum) 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->rdi, udt_eval.type_key); + E_Type *type = e_type_from_key(scratch.arena, 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); @@ -5169,26 +4736,26 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView //- rjf: (structs, unions, classes) descend to members & make block(s), with linked list view // if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_List && - (udt_type_kind == TG_Kind_Struct || - udt_type_kind == TG_Kind_Union || - udt_type_kind == TG_Kind_Class)) + (udt_type_kind == E_TypeKind_Struct || + udt_type_kind == E_TypeKind_Union || + udt_type_kind == E_TypeKind_Class)) 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->rdi, udt_eval.type_key); + E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, udt_eval.type_key); //- rjf: find link member - TG_Member *link_member = 0; - TG_Kind link_member_type_kind = TG_Kind_Null; - TG_Key link_member_ptee_type_key = zero_struct; + E_Member *link_member = 0; + E_TypeKind link_member_type_kind = E_TypeKind_Null; + E_TypeKey link_member_ptee_type_key = zero_struct; for(U64 idx = 0; idx < data_members.count; idx += 1) { - TG_Member *mem = &data_members.v[idx]; + E_Member *mem = &data_members.v[idx]; if(str8_match(mem->name, list_next_link_member_name, 0)) { 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->rdi, link_member->type_key); + link_member_type_kind = e_type_kind_from_key(link_member->type_key); + link_member_ptee_type_key = e_type_ptee_from_key(link_member->type_key); break; } } @@ -5196,8 +4763,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView //- rjf: check if link member is good B32 link_member_is_good = 1; if(link_member == 0 || - link_member_type_kind != TG_Kind_Ptr || - !tg_key_match(link_member_ptee_type_key, udt_eval.type_key)) + link_member_type_kind != E_TypeKind_Ptr || + !e_type_key_match(link_member_ptee_type_key, udt_eval.type_key)) { link_member_is_good = 0; } @@ -5206,7 +4773,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView 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->rdi, link_member->type_key, link_member->off, ctrl_ctx, udt_eval, 512); + link_bases = df_eval_link_base_chunk_list_from_eval(scratch.arena, link_member->type_key, link_member->off, udt_eval, 512); } //- rjf: build blocks for all links, split by sub-expansions @@ -5249,13 +4816,13 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); } } - DF_Eval child_eval = zero_struct; + E_Eval child_eval = zero_struct; { child_eval.type_key = udt_eval.type_key; child_eval.mode = link_base.mode; - child_eval.offset = link_base.offset; + child_eval.value.u64= link_base.offset; } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); } } df_eval_viz_block_end(list_out, last_vb); @@ -5266,14 +4833,14 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView //- rjf: (arrays) descend to elements & make block(s), normally // if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && - arr_type_kind == TG_Kind_Array) + arr_type_kind == E_TypeKind_Array) 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->rdi, arr_eval.type_key); + E_Type *array_type = e_type_from_key(scratch.arena, 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->rdi, element_type_key); + E_TypeKey element_type_key = array_type->direct_type_key; + U64 element_type_byte_size = e_type_byte_size_from_key(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); @@ -5307,13 +4874,13 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); } } - DF_Eval child_eval = zero_struct; + E_Eval child_eval = zero_struct; { child_eval.type_key = element_type_key; child_eval.mode = arr_eval.mode; - child_eval.offset = arr_eval.offset + child_idx*element_type_byte_size; + child_eval.value.u64= arr_eval.value.u64 + child_idx*element_type_byte_size; } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); } } df_eval_viz_block_end(list_out, last_vb); @@ -5322,11 +4889,11 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView ////////////////////////////// //- rjf: (ptr to ptrs) descend to make blocks for pointed-at-pointer // - if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && (ptr_type_kind == TG_Kind_Ptr || ptr_type_kind == TG_Kind_LRef || ptr_type_kind == TG_Kind_RRef)) + if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && (ptr_type_kind == E_TypeKind_Ptr || ptr_type_kind == E_TypeKind_LRef || ptr_type_kind == E_TypeKind_RRef)) ProfScope("build viz blocks for ptr-to-ptrs") { String8 subexpr = push_str8f(arena, "*(%S)", string); - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, df_expand_key_make(df_hash_from_expand_key(key), 1), subexpr, ptr_eval, 0, cfg_table, depth+1, list_out); + df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, key, df_expand_key_make(df_hash_from_expand_key(key), 1), subexpr, ptr_eval, 0, cfg_table, depth+1, list_out); } scratch_end(scratch); @@ -5334,12 +4901,12 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView } internal DF_EvalVizBlockList -df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key) +df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key) { ProfBeginFunction(); DF_EvalVizBlockList blocks = {0}; { - DF_Eval eval = df_eval_from_string(arena, scope, ctrl_ctx, parse_ctx, macro_map, expr); + E_Eval eval = e_eval_from_string(arena, expr); U64 expr_comma_pos = str8_find_needle(expr, 0, str8_lit(","), 0); U64 passthrough_pos = str8_find_needle(expr, 0, str8_lit("--"), 0); String8List default_view_rules = {0}; @@ -5379,7 +4946,7 @@ df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, D df_cfg_table_push_unparsed_string(arena, &view_rule_table, n->string, DF_CfgSrc_User); } df_cfg_table_push_unparsed_string(arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, parent_key, key, expr, eval, 0, &view_rule_table, 0, &blocks); + df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, parent_key, key, expr, eval, 0, &view_rule_table, 0, &blocks); } ProfEnd(); return blocks; @@ -5505,7 +5072,7 @@ df_parent_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_n //- rjf: viz row list building internal DF_EvalVizRow * -df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, DF_Eval eval) +df_eval_viz_row_list_push_new(Arena *arena, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, E_Eval eval) { // rjf: push DF_EvalVizRow *row = push_array(arena, DF_EvalVizRow, 1); @@ -5520,27 +5087,27 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz row->size_in_rows = 1; // rjf: determine exandability, editability - if(tg_kind_from_key(eval.type_key) != TG_Kind_Null) + if(e_type_kind_from_key(eval.type_key) != E_TypeKind_Null) { - for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, t)) + for(E_TypeKey t = eval.type_key;; t = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t)))) { - TG_Kind kind = tg_kind_from_key(t); - if(kind == TG_Kind_Null) + E_TypeKind kind = e_type_kind_from_key(t); + if(kind == E_TypeKind_Null) { break; } - if(eval.mode != EVAL_EvalMode_NULL && ((TG_Kind_FirstBasic <= kind && kind <= TG_Kind_LastBasic) || kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef)) + if(eval.mode != E_Mode_Null && ((E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) || kind == E_TypeKind_Ptr || kind == E_TypeKind_LRef || kind == E_TypeKind_RRef)) { row->flags |= DF_EvalVizRowFlag_CanEditValue; } - if(eval.mode == EVAL_EvalMode_NULL && kind == TG_Kind_Enum) + if(eval.mode == E_Mode_Null && kind == E_TypeKind_Enum) { row->flags |= DF_EvalVizRowFlag_CanExpand; } - if(kind == TG_Kind_Struct || - kind == TG_Kind_Union || - kind == TG_Kind_Class || - kind == TG_Kind_Array) + if(kind == E_TypeKind_Struct || + kind == E_TypeKind_Union || + kind == E_TypeKind_Class || + kind == E_TypeKind_Array) { row->flags |= DF_EvalVizRowFlag_CanExpand; } @@ -5548,11 +5115,11 @@ df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalViz { break; } - if(eval.mode == EVAL_EvalMode_NULL) + if(eval.mode == E_Mode_Null) { break; } - if(kind == TG_Kind_Function) + if(kind == E_TypeKind_Function) { break; } @@ -5600,6 +5167,13 @@ df_interact_regs(void) return regs; } +internal DF_InteractRegs * +df_base_interact_regs(void) +{ + DF_InteractRegs *regs = &df_state->base_interact_regs.v; + return regs; +} + internal DF_InteractRegs * df_push_interact_regs(void) { @@ -5656,25 +5230,6 @@ df_ctrl_targets_running(void) return df_state->ctrl_is_running; } -//- rjf: control context - -internal DF_CtrlCtx -df_ctrl_ctx(void) -{ - return df_state->ctrl_ctx; -} - -internal void -df_ctrl_ctx_apply_overrides(DF_CtrlCtx *ctx, DF_CtrlCtx *overrides) -{ - if(!df_handle_match(overrides->thread, df_handle_zero())) - { - ctx->thread = overrides->thread; - ctx->unwind_count = overrides->unwind_count; - ctx->inline_depth = overrides->inline_depth; - } -} - //- rjf: config paths internal String8 @@ -6322,11 +5877,11 @@ df_query_cached_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 roo return result; } -internal EVAL_String2NumMap * +internal E_String2NumMap * df_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) { ProfBeginFunction(); - EVAL_String2NumMap *map = &eval_string2num_map_nil; + E_String2NumMap *map = &e_string2num_map_nil; for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->locals_caches); cache_idx += 1) { DF_RunLocalsCache *cache = &df_state->locals_caches[(df_state->locals_cache_gen+cache_idx)%ArrayCount(df_state->locals_caches)]; @@ -6354,7 +5909,7 @@ df_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) if(node == 0) { DI_Scope *scope = di_scope_open(); - EVAL_String2NumMap *map = df_push_locals_map_from_dbgi_key_voff(cache->arena, scope, dbgi_key, voff); + E_String2NumMap *map = df_push_locals_map_from_dbgi_key_voff(cache->arena, scope, dbgi_key, voff); if(map->slots_count != 0) { node = push_array(cache->arena, DF_RunLocalsCacheNode, 1); @@ -6375,11 +5930,11 @@ df_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) return map; } -internal EVAL_String2NumMap * +internal E_String2NumMap * df_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) { ProfBeginFunction(); - EVAL_String2NumMap *map = &eval_string2num_map_nil; + E_String2NumMap *map = &e_string2num_map_nil; for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->member_caches); cache_idx += 1) { DF_RunLocalsCache *cache = &df_state->member_caches[(df_state->member_cache_gen+cache_idx)%ArrayCount(df_state->member_caches)]; @@ -6407,7 +5962,7 @@ df_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) if(node == 0) { DI_Scope *scope = di_scope_open(); - EVAL_String2NumMap *map = df_push_member_map_from_dbgi_key_voff(cache->arena, scope, dbgi_key, voff); + E_String2NumMap *map = df_push_member_map_from_dbgi_key_voff(cache->arena, scope, dbgi_key, voff); if(map->slots_count != 0) { node = push_array(cache->arena, DF_RunLocalsCacheNode, 1); @@ -6671,6 +6226,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) ProfBeginFunction(); df_state->frame_index += 1; arena_clear(df_frame_arena()); + df_state->frame_di_scope = di_scope_open(); df_state->dt = dt; df_state->time_in_seconds += dt; df_state->top_interact_regs = &df_state->base_interact_regs; @@ -6740,7 +6296,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) // rjf: if no stop-causing thread, and if selected thread, snap to selected if(should_snap && df_entity_is_nil(stop_thread)) { - DF_Entity *selected_thread = df_entity_from_handle(df_state->ctrl_ctx.thread); + DF_Entity *selected_thread = df_entity_from_handle(df_interact_regs()->thread); if(!df_entity_is_nil(selected_thread)) { DF_CmdParams params = df_cmd_params_zero(); @@ -6910,10 +6466,10 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) df_entity_equip_color_rgba(entity, thread_color); // rjf: automatically select if we don't have a selected thread - DF_Entity *selected_thread = df_entity_from_handle(df_state->ctrl_ctx.thread); + DF_Entity *selected_thread = df_entity_from_handle(df_state->base_interact_regs.v.thread); if(df_entity_is_nil(selected_thread)) { - df_state->ctrl_ctx.thread = df_handle_from_entity(entity); + df_state->base_interact_regs.v.thread = df_handle_from_entity(entity); } // rjf: do initial snap @@ -7570,24 +7126,30 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) //- rjf: debug control context management operations case DF_CoreCmdKind_SelectThread: { - MemoryZeroStruct(&df_state->ctrl_ctx); - df_state->ctrl_ctx.thread = params.entity; + DF_Entity *thread = df_entity_from_handle(params.entity); + DF_Entity *module = df_module_from_thread(thread); + DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); + df_state->base_interact_regs.v.unwind_count = 0; + df_state->base_interact_regs.v.inline_depth = 0; + df_state->base_interact_regs.v.thread = df_handle_from_entity(thread); + df_state->base_interact_regs.v.module = df_handle_from_entity(module); + df_state->base_interact_regs.v.process = df_handle_from_entity(process); }break; case DF_CoreCmdKind_SelectUnwind: { DI_Scope *di_scope = di_scope_open(); - DF_Entity *thread = df_entity_from_handle(df_state->ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_state->base_interact_regs.v.thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); CTRL_Unwind base_unwind = df_query_cached_unwind_from_thread(thread); DF_Unwind rich_unwind = df_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind); if(params.unwind_index < rich_unwind.frames.concrete_frame_count) { DF_UnwindFrame *frame = &rich_unwind.frames.v[params.unwind_index]; - df_state->ctrl_ctx.unwind_count = params.unwind_index; - df_state->ctrl_ctx.inline_depth = 0; + df_state->base_interact_regs.v.unwind_count = params.unwind_index; + df_state->base_interact_regs.v.inline_depth = 0; if(params.inline_depth <= frame->inline_frame_count) { - df_state->ctrl_ctx.inline_depth = params.inline_depth; + df_state->base_interact_regs.v.inline_depth = params.inline_depth; } } di_scope_close(di_scope); @@ -7595,16 +7157,15 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) case DF_CoreCmdKind_UpOneFrame: case DF_CoreCmdKind_DownOneFrame: { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx(); DI_Scope *di_scope = di_scope_open(); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_state->base_interact_regs.v.thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); CTRL_Unwind base_unwind = df_query_cached_unwind_from_thread(thread); DF_Unwind rich_unwind = df_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind); - U64 crnt_unwind_idx = ctrl_ctx.unwind_count; - U64 crnt_inline_dpt = ctrl_ctx.inline_depth; - U64 next_unwind_idx = ctrl_ctx.unwind_count; - U64 next_inline_dpt = ctrl_ctx.inline_depth; + U64 crnt_unwind_idx = df_state->base_interact_regs.v.unwind_count; + U64 crnt_inline_dpt = df_state->base_interact_regs.v.inline_depth; + U64 next_unwind_idx = crnt_unwind_idx; + U64 next_inline_dpt = crnt_inline_dpt; if(crnt_unwind_idx < rich_unwind.frames.concrete_frame_count) { DF_UnwindFrame *f = &rich_unwind.frames.v[crnt_unwind_idx]; @@ -7643,6 +7204,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) p.unwind_index = next_unwind_idx; p.inline_depth = next_inline_dpt; df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectUnwind)); + di_scope_close(di_scope); }break; case DF_CoreCmdKind_FreezeThread: case DF_CoreCmdKind_ThawThread: @@ -8929,16 +8491,68 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) scratch_end(scratch); } - //- rjf: fill core interaction register info + //- rjf: choose evaluation context { - DF_Entity *thread = df_entity_from_handle(df_state->ctrl_ctx.thread); - DF_Entity *module = df_module_from_thread(thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - df_interact_regs()->thread = df_handle_from_entity(thread); - df_interact_regs()->module = df_handle_from_entity(module); - df_interact_regs()->process = df_handle_from_entity(process); - df_interact_regs()->unwind_count = df_state->ctrl_ctx.unwind_count; - df_interact_regs()->inline_depth = df_state->ctrl_ctx.inline_depth; + DF_Entity *process = df_entity_from_handle(df_interact_regs()->process); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); + U64 unwind_count = df_interact_regs()->unwind_count; + U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); + DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); + DF_EntityList all_modules = df_query_cached_entity_list_with_kind(DF_EntityKind_Module); + U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr); + U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); + E_Ctx *ctx = push_array(arena, E_Ctx, 1); + ctx->arch = df_architecture_from_entity(thread); + ctx->ip_vaddr = rip_vaddr; + ctx->ip_voff = rip_voff; + DI_Key primary_dbgi_key = {0}; + if(all_modules.count == 0) + { + ctx->rdis_count = 1; + ctx->rdis = push_array(arena, RDI_Parsed *, 1); + ctx->rdis[0] = &di_rdi_parsed_nil; + } + else + { + ctx->rdis_count = all_modules.count; + ctx->rdis = push_array(arena, RDI_Parsed *, ctx->rdis_count); + ctx->rdis_vaddr_ranges = push_array(arena, Rng1U64, ctx->rdis_count); + { + U64 primary_idx = 0; + U64 idx = 0; + for(DF_EntityNode *n = all_modules.first; n != 0; n = n->next, idx += 1) + { + DI_Key dbgi_key = df_dbgi_key_from_module(n->entity); + ctx->rdis[idx] = di_rdi_from_key(df_state->frame_di_scope, &dbgi_key, 0); + ctx->rdis_vaddr_ranges[idx] = n->entity->vaddr_rng; + if(n->entity == module) + { + primary_dbgi_key = dbgi_key; + primary_idx = idx; + } + } + if(primary_idx != 0) + { + Swap(RDI_Parsed *, ctx->rdis[0], ctx->rdis[primary_idx]); + Swap(Rng1U64, ctx->rdis_vaddr_ranges[0], ctx->rdis_vaddr_ranges[primary_idx]); + } + } + } + ctx->regs_map = ctrl_string2reg_from_arch(ctx->arch); + ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->arch); + ctx->locals_map = df_query_cached_locals_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); + ctx->member_map = df_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); + ctx->macro_map = &e_string2expr_map_nil; + // TODO(rjf): ctx->macro_map = ...; + ctx->memory_read_user_data = process; + ctx->memory_read = df_eval_memory_read; + ctx->reg_data = ctrl_query_cached_reg_block_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); + ctx->reg_size = regs_block_size_from_architecture(ctx->arch); + ctx->module_base = push_array(arena, U64, 1); + ctx->module_base[0]= module->vaddr_rng.min; + ctx->tls_base = push_array(arena, U64, 1); + ctx->tls_base[0] = df_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, rip_vaddr); + e_select_ctx(ctx); } ProfEnd(); @@ -9049,5 +8663,8 @@ df_core_end_frame(void) } } + //- rjf: end scopes + di_scope_close(df_state->frame_di_scope); + ProfEnd(); } diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index bb7655e2..ab50213f 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -68,17 +68,6 @@ struct DF_ExpandTreeTable DF_ExpandNode *free_node; }; -//////////////////////////////// -//~ rjf: Control Context Types - -typedef struct DF_CtrlCtx DF_CtrlCtx; -struct DF_CtrlCtx -{ - DF_Handle thread; - U64 unwind_count; - U64 inline_depth; -}; - //////////////////////////////// //~ rjf: Entity Kind Flags @@ -177,26 +166,6 @@ struct DF_CtrlFlowInfo U64 total_size; }; -//////////////////////////////// -//~ rjf: Evaluation Types - -typedef struct DF_Eval DF_Eval; -struct DF_Eval -{ - TG_Key type_key; - EVAL_EvalMode mode; - U64 offset; - union - { - S64 imm_s64; - U64 imm_u64; - F32 imm_f32; - F64 imm_f64; - U64 imm_u128[2]; - }; - EVAL_ErrorList errors; -}; - //////////////////////////////// //~ rjf: View Rule Hook Types @@ -205,10 +174,10 @@ typedef struct DF_CfgVal DF_CfgVal; typedef struct DF_CfgTable DF_CfgTable; typedef struct DF_EvalView DF_EvalView; typedef struct DF_EvalVizBlockList DF_EvalVizBlockList; -#define DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_SIG(name) DF_Eval name(Arena *arena, DI_Scope *di_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgVal *val) +#define DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_SIG(name) E_Eval name(Arena *arena, E_Eval eval, DF_CfgVal *val) #define DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(name) df_core_view_rule_eval_resolution__##name #define DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(name) internal DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_SIG(DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(name)) -#define DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_SIG(name) void name(Arena *arena, DI_Scope *di_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, DF_Eval eval, String8 string, DF_CfgTable *cfg_table, DF_ExpandKey parent_key, DF_ExpandKey key, S32 depth, DF_CfgNode *cfg, struct DF_EvalVizBlockList *out) +#define DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_SIG(name) void name(Arena *arena, DF_EvalView *eval_view, E_Eval eval, String8 string, DF_CfgTable *cfg_table, DF_ExpandKey parent_key, DF_ExpandKey key, S32 depth, DF_CfgNode *cfg, struct DF_EvalVizBlockList *out) #define DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(name) df_core_view_rule_viz_block_prod__##name #define DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(name) internal DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_SIG(DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(name)) typedef DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_SIG(DF_CoreViewRuleEvalResolutionHookFunctionType); @@ -682,7 +651,7 @@ struct DF_EvalViewCache typedef struct DF_EvalLinkBase DF_EvalLinkBase; struct DF_EvalLinkBase { - EVAL_EvalMode mode; + E_Mode mode; U64 offset; }; @@ -733,19 +702,19 @@ struct DF_EvalVizBlock S32 depth; // rjf: evaluation info - DF_Eval eval; + E_Eval eval; String8 string; - TG_Member *member; + E_Member *member; // rjf: info about ranges that this block spans Rng1U64 visual_idx_range; Rng1U64 semantic_idx_range; - FZY_Target fzy_target; + RDI_SectionKind fzy_target; FZY_ItemArray fzy_backing_items; // rjf: visualization config extensions DF_CfgTable cfg_table; - TG_Key link_member_type_key; + E_TypeKey link_member_type_key; U64 link_member_off; }; @@ -804,14 +773,14 @@ struct DF_EvalVizRow DF_ExpandKey key; // rjf: evaluation artifacts - DF_Eval eval; + E_Eval eval; // rjf: basic visualization contents String8 display_expr; String8 edit_expr; String8 display_value; String8 edit_value; - TG_KeyList inherited_type_key_chain; + E_TypeKeyList inherited_type_key_chain; // rjf: variable-size & hook info U64 size_in_rows; @@ -1042,7 +1011,7 @@ struct DF_RunLocalsCacheNode DF_RunLocalsCacheNode *hash_next; DI_Key dbgi_key; U64 voff; - EVAL_String2NumMap *locals_map; + E_String2NumMap *locals_map; }; typedef struct DF_RunLocalsCacheSlot DF_RunLocalsCacheSlot; @@ -1154,8 +1123,11 @@ struct DF_State F32 dt; F32 seconds_til_autosave; - // rjf: interaction registers + // rjf: frame info Arena *frame_arenas[2]; + DI_Scope *frame_di_scope; + + // rjf: interaction registers DF_InteractRegsNode base_interact_regs; DF_InteractRegsNode *top_interact_regs; @@ -1218,9 +1190,6 @@ struct DF_State DF_HandleList frozen_threads; DF_HandleNode *free_handle_node; - // rjf: main control context - DF_CtrlCtx ctrl_ctx; - // rjf: control thread user -> ctrl driving state Arena *ctrl_last_run_arena; DF_RunKind ctrl_last_run_kind; @@ -1401,7 +1370,7 @@ internal String8 df_cmd_arg_part_from_string(String8 string); internal DF_CmdParams df_cmd_params_zero(void); internal void df_cmd_params_mark_slot(DF_CmdParams *params, DF_CmdParamSlot slot); internal B32 df_cmd_params_has_slot(DF_CmdParams *params, DF_CmdParamSlot slot); -internal String8 df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams *params, DF_CmdSpec *spec, String8 query); +internal String8 df_cmd_params_apply_spec_query(Arena *arena, DF_CmdParams *params, DF_CmdSpec *spec, String8 query); //- rjf: command lists internal void df_cmd_list_push(Arena *arena, DF_CmdList *cmds, DF_CmdParams *params, DF_CmdSpec *spec); @@ -1581,8 +1550,8 @@ internal DF_Entity *df_module_from_process_vaddr(DF_Entity *process, U64 vaddr); internal DF_Entity *df_module_from_thread(DF_Entity *thread); internal U64 df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr); internal Architecture df_architecture_from_entity(DF_Entity *entity); -internal EVAL_String2NumMap *df_push_locals_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); -internal EVAL_String2NumMap *df_push_member_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); +internal E_String2NumMap *df_push_locals_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); +internal E_String2NumMap *df_push_member_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); internal B32 df_set_thread_rip(DF_Entity *thread, U64 vaddr); internal DF_Entity *df_module_from_thread_candidates(DF_Entity *thread, DF_EntityList *candidates); internal DF_Unwind df_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, DF_Entity *process, CTRL_Unwind *base_unwind); @@ -1600,15 +1569,10 @@ internal void df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_RunFlags f internal CTRL_Event df_ctrl_last_stop_event(void); //////////////////////////////// -//~ rjf: Evaluation +//~ rjf: Evaluation Context -internal B32 df_eval_memory_read(void *u, void *out, U64 addr, U64 size); -internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DI_Scope *scope, DF_Entity *process, U64 vaddr); -internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DI_Scope *scope, DF_Entity *file, TxtPt pt); -internal DF_Eval df_eval_from_string(Arena *arena, DI_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 *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, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg); +internal B32 df_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range); +internal E_Eval df_eval_from_eval_cfg_table(Arena *arena, E_Eval eval, DF_CfgTable *cfg); //////////////////////////////// //~ rjf: Evaluation Views @@ -1631,14 +1595,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 *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); +internal String8 df_string_from_simple_typed_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 radix, E_Eval eval); //- rjf: writing values back to child processes -internal B32 df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); +internal B32 df_commit_eval_value(E_Eval dst_eval, E_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 *rdi, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); +internal E_MemberArray df_filtered_data_members_from_members_cfg_table(Arena *arena, E_MemberArray members, DF_CfgTable *cfg); +internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, E_TypeKey link_member_type_key, U64 link_member_off, E_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); @@ -1646,8 +1610,8 @@ internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *are internal DF_EvalVizBlock *df_eval_viz_block_begin(Arena *arena, DF_EvalVizBlockKind kind, DF_ExpandKey parent_key, DF_ExpandKey key, S32 depth); internal DF_EvalVizBlock *df_eval_viz_block_split_and_continue(Arena *arena, DF_EvalVizBlockList *list, DF_EvalVizBlock *split_block, U64 split_idx); internal void df_eval_viz_block_end(DF_EvalVizBlockList *list, DF_EvalVizBlock *block); -internal void df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *view, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out); -internal DF_EvalVizBlockList df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key); +internal void df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *view, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out); +internal DF_EvalVizBlockList df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key); internal void df_eval_viz_block_list_concat__in_place(DF_EvalVizBlockList *dst, DF_EvalVizBlockList *to_push); //- rjf: viz block list <-> table coordinates @@ -1656,7 +1620,7 @@ internal DF_ExpandKey df_key_from_viz_block_list_row_num(DF_EvalVizBlockList *bl internal DF_ExpandKey df_parent_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_num); //- rjf: viz row list building -internal DF_EvalVizRow *df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, DF_Eval eval); +internal DF_EvalVizRow *df_eval_viz_row_list_push_new(Arena *arena, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, E_Eval eval); //////////////////////////////// //~ rjf: Main State Accessors/Mutators @@ -1669,6 +1633,7 @@ internal F64 df_time_in_seconds(void); //- rjf: interaction registers internal DF_InteractRegs *df_interact_regs(void); +internal DF_InteractRegs *df_base_interact_regs(void); internal DF_InteractRegs *df_push_interact_regs(void); internal DF_InteractRegs *df_pop_interact_regs(void); @@ -1681,10 +1646,6 @@ internal U64 df_ctrl_last_run_frame_idx(void); internal U64 df_ctrl_run_gen(void); internal B32 df_ctrl_targets_running(void); -//- rjf: control context -internal DF_CtrlCtx df_ctrl_ctx(void); -internal void df_ctrl_ctx_apply_overrides(DF_CtrlCtx *ctx, DF_CtrlCtx *overrides); - //- rjf: config paths internal String8 df_cfg_path_from_src(DF_CfgSrc src); @@ -1716,8 +1677,8 @@ internal CTRL_Unwind df_query_cached_unwind_from_thread(DF_Entity *thread); internal U64 df_query_cached_rip_from_thread(DF_Entity *thread); internal U64 df_query_cached_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count); internal U64 df_query_cached_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr); -internal EVAL_String2NumMap *df_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); -internal EVAL_String2NumMap *df_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); +internal E_String2NumMap *df_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); +internal E_String2NumMap *df_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); //- rjf: top-level command dispatch internal void df_push_cmd__root(DF_CmdParams *params, DF_CmdSpec *spec); diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index f36f70d4..bcdca60f 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -144,8 +144,6 @@ DF_CoreCmdTable:// | | | //- rjf: debug control context management operations {SelectThread 0 Entity Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" } - {SelectThreadWindow 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_window" "Select Thread On Window" "Selects a thread for the active window, overriding the global selected thread." "" } - {SelectThreadView 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_view" "Select Thread On View" "Selects a thread for the active view, overriding the global and per-window selected threads." "" } {SelectUnwind 1 Null Nil 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" } {UpOneFrame 0 Null Nil 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" } {DownOneFrame 0 Null Nil 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" } diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 13135a5e..a5b98cce 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -209,7 +209,7 @@ DF_CoreCmdKind_Null, DF_CoreCmdKind_Null, }; -DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[221] = +DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[219] = { { str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_X}, @@ -239,8 +239,6 @@ DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[221] = { str8_lit_comp("run_to_cursor"), str8_lit_comp("Runs the selected thread to the current cursor."), str8_lit_comp(""), str8_lit_comp("Run To Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play}, { str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow}, { str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("select_thread_window"), str8_lit_comp("Selects a thread for the active window, overriding the global selected thread."), str8_lit_comp(""), str8_lit_comp("Select Thread On Window"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("select_thread_view"), str8_lit_comp("Selects a thread for the active view, overriding the global and per-window selected threads."), str8_lit_comp(""), str8_lit_comp("Select Thread On View"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, { str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp("Select Unwind"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, { str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp("Up One Frame"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_UpArrow}, { str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Down One Frame"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_DownArrow}, diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index fe612058..bee1368a 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -75,8 +75,6 @@ DF_CoreCmdKind_StepOver, DF_CoreCmdKind_RunToCursor, DF_CoreCmdKind_SetNextStatement, DF_CoreCmdKind_SelectThread, -DF_CoreCmdKind_SelectThreadWindow, -DF_CoreCmdKind_SelectThreadView, DF_CoreCmdKind_SelectUnwind, DF_CoreCmdKind_UpOneFrame, DF_CoreCmdKind_DownOneFrame, diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 20dd855d..4ba2ecea 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -363,7 +363,7 @@ df_selected_tab_from_panel(DF_Panel *panel) //- rjf: icons & display strings internal String8 -df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view) +df_display_string_from_view(Arena *arena, DF_View *view) { String8 result = {0}; switch(view->spec->info.name_kind) @@ -430,25 +430,6 @@ df_window_from_handle(DF_Handle handle) return window; } -//////////////////////////////// -//~ rjf: Control Context - -internal DF_CtrlCtx -df_ctrl_ctx_from_window(DF_Window *ws) -{ - DF_CtrlCtx ctx = df_ctrl_ctx(); - df_ctrl_ctx_apply_overrides(&ctx, &ws->ctrl_ctx_overrides); - return ctx; -} - -internal DF_CtrlCtx -df_ctrl_ctx_from_view(DF_Window *ws, DF_View *view) -{ - DF_CtrlCtx ctx = df_ctrl_ctx_from_window(ws); - df_ctrl_ctx_apply_overrides(&ctx, &view->ctrl_ctx_overrides); - return ctx; -} - //////////////////////////////// //~ rjf: Command Parameters From Context @@ -516,7 +497,6 @@ internal DF_CmdParams df_cmd_params_from_window(DF_Window *window) { DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_selected_tab_from_panel(window->focused_panel)); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); @@ -527,10 +507,10 @@ df_cmd_params_from_window(DF_Window *window) p.window = df_handle_from_window(window); p.panel = df_handle_from_panel(window->focused_panel); p.view = df_handle_from_view(df_selected_tab_from_panel(window->focused_panel)); - p.prefer_dasm = df_prefer_dasm_from_window(window); - p.entity = ctrl_ctx.thread; - p.unwind_index = ctrl_ctx.unwind_count; - p.inline_depth = ctrl_ctx.inline_depth; + p.prefer_dasm = df_prefer_dasm_from_window(window); + p.entity = df_interact_regs()->thread; + p.unwind_index = df_interact_regs()->unwind_count; + p.inline_depth = df_interact_regs()->inline_depth; return p; } @@ -538,7 +518,6 @@ internal DF_CmdParams df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel) { DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_selected_tab_from_panel(panel)); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); @@ -550,9 +529,9 @@ df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel) p.panel = df_handle_from_panel(panel); p.view = df_handle_from_view(df_selected_tab_from_panel(panel)); p.prefer_dasm = df_prefer_dasm_from_window(window); - p.entity = ctrl_ctx.thread; - p.unwind_index = ctrl_ctx.unwind_count; - p.inline_depth = ctrl_ctx.inline_depth; + p.entity = df_interact_regs()->thread; + p.unwind_index = df_interact_regs()->unwind_count; + p.inline_depth = df_interact_regs()->inline_depth; return p; } @@ -560,7 +539,6 @@ internal DF_CmdParams df_cmd_params_from_view(DF_Window *window, DF_Panel *panel, DF_View *view) { DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, view); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); @@ -572,9 +550,9 @@ df_cmd_params_from_view(DF_Window *window, DF_Panel *panel, DF_View *view) p.panel = df_handle_from_panel(panel); p.view = df_handle_from_view(view); p.prefer_dasm = df_prefer_dasm_from_window(window); - p.entity = ctrl_ctx.thread; - p.unwind_index = ctrl_ctx.unwind_count; - p.inline_depth = ctrl_ctx.inline_depth; + p.entity = df_interact_regs()->thread; + p.unwind_index = df_interact_regs()->unwind_count; + p.inline_depth = df_interact_regs()->inline_depth; return p; } @@ -1271,25 +1249,6 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //- rjf: debug control context management operations case DF_CoreCmdKind_SelectThread:goto thread_locator; - case DF_CoreCmdKind_SelectThreadWindow: - { - MemoryZeroStruct(&ws->ctrl_ctx_overrides); - ws->ctrl_ctx_overrides.thread = params.entity; - }goto thread_locator; - case DF_CoreCmdKind_SelectThreadView: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(params.view); - if(df_view_is_nil(view) && !df_panel_is_nil(panel)) - { - view = df_selected_tab_from_panel(panel); - } - if(!df_view_is_nil(view)) - { - MemoryZeroStruct(&view->ctrl_ctx_overrides); - view->ctrl_ctx_overrides.thread = params.entity; - } - }goto thread_locator; case DF_CoreCmdKind_SelectUnwind: thread_locator:; { @@ -2668,13 +2627,12 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) di_scope_close(scope); }break; case DF_CoreCmdKind_FindSelectedThread: - { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(ws); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); + { + DF_Entity *selected_thread = df_entity_from_handle(df_base_interact_regs()->thread); DF_CmdParams params = df_cmd_params_from_window(ws); params.entity = df_handle_from_entity(selected_thread); - params.unwind_index = ctrl_ctx.unwind_count; - params.inline_depth = ctrl_ctx.inline_depth; + params.unwind_index = df_base_interact_regs()->unwind_count; + params.inline_depth = df_base_interact_regs()->inline_depth; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_UnwindIndex); df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_InlineDepth); @@ -3657,8 +3615,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { UI_Row { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 display_name = df_display_string_from_view(scratch.arena, ctrl_ctx, view); + String8 display_name = df_display_string_from_view(scratch.arena, view); DF_IconKind icon_kind = df_icon_kind_from_view(view); DF_Font(ws, DF_FontSlot_Icons) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) @@ -3840,7 +3797,6 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { TXT_Scope *txt_scope = txt_scope_open(); HS_Scope *hs_scope = hs_scope_open(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(ws); TxtRng range = ws->code_ctx_menu_range; DF_LineList lines = ws->code_ctx_menu_lines; if(!txt_pt_match(range.min, range.max) && ui_clicked(df_cmd_spec_button(ws, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Copy)))) @@ -3854,7 +3810,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } if(range.min.line == range.max.line && ui_clicked(df_icon_buttonf(ws, DF_IconKind_RightArrow, 0, "Set Next Statement"))) { - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); U64 new_rip_vaddr = ws->code_ctx_menu_vaddr; if(!df_entity_is_nil(df_entity_from_handle(ws->code_ctx_menu_file))) { @@ -3964,7 +3920,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } if(!df_entity_is_nil(df_entity_from_handle(ws->code_ctx_menu_file)) && range.min.line == range.max.line && ui_clicked(df_icon_buttonf(ws, DF_IconKind_FileOutline, 0, "Go To Disassembly"))) { - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); U64 vaddr = 0; for(DF_LineNode *n = lines.first; n != 0; n = n->next) { @@ -4237,8 +4193,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // rjf: go-to-vaddr-location if(entity->flags & DF_EntityFlag_HasVAddr) { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx(); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); if(entity->vaddr != 0 && !df_entity_is_nil(thread) && ui_clicked(df_icon_buttonf(ws, DF_IconKind_FileOutline, 0, "Go To Location"))) { DF_CmdParams params = df_cmd_params_from_window(ws); @@ -4298,8 +4253,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { if(entity->kind == DF_EntityKind_Thread) { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx(); - B32 is_selected = df_handle_match(ctrl_ctx.thread, df_handle_from_entity(entity)); + B32 is_selected = df_handle_match(df_base_interact_regs()->thread, df_handle_from_entity(entity)); if(is_selected) { df_icon_buttonf(ws, DF_IconKind_Thread, 0, "[Selected]###select_entity"); @@ -4542,8 +4496,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_View *view = df_view_from_handle(ws->tab_ctx_menu_view); DF_IconKind view_icon = df_icon_kind_from_view(view); DF_Entity *entity = df_entity_from_handle(view->entity); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 display_name = df_display_string_from_view(scratch.arena, ctrl_ctx, view); + String8 display_name = df_display_string_from_view(scratch.arena, view); // rjf: title UI_Row @@ -4705,9 +4658,8 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) Temp scratch = scratch_begin(&arena, 1); //- rjf: unpack lister params - DF_CtrlCtx ctrl_ctx = ws->autocomp_ctrl_ctx; - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); + DF_Entity *thread = df_entity_from_handle(df_base_interact_regs()->thread); + U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, df_base_interact_regs()->unwind_count); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); U64 thread_rip_voff = df_voff_from_vaddr(module, thread_rip_vaddr); @@ -4719,8 +4671,8 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //- rjf: gather locals if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Locals) { - EVAL_String2NumMap *locals_map = df_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); - for(EVAL_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) + E_String2NumMap *locals_map = df_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); + for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) { DF_AutoCompListerItem item = {0}; { @@ -6158,8 +6110,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) Temp scratch = scratch_begin(&arena, 1); DF_View *view = ws->query_view_stack_top; DF_CmdParams params = df_cmd_params_from_window(ws); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 error = df_cmd_params_apply_spec_query(scratch.arena, &ctrl_ctx, ¶ms, ws->query_cmd_spec, str8(view->query_buffer, view->query_string_size)); + String8 error = df_cmd_params_apply_spec_query(scratch.arena, ¶ms, ws->query_cmd_spec, str8(view->query_buffer, view->query_string_size)); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); if(error.size != 0) { @@ -6243,17 +6194,14 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { Temp scratch = scratch_begin(&arena, 1); DI_Scope *scope = di_scope_open(); - DF_CtrlCtx ctrl_ctx = ws->hover_eval_ctrl_ctx; - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_base_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_unwind_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_unwind_rip_vaddr); - EVAL_String2ExprMap *macro_map = &eval_string2expr_map_nil; + U64 thread_unwind_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, df_base_interact_regs()->unwind_count); String8 expr = ws->hover_eval_string; - DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); + E_Eval eval = e_eval_from_string(scratch.arena, expr); //- rjf: build if good - if(!tg_key_match(eval.type_key, tg_key_zero()) && !ui_any_ctx_menu_is_open()) + if(!e_type_key_match(eval.type_key, e_type_key_zero()) && !ui_any_ctx_menu_is_open()) UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && ws->hover_eval_focused && (!query_is_open || !ws->query_view_selected)) ? UI_FocusKind_Null : UI_FocusKind_Off) { //- rjf: eval -> viz artifacts @@ -6264,9 +6212,9 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); DF_ExpandKey parent_key = df_expand_key_make(5381, 1); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1); - DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, expr, parent_key, key); - U32 default_radix = (eval.mode == EVAL_EvalMode_Reg ? 16 : 10); - DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); + DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, scope, eval_view, expr, parent_key, key); + U32 default_radix = (eval.mode == E_Mode_Reg ? 16 : 10); + DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); //- rjf: animate { @@ -6353,11 +6301,11 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) switch(row->eval.mode) { default:{}break; - case EVAL_EvalMode_Addr: + case E_Mode_Addr: { - U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key); + U64 size = e_type_byte_size_from_key(row->eval.type_key); size = Min(size, 64); - Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); + Rng1U64 vaddr_rng = r1u64(row->eval.value.u64, row->eval.value.u64+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) { @@ -6413,8 +6361,8 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) if(ui_committed(sig)) { 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.rdi, &ctrl_ctx, row->eval, write_eval); + E_Eval write_eval = e_eval_from_string(scratch.arena, commit_string); + B32 success = df_commit_eval_value(row->eval, write_eval); if(success == 0) { DF_CmdParams params = df_cmd_params_from_window(ws); @@ -7438,8 +7386,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) // rjf: gather info for this tab B32 view_is_selected = (view == df_selected_tab_from_panel(panel)); DF_IconKind icon_kind = df_icon_kind_from_view(view); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 label = df_display_string_from_view(scratch.arena, ctrl_ctx, view); + String8 label = df_display_string_from_view(scratch.arena, view); // rjf: begin vertical region for this tab ui_set_next_child_layout_axis(Axis2_Y); @@ -8477,24 +8424,24 @@ 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 *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) +df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table) { ProfBeginFunction(); String8List list = {0}; F32 space_taken = 0; //- rjf: type path -> empty - if(eval.mode == EVAL_EvalMode_NULL && !tg_key_match(tg_key_zero(), eval.type_key)) + if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key)) { if(opt_member != 0) { - U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, opt_member->type_key); + U64 member_byte_size = e_type_byte_size_from_key(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, rdi, eval.type_key); + String8 basic_type_kind_string = e_kind_basic_string_table[e_type_kind_from_key(eval.type_key)]; + U64 byte_size = e_type_byte_size_from_key(eval.type_key); str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size == 1 ? "s" : ""); } } @@ -8502,7 +8449,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, rdi, eval.type_key)); + E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(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")); @@ -8518,17 +8465,17 @@ 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, rdi, ctrl_ctx, eval); - String8 string = df_string_from_simple_typed_eval(arena, graph, rdi, flags, radix, value_eval); + E_Eval value_eval = e_value_eval_from_eval(eval); + String8 string = df_string_from_simple_typed_eval(arena, flags, radix, value_eval); space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, string).x; str8_list_push(arena, &list, string); }break; //- rjf: pointers - case TG_Kind_Function: - case TG_Kind_Ptr: - case TG_Kind_LRef: - case TG_Kind_RRef: + case E_TypeKind_Function: + case E_TypeKind_Ptr: + case E_TypeKind_LRef: + case E_TypeKind_RRef: { // rjf: determine ptr value omission DF_CfgVal *noaddr_cfg = df_cfg_val_from_string(cfg_table, str8_lit("no_addr")); @@ -8539,27 +8486,27 @@ 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, rdi, ctrl_ctx, eval); + E_Eval value_eval = e_value_eval_from_eval(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, 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 && - ((TG_Kind_Char8 <= direct_type_kind && direct_type_kind <= TG_Kind_UChar32) || - direct_type_kind == TG_Kind_Char8 || - direct_type_kind == TG_Kind_UChar8)); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + E_TypeKind type_kind = e_type_kind_from_key(eval.type_key); + E_TypeKey direct_type_key = e_type_ptee_from_key(eval.type_key); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + B32 direct_type_has_content = (direct_type_kind != E_TypeKind_Null && direct_type_kind != E_TypeKind_Void && value_eval.value.u64 != 0); + B32 direct_type_is_string = (direct_type_kind != E_TypeKind_Null && value_eval.value.u64 != 0 && + ((E_TypeKind_Char8 <= direct_type_kind && direct_type_kind <= E_TypeKind_UChar32) || + direct_type_kind == E_TypeKind_Char8 || + direct_type_kind == E_TypeKind_UChar8)); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - String8 symbol_name = df_symbol_name_from_process_vaddr(arena, process, value_eval.imm_u64); + String8 symbol_name = df_symbol_name_from_process_vaddr(arena, process, value_eval.value.u64); // rjf: display ptr value B32 did_ptr_value = 0; 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, rdi, flags, radix, value_eval); + String8 string = df_string_from_simple_typed_eval(arena, flags, radix, value_eval); space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, string).x; str8_list_push(arena, &list, string); } @@ -8573,10 +8520,10 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags } // rjf: special-case: strings - if(!has_array && direct_type_is_string && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && eval.mode == EVAL_EvalMode_Addr) + if(!has_array && direct_type_is_string && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && eval.mode == E_Mode_Addr) { - U64 string_memory_addr = value_eval.imm_u64; - U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type_key); + U64 string_memory_addr = value_eval.value.u64; + U64 element_size = e_type_byte_size_from_key(direct_type_key); CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, element_size, 0); String8 raw_text = {0}; switch(element_size) @@ -8595,9 +8542,9 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags // rjf: special-case: symbols else if((flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && symbol_name.size != 0 && - (type_kind == TG_Kind_Function || - direct_type_kind == TG_Kind_Function || - direct_type_kind == TG_Kind_Void)) + (type_kind == E_TypeKind_Function || + direct_type_kind == E_TypeKind_Function || + direct_type_kind == E_TypeKind_Void)) { str8_list_push(arena, &list, symbol_name); space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, symbol_name).x; @@ -8608,11 +8555,11 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { if(depth < 3) { - DF_Eval pted_eval = zero_struct; + E_Eval pted_eval = zero_struct; 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, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); + pted_eval.mode = E_Mode_Addr; + pted_eval.value = value_eval.value; + String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, 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("???"); @@ -8635,12 +8582,12 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags }break; //- rjf: arrays - case TG_Kind_Array: + case E_TypeKind_Array: { Temp scratch = scratch_begin(&arena, 1); - 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); + E_Type *eval_type = e_type_from_key(scratch.arena, eval.type_key); + E_TypeKey direct_type_key = eval_type->direct_type_key; + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); U64 array_count = eval_type->count; // rjf: determine presence of array view rule -> omit c-string fastpath @@ -8648,20 +8595,20 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags B32 has_array = (array_cfg != &df_g_nil_cfg_val); // rjf: get pointed-at type - B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && - ((TG_Kind_Char8 <= direct_type_kind && direct_type_kind <= TG_Kind_UChar32) || - direct_type_kind == TG_Kind_S8 || - direct_type_kind == TG_Kind_U8)); + B32 direct_type_is_string = (direct_type_kind != E_TypeKind_Null && + ((E_TypeKind_Char8 <= direct_type_kind && direct_type_kind <= E_TypeKind_UChar32) || + direct_type_kind == E_TypeKind_S8 || + direct_type_kind == E_TypeKind_U8)); B32 special_case = 0; // rjf: special-case: strings - if(!has_array && direct_type_is_string && eval.mode == EVAL_EvalMode_Addr) + if(!has_array && direct_type_is_string && eval.mode == E_Mode_Addr) { special_case = 1; - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval_type->direct_type_key); - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, element_size, 0); + U64 element_size = e_type_byte_size_from_key(eval_type->direct_type_key); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.value.u64, 256, element_size, 0); String8 raw_text = {0}; switch(element_size) { @@ -8690,15 +8637,15 @@ 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, rdi, direct_type_key); + U64 direct_type_byte_size = e_type_byte_size_from_key(direct_type_key); for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) { - DF_Eval element_eval = zero_struct; + E_Eval element_eval = zero_struct; element_eval.type_key = direct_type_key; - 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, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); + element_eval.mode = eval.mode; + element_eval.value = eval.value; + element_eval.value.u64 += direct_type_byte_size*idx; + String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, 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, 0, 0, element_strs).x; str8_list_concat_in_place(&list, &element_strs); if(idx+1 < array_count) @@ -8728,12 +8675,12 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags }break; //- rjf: structs - case TG_Kind_Struct: - case TG_Kind_Union: - case TG_Kind_Class: - case TG_Kind_IncompleteStruct: - case TG_Kind_IncompleteUnion: - case TG_Kind_IncompleteClass: + case E_TypeKind_Struct: + case E_TypeKind_Union: + case E_TypeKind_Class: + case E_TypeKind_IncompleteStruct: + case E_TypeKind_IncompleteUnion: + case E_TypeKind_IncompleteClass: { // rjf: open brace { @@ -8746,17 +8693,17 @@ 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, rdi, eval.type_key); - TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); + E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, eval.type_key); + E_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) { - TG_Member *mem = &filtered_data_members.v[member_idx]; - DF_Eval member_eval = zero_struct; - member_eval.type_key = mem->type_key; - 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, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); + E_Member *mem = &filtered_data_members.v[member_idx]; + E_Eval member_eval = zero_struct; + member_eval.type_key = mem->type_key; + member_eval.mode = eval.mode; + member_eval.value = eval.value; + member_eval.value.u64 += mem->off; + String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, 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, 0, 0, member_strs).x; str8_list_concat_in_place(&list, &member_strs); if(member_idx+1 < filtered_data_members.count) @@ -8790,7 +8737,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags } internal DF_EvalVizWindowedRowList -df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_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) +df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -8812,7 +8759,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, U64 block_num_semantic_rows = dim_1u64(block->semantic_idx_range); Rng1S64 block_visual_range = r1s64(visual_idx_off, visual_idx_off + block_num_visual_rows); Rng1S64 block_semantic_range = r1s64(semantic_idx_off, semantic_idx_off + block_num_semantic_rows); - TG_Kind block_type_kind = tg_kind_from_key(block->eval.type_key); + E_TypeKind block_type_kind = e_type_kind_from_key(block->eval.type_key); ////////////////////////////// //- rjf: determine if view rules force expandability @@ -8911,8 +8858,8 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, case DF_EvalVizBlockKind_Null: if(visible_idx_range.max > visible_idx_range.min) { - DF_Eval eval = zero_struct; - df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, block->key, eval); + E_Eval eval = zero_struct; + df_eval_viz_row_list_push_new(arena, &list, block, block->key, eval); }break; ////////////////////////////// @@ -8921,9 +8868,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, 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->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); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 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, 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, &list, block, block->key, block->eval); row->display_expr = block->string; row->edit_expr = block->string; row->display_value = str8_list_join(arena, &display_strings, 0); @@ -8932,7 +8879,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, row->value_ui_rule_spec = value_ui_rule_spec; row->expand_ui_rule_node = expand_ui_rule_node; row->expand_ui_rule_spec = expand_ui_rule_spec; - if(block->member && block->member->kind == TG_MemberKind_Padding) + if(block->member && block->member->kind == E_MemberKind_Padding) { row->flags |= DF_EvalVizRowFlag_ExprIsSpecial; } @@ -8946,24 +8893,24 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, //- rjf: members -> produce rows for the visible range of members. // case DF_EvalVizBlockKind_Members: - if(block_type_kind != TG_Kind_Null) + if(block_type_kind != E_TypeKind_Null) { - 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); + E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, block->eval.type_key); + E_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) { - TG_Member *member = &filtered_data_members.v[idx]; + E_Member *member = &filtered_data_members.v[idx]; // rjf: get keys for this row DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); // rjf: get member eval - DF_Eval member_eval = zero_struct; + E_Eval member_eval = zero_struct; { member_eval.type_key = member->type_key; - member_eval.mode = block->eval.mode; - member_eval.offset = block->eval.offset + member->off; - MemoryCopyArray(member_eval.imm_u128, block->eval.imm_u128); + member_eval.mode = block->eval.mode; + member_eval.value = block->eval.value; + member_eval.value.u64 += member->off; } // rjf: get view rules @@ -8973,15 +8920,15 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: apply view rules to eval { - member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, member_eval); - member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, member_eval, &view_rule_table); + member_eval = e_dynamically_typed_eval_from_eval(member_eval); + member_eval = df_eval_from_eval_cfg_table(arena, 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->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) + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 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, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, member_eval); + if(member->kind == E_MemberKind_Padding) { row->flags |= DF_EvalVizRowFlag_ExprIsSpecial; } @@ -8993,7 +8940,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, row->value_ui_rule_spec = value_ui_rule_spec; row->expand_ui_rule_node = expand_ui_rule_node; row->expand_ui_rule_spec = expand_ui_rule_spec; - row->inherited_type_key_chain = tg_key_list_copy(arena, &member->inheritance_key_chain); + row->inherited_type_key_chain = e_type_key_list_copy(arena, &member->inheritance_key_chain); if(expandability_required) { row->flags |= DF_EvalVizRowFlag_CanExpand; @@ -9005,20 +8952,20 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, //- rjf: enum members -> produce rows for the visible range of enum members. // case DF_EvalVizBlockKind_EnumMembers: - if(block_type_kind == TG_Kind_Enum) + if(block_type_kind == E_TypeKind_Enum) { - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); + E_Type *type = e_type_from_key(scratch.arena, 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]; + E_EnumVal *enum_val = &type->enum_vals[idx]; DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); // rjf: produce eval for this enum member - DF_Eval eval = zero_struct; + E_Eval eval = zero_struct; { - eval.type_key = block->eval.type_key; - eval.mode = EVAL_EvalMode_Value; - eval.imm_u64 = enum_val->val; + eval.type_key = block->eval.type_key; + eval.mode = E_Mode_Value; + eval.value.u64 = enum_val->val; } // rjf: get view rules @@ -9028,14 +8975,14 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: apply view rules to eval { - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); + eval = e_dynamically_typed_eval_from_eval(eval); + eval = df_eval_from_eval_cfg_table(arena, 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->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); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 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, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, eval); row->display_expr = push_str8_copy(arena, enum_val->name); row->edit_expr = row->display_expr; row->display_value = str8_list_join(arena, &display_strings, 0); @@ -9052,21 +8999,21 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // case DF_EvalVizBlockKind_Elements: { - 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->rdi, direct_type_key); + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(block->eval.type_key))); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + U64 direct_type_key_byte_size = e_type_byte_size_from_key(direct_type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { // rjf: get keys for this row DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); // rjf: get eval for this element - DF_Eval elem_eval = zero_struct; + E_Eval elem_eval = zero_struct; { elem_eval.type_key = direct_type_key; - elem_eval.mode = block->eval.mode; - elem_eval.offset = block->eval.offset + idx*direct_type_key_byte_size; - MemoryCopyArray(elem_eval.imm_u128, block->eval.imm_u128); + elem_eval.mode = block->eval.mode; + elem_eval.value = block->eval.value; + elem_eval.value.u64 += idx*direct_type_key_byte_size; } // rjf: get view rules @@ -9076,14 +9023,14 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: apply view rules to eval { - elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, elem_eval); - elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, elem_eval, &view_rule_table); + elem_eval = e_dynamically_typed_eval_from_eval(elem_eval); + elem_eval = df_eval_from_eval_cfg_table(arena, 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->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); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 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, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, elem_eval); row->display_expr = push_str8f(arena, "[%I64u]", idx); row->edit_expr = push_str8f(arena, "%S[%I64u]", block->string, idx); row->display_value = str8_list_join(arena, &display_strings, 0); @@ -9104,9 +9051,9 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // 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->rdi, 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, block->link_member_type_key, block->link_member_off, block->eval, 512); DF_EvalLinkBaseArray link_bases = df_eval_link_base_array_from_chunk_list(scratch.arena, &link_base_chunks); - String8 node_type_string = tg_string_from_key(arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); + String8 node_type_string = e_type_string_from_key(arena, block->eval.type_key); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { // rjf: get key for this row @@ -9116,11 +9063,11 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_EvalLinkBase *link_base = &link_bases.v[idx]; // rjf: get eval for this link - DF_Eval link_eval = zero_struct; + E_Eval link_eval = zero_struct; { link_eval.type_key = block->eval.type_key; - link_eval.mode = link_base->mode; - link_eval.offset = link_base->offset; + link_eval.mode = link_base->mode; + link_eval.value.u64= link_base->offset; } // rjf: get view rules @@ -9129,16 +9076,16 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, 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->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); + link_eval = e_dynamically_typed_eval_from_eval(link_eval); + link_eval = df_eval_from_eval_cfg_table(arena, link_eval, &view_rule_table); + E_TypeKind link_type_kind = e_type_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->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); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 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, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, link_eval); row->display_expr = push_str8f(arena, "[%I64u]", idx); - row->edit_expr = push_str8f(arena, "(%S *)0xI64x", node_type_string, link_eval.offset); + row->edit_expr = push_str8f(arena, "(%S *)0xI64x", node_type_string, link_eval.value.u64); row->display_value = str8_list_join(arena, &display_strings, 0); row->edit_value = str8_list_join(arena, &edit_strings, 0); row->value_ui_rule_node = value_ui_rule_node; @@ -9159,7 +9106,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, if(num_skipped_visual < block_num_visual_rows) { DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), 1); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, block->eval); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, block->eval); row->flags = DF_EvalVizRowFlag_Canvas; row->edit_expr = block->string; row->size_in_rows = dim_1u64(intersect_1u64(visible_idx_range, r1u64(0, dim_1u64(block->visual_idx_range)))); @@ -9174,9 +9121,28 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // case DF_EvalVizBlockKind_DebugInfoTable: for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) - { - // rjf: unpack info about this row - String8 name = fzy_item_string_from_rdi_target_element_idx(parse_ctx->rdi, block->fzy_target, block->fzy_backing_items.v[idx].idx); + { + FZY_Item *item = &block->fzy_backing_items.v[idx]; + + // rjf: determine dbgi/rdi to which this item belongs + RDI_Parsed *rdi = &di_rdi_parsed_nil; + { + U64 base_idx = 0; + for(U64 rdi_idx = 0; rdi_idx < e_state->ctx->rdis_count; rdi_idx += 1) + { + U64 all_items_count = 0; + rdi_section_raw_table_from_kind(e_state->ctx->rdis[rdi_idx], block->fzy_target, &all_items_count); + if(base_idx <= item->idx && item->idx < base_idx + all_items_count) + { + rdi = e_state->ctx->rdis[rdi_idx]; + break; + } + base_idx += all_items_count; + } + } + + // rjf: unpack info about this row + String8 name = fzy_item_string_from_rdi_target_element_idx(rdi, block->fzy_target, block->fzy_backing_items.v[idx].idx); // rjf: get keys for this row DF_ExpandKey parent_key = block->parent_key; @@ -9184,7 +9150,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, key.child_num = block->fzy_backing_items.v[idx].idx; // rjf: get eval for this row - DF_Eval eval = df_eval_from_string(arena, scope, ctrl_ctx, parse_ctx, macro_map, name); + E_Eval eval = e_eval_from_string(arena, name); // rjf: get view rules String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); @@ -9193,14 +9159,14 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, // rjf: apply view rules to eval { - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); + eval = e_dynamically_typed_eval_from_eval(eval); + eval = df_eval_from_eval_cfg_table(arena, 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->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); + String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 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, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); + DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, &list, block, key, eval); row->display_expr = name; row->edit_expr = name; row->display_value = str8_list_join(arena, &display_strings, 0); @@ -9221,7 +9187,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, //~ rjf: Hover Eval internal void -df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_CtrlCtx ctrl_ctx, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string) +df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string) { if(ws->hover_eval_last_frame_idx+1 < df_frame_index() && ui_key_match(ui_active_key(UI_MouseButtonKind_Left), ui_key_zero()) && @@ -9239,7 +9205,6 @@ df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_CtrlCtx ctrl_ctx, DF_Entity *fi ws->hover_eval_vaddr = vaddr; ws->hover_eval_focused = 0; } - ws->hover_eval_ctrl_ctx = ctrl_ctx; ws->hover_eval_spawn_pos = pos; ws->hover_eval_last_frame_idx = df_frame_index(); } @@ -9463,7 +9428,7 @@ df_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 stri } internal void -df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_CtrlCtx ctrl_ctx, DF_AutoCompListerParams *params, String8 input, U64 cursor_off) +df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_AutoCompListerParams *params, String8 input, U64 cursor_off) { String8 query = df_autocomp_query_word_from_input_string_off(input, cursor_off); String8 current_query = str8(ws->autocomp_lister_query_buffer, ws->autocomp_lister_query_size); @@ -9488,7 +9453,6 @@ df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_CtrlCtx ctrl_ctx ws->autocomp_num_visible_rows_t = 0; ws->autocomp_open_t = 0; } - ws->autocomp_ctrl_ctx = ctrl_ctx; ws->autocomp_root_key = root_key; arena_clear(ws->autocomp_lister_params_arena); MemoryCopyStruct(&ws->autocomp_lister_params, params); @@ -10730,10 +10694,9 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam UI_Palette *palette = ui_top_palette(); if(entity->kind == DF_EntityKind_Thread) { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(ws); CTRL_Event stop_event = df_ctrl_last_stop_event(); DF_Entity *stopped_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *selected_thread = df_entity_from_handle(df_base_interact_regs()->thread); if(selected_thread == entity) { palette = df_palette_from_code(ws, DF_PaletteCode_NeutralPopButton); @@ -11106,14 +11069,14 @@ internal UI_BOX_CUSTOM_DRAW(df_bp_box_draw_extensions) } internal DF_CodeSliceSignal -df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string) +df_code_slice(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string) { DF_CodeSliceSignal result = {0}; ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *selected_thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *selected_thread_process = df_entity_ancestor_from_kind(selected_thread, DF_EntityKind_Process); - U64 selected_thread_rip_unwind_vaddr = df_query_cached_rip_from_thread_unwind(selected_thread, ctrl_ctx->unwind_count); + U64 selected_thread_rip_unwind_vaddr = df_query_cached_rip_from_thread_unwind(selected_thread, df_interact_regs()->unwind_count); DF_Entity *selected_thread_module = df_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); CTRL_Event stop_event = df_ctrl_last_stop_event(); DF_Entity *stopper_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); @@ -11211,7 +11174,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { continue; } - U64 unwind_count = (thread == selected_thread) ? ctrl_ctx->unwind_count : 0; + U64 unwind_count = (thread == selected_thread) ? df_interact_regs()->unwind_count : 0; U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); @@ -11368,7 +11331,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { continue; } - U64 unwind_count = (thread == selected_thread) ? ctrl_ctx->unwind_count : 0; + U64 unwind_count = (thread == selected_thread) ? df_interact_regs()->unwind_count : 0; U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); @@ -11830,12 +11793,12 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { DF_Entity *pin = n->entity; String8 pin_expr = pin->name; - DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, &eval_string2expr_map_nil, pin_expr); + E_Eval eval = e_eval_from_string(scratch.arena, pin_expr); String8 eval_string = {0}; - if(!tg_key_match(tg_key_zero(), eval.type_key)) + if(!e_type_key_match(e_type_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->rdi, 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, 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)); @@ -11877,7 +11840,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_Signal pin_sig = ui_signal_from_box(pin_box); if(ui_key_match(pin_box_key, ui_hot_key())) { - df_set_hover_eval(ws, v2f32(pin_box->rect.x0, pin_box->rect.y1-2.f), *ctrl_ctx, &df_g_nil_entity, txt_pt(1, 1), 0, pin_expr); + df_set_hover_eval(ws, v2f32(pin_box->rect.x0, pin_box->rect.y1-2.f), &df_g_nil_entity, txt_pt(1, 1), 0, pin_expr); } } } @@ -12161,9 +12124,8 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ // if(!ui_dragging(text_container_sig) && text_container_sig.event_flags == 0 && mouse_expr.size != 0) { - DI_Scope *di_scope = di_scope_open(); - DF_Eval eval = df_eval_from_string(scratch.arena, di_scope, ctrl_ctx, parse_ctx, &eval_string2expr_map_nil, mouse_expr); - if(eval.mode != EVAL_EvalMode_NULL) + E_Eval eval = e_eval_from_string(scratch.arena, mouse_expr); + if(eval.mode != E_Mode_Null) { U64 line_vaddr = 0; if(contains_1s64(params->line_num_range, mouse_pt.line)) @@ -12171,9 +12133,8 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ U64 line_idx = mouse_pt.line-params->line_num_range.min; line_vaddr = params->line_vaddrs[line_idx]; } - df_set_hover_eval(ws, mouse_expr_baseline_pos, *ctrl_ctx, df_entity_from_handle(df_interact_regs()->file), mouse_pt, line_vaddr, mouse_expr); + df_set_hover_eval(ws, mouse_expr_baseline_pos, df_entity_from_handle(df_interact_regs()->file), mouse_pt, line_vaddr, mouse_expr); } - di_scope_close(di_scope); } ////////////////////////////// @@ -12351,7 +12312,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } if(!mapped_special && token->kind == TXT_TokenKind_Identifier) { - U64 local_num = eval_num_from_string(parse_ctx->locals_map, token_string); + U64 local_num = e_num_from_string(e_state->ctx->locals_map, token_string); if(local_num != 0) { mapped_special = 1; @@ -12363,7 +12324,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } if(!mapped_special) { - U64 reg_num = eval_num_from_string(parse_ctx->regs_map, token_string); + U64 reg_num = e_num_from_string(e_state->ctx->regs_map, token_string); if(reg_num != 0) { mapped_special = 1; @@ -12373,7 +12334,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } if(!mapped_special) { - U64 alias_num = eval_num_from_string(parse_ctx->reg_alias_map, token_string); + U64 alias_num = e_num_from_string(e_state->ctx->reg_alias_map, token_string); if(alias_num != 0) { mapped_special = 1; @@ -12562,13 +12523,13 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } internal DF_CodeSliceSignal -df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...) +df_code_slicef(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...) { Temp scratch = scratch_begin(0, 0); va_list args; va_start(args, fmt); String8 string = push_str8fv(scratch.arena, fmt, args); - DF_CodeSliceSignal sig = df_code_slice(ws, ctrl_ctx, parse_ctx, params, cursor, mark, preferred_column, string); + DF_CodeSliceSignal sig = df_code_slice(ws, params, cursor, mark, preferred_column, string); va_end(args); scratch_end(scratch); return sig; @@ -13732,8 +13693,6 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds) //- rjf: commands with implications for graphical systems, but generated // without context needed - pick selected window & dispatch case DF_CoreCmdKind_SelectThread: - case DF_CoreCmdKind_SelectThreadView: - case DF_CoreCmdKind_SelectThreadWindow: case DF_CoreCmdKind_FindThread: { DF_Window *window = df_window_from_handle(params.window); diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index dc46b762..318fcafe 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -202,9 +202,6 @@ struct DF_View TxtPt cursor; TxtPt mark; - // rjf: ctrl context overrides - DF_CtrlCtx ctrl_ctx_overrides; - // rjf: allocation & user data extensions Arena *arena; DF_ArenaExt *first_arena_ext; @@ -324,11 +321,11 @@ enum #define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name) df_gfx_view_rule_line_stringize__##name #define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(name) internal DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name)) -#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, DF_Eval eval, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg) +#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, E_Eval eval, struct DF_CfgNode *cfg) #define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name) df_gfx_view_rule_row_ui__##name #define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name)) -#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, DF_Eval eval, String8 string, DI_Scope *di_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg, Vec2F32 dim) +#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, E_Eval eval, String8 string, struct DF_CfgNode *cfg, Vec2F32 dim) #define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name) df_gfx_view_rule_block_ui__##name #define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name)) @@ -602,7 +599,6 @@ struct DF_Window B32 autocomp_force_closed; B32 autocomp_query_dirty; UI_Key autocomp_root_key; - DF_CtrlCtx autocomp_ctrl_ctx; Arena *autocomp_lister_params_arena; DF_AutoCompListerParams autocomp_lister_params; U64 autocomp_cursor_off; @@ -636,7 +632,6 @@ struct DF_Window U64 hover_eval_last_frame_idx; // rjf: hover eval params - DF_CtrlCtx hover_eval_ctrl_ctx; DF_Handle hover_eval_file; TxtPt hover_eval_file_pt; U64 hover_eval_vaddr; @@ -648,9 +643,6 @@ struct DF_Window U64 error_string_size; F32 error_t; - // rjf: context overrides - DF_CtrlCtx ctrl_ctx_overrides; - // rjf: panel state DF_Panel *root_panel; DF_Panel *free_panel; @@ -834,7 +826,6 @@ read_only global DF_View df_g_nil_view = {0}, {0}, {0}, - {0}, 0, 0, 0, @@ -907,7 +898,7 @@ internal void df_panel_remove_tab_view(DF_Panel *panel, DF_View *view); internal DF_View *df_selected_tab_from_panel(DF_Panel *panel); //- rjf: icons & display strings -internal String8 df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view); +internal String8 df_display_string_from_view(Arena *arena, DF_View *view); internal DF_IconKind df_icon_kind_from_view(DF_View *view); //////////////////////////////// @@ -916,12 +907,6 @@ internal DF_IconKind df_icon_kind_from_view(DF_View *view); internal DF_Handle df_handle_from_window(DF_Window *window); internal DF_Window *df_window_from_handle(DF_Handle handle); -//////////////////////////////// -//~ rjf: Control Context - -internal DF_CtrlCtx df_ctrl_ctx_from_window(DF_Window *ws); -internal DF_CtrlCtx df_ctrl_ctx_from_view(DF_Window *ws, DF_View *view); - //////////////////////////////// //~ rjf: Command Parameters From Context @@ -998,13 +983,13 @@ internal void df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdLis //~ 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 *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, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); +internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *opt_member, DF_CfgTable *cfg_table); +internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); //////////////////////////////// //~ rjf: Hover Eval -internal void df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_CtrlCtx ctrl_ctx, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string); +internal void df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string); //////////////////////////////// //~ rjf: Auto-Complete Lister @@ -1016,7 +1001,7 @@ internal void df_autocomp_lister_item_array_sort__in_place(DF_AutoCompListerItem internal String8 df_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off); internal DF_AutoCompListerParams df_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off); -internal void df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_CtrlCtx ctrl_ctx, DF_AutoCompListerParams *params, String8 input, U64 cursor_off); +internal void df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_AutoCompListerParams *params, String8 input, U64 cursor_off); //////////////////////////////// //~ rjf: Search Strings @@ -1085,8 +1070,8 @@ internal void df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt p internal UI_BOX_CUSTOM_DRAW(df_thread_box_draw_extensions); internal UI_BOX_CUSTOM_DRAW(df_bp_box_draw_extensions); -internal DF_CodeSliceSignal df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string); -internal DF_CodeSliceSignal df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...); +internal DF_CodeSliceSignal df_code_slice(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string); +internal DF_CodeSliceSignal df_code_slicef(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...); internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); diff --git a/src/df/gfx/df_view_rules.c b/src/df/gfx/df_view_rules.c index 109c6713..9d865daf 100644 --- a/src/df/gfx/df_view_rules.c +++ b/src/df/gfx/df_view_rules.c @@ -7,9 +7,9 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) { Temp scratch = scratch_begin(&arena, 1); - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - if(type_kind == TG_Kind_Ptr || type_kind == TG_Kind_LRef || type_kind == TG_Kind_RRef) + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(type_kind == E_TypeKind_Ptr || type_kind == E_TypeKind_LRef || type_kind == E_TypeKind_RRef) { DF_CfgNode *array_node = val->last; if(array_node != &df_g_nil_cfg_node) @@ -23,16 +23,16 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) str8_list_push(scratch.arena, &array_size_expr_strs, child->string); } String8 array_size_expr = str8_list_join(scratch.arena, &array_size_expr_strs, 0); - DF_Eval array_size_eval = df_eval_from_string(arena, di_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->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; + E_Eval array_size_eval = e_eval_from_string(arena, array_size_expr); + E_Eval array_size_eval_value = e_value_eval_from_eval(array_size_eval); + e_msg_list_concat_in_place(&eval.msgs, &array_size_eval.msgs); + array_size = array_size_eval_value.value.u64; } // rjf: apply array size to type - 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); + E_TypeKey pointee = e_type_ptee_from_key(type_key); + E_TypeKey array_type = e_type_key_cons(E_TypeKind_Array, pointee, array_size); + eval.type_key = e_type_key_cons(E_TypeKind_Ptr, array_type, 0); } } scratch_end(scratch); @@ -59,23 +59,23 @@ DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(list){} 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->rdi, type_key); - if(TG_Kind_Char8 <= type_kind && type_kind <= TG_Kind_S256 && + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + U64 type_size_bytes = e_type_byte_size_from_key(type_key); + if(E_TypeKind_Char8 <= type_kind && type_kind <= E_TypeKind_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->rdi, ctrl_ctx, eval); - if(value_eval.mode == EVAL_EvalMode_Value) + E_Eval value_eval = e_value_eval_from_eval(eval); + if(value_eval.mode == E_Mode_Value) { switch(type_size_bytes) { default:{}break; - case 2:{U16 v = (U16)value_eval.imm_u64; v = bswap_u16(v); value_eval.imm_u64 = (U64)v;}break; - case 4:{U32 v = (U32)value_eval.imm_u64; v = bswap_u32(v); value_eval.imm_u64 = (U64)v;}break; - case 8:{U64 v = value_eval.imm_u64; v = bswap_u64(v); value_eval.imm_u64 = v;}break; + case 2:{U16 v = (U16)value_eval.value.u64; v = bswap_u16(v); value_eval.value.u64 = (U64)v;}break; + case 4:{U32 v = (U32)value_eval.value.u64; v = bswap_u32(v); value_eval.value.u64 = (U64)v;}break; + case 8:{U64 v = value_eval.value.u64; v = bswap_u64(v); value_eval.value.u64 = v;}break; } } eval = value_eval; @@ -127,36 +127,36 @@ DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(no_addr){} //~ rjf: "rgba" internal Vec4F32 -df_vr_rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entity *process) +df_vr_rgba_from_eval(E_Eval eval, DF_Entity *process) { Vec4F32 rgba = {0}; Temp scratch = scratch_begin(0, 0); - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); switch(type_kind) { default:{}break; // rjf: extract r/g/b/a bytes from u32 - case TG_Kind_U32: - case TG_Kind_S32: + case E_TypeKind_U32: + case E_TypeKind_S32: { - U32 hex_val = (U32)eval.imm_u64; + U32 hex_val = (U32)eval.value.u64; rgba = rgba_from_u32(hex_val); }break; // rjf: extract r/g/b/a values from array - case TG_Kind_Array: - if(eval.mode == EVAL_EvalMode_Addr) + case E_TypeKind_Array: + if(eval.mode == E_Mode_Addr) { - U64 array_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); + U64 array_total_size = e_type_byte_size_from_key(type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); - Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); + Rng1U64 array_memory_vaddr_rng = r1u64(eval.value.u64, eval.value.u64 + array_total_size_capped); CTRL_ProcessMemorySlice array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng, 0); String8 array_memory = array_slice.data; - TG_Key element_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, raddbg, type_key); - TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, element_type_key); + E_TypeKey element_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))); + E_TypeKind element_type_kind = e_type_kind_from_key(element_type_key); + U64 element_type_size = e_type_byte_size_from_key(element_type_key); for(U64 element_idx = 0; element_idx < 4; element_idx += 1) { U64 offset = element_idx*element_type_size; @@ -167,12 +167,12 @@ df_vr_rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entit switch(element_type_kind) { default:{}break; - case TG_Kind_U8: + case E_TypeKind_U8: { U8 byte = array_memory.str[offset]; rgba.v[element_idx] = byte/255.f; }break; - case TG_Kind_F32: + case E_TypeKind_F32: { rgba.v[element_idx] = *(F32 *)(array_memory.str+offset); }break; @@ -181,33 +181,33 @@ df_vr_rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entit }break; // rjf: extract r/g/b/a values from struct - case TG_Kind_Struct: - case TG_Kind_Class: - case TG_Kind_Union: - if(eval.mode == EVAL_EvalMode_Addr) + case E_TypeKind_Struct: + case E_TypeKind_Class: + case E_TypeKind_Union: + if(eval.mode == E_Mode_Addr) { - U64 struct_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); + U64 struct_total_size = e_type_byte_size_from_key(type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); - Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); + Rng1U64 struct_memory_vaddr_rng = r1u64(eval.value.u64, eval.value.u64 + struct_total_size_capped); CTRL_ProcessMemorySlice struct_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng, 0); String8 struct_memory = struct_slice.data; - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, raddbg, type_key); + E_Type *type = e_type_from_key(scratch.arena, type_key); for(U64 element_idx = 0, member_idx = 0; element_idx < 4 && member_idx < type->count; member_idx += 1) { - TG_Member *member = &type->members[member_idx]; - TG_Key member_type_key = member->type_key; - TG_Kind member_type_kind = tg_kind_from_key(member_type_key); + E_Member *member = &type->members[member_idx]; + E_TypeKey member_type_key = member->type_key; + E_TypeKind member_type_kind = e_type_kind_from_key(member_type_key); B32 member_is_component = 1; switch(member_type_kind) { default:{member_is_component = 0;}break; - case TG_Kind_U8: + case E_TypeKind_U8: { rgba.v[element_idx] = struct_memory.str[member->off]/255.f; }break; - case TG_Kind_F32: + case E_TypeKind_F32: { rgba.v[element_idx] = *(F32 *)(struct_memory.str + member->off); }break; @@ -224,37 +224,37 @@ df_vr_rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entit } internal void -df_vr_eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba) +df_vr_eval_commit_rgba(E_Eval eval, Vec4F32 rgba) { - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); switch(type_kind) { default:{}break; // rjf: extract r/g/b/a bytes from u32 - case TG_Kind_U32: - case TG_Kind_S32: + case E_TypeKind_U32: + case E_TypeKind_S32: { U32 val = u32_from_rgba(rgba); - DF_Eval src_eval = eval; - src_eval.mode = EVAL_EvalMode_Value; - src_eval.imm_u64 = (U64)val; - df_commit_eval_value(graph, raddbg, ctrl_ctx, eval, src_eval); + E_Eval src_eval = eval; + src_eval.mode = E_Mode_Value; + src_eval.value.u64 = (U64)val; + df_commit_eval_value(eval, src_eval); }break; #if 0 // rjf: extract r/g/b/a values from array - case TG_Kind_Array: - if(eval.mode == EVAL_EvalMode_Addr) + case E_TypeKind_Array: + if(eval.mode == E_Mode_Addr) { - U64 array_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); + U64 array_total_size = e_type_byte_size_from_key(type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng); - TG_Key element_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, raddbg, type_key); - TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, element_type_key); + E_TypeKey element_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))); + E_TypeKind element_type_kind = e_type_kind_from_key(element_type_key); + U64 element_type_size = e_type_byte_size_from_key(element_type_key); for(U64 element_idx = 0; element_idx < 4; element_idx += 1) { U64 offset = element_idx*element_type_size; @@ -265,12 +265,12 @@ df_vr_eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Ctr switch(element_type_kind) { default:{}break; - case TG_Kind_U8: + case E_TypeKind_U8: { U8 byte = array_memory.str[offset]; rgba.v[element_idx] = byte/255.f; }break; - case TG_Kind_F32: + case E_TypeKind_F32: { rgba.v[element_idx] = *(F32 *)(array_memory.str+offset); }break; @@ -279,32 +279,32 @@ df_vr_eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Ctr }break; // rjf: extract r/g/b/a values from struct - case TG_Kind_Struct: - case TG_Kind_Class: - case TG_Kind_Union: - if(eval.mode == EVAL_EvalMode_Addr) + case E_TypeKind_Struct: + case E_TypeKind_Class: + case E_TypeKind_Union: + if(eval.mode == E_Mode_Addr) { - U64 struct_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); + U64 struct_total_size = e_type_byte_size_from_key(type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); String8 struct_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, raddbg, type_key); + E_Type *type = e_type_from_key(scratch.arena, graph, raddbg, type_key); for(U64 element_idx = 0, member_idx = 0; element_idx < 4 && member_idx < type->count; member_idx += 1) { - TG_Member *member = &type->members[member_idx]; - TG_Key member_type_key = member->type_key; - TG_Kind member_type_kind = tg_kind_from_key(member_type_key); + E_Member *member = &type->members[member_idx]; + E_TypeKey member_type_key = member->type_key; + E_TypeKind member_type_kind = e_type_kind_from_key(member_type_key); B32 member_is_component = 1; switch(member_type_kind) { default:{member_is_component = 0;}break; - case TG_Kind_U8: + case E_TypeKind_U8: { rgba.v[element_idx] = struct_memory.str[member->off]/255.f; }break; - case TG_Kind_F32: + case E_TypeKind_F32: { rgba.v[element_idx] = *(F32 *)(struct_memory.str + member->off); }break; @@ -333,12 +333,12 @@ DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(rgba) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba) { Temp scratch = scratch_begin(0, 0); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); 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->rdi, ctrl_ctx, eval); - Vec4F32 rgba = df_vr_rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); + E_Eval value_eval = e_value_eval_from_eval(eval); + Vec4F32 rgba = df_vr_rgba_from_eval(value_eval, process); Vec4F32 hsva = hsva_from_rgba(rgba); //- rjf: build text box @@ -396,7 +396,7 @@ DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) { Temp scratch = scratch_begin(0, 0); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); DF_VR_RGBAState *state = df_view_rule_block_user_state(key, DF_VR_RGBAState); @@ -411,8 +411,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->rdi, ctrl_ctx, eval); - rgba = df_vr_rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); + E_Eval value_eval = e_value_eval_from_eval(eval); + rgba = df_vr_rgba_from_eval(value_eval, process); state->hsva = hsva = hsva_from_rgba(rgba); state->memgen_idx = ctrl_mem_gen(); } @@ -462,7 +462,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) if(commit) { Vec4F32 rgba = rgba_from_hsva(hsva); - df_vr_eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, rgba); + df_vr_eval_commit_rgba(eval, rgba); state->memgen_idx = ctrl_mem_gen(); } @@ -476,7 +476,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) //~ rjf: "text" internal DF_TxtTopologyInfo -df_vr_txt_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) +df_vr_txt_topology_info_from_cfg(DF_CfgNode *cfg) { Temp scratch = scratch_begin(0, 0); DF_TxtTopologyInfo result = zero_struct; @@ -493,10 +493,10 @@ df_vr_txt_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_Par } 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->rdi, ctrl_ctx, size_eval); + E_Eval size_eval = e_eval_from_string(scratch.arena, size_expr); + E_Eval size_val_eval = e_value_eval_from_eval(size_eval); result.lang = txt_lang_kind_from_extension(lang_string); - result.size_cap = size_val_eval.imm_u64; + result.size_cap = size_val_eval.value.u64; } scratch_end(scratch); return result; @@ -532,11 +532,11 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) ////////////////////////////// //- rjf: unpack evaluation / view rule params // - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_TxtTopologyInfo top = df_vr_txt_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); - 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_TxtTopologyInfo top = df_vr_txt_topology_info_from_cfg(cfg); + E_Eval value_eval = e_value_eval_from_eval(eval); + U64 base_vaddr = value_eval.value.u64; Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); ////////////////////////////// @@ -600,7 +600,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) //- rjf: build code slice UI_WidthFill UI_HeightFill UI_Parent(container) { - DF_CodeSliceSignal slice_sig = df_code_slice(ws, ctrl_ctx, parse_ctx, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###slice")); + DF_CodeSliceSignal slice_sig = df_code_slice(ws, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###slice")); } } @@ -620,7 +620,7 @@ DF_VIEW_UI_FUNCTION_DEF(text) //~ rjf: "disasm" internal DF_DisasmTopologyInfo -df_vr_disasm_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) +df_vr_disasm_topology_info_from_cfg(DF_CfgNode *cfg) { Temp scratch = scratch_begin(0, 0); DF_DisasmTopologyInfo result = zero_struct; @@ -637,13 +637,13 @@ df_vr_disasm_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ } arch_string = arch_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->rdi, ctrl_ctx, size_eval); + E_Eval size_eval = e_eval_from_string(scratch.arena, size_expr); + E_Eval size_val_eval = e_value_eval_from_eval(size_eval); if(str8_match(arch_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) { result.arch = Architecture_x64; } - result.size_cap = size_val_eval.imm_u64; + result.size_cap = size_val_eval.value.u64; } scratch_end(scratch); return result; @@ -679,15 +679,15 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm) state->last_open_frame_idx = df_frame_index(); { //- rjf: unpack params - DF_DisasmTopologyInfo top = df_vr_disasm_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); + DF_DisasmTopologyInfo top = df_vr_disasm_topology_info_from_cfg(cfg); //- rjf: resolve to address value & range - 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; + E_Eval value_eval = e_value_eval_from_eval(eval); + U64 base_vaddr = value_eval.value.u64; Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); //- rjf: unpack thread/process of eval - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); //- rjf: unpack key for this region in memory @@ -752,7 +752,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm) if(dasm_info.lines.count != 0 && dasm_text_info.lines_count != 0) UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_px(dasm_text_info.lines_max_size*ui_top_font_size()*1.2f, 1.f)) UI_Column UI_Padding(ui_pct(1, 0)) { - DF_CodeSliceSignal sig = df_code_slice(ws, ctrl_ctx, parse_ctx, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###code_slice")); + DF_CodeSliceSignal sig = df_code_slice(ws, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###code_slice")); } } dasm_scope_close(dasm_scope); @@ -833,7 +833,7 @@ df_bitmap_view_state__canvas_from_screen_rect(DF_BitmapViewState *bvs, Rng2F32 r } internal DF_BitmapTopologyInfo -df_vr_bitmap_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) +df_vr_bitmap_topology_info_from_cfg(DF_CfgNode *cfg) { Temp scratch = scratch_begin(0, 0); DF_BitmapTopologyInfo info = {0}; @@ -857,12 +857,12 @@ df_vr_bitmap_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ String8 width_expr = str8_list_join(scratch.arena, &width_expr_strs, 0); 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->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->rdi, ctrl_ctx, height_eval); - info.height = height_eval_value.imm_u64; + E_Eval width_eval = e_eval_from_string(scratch.arena, width_expr); + E_Eval width_eval_value = e_value_eval_from_eval(width_eval); + info.width = width_eval_value.value.u64; + E_Eval height_eval = e_eval_from_string(scratch.arena, height_expr); + E_Eval height_eval_value = e_value_eval_from_eval(height_eval); + info.height = height_eval_value.value.u64; if(fmt_string.size != 0) { for(R_Tex2DFormat fmt = (R_Tex2DFormat)0; fmt < R_Tex2DFormat_COUNT; fmt = (R_Tex2DFormat)(fmt+1)) @@ -926,9 +926,9 @@ 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->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - DF_BitmapTopologyInfo topology = df_vr_bitmap_topology_info_from_cfg(scope, ctrl_ctx, parse_ctx, macro_map, cfg); + E_Eval value_eval = e_value_eval_from_eval(eval); + U64 base_vaddr = value_eval.value.u64; + DF_BitmapTopologyInfo topology = df_vr_bitmap_topology_info_from_cfg(cfg); U64 expected_size = topology.width*topology.height*r_tex2d_format_bytes_per_pixel_table[topology.fmt]; DF_Font(ws, DF_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("0x%I64x -> Bitmap (%I64u x %I64u)", base_vaddr, topology.width, topology.height); @@ -949,15 +949,15 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) ////////////////////////////// //- rjf: unpack context // - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); ////////////////////////////// //- rjf: evaluate expression // - 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_info = df_vr_bitmap_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); + E_Eval value_eval = e_value_eval_from_eval(eval); + U64 base_vaddr = value_eval.value.u64; + DF_BitmapTopologyInfo topology_info = df_vr_bitmap_topology_info_from_cfg(cfg); U64 expected_size = topology_info.width*topology_info.height*r_tex2d_format_bytes_per_pixel_table[topology_info.fmt]; Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr+expected_size); @@ -1012,24 +1012,20 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) DF_VIEW_SETUP_FUNCTION_DEF(bitmap) { DF_BitmapViewState *bvs = df_view_user_state(view, DF_BitmapViewState); - DI_Scope *di_scope = di_scope_open(); DF_CfgNode *view_center_cfg = df_cfg_node_child_from_string(cfg_root, str8_lit("view_center"), StringMatchFlag_CaseInsensitive); DF_CfgNode *zoom_cfg = df_cfg_node_child_from_string(cfg_root, str8_lit("zoom"), StringMatchFlag_CaseInsensitive); DF_CfgNode *bitmap_cfg = df_cfg_node_child_from_string(cfg_root, str8_lit("bitmap"), StringMatchFlag_CaseInsensitive); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_unwind_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(di_scope, process, thread_unwind_rip_vaddr); + U64 thread_unwind_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, df_interact_regs()->unwind_count); bvs->view_center_pos.x = (F32)f64_from_str8(bitmap_cfg->first->string); bvs->view_center_pos.y = (F32)f64_from_str8(bitmap_cfg->first->next->string); bvs->zoom = (F32)f64_from_str8(zoom_cfg->first->string); - bvs->top = df_vr_bitmap_topology_info_from_cfg(di_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, bitmap_cfg); + bvs->top = df_vr_bitmap_topology_info_from_cfg(bitmap_cfg); if(bvs->zoom == 0) { bvs->zoom = 1.f; } - di_scope_close(di_scope); } DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(bitmap) @@ -1080,26 +1076,23 @@ DF_VIEW_UI_FUNCTION_DEF(bitmap) { DF_BitmapViewState *bvs = df_view_user_state(view, DF_BitmapViewState); Temp scratch = scratch_begin(0, 0); - DI_Scope *di_scope = di_scope_open(); HS_Scope *hs_scope = hs_scope_open(); TEX_Scope *tex_scope = tex_scope_open(); ////////////////////////////// //- rjf: unpack context // - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_unwind_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(di_scope, process, thread_unwind_rip_vaddr); + U64 thread_unwind_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, df_interact_regs()->unwind_count); ////////////////////////////// //- rjf: evaluate expression // String8 expr = str8(view->query_buffer, view->query_string_size); - DF_Eval eval = df_eval_from_string(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); - 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; + E_Eval eval = e_eval_from_string(scratch.arena, expr); + E_Eval value_eval = e_value_eval_from_eval(eval); + U64 base_vaddr = value_eval.value.u64; U64 expected_size = bvs->top.width*bvs->top.height*r_tex2d_format_bytes_per_pixel_table[bvs->top.fmt]; Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr+expected_size); @@ -1245,7 +1238,6 @@ DF_VIEW_UI_FUNCTION_DEF(bitmap) hs_scope_close(hs_scope); tex_scope_close(tex_scope); - di_scope_close(di_scope); scratch_end(scratch); } @@ -1253,7 +1245,7 @@ DF_VIEW_UI_FUNCTION_DEF(bitmap) //~ rjf: "geo" internal DF_GeoTopologyInfo -df_vr_geo_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) +df_vr_geo_topology_info_from_cfg(DF_CfgNode *cfg) { Temp scratch = scratch_begin(0, 0); DF_GeoTopologyInfo result = {0}; @@ -1281,15 +1273,15 @@ df_vr_geo_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_Par String8 count_expr = str8_list_join(scratch.arena, &count_expr_strs, &join); String8 vertices_base_expr = str8_list_join(scratch.arena, &vertices_base_expr_strs, &join); String8 vertices_size_expr = str8_list_join(scratch.arena, &vertices_size_expr_strs, &join); - 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->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); + E_Eval count_eval = e_eval_from_string(scratch.arena, count_expr); + E_Eval vertices_base_eval = e_eval_from_string(scratch.arena, vertices_base_expr); + E_Eval vertices_size_eval = e_eval_from_string(scratch.arena, vertices_size_expr); + E_Eval count_val_eval = e_value_eval_from_eval(count_eval); + E_Eval vertices_base_val_eval = e_value_eval_from_eval(vertices_base_eval); + E_Eval vertices_size_val_eval = e_value_eval_from_eval(vertices_size_eval); + U64 vertices_base_vaddr = vertices_base_val_eval.value.u64; + result.index_count = count_val_eval.value.u64; + result.vertices_vaddr_range = r1u64(vertices_base_vaddr, vertices_base_vaddr+vertices_size_val_eval.value.u64); } scratch_end(scratch); return result; @@ -1344,8 +1336,8 @@ 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->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; + E_Eval value_eval = e_value_eval_from_eval(eval); + U64 base_vaddr = value_eval.value.u64; DF_Font(ws, DF_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("0x%I64x -> Geometry", base_vaddr); } @@ -1369,16 +1361,16 @@ 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->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; + E_Eval value_eval = e_value_eval_from_eval(eval); + U64 base_vaddr = value_eval.value.u64; //- rjf: extract extra geo topology info from view rule - DF_GeoTopologyInfo top = df_vr_geo_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); + DF_GeoTopologyInfo top = df_vr_geo_topology_info_from_cfg(cfg); Rng1U64 index_buffer_vaddr_range = r1u64(base_vaddr, base_vaddr+top.index_count*sizeof(U32)); Rng1U64 vertex_buffer_vaddr_range = top.vertices_vaddr_range; //- rjf: unpack thread/process of eval - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); //- rjf: obtain keys for index buffer & vertex buffer memory diff --git a/src/df/gfx/df_view_rules.h b/src/df/gfx/df_view_rules.h index 13cfde74..1e9b2d99 100644 --- a/src/df/gfx/df_view_rules.h +++ b/src/df/gfx/df_view_rules.h @@ -14,8 +14,8 @@ struct DF_VR_RGBAState U64 memgen_idx; }; -internal Vec4F32 df_vr_rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entity *process); -internal void df_vr_eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba); +internal Vec4F32 df_vr_rgba_from_eval(E_Eval eval, DF_Entity *process); +internal void df_vr_eval_commit_rgba(E_Eval eval, Vec4F32 rgba); //////////////////////////////// //~ rjf: "text" @@ -38,7 +38,7 @@ struct DF_VR_TextState F32 loaded_t; }; -internal DF_TxtTopologyInfo df_vr_txt_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); +internal DF_TxtTopologyInfo df_vr_txt_topology_info_from_cfg(DF_CfgNode *cfg); //////////////////////////////// //~ rjf: "disasm" @@ -61,7 +61,7 @@ struct DF_VR_DisasmState F32 loaded_t; }; -internal DF_DisasmTopologyInfo df_vr_disasm_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); +internal DF_DisasmTopologyInfo df_vr_disasm_topology_info_from_cfg(DF_CfgNode *cfg); //////////////////////////////// //~ rjf: "bitmap" @@ -104,7 +104,7 @@ internal Vec2F32 df_bitmap_view_state__screen_from_canvas_pos(DF_BitmapViewState internal Rng2F32 df_bitmap_view_state__screen_from_canvas_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 cvs); internal Vec2F32 df_bitmap_view_state__canvas_from_screen_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 scr); internal Rng2F32 df_bitmap_view_state__canvas_from_screen_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 scr); -internal DF_BitmapTopologyInfo df_vr_bitmap_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); +internal DF_BitmapTopologyInfo df_vr_bitmap_topology_info_from_cfg(DF_CfgNode *cfg); //////////////////////////////// //~ rjf: "geo" @@ -139,6 +139,6 @@ struct DF_VR_GeoBoxDrawData F32 loaded_t; }; -internal DF_GeoTopologyInfo df_vr_geo_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); +internal DF_GeoTopologyInfo df_vr_geo_topology_info_from_cfg(DF_CfgNode *cfg); #endif // DF_VIEW_RULES_H diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 342b9de1..447453b5 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -464,13 +464,11 @@ df_code_view_build(Arena *arena, DF_Window *ws, DF_Panel *panel, DF_View *view, ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); HS_Scope *hs_scope = hs_scope_open(); - DI_Scope *di_scope = di_scope_open(); TXT_Scope *txt_scope = txt_scope_open(); ////////////////////////////// //- rjf: extract invariants // - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); F_Tag code_font = df_font_from_slot(DF_FontSlot_Code); F32 code_font_size = df_font_size_from_slot(ws, DF_FontSlot_Code); F32 code_tab_size = f_column_size_from_tag_size(code_font, code_font_size)*df_setting_val_from_code(ws, DF_SettingCode_TabWidth).s32; @@ -481,15 +479,8 @@ df_code_view_build(Arena *arena, DF_Window *ws, DF_Panel *panel, DF_View *view, F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - - ////////////////////////////// - //- rjf: unpack ctrl ctx & make parse ctx - // - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - U64 unwind_count = ctrl_ctx.unwind_count; - U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(di_scope, process, rip_vaddr); ////////////////////////////// //- rjf: determine visible line range / count @@ -616,14 +607,14 @@ df_code_view_build(Arena *arena, DF_Window *ws, DF_Panel *panel, DF_View *view, ProfScope("find live threads mapping to this file") { DF_Entity *file = df_entity_from_handle(df_interact_regs()->file); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *selected_thread = df_entity_from_handle(df_interact_regs()->thread); DF_EntityList threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); for(DF_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) { DF_Entity *thread = thread_n->entity; DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 unwind_count = (thread == selected_thread) ? ctrl_ctx.unwind_count : 0; - U64 inline_depth = (thread == selected_thread) ? ctrl_ctx.inline_depth : 0; + U64 unwind_count = (thread == selected_thread) ? df_interact_regs()->unwind_count : 0; + U64 inline_depth = (thread == selected_thread) ? df_interact_regs()->inline_depth : 0; U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); U64 last_inst_on_unwound_rip_vaddr = rip_vaddr - !!unwind_count; DF_Entity *module = df_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr); @@ -671,12 +662,12 @@ df_code_view_build(Arena *arena, DF_Window *ws, DF_Panel *panel, DF_View *view, // rjf: find live threads mapping to disasm if(dasm_lines) ProfScope("find live threads mapping to this disassembly") { - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *selected_thread = df_entity_from_handle(df_interact_regs()->thread); DF_EntityList threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); for(DF_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) { DF_Entity *thread = thread_n->entity; - U64 unwind_count = (thread == selected_thread) ? ctrl_ctx.unwind_count : 0; + U64 unwind_count = (thread == selected_thread) ? df_interact_regs()->unwind_count : 0; U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); if(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) { @@ -945,7 +936,7 @@ df_code_view_build(Arena *arena, DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeSliceSignal sig = {0}; UI_Focus(UI_FocusKind_On) { - sig = df_code_slicef(ws, &ctrl_ctx, &parse_ctx, &code_slice_params, &view->cursor, &view->mark, &cv->preferred_column, "txt_view_%p", view); + sig = df_code_slicef(ws, &code_slice_params, &view->cursor, &view->mark, &cv->preferred_column, "txt_view_%p", view); } //- rjf: press code slice? -> focus panel @@ -1159,7 +1150,6 @@ df_code_view_build(Arena *arena, DF_Window *ws, DF_Panel *panel, DF_View *view, } txt_scope_close(txt_scope); - di_scope_close(di_scope); hs_scope_close(hs_scope); scratch_end(scratch); ProfEnd(); @@ -1301,7 +1291,7 @@ df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt) //- rjf: table coordinates -> strings internal String8 -df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable) +df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable) { String8 result = {0}; switch(col_kind) @@ -1309,7 +1299,7 @@ df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, TG_Graph default:{}break; case DF_WatchViewColumnKind_Expr: {result = editable ? row->edit_expr : row->display_expr;}break; case DF_WatchViewColumnKind_Value: {result = editable ? row->edit_value : row->display_value;}break; - case DF_WatchViewColumnKind_Type: {result = !tg_key_match(row->eval.type_key, tg_key_zero()) ? tg_string_from_key(arena, graph, rdi, row->eval.type_key) : str8_zero();}break; + case DF_WatchViewColumnKind_Type: {result = !e_type_key_match(row->eval.type_key, e_type_key_zero()) ? e_type_string_from_key(arena, row->eval.type_key) : str8_zero();}break; case DF_WatchViewColumnKind_ViewRule:{result = df_eval_view_rule_from_key(ev, row->key);}break; } return result; @@ -1340,7 +1330,7 @@ df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint p //- rjf: windowed watch tree visualization (both single-line and multi-line) internal DF_EvalVizBlockList -df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, FZY_Scope *fzy_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_WatchViewState *ews) +df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, FZY_Scope *fzy_scope, DF_View *view, DF_WatchViewState *ews) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -1348,7 +1338,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ews); DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); String8 filter = str8(view->query_buffer, view->query_string_size); - FZY_Target fzy_target = FZY_Target_UDTs; + RDI_SectionKind fzy_target = RDI_SectionKind_UDTs; switch(ews->fill_kind) { //////////////////////////// @@ -1365,7 +1355,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F { DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); DF_ExpandKey key = df_expand_key_from_eval_root(root); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1376,7 +1366,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F // case DF_WatchViewFillKind_Registers: { - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); Architecture arch = df_architecture_from_entity(thread); U64 reg_count = regs_reg_code_count_from_architecture(arch); String8 *reg_strings = regs_reg_code_string_table_from_architecture(arch); @@ -1391,7 +1381,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F { DF_ExpandKey parent_key = df_expand_key_make(5381, 0); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1403,7 +1393,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F { DF_ExpandKey parent_key = df_expand_key_make(5381, 0); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1414,18 +1404,18 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F // case DF_WatchViewFillKind_Locals: { - EVAL_String2NumMapNodeArray nodes = eval_string2num_map_node_array_from_map(scratch.arena, parse_ctx->locals_map); - eval_string2num_map_node_array_sort__in_place(&nodes); + E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_state->ctx->locals_map); + e_string2num_map_node_array_sort__in_place(&nodes); for(U64 idx = 0; idx < nodes.count; idx += 1) { - EVAL_String2NumMapNode *n = nodes.v[idx]; + E_String2NumMapNode *n = nodes.v[idx]; String8 root_expr_string = n->string; FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); if(matches.count == matches.needle_part_count) { DF_ExpandKey parent_key = df_expand_key_make(5381, 0); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), idx+1); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); + DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, eval_view, root_expr_string, parent_key, key); df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); } } @@ -1434,18 +1424,23 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F //////////////////////////// //- rjf: debug info table fill -> build split debug info table blocks // - case DF_WatchViewFillKind_Globals: fzy_target = FZY_Target_GlobalVariables; goto dbgi_table; - case DF_WatchViewFillKind_ThreadLocals: fzy_target = FZY_Target_ThreadVariables; goto dbgi_table; - case DF_WatchViewFillKind_Types: fzy_target = FZY_Target_UDTs; goto dbgi_table; - case DF_WatchViewFillKind_Procedures: fzy_target = FZY_Target_Procedures; goto dbgi_table; + case DF_WatchViewFillKind_Globals: fzy_target = RDI_SectionKind_GlobalVariables; goto dbgi_table; + case DF_WatchViewFillKind_ThreadLocals: fzy_target = RDI_SectionKind_ThreadVariables; goto dbgi_table; + case DF_WatchViewFillKind_Types: fzy_target = RDI_SectionKind_UDTs; goto dbgi_table; + case DF_WatchViewFillKind_Procedures: fzy_target = RDI_SectionKind_Procedures; goto dbgi_table; dbgi_table:; { + U64 endt_us = os_now_microseconds()+200; + //- rjf: unpack context - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_rip_unwind_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx->unwind_count); - DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_unwind_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); + DI_KeyList dbgi_keys_list = df_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + U64 rdis_count = dbgi_keys.count; + RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); + for(U64 idx = 0; idx < rdis_count; idx += 1) + { + rdis[idx] = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], endt_us); + } //- rjf: calculate top-level keys, expand root-level, grab root expansion node DF_ExpandKey parent_key = df_expand_key_make(5381, 0); @@ -1456,12 +1451,8 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F //- rjf: query all filtered items from dbgi searching system U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; B32 items_stale = 0; - FZY_Params params = {fzy_target}; - { - params.dbgi_keys.count = 1; - params.dbgi_keys.v = &dbgi_key; - } - FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, ¶ms, filter, os_now_microseconds()+100, &items_stale); + FZY_Params params = {fzy_target, dbgi_keys}; + FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, ¶ms, filter, endt_us, &items_stale); if(items_stale) { df_gfx_request_frame(); @@ -1537,11 +1528,30 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F } for(U64 sub_expand_idx = 0; sub_expand_idx < sub_expand_keys_count; sub_expand_idx += 1) { + FZY_Item *item = &items.v[sub_expand_item_idxs[sub_expand_idx]]; + // rjf: form split: truncate & complete last block; begin next block last_vb = df_eval_viz_block_split_and_continue(arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]); + // rjf: grab rdi for this item + RDI_Parsed *rdi = &di_rdi_parsed_nil; + U64 base_idx = 0; + { + for(U64 rdi_idx = 0; rdi_idx < rdis_count; rdi_idx += 1) + { + U64 procedures_count = 0; + rdi_section_raw_table_from_kind(rdis[rdi_idx], RDI_SectionKind_Procedures, &procedures_count); + if(base_idx <= item->idx && item->idx < base_idx + procedures_count) + { + rdi = rdis[rdi_idx]; + break; + } + base_idx += procedures_count; + } + } + // rjf: grab name for the expanded row - String8 name = fzy_item_string_from_rdi_target_element_idx(parse_ctx->rdi, fzy_target, sub_expand_keys[sub_expand_idx].child_num); + String8 name = fzy_item_string_from_rdi_target_element_idx(rdi, fzy_target, sub_expand_keys[sub_expand_idx].child_num-base_idx); // rjf: recurse for sub-expansion { @@ -1553,8 +1563,8 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, F df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); } } - DF_Eval eval = df_eval_from_string(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, name); - df_append_viz_blocks_for_parent__rec(arena, di_scope, eval_view, ctrl_ctx, parse_ctx, macro_map, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks); + E_Eval eval = e_eval_from_string(arena, name); + df_append_viz_blocks_for_parent__rec(arena, di_scope, eval_view, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks); } } df_eval_viz_block_end(&blocks, last_vb); @@ -1626,21 +1636,15 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //- rjf: unpack arguments // F_Tag code_font = df_font_from_slot(DF_FontSlot_Code); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_ip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); + U64 thread_ip_vaddr = df_query_cached_rip_from_thread_unwind(thread, df_interact_regs()->unwind_count); DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ewv); DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); String8 filter = str8(view->query_buffer, view->query_string_size); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); - ////////////////////////////// - //- rjf: process * thread info -> parse_ctx - // - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(di_scope, process, thread_ip_vaddr); - ////////////////////////////// //- rjf: determine autocompletion string // @@ -1660,7 +1664,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS ////////////////////////////// //- rjf: consume events & perform navigations/edits - calculate state // - EVAL_String2ExprMap macro_map = {0}; + E_String2ExprMap macro_map = {0}; DF_EvalVizBlockList blocks = {0}; UI_ScrollListRowBlockArray row_blocks = {0}; Vec2S64 cursor_tbl = {0}; @@ -1679,14 +1683,14 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // if(state_dirty) { - macro_map = eval_string2expr_map_make(scratch.arena, 256); + macro_map = e_string2expr_map_make(scratch.arena, 256); for(DF_EvalRoot *root = ewv->first_root; root != 0; root = root->next) { String8 root_expr = str8(root->expr_buffer, root->expr_buffer_string_size); //- rjf: unpack arguments DF_Entity *process = thread->parent; - U64 unwind_count = ctrl_ctx.unwind_count; + U64 unwind_count = df_interact_regs()->unwind_count; CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); Architecture arch = df_architecture_from_entity(thread); U64 reg_size = regs_block_size_from_architecture(arch); @@ -1699,12 +1703,11 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS } //- rjf: lex & parse - EVAL_TokenArray tokens = eval_token_array_from_text(scratch.arena, root_expr); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(scratch.arena, &parse_ctx, root_expr, &tokens); - EVAL_ErrorList errors = parse.errors; - if(errors.count == 0) + E_TokenArray tokens = e_token_array_from_text(scratch.arena, root_expr); + E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, root_expr, &tokens); + if(parse.msgs.max_kind == E_MsgKind_Null) { - eval_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ¯o_map, parse.expr, &errors); + e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ¯o_map, parse.expr); } } } @@ -1714,7 +1717,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // if(state_dirty) { - blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, di_scope, fzy_scope, &ctrl_ctx, &parse_ctx, ¯o_map, view, ewv); + blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, di_scope, fzy_scope, view, ewv); } ////////////////////////// @@ -1852,7 +1855,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS ewv->text_edit_state_slots_count = u64_up_to_pow2(selection_dim.y+1); ewv->text_edit_state_slots_count = Max(ewv->text_edit_state_slots_count, 64); ewv->text_edit_state_slots = push_array(ewv->text_edit_arena, DF_WatchViewTextEditState*, ewv->text_edit_state_slots_count); - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; @@ -1860,7 +1863,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { - String8 string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, parse_ctx.type_graph, parse_ctx.rdi, row, (DF_WatchViewColumnKind)x, 1); + String8 string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, row, (DF_WatchViewColumnKind)x, 1); string.size = Min(string.size, sizeof(ewv->dummy_text_edit_state.input_buffer)); DF_WatchViewPoint pt = {(DF_WatchViewColumnKind)x, row->parent_key, row->key}; U64 hash = df_hash_from_expand_key(pt.key); @@ -1884,7 +1887,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept && selection_tbl.min.x <= 0) { taken = 1; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; @@ -1926,15 +1929,13 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS selection_tbl.min.x == 1) { taken = 1; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; if(!(row->flags & DF_EvalVizRowFlag_CanEditValue)) { - U64 vaddr = 0; - if(vaddr == 0) { vaddr = row->eval.offset; } - if(vaddr == 0) { vaddr = row->eval.imm_u64; } + U64 vaddr = row->eval.value.u64; DF_Entity *module = df_module_from_process_vaddr(process, vaddr); DI_Key dbgi_key = df_dbgi_key_from_module(module); U64 voff = df_voff_from_vaddr(module, vaddr); @@ -2042,14 +2043,14 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS case DF_WatchViewColumnKind_Value: if(editing_complete && evt->slot != UI_EventActionSlot_Cancel) { - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, y-1), ui_scroll_list_row_from_item(&row_blocks, y-1)+1), &blocks); B32 success = 0; if(rows.first != 0) { - DF_Eval write_eval = df_eval_from_string(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, new_string); - success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, rows.first->eval, write_eval); + E_Eval write_eval = e_eval_from_string(scratch.arena, new_string); + success = df_commit_eval_value(rows.first->eval, write_eval); } if(!success) { @@ -2084,7 +2085,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { taken = 1; String8List strs = {0}; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); DF_EvalVizRow *row = rows.first; @@ -2092,7 +2093,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) { - String8 cell_string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, parse_ctx.type_graph, parse_ctx.rdi, row, (DF_WatchViewColumnKind)x, 0); + String8 cell_string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, row, (DF_WatchViewColumnKind)x, 0); cell_string = str8_skip_chop_whitespace(cell_string); U64 comma_pos = str8_find_needle(cell_string, 0, str8_lit(","), 0); if(selection_tbl.min.x != selection_tbl.max.x || selection_tbl.min.y != selection_tbl.max.y) @@ -2431,7 +2432,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // DF_EvalVizWindowedRowList rows = {0}; { - rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); + rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); } //////////////////////////// @@ -2458,11 +2459,11 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS switch(row->eval.mode) { default:{}break; - case EVAL_EvalMode_Addr: + case E_Mode_Addr: { - U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key); + U64 size = e_type_byte_size_from_key(row->eval.type_key); size = Min(size, 64); - Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); + Rng1U64 vaddr_rng = r1u64(row->eval.value.u64, row->eval.value.u64+size); CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) { @@ -2519,7 +2520,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { Vec2F32 canvas_dim = v2f32(scroll_list_params.dim_px.x - ui_top_font_size()*1.5f, (row->skipped_size_in_rows+row->size_in_rows+row->chopped_size_in_rows)*scroll_list_params.row_height_px); - row->expand_ui_rule_spec->info.block_ui(ws, row->key, row->eval, row->edit_expr, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, row->expand_ui_rule_node, canvas_dim); + row->expand_ui_rule_spec->info.block_ui(ws, row->key, row->eval, row->edit_expr, row->expand_ui_rule_node, canvas_dim); } } @@ -2566,9 +2567,9 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //////////////////// //- rjf: draw start of cache lines in expansions // - if((row->eval.mode == EVAL_EvalMode_Addr || row->eval.mode == EVAL_EvalMode_NULL) && - row->eval.errors.count == 0 && - row->eval.offset%64 == 0 && row->depth > 0 && + if((row->eval.mode == E_Mode_Addr || row->eval.mode == E_Mode_Null) && + row->eval.msgs.count == 0 && + row->eval.value.u64%64 == 0 && row->depth > 0 && !row_expanded) { ui_set_next_fixed_x(0); @@ -2581,14 +2582,14 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //////////////////// //- rjf: draw mid-row cache line boundaries in expansions // - if((row->eval.mode == EVAL_EvalMode_Addr || row->eval.mode == EVAL_EvalMode_NULL) && - row->eval.errors.count == 0 && - row->eval.offset%64 != 0 && + if((row->eval.mode == E_Mode_Addr || row->eval.mode == E_Mode_Null) && + row->eval.msgs.max_kind == E_MsgKind_Null && + row->eval.value.u64%64 != 0 && row->depth > 0 && !row_expanded) { - 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) + U64 next_off = (row->eval.value.u64 + e_type_byte_size_from_key(row->eval.type_key)); + if(next_off%64 != 0 && row->eval.value.u64/64 < next_off/64) { ui_set_next_fixed_x(0); ui_set_next_fixed_y(scroll_list_params.row_height_px - ui_top_font_size()*0.5f); @@ -2641,9 +2642,9 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS if(is_inherited && ui_hovering(sig)) UI_Tooltip { String8List inheritance_chain_type_names = {0}; - for(TG_KeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next) + for(E_TypeKeyNode *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.rdi, n->v); + String8 inherited_type_name = e_type_string_from_key(scratch.arena, n->v); inherited_type_name = str8_skip_chop_whitespace(inherited_type_name); str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name); } @@ -2657,53 +2658,6 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS DF_Font(ws, DF_FontSlot_Code) df_code_label(1.f, 1.f, df_rgba_from_theme_color(DF_ThemeColor_CodeType), inheritance_type); } } - if(DEV_eval_watch_key_tooltips && ui_hovering(sig)) UI_Tooltip DF_Font(ws, DF_FontSlot_Code) - { - ui_labelf("Parent Key: %I64x, %I64x", row->parent_key.parent_hash, row->parent_key.child_num); - ui_labelf("Hover Key: %I64x, %I64x", row->key.parent_hash, row->key.child_num); - ui_labelf("Cursor Key: %I64x, %I64x", ewv->cursor.key.parent_hash, ewv->cursor.key.child_num); - } - if(DEV_eval_compiler_tooltips && row->depth == 0 && ui_hovering(sig)) UI_Tooltip - { - Temp scratch = scratch_begin(0, 0); - String8 string = row->display_expr; - - // rjf: lex & parse - EVAL_TokenArray tokens = eval_token_array_from_text(scratch.arena, string); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(scratch.arena, &parse_ctx, string, &tokens); - EVAL_ErrorList errors = parse.errors; - ui_labelf("Tokens:"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) for(U64 idx = 0; idx < tokens.count; idx += 1) - { - EVAL_Token *token = tokens.v+idx; - String8 token_string = str8_substr(string, token->range); - String8 token_kind_name = str8_lit("Token"); - switch(token->kind) - { - default:break; - case EVAL_TokenKind_Identifier: {token_kind_name = str8_lit("Identifier");}break; - case EVAL_TokenKind_Numeric: {token_kind_name = str8_lit("Numeric");}break; - case EVAL_TokenKind_StringLiteral:{token_kind_name = str8_lit("StringLiteral");}break; - case EVAL_TokenKind_CharLiteral: {token_kind_name = str8_lit("CharLiteral");}break; - case EVAL_TokenKind_Symbol: {token_kind_name = str8_lit("Symbol");}break; - } - ui_labelf("%S -> \"%S\"", token_kind_name, token_string); - } - - // rjf: produce IR tree & type - EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; - 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.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.rdi, type_key); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(type_string); - } - - scratch_end(scratch); - } // rjf: autocomplete lister if(expr_editing_active && @@ -2712,7 +2666,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { String8 input = str8(edit_state->input_buffer, edit_state->input_size); DF_AutoCompListerParams params = {DF_AutoCompListerFlag_Locals}; - df_set_autocomp_lister_query(ws, sig.box->key, ctrl_ctx, ¶ms, input, edit_state->cursor.column-1); + df_set_autocomp_lister_query(ws, sig.box->key, ¶ms, input, edit_state->cursor.column-1); } } @@ -2746,7 +2700,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS DF_WatchViewPoint pt = {DF_WatchViewColumnKind_Value, row->parent_key, row->key}; DF_WatchViewTextEditState *edit_state = df_watch_view_text_edit_state_from_pt(ewv, pt); B32 cell_selected = (row_selected && selection_tbl.min.x <= pt.column_kind && pt.column_kind <= selection_tbl.max.x); - B32 value_is_error = (row->eval.errors.count != 0); + B32 value_is_error = (row->eval.msgs.max_kind != E_MsgKind_Null); B32 value_is_hook = (!value_is_error && row->value_ui_rule_spec != &df_g_nil_gfx_view_rule_spec && row->value_ui_rule_spec != 0); B32 value_is_complex = (!value_is_error && !value_is_hook && !(row->flags & DF_EvalVizRowFlag_CanEditValue)); B32 value_is_simple = (!value_is_error && !value_is_hook && (row->flags & DF_EvalVizRowFlag_CanEditValue)); @@ -2773,9 +2727,9 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS if(value_is_error) DF_Font(ws, DF_FontSlot_Main) { String8List strings = {0}; - for(EVAL_Error *error = row->eval.errors.first; error != 0; error = error->next) + for(E_Msg *msg = row->eval.msgs.first; msg != 0; msg = msg->next) { - str8_list_push(scratch.arena, &strings, error->text); + str8_list_push(scratch.arena, &strings, msg->text); } StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; String8 error_string = str8_list_join(scratch.arena, &strings, &join); @@ -2788,7 +2742,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash); UI_Parent(box) { - row->value_ui_rule_spec->info.row_ui(ws, row->key, row->eval, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, row->value_ui_rule_node); + row->value_ui_rule_spec->info.row_ui(ws, row->key, row->eval, row->value_ui_rule_node); } sig = ui_signal_from_box(box); } @@ -2835,9 +2789,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS // rjf: double-click, not editable -> go-to-location if(ui_double_clicked(sig) && !(row->flags & DF_EvalVizRowFlag_CanEditValue)) { - U64 vaddr = 0; - if(vaddr == 0) { vaddr = row->eval.offset; } - if(vaddr == 0) { vaddr = row->eval.imm_u64; } + U64 vaddr = row->eval.value.u64; DF_Entity *module = df_module_from_process_vaddr(process, vaddr); DI_Key dbgi_key = df_dbgi_key_from_module(module); U64 voff = df_voff_from_vaddr(module, vaddr); @@ -2866,11 +2818,11 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_FocusActive((cell_selected && ewv->text_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.rdi, key); + E_TypeKey key = row->eval.type_key; + String8 string = e_type_string_from_key(scratch.arena, 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) + if(!e_type_key_match(key, e_type_key_zero())) UI_Parent(box) { df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeType), string); } @@ -2923,7 +2875,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { params.flags = DF_AutoCompListerFlag_ViewRules; } - df_set_autocomp_lister_query(ws, sig.box->key, ctrl_ctx, ¶ms, input, edit_state->cursor.column-1); + df_set_autocomp_lister_query(ws, sig.box->key, ¶ms, input, edit_state->cursor.column-1); } // rjf: double-click -> begin editing @@ -4098,20 +4050,18 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) String8 query = str8(view->query_buffer, view->query_string_size); DI_KeyList dbgi_keys_list = df_push_active_dbgi_key_list(scratch.arena); DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); - FZY_Params params = {FZY_Target_Procedures, dbgi_keys}; + FZY_Params params = {RDI_SectionKind_Procedures, dbgi_keys}; U64 endt_us = os_now_microseconds()+200; //- rjf: grab rdis, make type graphs for each U64 rdis_count = dbgi_keys.count; RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); - TG_Graph **graphs = push_array(scratch.arena, TG_Graph *, rdis_count); { for(U64 idx = 0; idx < rdis_count; idx += 1) { RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], endt_us); RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); rdis[idx] = rdi; - graphs[idx] = tg_graph_begin(rdi_addr_size_from_arch(tli->arch), 256); } } @@ -4195,7 +4145,6 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) //- rjf: determine dbgi/rdi to which this item belongs DI_Key dbgi_key = {0}; RDI_Parsed *rdi = &di_rdi_parsed_nil; - TG_Graph *graph = 0; U64 base_idx = 0; { for(U64 rdi_idx = 0; rdi_idx < rdis_count; rdi_idx += 1) @@ -4206,7 +4155,6 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) { dbgi_key = dbgi_keys.v[rdi_idx]; rdi = rdis[rdi_idx]; - graph = graphs[rdi_idx]; break; } base_idx += procedures_count; @@ -4219,7 +4167,7 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) 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_name_idx(rdi, TypeNodes, procedure->type_idx); - TG_Key type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), procedure->type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, e_idx_from_rdi(rdi)); //- rjf: build item button ui_set_next_hover_cursor(OS_Cursor_HandPoint); @@ -4234,9 +4182,9 @@ DF_VIEW_UI_FUNCTION_DEF(SymbolLister) { UI_Box *box = df_code_label(1.f, 0, df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol), name); ui_box_equip_fuzzy_match_ranges(box, &item->match_ranges); - if(!tg_key_match(tg_key_zero(), type_key) && graph != 0) + if(!e_type_key_match(e_type_key_zero(), type_key)) { - String8 type_string = tg_string_from_key(scratch.arena, graph, rdi, type_key); + String8 type_string = e_type_string_from_key(scratch.arena, type_key); df_code_label(0.5f, 0, df_rgba_from_theme_color(DF_ThemeColor_TextWeak), type_string); } } @@ -5430,7 +5378,6 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); String8 query = str8(view->query_buffer, view->query_string_size); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); //- rjf: get state typedef struct DF_SchedulerViewState DF_SchedulerViewState; @@ -5672,10 +5619,9 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DI_Scope *scope = di_scope_open(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); Architecture arch = df_architecture_from_entity(thread); - DF_Entity *process = thread->parent; + DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); Vec4F32 thread_color = ui_top_palette()->text; if(thread->flags & DF_EntityFlag_HasColor) { @@ -5812,20 +5758,19 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) U64 rip_vaddr = regs_rip_from_arch_block(thread->arch, row->regs); DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); B32 frame_valid = (rip_vaddr != 0); - TG_Graph *graph = tg_graph_begin(bit_size_from_arch(thread->arch)/8, 256); String8 symbol_name = {0}; String8 symbol_type_string = {0}; if(row->procedure != 0) { symbol_name.str = rdi_name_from_procedure(row->rdi, row->procedure, &symbol_name.size); RDI_TypeNode *type = rdi_element_from_name_idx(row->rdi, TypeNodes, row->procedure->type_idx); - symbol_type_string = tg_string_from_key(scratch.arena, graph, row->rdi, tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), row->procedure->type_idx)); + symbol_type_string = e_type_string_from_key(scratch.arena, e_type_key_ext(e_type_kind_from_rdi(type->kind), row->procedure->type_idx, e_idx_from_rdi(row->rdi))); } if(row->inline_site != 0) { symbol_name.str = rdi_string_from_idx(row->rdi, row->inline_site->name_string_idx, &symbol_name.size); RDI_TypeNode *type = rdi_element_from_name_idx(row->rdi, TypeNodes, row->inline_site->type_idx); - symbol_type_string = tg_string_from_key(scratch.arena, graph, row->rdi, tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), row->inline_site->type_idx)); + symbol_type_string = e_type_string_from_key(scratch.arena, e_type_key_ext(e_type_kind_from_rdi(type->kind), row->inline_site->type_idx, e_idx_from_rdi(row->rdi))); } // rjf: build row @@ -5840,8 +5785,8 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) UI_FocusHot((row_selected && cs->cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) { String8 selected_string = {0}; - if(ctrl_ctx.unwind_count == row->unwind_idx && - ctrl_ctx.inline_depth == row->inline_depth) + if(df_interact_regs()->unwind_count == row->unwind_idx && + df_interact_regs()->inline_depth == row->inline_depth) { selected_string = df_g_icon_kind_text_table[DF_IconKind_RightArrow]; ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = thread_color)); @@ -7259,8 +7204,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) ////////////////////////////// //- rjf: unpack entity params // - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); + DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); ////////////////////////////// @@ -7586,6 +7530,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) //- rjf: fill local variable annotations { + DI_Scope *scope = di_scope_open(); Vec4F32 color_gen_table[] = { df_rgba_from_theme_color(DF_ThemeColor_Thread0), @@ -7597,19 +7542,16 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) df_rgba_from_theme_color(DF_ThemeColor_Thread6), df_rgba_from_theme_color(DF_ThemeColor_Thread7), }; - DI_Scope *scope = di_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 *rdi = parse_ctx.rdi; - for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next) + U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, df_interact_regs()->unwind_count); + for(E_String2NumMapNode *n = e_ctx()->locals_map->first; n != 0; n = n->order_next) { String8 local_name = n->string; - DF_Eval local_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, local_name); - if(local_eval.mode == EVAL_EvalMode_Addr) + E_Eval local_eval = e_eval_from_string(scratch.arena, local_name); + if(local_eval.mode == E_Mode_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, rdi, local_eval.type_key); - Rng1U64 vaddr_rng = r1u64(local_eval.offset, local_eval.offset+local_eval_type_size); + E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.type_key); + U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.type_key); + Rng1U64 vaddr_rng = r1u64(local_eval.value.u64, local_eval.value.u64+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) { @@ -7617,7 +7559,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.rdi, local_eval.type_key); + annotation->type_string = e_type_string_from_key(scratch.arena, local_eval.type_key); annotation->color = color_gen_table[(vaddr_rng.min/8)%ArrayCount(color_gen_table)]; annotation->vaddr_range = vaddr_rng; } diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 8f101ffb..71edd063 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -555,13 +555,13 @@ internal DF_WatchViewPoint df_watch_view_point_from_tbl(DF_EvalVizBlockList *blo internal Vec2S64 df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt); //- rjf: table coordinates -> strings -internal String8 df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable); +internal String8 df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable); //- rjf: table coordinates -> text edit state internal DF_WatchViewTextEditState *df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint pt); //- rjf: windowed watch tree visualization -internal DF_EvalVizBlockList df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, FZY_Scope *fzy_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_WatchViewState *ews); +internal DF_EvalVizBlockList df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, FZY_Scope *fzy_scope, DF_View *view, DF_WatchViewState *ews); //- rjf: eval/watch views main hooks internal void df_watch_view_init(DF_WatchViewState *ewv, DF_View *view, DF_WatchViewFillKind fill_kind); diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 3110fc85..f3c22087 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -918,6 +918,7 @@ e_push_expr(Arena *arena, E_ExprKind kind, void *location) e->first = e->last = e->next = &e_expr_nil; e->location = location; e->kind = kind; + return e; } internal void @@ -927,7 +928,13 @@ e_expr_push_child(E_Expr *parent, E_Expr *child) } //////////////////////////////// -//~ rjf: Context Selection Functions (Required For All Subsequent APIs) +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_Ctx * +e_ctx(void) +{ + return e_state->ctx; +} internal void e_select_ctx(E_Ctx *ctx) @@ -947,6 +954,21 @@ e_select_ctx(E_Ctx *ctx) e_state->cons_key_slots = push_array(e_state->arena, E_ConsTypeSlot, e_state->cons_key_slots_count); } +internal U32 +e_idx_from_rdi(RDI_Parsed *rdi) +{ + U32 result = 0; + for(U64 idx = 0; idx < e_state->ctx->rdis_count; idx += 1) + { + if(e_state->ctx->rdis[idx] == rdi) + { + result = (U32)idx; + break; + } + } + return result; +} + //////////////////////////////// //~ rjf: Type Operation Functions @@ -972,8 +994,15 @@ e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx) { E_TypeKey key = {E_TypeKeyKind_Ext}; key.u32[0] = (U32)kind; - key.u32[1] = type_idx; - key.u32[2] = rdi_idx; + if(E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) + { + key.kind = E_TypeKeyKind_Basic; + } + else + { + key.u32[1] = type_idx; + key.u32[2] = rdi_idx; + } return key; } @@ -1138,7 +1167,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); if(rdi_type->kind != RDI_TypeKind_NULL) { - E_TypeKind kind = e_kind_from_rdi_type_kind(rdi_type->kind); + E_TypeKind kind = e_type_kind_from_rdi(rdi_type->kind); //- rjf: record types => unpack name * members & produce if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord) @@ -1165,9 +1194,9 @@ e_type_from_key(Arena *arena, E_TypeKey key) RDI_Member *src = rdi_element_from_name_idx(rdi, Members, member_idx); E_TypeKind member_type_kind = E_TypeKind_Null; RDI_TypeNode *member_type = rdi_element_from_name_idx(rdi, TypeNodes, src->type_idx); - member_type_kind = e_kind_from_rdi_type_kind(member_type->kind); + member_type_kind = e_type_kind_from_rdi(member_type->kind); E_Member *dst = &members[member_idx-udt->member_first]; - dst->kind = e_member_kind_from_rdi_member_kind(src->kind); + dst->kind = e_member_kind_from_rdi(src->kind); dst->type_key = e_type_key_ext(member_type_kind, src->type_idx, rdi_idx); dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size); dst->off = (U64)src->off; @@ -1196,7 +1225,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) if(rdi_type->user_defined.direct_type_idx < type_node_idx) { RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx); - E_TypeKind direct_type_kind = e_kind_from_rdi_type_kind(direct_type_node->kind); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_idx); } @@ -1239,7 +1268,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) if(rdi_type->constructed.direct_type_idx < type_node_idx) { RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.direct_type_idx); - E_TypeKind direct_type_kind = e_kind_from_rdi_type_kind(direct_type_node->kind); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->constructed.direct_type_idx, rdi_idx); direct_type_is_good = 1; direct_type_byte_size = (U64)direct_type_node->byte_size; @@ -1303,7 +1332,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) if(param_type_idx < type_node_idx) { RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx); - E_TypeKind param_kind = e_kind_from_rdi_type_kind(param_type_node->kind); + E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind); type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_idx); } else @@ -1336,7 +1365,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) if(param_type_idx < type_node_idx) { RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx); - E_TypeKind param_kind = e_kind_from_rdi_type_kind(param_type_node->kind); + E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind); type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_idx); } else @@ -1359,7 +1388,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) if(rdi_type->constructed.owner_type_idx < type_node_idx) { RDI_TypeNode *owner_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.owner_type_idx); - E_TypeKind owner_type_kind = e_kind_from_rdi_type_kind(owner_type_node->kind); + E_TypeKind owner_type_kind = e_type_kind_from_rdi(owner_type_node->kind); owner_type_key = e_type_key_ext(owner_type_kind, rdi_type->constructed.owner_type_idx, rdi_idx); } type = push_array(arena, E_Type, 1); @@ -1384,7 +1413,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) if(rdi_type->user_defined.direct_type_idx < type_node_idx) { RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx); - E_TypeKind direct_type_kind = e_kind_from_rdi_type_kind(direct_type_node->kind); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_idx); direct_type_byte_size = direct_type_node->byte_size; } @@ -1406,7 +1435,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) if(rdi_type->bitfield.direct_type_idx < type_node_idx) { RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->bitfield.direct_type_idx); - E_TypeKind direct_type_kind = e_kind_from_rdi_type_kind(direct_type_node->kind); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->bitfield.direct_type_idx, rdi_idx); direct_type_byte_size = direct_type_node->byte_size; } @@ -1669,6 +1698,38 @@ e_type_owner_from_key(E_TypeKey key) return result; } +internal E_TypeKey +e_type_ptee_from_key(E_TypeKey key) +{ + E_TypeKey result = key; + B32 passed_ptr = 0; + for(;;) + { + E_TypeKind kind = e_type_kind_from_key(result); + result = e_type_direct_from_key(result); + if(kind == E_TypeKind_Ptr || kind == E_TypeKind_LRef || kind == E_TypeKind_RRef) + { + passed_ptr = 1; + } + E_TypeKind next_kind = e_type_kind_from_key(result); + if(passed_ptr && + next_kind != E_TypeKind_IncompleteStruct && + next_kind != E_TypeKind_IncompleteUnion && + next_kind != E_TypeKind_IncompleteEnum && + next_kind != E_TypeKind_IncompleteClass && + next_kind != E_TypeKind_Alias && + next_kind != E_TypeKind_Modifier) + { + break; + } + if(kind == E_TypeKind_Null) + { + break; + } + } + return result; +} + internal E_TypeKey e_type_unwrap_enum(E_TypeKey key) { @@ -2369,6 +2430,30 @@ e_type_from_expr(E_Expr *expr) return result; } +internal void +e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr) +{ + switch(expr->kind) + { + default: + { + for(E_Expr *child = expr->first; child != &e_expr_nil; child = child->next) + { + e_push_leaf_ident_exprs_from_expr__in_place(arena, map, child); + } + }break; + case E_ExprKind_Define: + { + E_Expr *exprl = expr->first; + E_Expr *exprr = exprl->next; + if(exprl->kind == E_ExprKind_LeafIdent) + { + e_string2expr_map_insert(arena, map, exprl->string, exprr); + } + }break; + } +} + internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) { @@ -2814,7 +2899,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to U32 match_idx = matches[matches_count-1]; RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, match_idx); E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff); + e_oplist_push(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff); loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_bytecode = e_bytecode_from_oplist(arena, &oplist); U32 type_idx = global_var->type_idx; @@ -2851,7 +2936,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to U32 match_idx = matches[0]; RDI_ThreadVariable *thread_var = rdi_element_from_name_idx(rdi, ThreadVariables, match_idx); E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off); + e_oplist_push(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off); loc_kind = RDI_LocationKind_AddrBytecodeStream; loc_bytecode = e_bytecode_from_oplist(arena, &oplist); U32 type_idx = thread_var->type_idx; @@ -2890,7 +2975,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); U64 voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first); E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff); + e_oplist_push(arena, &oplist, RDI_EvalOp_ModuleOff, voff); loc_kind = RDI_LocationKind_ValBytecodeStream; loc_bytecode = e_bytecode_from_oplist(arena, &oplist); U32 type_idx = procedure->type_idx; @@ -2977,9 +3062,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to E_OpList oplist = {0}; U64 byte_size = bit_size_from_arch(e_state->ctx->arch)/8; U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0); + e_oplist_push(arena, &oplist, RDI_EvalOp_RegRead, regread_param); + e_oplist_push(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); + e_oplist_push(arena, &oplist, RDI_EvalOp_Add, 0); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom->mode = E_Mode_Addr; atom->type_key = type_key; @@ -2990,10 +3075,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to E_OpList oplist = {0}; U64 byte_size = bit_size_from_arch(e_state->ctx->arch)/8; U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(e_state->ctx->arch)/8); + e_oplist_push(arena, &oplist, RDI_EvalOp_RegRead, regread_param); + e_oplist_push(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); + e_oplist_push(arena, &oplist, RDI_EvalOp_Add, 0); + e_oplist_push(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(e_state->ctx->arch)/8); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom->mode = E_Mode_Addr; atom->type_key = type_key; @@ -3007,7 +3092,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to U64 byte_size = (U64)reg_rng.byte_size; U64 byte_pos = 0; U64 regread_param = RDI_EncodeRegReadParam(loc_reg.reg_code, byte_size, byte_pos); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); + e_oplist_push(arena, &oplist, RDI_EvalOp_RegRead, regread_param); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom->mode = E_Mode_Value; atom->type_key = type_key; @@ -4538,10 +4623,10 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) //////////////////////////////// //~ rjf: Interpretation Functions -internal E_Result +internal E_Interpretation e_interpret(String8 bytecode) { - E_Result result = {0}; + E_Interpretation result = {0}; Temp scratch = scratch_begin(0, 0); //- rjf: allocate stack @@ -4558,7 +4643,7 @@ e_interpret(String8 bytecode) RDI_EvalOp op = (RDI_EvalOp)*ptr; if(op >= RDI_EvalOp_COUNT) { - result.code = E_ResultCode_BadOp; + result.code = E_InterpretationCode_BadOp; goto done; } U8 ctrlbits = rdi_eval_op_ctrlbits_table[op]; @@ -4571,7 +4656,7 @@ e_interpret(String8 bytecode) U8 *next_ptr = ptr + decode_size; if(next_ptr > opl) { - result.code = E_ResultCode_BadOp; + result.code = E_InterpretationCode_BadOp; goto done; } // TODO(rjf): guarantee 8 bytes padding after the end of serialized @@ -4592,7 +4677,7 @@ e_interpret(String8 bytecode) U32 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); if(pop_count > stack_count) { - result.code = E_ResultCode_BadOp; + result.code = E_InterpretationCode_BadOp; goto done; } if(pop_count <= stack_count) @@ -4638,7 +4723,7 @@ e_interpret(String8 bytecode) } if(!good_read) { - result.code = E_ResultCode_BadMemRead; + result.code = E_InterpretationCode_BadMemRead; goto done; } }break; @@ -4658,7 +4743,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadRegRead; + result.code = E_InterpretationCode_BadRegRead; goto done; } }break; @@ -4673,7 +4758,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadRegRead; + result.code = E_InterpretationCode_BadRegRead; goto done; } }break; @@ -4686,7 +4771,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadFrameBase; + result.code = E_InterpretationCode_BadFrameBase; goto done; } }break; @@ -4699,7 +4784,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadModuleBase; + result.code = E_InterpretationCode_BadModuleBase; goto done; } }break; @@ -4712,7 +4797,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadTLSBase; + result.code = E_InterpretationCode_BadTLSBase; goto done; } }break; @@ -4827,7 +4912,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_DivideByZero; + result.code = E_InterpretationCode_DivideByZero; goto done; } } @@ -4839,7 +4924,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_DivideByZero; + result.code = E_InterpretationCode_DivideByZero; goto done; } } @@ -4852,13 +4937,13 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_DivideByZero; + result.code = E_InterpretationCode_DivideByZero; goto done; } } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4875,7 +4960,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4889,7 +4974,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4906,7 +4991,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4920,7 +5005,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4934,7 +5019,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4948,7 +5033,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4962,7 +5047,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4976,7 +5061,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -4990,7 +5075,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -5004,7 +5089,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -5039,7 +5124,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -5064,7 +5149,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -5089,7 +5174,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -5114,7 +5199,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOpTypes; + result.code = E_InterpretationCode_BadOpTypes; goto done; } }break; @@ -5213,7 +5298,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOp; + result.code = E_InterpretationCode_BadOp; goto done; } }break; @@ -5238,7 +5323,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_BadOp; + result.code = E_InterpretationCode_BadOp; goto done; } }break; @@ -5256,7 +5341,7 @@ e_interpret(String8 bytecode) } else { - result.code = E_ResultCode_InsufficientStackSpace; + result.code = E_InterpretationCode_InsufficientStackSpace; goto done; } } @@ -5268,11 +5353,201 @@ e_interpret(String8 bytecode) { result.value = stack[0]; } - else if(result.code == E_ResultCode_Good) + else if(result.code == E_InterpretationCode_Good) { - result.code = E_ResultCode_MalformedBytecode; + result.code = E_InterpretationCode_MalformedBytecode; } scratch_end(scratch); return result; } + +//////////////////////////////// +//~ rjf: Bundled Evaluation Functions + +internal E_Eval +e_eval_from_string(Arena *arena, String8 string) +{ + E_TokenArray tokens = e_token_array_from_text(arena, string); + E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, parse.expr); + E_OpList oplist = e_oplist_from_irtree(arena, irtree.root); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + E_Interpretation interp = e_interpret(bytecode); + E_Eval eval = + { + .value = interp.value, + .mode = irtree.mode, + .type_key = irtree.type_key, + .code = interp.code, + }; + e_msg_list_concat_in_place(&eval.msgs, &parse.msgs); + e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs); + if(E_InterpretationCode_Good < eval.code && eval.code < E_InterpretationCode_COUNT) + { + e_msg(arena, &eval.msgs, E_MsgKind_InterpretationError, 0, e_interpretation_code_display_strings[eval.code]); + } + return eval; +} + +internal E_Eval +e_autoresolved_eval_from_eval(E_Eval eval) +{ + if(e_state->ctx->rdis_count > 0 && + e_state->ctx->module_base != 0 && + (eval.mode == E_Mode_Value || eval.mode == E_Mode_Reg) && + (e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S64)) || + e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U64)) || + e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S32)) || + e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U32)))) + { + U64 vaddr = eval.value.u64; + U64 voff = vaddr - e_state->ctx->module_base[0]; + RDI_Parsed *rdi = e_state->ctx->rdis[0]; + RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); + U32 string_idx = 0; + if(string_idx == 0) { string_idx = procedure->name_string_idx; } + if(string_idx == 0) { string_idx = gvar->name_string_idx; } + if(string_idx != 0) + { + eval.type_key = e_type_key_cons(E_TypeKind_Ptr, e_type_key_basic(E_TypeKind_Void), 0); + } + } + return eval; +} + +internal E_Eval +e_dynamically_typed_eval_from_eval(E_Eval eval) +{ + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(e_state->ctx->memory_read != 0 && + e_state->ctx->module_base != 0 && + type_kind == E_TypeKind_Ptr) + { + Temp scratch = scratch_begin(0, 0); + E_TypeKey ptee_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))); + E_TypeKind ptee_type_kind = e_type_kind_from_key(ptee_type_key); + if(ptee_type_kind == E_TypeKind_Struct || ptee_type_kind == E_TypeKind_Class) + { + E_Type *ptee_type = e_type_from_key(scratch.arena, ptee_type_key); + B32 has_vtable = 0; + for(U64 idx = 0; idx < ptee_type->count; idx += 1) + { + if(ptee_type->members[idx].kind == E_MemberKind_VirtualMethod) + { + has_vtable = 1; + break; + } + } + if(has_vtable) + { + U64 ptr_vaddr = eval.value.u64; + U64 addr_size = bit_size_from_arch(e_state->ctx->arch)/8; + U64 class_base_vaddr = 0; + U64 vtable_vaddr = 0; + if(e_state->ctx->memory_read(e_state->ctx->memory_read_user_data, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && + e_state->ctx->memory_read(e_state->ctx->memory_read_user_data, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) + { + U32 rdi_idx = 0; + RDI_Parsed *rdi = 0; + U64 module_base = 0; + for(U64 idx = 0; idx < e_state->ctx->rdis_count; idx += 1) + { + if(contains_1u64(e_state->ctx->rdis_vaddr_ranges[idx], vtable_vaddr)) + { + rdi_idx = (U32)idx; + rdi = e_state->ctx->rdis[idx]; + module_base = e_state->ctx->rdis_vaddr_ranges[idx].min; + break; + } + } + if(rdi != 0) + { + U64 vtable_voff = vtable_vaddr - module_base; + U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); + RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); + if(global_var->link_flags & RDI_LinkFlag_TypeScoped) + { + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); + RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); + E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx); + E_TypeKey ptr_to_derived_type_key = e_type_key_cons(E_TypeKind_Ptr, derived_type_key, 0); + eval.type_key = ptr_to_derived_type_key; + } + } + } + } + } + scratch_end(scratch); + } + return eval; +} + +internal E_Eval +e_value_eval_from_eval(E_Eval eval) +{ + switch(eval.mode) + { + //- rjf: no work to be done. already in value mode + default: + case E_Mode_Value:{}break; + + //- rjf: address => resolve into value, if leaf + case E_Mode_Addr: + if(e_state->ctx->memory_read != 0) + { + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + U64 type_byte_size = e_type_byte_size_from_key(type_key); + Rng1U64 value_vaddr_range = r1u64(eval.value.u64, eval.value.u64 + type_byte_size); + MemoryZeroStruct(&eval.value); + if(!e_type_key_match(type_key, e_type_key_zero()) && + type_byte_size <= sizeof(E_Value) && + e_state->ctx->memory_read(e_state->ctx->memory_read_user_data, &eval.value, value_vaddr_range)) + { + eval.mode = E_Mode_Value; + + // rjf: mask&shift, for bitfields + if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64)) + { + Temp scratch = scratch_begin(0, 0); + E_Type *type = e_type_from_key(scratch.arena, type_key); + U64 valid_bits_mask = 0; + for(U64 idx = 0; idx < type->count; idx += 1) + { + valid_bits_mask |= (1<> type->off; + eval.value.u64 = eval.value.u64 & valid_bits_mask; + eval.type_key = type->direct_type_key; + scratch_end(scratch); + } + + // rjf: manually sign-extend + switch(type_kind) + { + default: break; + case E_TypeKind_S8: {eval.value.s64 = (S64)*((S8 *)&eval.value.u64);}break; + case E_TypeKind_S16: {eval.value.s64 = (S64)*((S16 *)&eval.value.u64);}break; + case E_TypeKind_S32: {eval.value.s64 = (S64)*((S32 *)&eval.value.u64);}break; + } + } + }break; + + //- rjf: register => resolve into value + case E_Mode_Reg: + { + E_TypeKey type_key = eval.type_key; + U64 type_byte_size = e_type_byte_size_from_key(type_key); + U64 reg_off = eval.value.u64; + MemoryZeroStruct(&eval.value); + MemoryCopy(&eval.value.u256, ((U8 *)e_state->ctx->reg_data + reg_off), Min(type_byte_size, sizeof(U64)*4)); + eval.mode = E_Mode_Value; + }break; + } + + return eval; +} diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index 5df65b63..51cd0925 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -298,27 +298,6 @@ struct E_OpList U64 encoded_size; }; -//////////////////////////////// -//~ rjf: Evaluation Types - -typedef union E_Value E_Value; -union E_Value -{ - U64 u256[4]; - U64 u128[2]; - U64 u64; - S64 s64; - F64 f64; - F32 f32; -}; - -typedef struct E_Result E_Result; -struct E_Result -{ - E_Value value; - E_ResultCode code; -}; - //////////////////////////////// //~ rjf: Map Types @@ -416,6 +395,7 @@ struct E_Ctx // rjf: debug info RDI_Parsed **rdis; + Rng1U64 *rdis_vaddr_ranges; U64 rdis_count; // rjf: identifier resolution maps @@ -463,9 +443,46 @@ struct E_Parse E_MsgList msgs; }; +//////////////////////////////// +//~ rjf: Bytecode Interpretation Types + +typedef union E_Value E_Value; +union E_Value +{ + U64 u512[8]; + U64 u256[4]; + U64 u128[2]; + U64 u64; + S64 s64; + F64 f64; + F32 f32; +}; + +typedef struct E_Interpretation E_Interpretation; +struct E_Interpretation +{ + E_Value value; + E_InterpretationCode code; +}; + +//////////////////////////////// +//~ rjf: Bundled Evaluation Path Types + +typedef struct E_Eval E_Eval; +struct E_Eval +{ + E_Value value; + E_Mode mode; + E_TypeKey type_key; + E_InterpretationCode code; + E_MsgList msgs; +}; + //////////////////////////////// //~ rjf: Globals +global read_only E_String2NumMap e_string2num_map_nil = {0}; +global read_only E_String2ExprMap e_string2expr_map_nil = {0}; global read_only E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil}; global read_only E_Type e_type_nil = {E_TypeKind_Null}; global read_only E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil}; @@ -540,9 +557,11 @@ internal E_Expr *e_push_expr(Arena *arena, E_ExprKind kind, void *location); internal void e_expr_push_child(E_Expr *parent, E_Expr *child); //////////////////////////////// -//~ rjf: Context Selection Functions (Required For All Subsequent APIs) +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) +internal E_Ctx *e_ctx(void); internal void e_select_ctx(E_Ctx *ctx); +internal U32 e_idx_from_rdi(RDI_Parsed *rdi); //////////////////////////////// //~ rjf: Type Operation Functions @@ -564,6 +583,7 @@ internal U64 e_type_byte_size_from_key(E_TypeKey key); internal E_Type *e_type_from_key(Arena *arena, E_TypeKey key); internal E_TypeKey e_type_direct_from_key(E_TypeKey key); internal E_TypeKey e_type_owner_from_key(E_TypeKey key); +internal E_TypeKey e_type_ptee_from_key(E_TypeKey key); internal E_TypeKey e_type_unwrap_enum(E_TypeKey key); internal E_TypeKey e_type_unwrap(E_TypeKey key); internal E_TypeKey e_type_promote(E_TypeKey key); @@ -584,6 +604,7 @@ internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src); internal E_TypeKey e_leaf_type_from_name(String8 name); internal E_TypeKey e_type_from_expr(E_Expr *expr); +internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr); internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence); internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); @@ -626,6 +647,14 @@ internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist); //////////////////////////////// //~ rjf: Interpretation Functions -internal E_Result e_interpret(String8 bytecode); +internal E_Interpretation e_interpret(String8 bytecode); + +//////////////////////////////// +//~ rjf: Bundled Evaluation Functions + +internal E_Eval e_eval_from_string(Arena *arena, String8 string); +internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval); +internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval); +internal E_Eval e_value_eval_from_eval(E_Eval eval); #endif // EVAL_H diff --git a/src/eval2/eval2.mdesk b/src/eval2/eval2.mdesk index 690e345c..64605d3d 100644 --- a/src/eval2/eval2.mdesk +++ b/src/eval2/eval2.mdesk @@ -115,7 +115,7 @@ E_ExprKindTable: } @table(name display_string) -E_ResultCodeTable: +E_InterpretationCodeTable: { { Good "" } { DivideByZero "Cannot divide by zero." } @@ -152,9 +152,9 @@ E_ResultCodeTable: COUNT, } -@enum E_ResultCode: +@enum E_InterpretationCode: { - @expand(E_ResultCodeTable a) `$(a.name)`, + @expand(E_InterpretationCodeTable a) `$(a.name)`, COUNT, } @@ -164,9 +164,9 @@ e_expr_kind_strings: @expand(E_ExprKindTable a) `str8_lit_comp("$(a.name)")` } -@data(String8) e_result_code_display_strings: +@data(String8) e_interpretation_code_display_strings: { - @expand(E_ResultCodeTable a) `str8_lit_comp("$(a.display_string)")` + @expand(E_InterpretationCodeTable a) `str8_lit_comp("$(a.display_string)")` } @data(String8) e_expr_op_strings: diff --git a/src/eval2/generated/eval2.meta.c b/src/eval2/generated/eval2.meta.c index 0729f745..f665bfb6 100644 --- a/src/eval2/generated/eval2.meta.c +++ b/src/eval2/generated/eval2.meta.c @@ -48,7 +48,7 @@ str8_lit_comp("Define"), str8_lit_comp("LeafIdent"), }; -String8 e_result_code_display_strings[11] = +String8 e_interpretation_code_display_strings[11] = { str8_lit_comp(""), str8_lit_comp("Cannot divide by zero."), diff --git a/src/eval2/generated/eval2.meta.h b/src/eval2/generated/eval2.meta.h index 791225a6..5e2889b2 100644 --- a/src/eval2/generated/eval2.meta.h +++ b/src/eval2/generated/eval2.meta.h @@ -121,25 +121,25 @@ E_ExprKind_LeafIdent, E_ExprKind_COUNT, } E_ExprKindEnum; -typedef enum E_ResultCode +typedef enum E_InterpretationCode { -E_ResultCode_Good, -E_ResultCode_DivideByZero, -E_ResultCode_BadOp, -E_ResultCode_BadOpTypes, -E_ResultCode_BadMemRead, -E_ResultCode_BadRegRead, -E_ResultCode_BadFrameBase, -E_ResultCode_BadModuleBase, -E_ResultCode_BadTLSBase, -E_ResultCode_InsufficientStackSpace, -E_ResultCode_MalformedBytecode, -E_ResultCode_COUNT, -} E_ResultCode; +E_InterpretationCode_Good, +E_InterpretationCode_DivideByZero, +E_InterpretationCode_BadOp, +E_InterpretationCode_BadOpTypes, +E_InterpretationCode_BadMemRead, +E_InterpretationCode_BadRegRead, +E_InterpretationCode_BadFrameBase, +E_InterpretationCode_BadModuleBase, +E_InterpretationCode_BadTLSBase, +E_InterpretationCode_InsufficientStackSpace, +E_InterpretationCode_MalformedBytecode, +E_InterpretationCode_COUNT, +} E_InterpretationCode; C_LINKAGE_BEGIN extern String8 e_expr_kind_strings[40]; -extern String8 e_result_code_display_strings[11]; +extern String8 e_interpretation_code_display_strings[11]; extern String8 e_expr_op_strings[40]; extern U8 e_kind_basic_byte_size_table[54]; extern String8 e_kind_basic_string_table[54]; diff --git a/src/fuzzy_search/fuzzy_search.c b/src/fuzzy_search/fuzzy_search.c index e5a88e57..406ce42f 100644 --- a/src/fuzzy_search/fuzzy_search.c +++ b/src/fuzzy_search/fuzzy_search.c @@ -44,34 +44,34 @@ fzy_item_num_from_array_element_idx__linear_search(FZY_ItemArray *array, U64 ele } internal String8 -fzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, FZY_Target target, U64 element_idx) +fzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, RDI_SectionKind target, U64 element_idx) { String8 result = {0}; switch(target) { - // NOTE(rjf): no default - warn if we miss a case - case FZY_Target_Procedures: + default:{}break; + case RDI_SectionKind_Procedures: { RDI_Procedure *proc = rdi_element_from_name_idx(rdi, Procedures, element_idx); U64 name_size = 0; U8 *name_base = rdi_string_from_idx(rdi, proc->name_string_idx, &name_size); result = str8(name_base, name_size); }break; - case FZY_Target_GlobalVariables: + case RDI_SectionKind_GlobalVariables: { RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, element_idx); U64 name_size = 0; U8 *name_base = rdi_string_from_idx(rdi, gvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; - case FZY_Target_ThreadVariables: + case RDI_SectionKind_ThreadVariables: { RDI_ThreadVariable *tvar = rdi_element_from_name_idx(rdi, ThreadVariables, element_idx); U64 name_size = 0; U8 *name_base = rdi_string_from_idx(rdi, tvar->name_string_idx, &name_size); result = str8(name_base, name_size); }break; - case FZY_Target_UDTs: + case RDI_SectionKind_UDTs: { RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, element_idx); RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); @@ -79,7 +79,6 @@ fzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, FZY_Target target, 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 FZY_Target_COUNT:{}break; } return result; } @@ -372,7 +371,7 @@ fzy_search_thread__entry_point(void *p) B32 task_is_good = 0; Arena *task_arena = 0; String8 query = {0}; - FZY_Params params = {FZY_Target_Procedures}; + FZY_Params params = {RDI_SectionKind_Procedures}; U64 initial_submit_gen = 0; OS_MutexScopeW(stripe->rw_mutex) { @@ -407,32 +406,27 @@ fzy_search_thread__entry_point(void *p) //////////////////////////// //- rjf: search target -> info about search space // - RDI_SectionKind section_kind = RDI_SectionKind_NULL; U64 element_name_idx_off = 0; if(task_is_good) { switch(params.target) { - // NOTE(rjf): no default! - case FZY_Target_COUNT:{}break; - case FZY_Target_Procedures: + default:{}break; + case RDI_SectionKind_Procedures: { - section_kind = RDI_SectionKind_Procedures; element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx); }break; - case FZY_Target_GlobalVariables: + case RDI_SectionKind_GlobalVariables: { - section_kind = RDI_SectionKind_GlobalVariables; element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx); }break; - case FZY_Target_ThreadVariables: + case RDI_SectionKind_ThreadVariables: { - section_kind = RDI_SectionKind_ThreadVariables; element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx); }break; - case FZY_Target_UDTs: + case RDI_SectionKind_UDTs: { - section_kind = RDI_SectionKind_UDTs; + // NOTE(rjf): name must be determined from self_type_idx }break; } } @@ -448,13 +442,13 @@ fzy_search_thread__entry_point(void *p) { RDI_Parsed *rdi = rdis[rdi_idx]; U64 element_count = 0; - void *table_base = rdi_section_raw_table_from_kind(rdi, section_kind, &element_count); - U64 element_size = rdi_section_element_size_table[section_kind]; + void *table_base = rdi_section_raw_table_from_kind(rdi, params.target, &element_count); + U64 element_size = rdi_section_element_size_table[params.target]; for(U64 idx = 1; task_is_good && idx < element_count; idx += 1) { void *element = (U8 *)table_base + element_size*idx; U32 *name_idx_ptr = (U32 *)((U8 *)element + element_name_idx_off); - if(params.target == FZY_Target_UDTs) + if(params.target == RDI_SectionKind_UDTs) { RDI_UDT *udt = (RDI_UDT *)element; RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); diff --git a/src/fuzzy_search/fuzzy_search.h b/src/fuzzy_search/fuzzy_search.h index 931311ed..00a379b9 100644 --- a/src/fuzzy_search/fuzzy_search.h +++ b/src/fuzzy_search/fuzzy_search.h @@ -43,20 +43,10 @@ struct FZY_ItemArray //////////////////////////////// //~ rjf: Search Parameter Types -typedef enum FZY_Target -{ - FZY_Target_Procedures, - FZY_Target_GlobalVariables, - FZY_Target_ThreadVariables, - FZY_Target_UDTs, - FZY_Target_COUNT -} -FZY_Target; - typedef struct FZY_Params FZY_Params; struct FZY_Params { - FZY_Target target; + RDI_SectionKind target; DI_KeyArray dbgi_keys; }; @@ -169,7 +159,7 @@ thread_static FZY_TCTX *fzy_tctx = 0; internal U64 fzy_hash_from_string(U64 seed, String8 string); internal U64 fzy_hash_from_params(FZY_Params *params); internal U64 fzy_item_num_from_array_element_idx__linear_search(FZY_ItemArray *array, U64 element_idx); -internal String8 fzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, FZY_Target target, U64 element_idx); +internal String8 fzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, RDI_SectionKind target, U64 element_idx); internal FZY_Params fzy_params_copy(Arena *arena, FZY_Params *src); //////////////////////////////// diff --git a/src/lib_rdi_format/rdi_format_parse.c b/src/lib_rdi_format/rdi_format_parse.c index 5d981b3e..937aca78 100644 --- a/src/lib_rdi_format/rdi_format_parse.c +++ b/src/lib_rdi_format/rdi_format_parse.c @@ -643,6 +643,16 @@ rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) return procedure; } +//- global variables + +RDI_PROC RDI_GlobalVariable * +rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff) +{ + RDI_U32 idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff); + RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, idx); + return gvar; +} + //- units RDI_PROC RDI_Unit * diff --git a/src/lib_rdi_format/rdi_format_parse.h b/src/lib_rdi_format/rdi_format_parse.h index 509f9580..8bb6b9ca 100644 --- a/src/lib_rdi_format/rdi_format_parse.h +++ b/src/lib_rdi_format/rdi_format_parse.h @@ -191,6 +191,9 @@ RDI_PROC RDI_U64 rdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); RDI_PROC RDI_Scope *rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff); RDI_PROC RDI_Procedure *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +//- global variables +RDI_PROC RDI_GlobalVariable *rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff); + //- units RDI_PROC RDI_Unit *rdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff); RDI_PROC RDI_LineTable *rdi_line_table_from_unit(RDI_Parsed *rdi, RDI_Unit *unit); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 4030414c..2675bafd 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 +#define BUILD_VERSION_PATCH 12 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "The RAD Debugger" #define OS_FEATURE_GRAPHICAL 1 @@ -50,12 +50,12 @@ #include "rdi_from_pdb/rdi_from_pdb.h" #include "regs/regs.h" #include "regs/rdi/regs_rdi.h" -#include "type_graph/type_graph.h" +//#include "type_graph/type_graph.h" #include "dbgi/dbgi.h" #include "dasm_cache/dasm_cache.h" #include "fuzzy_search/fuzzy_search.h" #include "demon/demon_inc.h" -#include "eval/eval_inc.h" +//#include "eval/eval_inc.h" #include "eval2/eval2.h" #include "ctrl/ctrl_inc.h" #include "font_provider/font_provider_inc.h" @@ -91,12 +91,12 @@ #include "rdi_from_pdb/rdi_from_pdb.c" #include "regs/regs.c" #include "regs/rdi/regs_rdi.c" -#include "type_graph/type_graph.c" +//#include "type_graph/type_graph.c" #include "dbgi/dbgi.c" #include "dasm_cache/dasm_cache.c" #include "fuzzy_search/fuzzy_search.c" #include "demon/demon_inc.c" -#include "eval/eval_inc.c" +//#include "eval/eval_inc.c" #include "eval2/eval2.c" #include "ctrl/ctrl_inc.c" #include "font_provider/font_provider_inc.c" @@ -360,8 +360,7 @@ entry_point(CmdLine *cmd_line) if(!df_cmd_spec_is_nil(cmd_spec)) { DF_CmdParams params = df_cmd_params_from_window(dst_window); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(dst_window); - String8 error = df_cmd_params_apply_spec_query(scratch.arena, &ctrl_ctx, ¶ms, cmd_spec, df_cmd_arg_part_from_string(msg)); + String8 error = df_cmd_params_apply_spec_query(scratch.arena, ¶ms, cmd_spec, df_cmd_arg_part_from_string(msg)); if(error.size == 0) { df_push_cmd__root(¶ms, cmd_spec); diff --git a/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c b/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c index ceb90206..96e4a155 100644 --- a/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c +++ b/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 +#define BUILD_VERSION_PATCH 12 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "rdi_breakpad_from_pdb" #define BUILD_CONSOLE_INTERFACE 1 diff --git a/src/rdi_dump/rdi_dump_main.c b/src/rdi_dump/rdi_dump_main.c index 49fab69e..8ea3c5e7 100644 --- a/src/rdi_dump/rdi_dump_main.c +++ b/src/rdi_dump/rdi_dump_main.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 +#define BUILD_VERSION_PATCH 12 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "rdi_dump" #define BUILD_CONSOLE_INTERFACE 1 diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 1b62e666..1234f54b 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 +#define BUILD_VERSION_PATCH 12 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "rdi_from_dwarf" #define BUILD_CONSOLE_INTERFACE 1 diff --git a/src/rdi_from_pdb/rdi_from_pdb_main.c b/src/rdi_from_pdb/rdi_from_pdb_main.c index 898aafa7..7f4b7390 100644 --- a/src/rdi_from_pdb/rdi_from_pdb_main.c +++ b/src/rdi_from_pdb/rdi_from_pdb_main.c @@ -6,7 +6,7 @@ #define BUILD_VERSION_MAJOR 0 #define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 +#define BUILD_VERSION_PATCH 12 #define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" #define BUILD_TITLE "rdi_from_pdb" #define BUILD_CONSOLE_INTERFACE 1