diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 117d86de..4db53c17 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4704,14 +4704,18 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread) CTRL_EvalScope *scope = push_array(arena, CTRL_EvalScope, 1); scope->di_scope = di_scope_open(); - // rjf: unpack thread + ////////////////////////////// + //- rjf: unpack thread + // Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle); CTRL_Entity *process = ctrl_process_from_entity(thread); CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); - // rjf: gather evaluation modules + ////////////////////////////// + //- rjf: gather evaluation modules + // U64 eval_modules_count = Max(1, ctrl_state->ctrl_thread_entity_store->entity_kind_counts[CTRL_EntityKind_Module]); E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &eval_modules[0]; @@ -4751,35 +4755,40 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread) } } - // rjf: build eval type context + ////////////////////////////// + //- rjf: build base evaluation context + // { - E_TypeCtx *ctx = &scope->type_ctx; - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; - } - e_select_type_ctx(&scope->type_ctx); - - // rjf: build eval parse context - ProfScope("build eval parse context") - { - E_ParseCtx *ctx = &scope->parse_ctx; - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; - } - e_select_parse_ctx(&scope->parse_ctx); - - // rjf: build eval IR context - { - E_IRCtx *ctx = &scope->ir_ctx; - ctx->thread_ip_vaddr = thread_rip_vaddr; - ctx->thread_ip_voff = thread_rip_voff; + E_BaseCtx *ctx = &scope->base_ctx; + + //- rjf: fill instruction pointer info + ctx->thread_ip_vaddr = thread_rip_vaddr; + ctx->thread_ip_voff = thread_rip_voff; + ctx->thread_arch = thread->arch; ctx->thread_reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); ctx->thread_reg_space.u64_0 = (U64)thread; - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; + + //- rjf: fill modules + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + + //- rjf: fill space hooks + ctx->space_rw_user_data = ctrl_state->ctrl_thread_entity_store; + ctx->space_read = ctrl_eval_space_read; + } + e_select_base_ctx(&scope->base_ctx); + + ////////////////////////////// + //- rjf: begin type evaluation + // + e_type_eval_begin(); + + ////////////////////////////// + //- rjf: build IR evaluation context + // + { + E_IRCtx *ctx = &scope->ir_ctx; ctx->regs_map = ctrl_string2reg_from_arch(arch); ctx->reg_alias_map = ctrl_string2alias_from_arch(arch); ctx->locals_map = e_push_locals_map_from_rdi_voff(arena, eval_modules_primary->rdi, thread_rip_voff); @@ -4791,7 +4800,9 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread) } e_select_ir_ctx(&scope->ir_ctx); - // rjf: build eval interpretation context + ////////////////////////////// + //- rjf: build eval interpretation context + // { E_InterpretCtx *ctx = &scope->interpret_ctx; ctx->space_rw_user_data = ctrl_state->ctrl_thread_entity_store; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 85d80ac3..f5127226 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -658,8 +658,7 @@ typedef struct CTRL_EvalScope CTRL_EvalScope; struct CTRL_EvalScope { DI_Scope *di_scope; - E_TypeCtx type_ctx; - E_ParseCtx parse_ctx; + E_BaseCtx base_ctx; E_IRCtx ir_ctx; E_InterpretCtx interpret_ctx; }; diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 2915cbc1..05263a35 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -613,135 +613,6 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) //////////////////////////////// //~ rjf: Debug Info Lookups -//- rjf: symbol lookups - -internal String8 -d_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, U64 depth, B32 decorated) -{ - String8 result = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - - //- rjf: try scopes - if(result.size == 0) - { - // rjf: voff -> scope - U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); - - // rjf: scope -> # of max possible inline depth - U64 inline_site_count = 0; - for(U64 s_idx = scope_idx, s_idx_next = 0; s_idx != 0; s_idx = s_idx_next) - { - RDI_Scope *s = rdi_element_from_name_idx(rdi, Scopes, s_idx); - s_idx_next = s->parent_scope_idx; - if(s->inline_site_idx != 0) - { - inline_site_count += 1; - } - else - { - break; - } - } - - // rjf: depth in [1, max]? -> form name from inline site - if(0 < depth && depth <= inline_site_count) - { - RDI_InlineSite *inline_site = 0; - U64 s_inline_depth = inline_site_count; - for(U64 s_idx = scope_idx, s_idx_next = 0; s_idx != 0; s_idx = s_idx_next) - { - RDI_Scope *s = rdi_element_from_name_idx(rdi, Scopes, s_idx); - s_idx_next = s->parent_scope_idx; - if(s_inline_depth == depth) - { - inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx); - break; - } - s_inline_depth -= 1; - if(s_inline_depth == 0) - { - break; - } - } - if(inline_site != 0) - { - E_TypeKey type = e_type_key_ext(E_TypeKind_Function, inline_site->type_idx, e_parse_ctx_module_idx_from_rdi(rdi)); - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); - if(decorated && inline_site->type_idx != 0) - { - String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "[inlined] "); - e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0); - str8_list_push(scratch.arena, &list, name); - e_type_rhs_string_from_key(scratch.arena, type, &list, 0); - result = str8_list_join(arena, &list, 0); - } - else - { - result = push_str8_copy(arena, name); - } - } - } - - // rjf: depth == 0 or depth >= max? -> form name from scope procedure - else - { - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); - U64 proc_idx = scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); - E_TypeKey type = e_type_key_ext(E_TypeKind_Function, procedure->type_idx, e_parse_ctx_module_idx_from_rdi(rdi)); - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); - if(decorated && procedure->type_idx != 0) - { - String8List list = {0}; - e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0); - str8_list_push(scratch.arena, &list, name); - e_type_rhs_string_from_key(scratch.arena, type, &list, 0); - result = str8_list_join(arena, &list, 0); - } - else - { - result = push_str8_copy(arena, name); - } - } - } - - //- rjf: try global variables - if(result.size == 0) - { - U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff); - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); - U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(rdi, global_var->name_string_idx, &name_size); - result = push_str8_copy(arena, str8(name_ptr, name_size)); - } - - di_scope_close(scope); - scratch_end(scratch); - } - return result; -} - -internal String8 -d_symbol_name_from_process_vaddr(Arena *arena, CTRL_Entity *process, U64 vaddr, U64 depth, B32 decorated) -{ - ProfBeginFunction(); - String8 result = {0}; - { - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - U64 voff = ctrl_voff_from_vaddr(module, vaddr); - result = d_symbol_name_from_dbgi_key_voff(arena, &dbgi_key, voff, depth, decorated); - } - ProfEnd(); - return result; -} - //- rjf: symbol -> voff lookups internal U64 diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index ff4b0fc3..536f852b 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -395,10 +395,6 @@ internal CTRL_TrapList d_trap_net_from_thread__step_into_line(Arena *arena, CTRL //////////////////////////////// //~ rjf: Debug Info Lookups -//- rjf: voff|vaddr -> symbol lookups -internal String8 d_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, U64 depth, B32 decorated); -internal String8 d_symbol_name_from_process_vaddr(Arena *arena, CTRL_Entity *process, U64 vaddr, U64 depth, B32 decorated); - //- rjf: symbol -> voff lookups internal U64 d_voff_from_dbgi_key_symbol_name(DI_Key *dbgi_key, String8 symbol_name); internal U64 d_type_num_from_dbgi_key_name(DI_Key *dbgi_key, String8 name); diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 859b708e..1cc3ced0 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -53,35 +53,6 @@ e_eval_from_stringf(Arena *arena, char *fmt, ...) return eval; } -internal E_Eval -e_autoresolved_eval_from_eval(E_Eval eval) -{ - if(e_parse_state && - e_interpret_ctx && - e_parse_state->ctx->modules_count > 0 && - e_interpret_ctx->module_base != 0 && - (e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S64)) || - e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U64)) || - e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S32)) || - e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U32)))) - { - U64 vaddr = eval.value.u64; - U64 voff = vaddr - e_interpret_ctx->module_base[0]; - RDI_Parsed *rdi = e_parse_state->ctx->primary_module->rdi; - 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.irtree.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0); - } - } - return eval; -} - internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval) { @@ -117,18 +88,18 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && e_space_read(eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) { - Arch arch = e_type_state->ctx->primary_module->arch; + Arch arch = e_base_ctx->primary_module->arch; U32 rdi_idx = 0; RDI_Parsed *rdi = 0; U64 module_base = 0; - for(U64 idx = 0; idx < e_type_state->ctx->modules_count; idx += 1) + for(U64 idx = 0; idx < e_base_ctx->modules_count; idx += 1) { - if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vtable_vaddr)) + if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vtable_vaddr)) { - arch = e_type_state->ctx->modules[idx].arch; + arch = e_base_ctx->modules[idx].arch; rdi_idx = (U32)idx; - rdi = e_type_state->ctx->modules[idx].rdi; - module_base = e_type_state->ctx->modules[idx].vaddr_range.min; + rdi = e_base_ctx->modules[idx].rdi; + module_base = e_base_ctx->modules[idx].vaddr_range.min; break; } } diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index d3be65cf..f6430dea 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -30,7 +30,6 @@ read_only global E_Eval e_eval_nil = {zero_struct, zero_struct, &e_expr_nil, {&e internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr); internal E_Eval e_eval_from_string(Arena *arena, String8 string); internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...); -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); internal E_Value e_value_from_string(String8 string); diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index bc53ed0e..78892efa 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -22,6 +22,37 @@ e_hash_from_string(U64 seed, String8 string) return result; } +//- rjf: type key data structures + +internal void +e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key) +{ + E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1); + n->v = key; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal void +e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key) +{ + E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1); + n->v = key; + SLLQueuePushFront(list->first, list->last, n); + list->count += 1; +} + +internal E_TypeKeyList +e_type_key_list_copy(Arena *arena, E_TypeKeyList *src) +{ + E_TypeKeyList dst = {0}; + for(E_TypeKeyNode *n = src->first; n != 0; n = n->next) + { + e_type_key_list_push(arena, &dst, n->v); + } + return dst; +} + //////////////////////////////// //~ rjf: Message Functions @@ -270,6 +301,45 @@ e_string2expr_lookup(E_String2ExprMap *map, String8 string) return expr; } +//- rjf: string -> type-key + +internal E_String2TypeKeyMap +e_string2typekey_map_make(Arena *arena, U64 slots_count) +{ + E_String2TypeKeyMap map = {0}; + map.slots_count = slots_count; + map.slots = push_array(arena, E_String2TypeKeySlot, map.slots_count); + return map; +} + +internal void +e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key) +{ + E_String2TypeKeyNode *n = push_array(arena, E_String2TypeKeyNode, 1); + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n); + n->string = push_str8_copy(arena, string); + n->key = key; +} + +internal E_TypeKey +e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string) +{ + E_TypeKey key = zero_struct; + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + for(E_String2TypeKeyNode *n = map->slots[slot_idx].first; n != 0; n = n->next) + { + if(str8_match(n->string, string, 0)) + { + key = n->key; + break; + } + } + return key; +} + //////////////////////////////// //~ rjf: Debug-Info-Driven Map Building Functions @@ -392,3 +462,15 @@ e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) return map; } + +//////////////////////////////// +//~ rjf: Base Evaluation Context Selection + +internal void +e_select_base_ctx(E_BaseCtx *ctx) +{ + if(ctx->modules == 0) { ctx->modules = &e_module_nil; } + if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; } + e_base_ctx = ctx; + e_base_ctx_gen += 1; +} diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index a1078495..a047efe8 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -55,6 +55,34 @@ union E_Value F32 f32; }; +//////////////////////////////// +//~ rjf: Bytecode Operation Types + +enum +{ + E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, + E_IRExtKind_SetSpace, + E_IRExtKind_COUNT +}; + +typedef struct E_Op E_Op; +struct E_Op +{ + E_Op *next; + RDI_EvalOp opcode; + E_Value value; + String8 string; +}; + +typedef struct E_OpList E_OpList; +struct E_OpList +{ + E_Op *first; + E_Op *last; + U64 op_count; + U64 encoded_size; +}; + //////////////////////////////// //~ rjf: Operator Info @@ -504,6 +532,31 @@ struct E_String2ExprMap E_String2ExprMapSlot *slots; }; +//////////////////////////////// +//~ rjf: String -> Type Key Map Data Structure + +typedef struct E_String2TypeKeyNode E_String2TypeKeyNode; +struct E_String2TypeKeyNode +{ + E_String2TypeKeyNode *next; + String8 string; + E_TypeKey key; +}; + +typedef struct E_String2TypeKeySlot E_String2TypeKeySlot; +struct E_String2TypeKeySlot +{ + E_String2TypeKeyNode *first; + E_String2TypeKeyNode *last; +}; + +typedef struct E_String2TypeKeyMap E_String2TypeKeyMap; +struct E_String2TypeKeyMap +{ + U64 slots_count; + E_String2TypeKeySlot *slots; +}; + //////////////////////////////// //~ rjf: Type Pattern -> Hook Key Data Structure (Auto View Rules) @@ -542,10 +595,31 @@ struct E_AutoHookParams }; //////////////////////////////// -//~ rjf: Contextual & Implicit Evaluation Parameters +//~ rjf: Evaluation Context typedef B32 E_SpaceRWFunction(void *user_data, E_Space space, void *out, Rng1U64 offset_range); +typedef struct E_BaseCtx E_BaseCtx; +struct E_BaseCtx +{ + // rjf: instruction pointer info + U64 thread_ip_vaddr; + U64 thread_ip_voff; + E_Space thread_reg_space; + Arch thread_arch; + U64 thread_unwind_count; + + // rjf: modules + E_Module *modules; + U64 modules_count; + E_Module *primary_module; + + // rjf: space hooks + void *space_rw_user_data; + E_SpaceRWFunction *space_read; + E_SpaceRWFunction *space_write; +}; + //////////////////////////////// //~ rjf: Generated Code @@ -555,6 +629,8 @@ typedef B32 E_SpaceRWFunction(void *user_data, E_Space space, void *out, Rng1U64 //~ rjf: Globals global read_only E_Module e_module_nil = {&rdi_parsed_nil}; +thread_static E_BaseCtx *e_base_ctx = 0; +thread_static U64 e_base_ctx_gen = 0; //////////////////////////////// //~ rjf: Basic Helper Functions @@ -562,6 +638,11 @@ global read_only E_Module e_module_nil = {&rdi_parsed_nil}; internal U64 e_hash_from_string(U64 seed, String8 string); #define e_value_u64(v) (E_Value){.u64 = (v)} +//- rjf: type key data structures +internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key); +internal void e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key); +internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src); + //////////////////////////////// //~ rjf: Message Functions @@ -592,10 +673,20 @@ internal void e_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string internal void e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string); internal E_Expr *e_string2expr_lookup(E_String2ExprMap *map, String8 string); +//- rjf: string -> type-key +internal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count); +internal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key); +internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string); + //////////////////////////////// //~ rjf: Debug-Info-Driven Map Building Functions internal E_String2NumMap *e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); internal E_String2NumMap *e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); +//////////////////////////////// +//~ rjf: Base Evaluation Context Selection + +internal void e_select_base_ctx(E_BaseCtx *ctx); + #endif // EVAL_CORE_H diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 0790cf4b..9cd4ff86 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -69,15 +69,13 @@ e_select_ir_ctx(E_IRCtx *ctx) e_ir_state->arena_eval_start_pos = arena_pos(arena); } arena_pop_to(e_ir_state->arena, e_ir_state->arena_eval_start_pos); - if(ctx->modules == 0) { ctx->modules = &e_module_nil; } - if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; } if(ctx->regs_map == 0) { ctx->regs_map = &e_string2num_map_nil; } if(ctx->reg_alias_map == 0) { ctx->reg_alias_map = &e_string2num_map_nil; } if(ctx->locals_map == 0) { ctx->locals_map = &e_string2num_map_nil; } if(ctx->member_map == 0) { ctx->member_map = &e_string2num_map_nil; } if(ctx->macro_map == 0) { ctx->macro_map = push_array(e_ir_state->arena, E_String2ExprMap, 1); ctx->macro_map[0] = e_string2expr_map_make(e_ir_state->arena, 512); } e_ir_state->ctx = ctx; - e_ir_state->thread_ip_procedure = rdi_procedure_from_voff(ctx->primary_module->rdi, ctx->thread_ip_voff); + e_ir_state->thread_ip_procedure = rdi_procedure_from_voff(e_base_ctx->primary_module->rdi, e_base_ctx->thread_ip_voff); e_ir_state->used_expr_map = push_array(e_ir_state->arena, E_UsedExprMap, 1); e_ir_state->used_expr_map->slots_count = 64; e_ir_state->used_expr_map->slots = push_array(e_ir_state->arena, E_UsedExprSlot, e_ir_state->used_expr_map->slots_count); @@ -1057,7 +1055,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) // rjf: generate result.root = r_tree.root; - result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 1, 0); + result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, r_type_unwrapped, 1, 0); result.mode = E_Mode_Value; }break; @@ -1448,7 +1446,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_TypeKey ptr_type = ptr_tree->type_key; if(ptr_is_decay) { - ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 1, 0); + ptr_type = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type, 1, 0); } E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root); result.root = new_root; @@ -1765,7 +1763,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) //- rjf: form namespaceified fallback versions of this lookup string String8List namespaceified_strings = {0}; { - E_Module *module = e_ir_state->ctx->primary_module; + E_Module *module = e_base_ctx->primary_module; RDI_Parsed *rdi = module->rdi; RDI_Procedure *procedure = e_ir_state->thread_ip_procedure; U64 name_size = 0; @@ -1819,8 +1817,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) B32 string_is_implicit_member_name = 0; if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("member"), 0))) { - E_Module *module = e_ir_state->ctx->primary_module; - U32 module_idx = (U32)(module - e_ir_state->ctx->modules); + E_Module *module = e_base_ctx->primary_module; + U32 module_idx = (U32)(module - e_base_ctx->modules); RDI_Parsed *rdi = module->rdi; RDI_Procedure *procedure = e_ir_state->thread_ip_procedure; RDI_UDT *udt = rdi_container_udt_from_procedure(rdi, procedure); @@ -1837,8 +1835,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) //- rjf: try locals if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("local"), 0))) { - E_Module *module = e_ir_state->ctx->primary_module; - U32 module_idx = (U32)(module - e_ir_state->ctx->modules); + E_Module *module = e_base_ctx->primary_module; + U32 module_idx = (U32)(module - e_base_ctx->modules); RDI_Parsed *rdi = module->rdi; U64 local_num = e_num_from_string(e_ir_state->ctx->locals_map, string__redirected); if(local_num != 0) @@ -1850,7 +1848,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local->type_idx, module_idx); // rjf: extract local's location block - U64 ip_voff = e_ir_state->ctx->thread_ip_voff; + U64 ip_voff = e_base_ctx->thread_ip_voff; for(U32 loc_block_idx = local->location_first; loc_block_idx < local->location_opl; loc_block_idx += 1) @@ -1960,9 +1958,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) //- rjf: try globals if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("global"), 0))) { - for(U64 module_idx = 0; module_idx < e_ir_state->ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1) { - E_Module *module = &e_ir_state->ctx->modules[module_idx]; + E_Module *module = &e_base_ctx->modules[module_idx]; RDI_Parsed *rdi = module->rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); RDI_ParsedNameMap parsed_name_map = {0}; @@ -1999,9 +1997,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) //- rjf: try thread-locals if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("thread_local"), 0))) { - for(U64 module_idx = 0; module_idx < e_ir_state->ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1) { - E_Module *module = &e_ir_state->ctx->modules[module_idx]; + E_Module *module = &e_base_ctx->modules[module_idx]; RDI_Parsed *rdi = module->rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_ThreadVariables); RDI_ParsedNameMap parsed_name_map = {0}; @@ -2038,9 +2036,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) //- rjf: try procedures if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("procedure"), 0))) { - for(U64 module_idx = 0; module_idx < e_ir_state->ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1) { - E_Module *module = &e_ir_state->ctx->modules[module_idx]; + E_Module *module = &e_base_ctx->modules[module_idx]; RDI_Parsed *rdi = module->rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); RDI_ParsedNameMap parsed_name_map = {0}; @@ -2093,13 +2091,13 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) if(reg_num != 0) { string_mapped = 1; - REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_parse_state->ctx->primary_module->arch)[reg_num]; + REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_base_ctx->primary_module->arch)[reg_num]; E_OpList oplist = {0}; e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); mapped_bytecode_mode = E_Mode_Offset; - mapped_bytecode_space = e_ir_state->ctx->thread_reg_space; - mapped_type_key = e_type_key_reg(e_parse_state->ctx->primary_module->arch, reg_num); + mapped_bytecode_space = e_base_ctx->thread_reg_space; + mapped_type_key = e_type_key_reg(e_base_ctx->primary_module->arch, reg_num); } } @@ -2110,14 +2108,14 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) if(alias_num != 0) { string_mapped = 1; - REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_ir_state->ctx->primary_module->arch)[alias_num]; - REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_ir_state->ctx->primary_module->arch)[alias_slice.code]; + REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_base_ctx->primary_module->arch)[alias_num]; + REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_base_ctx->primary_module->arch)[alias_slice.code]; E_OpList oplist = {0}; e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off); mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); mapped_bytecode_mode = E_Mode_Offset; - mapped_bytecode_space = e_ir_state->ctx->thread_reg_space; - mapped_type_key = e_type_key_reg_alias(e_parse_state->ctx->primary_module->arch, alias_num); + mapped_bytecode_space = e_base_ctx->thread_reg_space; + mapped_type_key = e_type_key_reg_alias(e_base_ctx->primary_module->arch, alias_num); } } diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 60c0226b..0709a2c6 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -4,34 +4,6 @@ #ifndef EVAL_IR_H #define EVAL_IR_H -//////////////////////////////// -//~ rjf: Bytecode Operation Types - -enum -{ - E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, - E_IRExtKind_SetSpace, - E_IRExtKind_COUNT -}; - -typedef struct E_Op E_Op; -struct E_Op -{ - E_Op *next; - RDI_EvalOp opcode; - E_Value value; - String8 string; -}; - -typedef struct E_OpList E_OpList; -struct E_OpList -{ - E_Op *first; - E_Op *last; - U64 op_count; - U64 encoded_size; -}; - //////////////////////////////// //~ rjf: Used Tag Map Data Structure @@ -116,24 +88,11 @@ struct E_StringIDMap typedef struct E_IRCtx E_IRCtx; struct E_IRCtx { - // rjf: instruction pointer info - U64 thread_ip_vaddr; - U64 thread_ip_voff; - E_Space thread_reg_space; - - // rjf: modules - E_Module *modules; - U64 modules_count; - E_Module *primary_module; - - // rjf: identifier-resolution maps E_String2NumMap *regs_map; E_String2NumMap *reg_alias_map; E_String2NumMap *locals_map; // (within `primary_module`) E_String2NumMap *member_map; // (within `primary_module`) E_String2ExprMap *macro_map; - - // rjf: hook maps E_AutoHookMap *auto_hook_map; }; diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 77ce10ff..a7c0ae6b 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -295,46 +295,6 @@ e_token_array_make_first_opl(E_Token *first, E_Token *opl) return array; } -//////////////////////////////// -//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) - -internal E_ParseCtx * -e_selected_parse_ctx(void) -{ - return e_parse_state->ctx; -} - -internal void -e_select_parse_ctx(E_ParseCtx *ctx) -{ - if(e_parse_state == 0) - { - Arena *arena = arena_alloc(); - e_parse_state = push_array(arena, E_ParseState, 1); - e_parse_state->arena = arena; - e_parse_state->arena_eval_start_pos = arena_pos(arena); - } - arena_pop_to(e_parse_state->arena, e_parse_state->arena_eval_start_pos); - if(ctx->modules == 0) { ctx->modules = &e_module_nil; } - if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; } - e_parse_state->ctx = ctx; -} - -internal U32 -e_parse_ctx_module_idx_from_rdi(RDI_Parsed *rdi) -{ - U32 result = 0; - for(U64 idx = 0; idx < e_parse_state->ctx->modules_count; idx += 1) - { - if(e_parse_state->ctx->modules[idx].rdi == rdi) - { - result = (U32)idx; - break; - } - } - return result; -} - //////////////////////////////// //~ rjf: Expression Tree Building Functions @@ -688,9 +648,9 @@ e_leaf_type_from_name(String8 name) } if(!found) { - for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1) + for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1) { - RDI_Parsed *rdi = e_parse_state->ctx->modules[module_idx].rdi; + RDI_Parsed *rdi = e_base_ctx->modules[module_idx].rdi; RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); RDI_ParsedNameMap parsed_name_map = {0}; rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); @@ -728,7 +688,7 @@ e_type_from_expr(E_Expr *expr) case E_ExprKind_Ptr: { E_TypeKey direct_type_key = e_type_from_expr(expr->first); - result = e_type_key_cons_ptr(e_parse_state->ctx->primary_module->arch, direct_type_key, 1, 0); + result = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type_key, 1, 0); }break; case E_ExprKind_Array: { @@ -1090,7 +1050,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok else { E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); - type->type_key = e_type_key_cons_ptr(e_parse_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0); + type->type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0); E_Expr *casted = atom; E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str); e_expr_push_child(cast, type); diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 3a11affb..c46ceb5b 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -17,25 +17,13 @@ struct E_Parse }; //////////////////////////////// -//~ rjf: Parse Context - -typedef struct E_ParseCtx E_ParseCtx; -struct E_ParseCtx -{ - E_Module *modules; - U64 modules_count; - E_Module *primary_module; -}; - -//////////////////////////////// -//~ rjf: Parse State (stateful thread-local caching mechanisms, not provided by user) +//~ rjf: Parse Evaluation State typedef struct E_ParseState E_ParseState; struct E_ParseState { Arena *arena; U64 arena_eval_start_pos; - E_ParseCtx *ctx; }; //////////////////////////////// @@ -56,13 +44,6 @@ internal E_TokenArray e_token_array_from_chunk_list(Arena *arena, E_TokenChunkLi internal E_TokenArray e_token_array_from_text(Arena *arena, String8 text); internal E_TokenArray e_token_array_make_first_opl(E_Token *first, E_Token *opl); -//////////////////////////////// -//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) - -internal E_ParseCtx *e_selected_parse_ctx(void); -internal void e_select_parse_ctx(E_ParseCtx *ctx); -internal U32 e_parse_ctx_module_idx_from_rdi(RDI_Parsed *rdi); - //////////////////////////////// //~ rjf: Expression Tree Building Functions diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index cb603c39..ff7af653 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -223,10 +223,10 @@ e_member_array_from_list(Arena *arena, E_MemberList *list) } //////////////////////////////// -//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) +//~ rjf: Type Evaluation Phase Beginning Marker (Required For All Subsequent APIs) internal void -e_select_type_ctx(E_TypeCtx *ctx) +e_type_eval_begin(void) { if(e_type_state == 0) { @@ -235,10 +235,7 @@ e_select_type_ctx(E_TypeCtx *ctx) e_type_state->arena = arena; e_type_state->arena_eval_start_pos = arena_pos(e_type_state->arena); } - if(ctx->modules == 0) { ctx->modules = &e_module_nil; } - if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; } arena_pop_to(e_type_state->arena, e_type_state->arena_eval_start_pos); - e_type_state->ctx = ctx; e_type_state->cons_id_gen = 0; e_type_state->cons_content_slots_count = 256; e_type_state->cons_key_slots_count = 256; @@ -665,7 +662,7 @@ e_type_byte_size_from_key(E_TypeKey key) { U64 type_node_idx = key.u32[1]; U32 rdi_idx = key.u32[2]; - RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi; + RDI_Parsed *rdi = e_base_ctx->modules[rdi_idx].rdi; RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); result = rdi_type->byte_size; }break; @@ -777,7 +774,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) { U64 type_node_idx = key.u32[1]; U32 rdi_idx = key.u32[2]; - RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi; + RDI_Parsed *rdi = e_base_ctx->modules[rdi_idx].rdi; RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); if(rdi_type->kind != RDI_TypeKind_NULL) { @@ -824,7 +821,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type->name = push_str8_copy(arena, name); type->byte_size = (U64)rdi_type->byte_size; type->count = members_count; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; type->members = members; } @@ -869,7 +866,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type->name = push_str8_copy(arena, name); type->byte_size = (U64)rdi_type->byte_size; type->count = enum_vals_count; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; type->enum_vals = enum_vals; type->direct_type_key = direct_type_key; } @@ -909,7 +906,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type->direct_type_key = direct_type_key; type->byte_size = direct_type_byte_size; type->flags = flags; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; }break; case RDI_TypeKind_Ptr: case RDI_TypeKind_LRef: @@ -918,9 +915,9 @@ e_type_from_key(Arena *arena, E_TypeKey key) type = push_array(arena, E_Type, 1); type->kind = kind; type->direct_type_key = direct_type_key; - type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8; type->count = 1; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; }break; case RDI_TypeKind_Array: @@ -930,7 +927,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type->direct_type_key = direct_type_key; type->count = rdi_type->constructed.count; type->byte_size = direct_type_byte_size * type->count; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; }break; case RDI_TypeKind_Function: { @@ -942,11 +939,11 @@ e_type_from_key(Arena *arena, E_TypeKey key) { type = push_array(arena, E_Type, 1); type->kind = kind; - type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8; type->direct_type_key = direct_type_key; type->count = count; type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count); - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; for(U32 idx = 0; idx < type->count; idx += 1) { U32 param_type_idx = idx_run[idx]; @@ -976,11 +973,11 @@ e_type_from_key(Arena *arena, E_TypeKey key) { type = push_array(arena, E_Type, 1); type->kind = kind; - type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8; type->owner_type_key = direct_type_key; type->count = count; type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count); - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; for(U32 idx = 0; idx < type->count; idx += 1) { U32 param_type_idx = idx_run[idx]; @@ -1015,10 +1012,10 @@ e_type_from_key(Arena *arena, E_TypeKey key) } type = push_array(arena, E_Type, 1); type->kind = kind; - type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8; type->owner_type_key = owner_type_key; type->direct_type_key = direct_type_key; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; }break; } } @@ -1047,7 +1044,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type->name = push_str8_copy(arena, name); type->byte_size = direct_type_byte_size; type->direct_type_key = direct_type_key; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; } //- rjf: bitfields @@ -1071,7 +1068,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type->direct_type_key = direct_type_key; type->off = (U32)rdi_type->bitfield.off; type->count = (U64)rdi_type->bitfield.size; - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; } //- rjf: incomplete types @@ -1085,7 +1082,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) type = push_array(arena, E_Type, 1); type->kind = kind; type->name = push_str8_copy(arena, name); - type->arch = e_type_state->ctx->modules[rdi_idx].arch; + type->arch = e_base_ctx->modules[rdi_idx].arch; } } @@ -1990,74 +1987,6 @@ e_default_expansion_type_from_key(E_TypeKey root_key) return type_key; } -//- rjf: type key data structures - -internal void -e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key) -{ - E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1); - n->v = key; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal void -e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key) -{ - E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1); - n->v = key; - SLLQueuePushFront(list->first, list->last, n); - list->count += 1; -} - -internal E_TypeKeyList -e_type_key_list_copy(Arena *arena, E_TypeKeyList *src) -{ - E_TypeKeyList dst = {0}; - for(E_TypeKeyNode *n = src->first; n != 0; n = n->next) - { - e_type_key_list_push(arena, &dst, n->v); - } - return dst; -} - -internal E_String2TypeKeyMap -e_string2typekey_map_make(Arena *arena, U64 slots_count) -{ - E_String2TypeKeyMap map = {0}; - map.slots_count = slots_count; - map.slots = push_array(arena, E_String2TypeKeySlot, map.slots_count); - return map; -} - -internal void -e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key) -{ - E_String2TypeKeyNode *n = push_array(arena, E_String2TypeKeyNode, 1); - U64 hash = e_hash_from_string(5381, string); - U64 slot_idx = hash%map->slots_count; - SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n); - n->string = push_str8_copy(arena, string); - n->key = key; -} - -internal E_TypeKey -e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string) -{ - E_TypeKey key = zero_struct; - U64 hash = e_hash_from_string(5381, string); - U64 slot_idx = hash%map->slots_count; - for(E_String2TypeKeyNode *n = map->slots[slot_idx].first; n != 0; n = n->next) - { - if(str8_match(n->string, string, 0)) - { - key = n->key; - break; - } - } - return key; -} - //////////////////////////////// //~ rjf: Cache Lookups @@ -2546,7 +2475,7 @@ E_TYPE_IREXT_FUNCTION_DEF(slice) } // rjf: determine architecture - Arch arch = e_type_state->ctx->primary_module->arch; + Arch arch = e_base_ctx->primary_module->arch; if(base_ptr_member != 0) { E_Type *type = e_type_from_key__cached(base_ptr_member->type_key); diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 4efa66ad..fdbcb08b 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -4,31 +4,6 @@ #ifndef EVAL_TYPES_H #define EVAL_TYPES_H -//////////////////////////////// -//~ rjf: String -> Type Key Map Data Structure - -typedef struct E_String2TypeKeyNode E_String2TypeKeyNode; -struct E_String2TypeKeyNode -{ - E_String2TypeKeyNode *next; - String8 string; - E_TypeKey key; -}; - -typedef struct E_String2TypeKeySlot E_String2TypeKeySlot; -struct E_String2TypeKeySlot -{ - E_String2TypeKeyNode *first; - E_String2TypeKeyNode *last; -}; - -typedef struct E_String2TypeKeyMap E_String2TypeKeyMap; -struct E_String2TypeKeyMap -{ - U64 slots_count; - E_String2TypeKeySlot *slots; -}; - //////////////////////////////// //~ rjf: Type Unwrapping @@ -46,7 +21,7 @@ enum }; //////////////////////////////// -//~ rjf: Evaluation Context +//~ rjf: Type Evaluation State //- rjf: constructed type cache types @@ -152,17 +127,7 @@ struct E_MemberCacheSlot E_MemberCacheNode *last; }; -//- rjf: context parameterization - -typedef struct E_TypeCtx E_TypeCtx; -struct E_TypeCtx -{ - E_Module *modules; - U64 modules_count; - E_Module *primary_module; -}; - -//- rjf: stateful machine part of context (not provided by user) +//- rjf: bundle typedef struct E_TypeState E_TypeState; struct E_TypeState @@ -170,9 +135,6 @@ struct E_TypeState Arena *arena; U64 arena_eval_start_pos; - // rjf: evaluation context - E_TypeCtx *ctx; - // rjf: JIT-constructed types tables U64 cons_id_gen; U64 cons_content_slots_count; @@ -231,9 +193,9 @@ internal void e_member_list_push(Arena *arena, E_MemberList *list, E_Member *mem internal E_MemberArray e_member_array_from_list(Arena *arena, E_MemberList *list); //////////////////////////////// -//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) +//~ rjf: Type Evaluation Phase Beginning Marker (Required For All Subsequent APIs) -internal void e_select_type_ctx(E_TypeCtx *ctx); +internal void e_type_eval_begin(void); //////////////////////////////// //~ rjf: Type Operation Functions @@ -288,14 +250,6 @@ internal void e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8Lis internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key); internal E_TypeKey e_default_expansion_type_from_key(E_TypeKey key); -//- rjf: type key data structures -internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key); -internal void e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key); -internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src); -internal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count); -internal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key); -internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string); - //////////////////////////////// //~ rjf: Cache Lookups diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index c2ed317f..cef40c56 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -469,18 +469,18 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr) if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && e_space_read(eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) { - Arch arch = e_type_state->ctx->primary_module->arch; + Arch arch = e_base_ctx->primary_module->arch; U32 rdi_idx = 0; RDI_Parsed *rdi = 0; U64 module_base = 0; - for(U64 idx = 0; idx < e_type_state->ctx->modules_count; idx += 1) + for(U64 idx = 0; idx < e_base_ctx->modules_count; idx += 1) { - if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vtable_vaddr)) + if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vtable_vaddr)) { - arch = e_type_state->ctx->modules[idx].arch; + arch = e_base_ctx->modules[idx].arch; rdi_idx = (U32)idx; - rdi = e_type_state->ctx->modules[idx].rdi; - module_base = e_type_state->ctx->modules[idx].vaddr_range.min; + rdi = e_base_ctx->modules[idx].rdi; + module_base = e_base_ctx->modules[idx].vaddr_range.min; break; } } @@ -1867,11 +1867,11 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) U64 vaddr = ptr_data->value_eval.value.u64; E_Module *module = &e_module_nil; U32 module_idx = 0; - for EachIndex(idx, e_type_state->ctx->modules_count) + for EachIndex(idx, e_base_ctx->modules_count) { - if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vaddr)) + if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vaddr)) { - module = &e_type_state->ctx->modules[idx]; + module = &e_base_ctx->modules[idx]; module_idx = (U32)idx; break; } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a3e0a0d4..13ae1c1e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2998,8 +2998,31 @@ rd_view_ui(Rng2F32 rect) { default: { - String8 symbol_name = d_symbol_name_from_process_vaddr(scratch.arena, ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), eval.value.u64, 0, 0); - rd_cmd(RD_CmdKind_CompleteQuery, .string = symbol_name); + U64 vaddr = eval.value.u64; + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + { + DI_Scope *scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); + String8 name = {0}; + if(name.size == 0) + { + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + name.str = rdi_name_from_procedure(rdi, procedure, &name.size); + } + if(name.size == 0) + { + RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); + name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size); + } + if(name.size != 0) + { + rd_cmd(RD_CmdKind_CompleteQuery, .string = name); + } + di_scope_close(scope); + } }break; case E_SpaceKind_File: case E_SpaceKind_FileSystem: @@ -3050,10 +3073,32 @@ rd_view_ui(Rng2F32 rect) { default: { - String8 symbol_name = d_symbol_name_from_process_vaddr(scratch.arena, ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), eval.value.u64, 0, 0); - if(symbol_name.size != 0) + String8 name = {0}; { - rd_cmd(RD_CmdKind_GoToName, .string = symbol_name); + U64 vaddr = eval.value.u64; + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + { + DI_Scope *scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); + if(name.size == 0) + { + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + name.str = rdi_name_from_procedure(rdi, procedure, &name.size); + } + if(name.size == 0) + { + RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); + name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size); + } + di_scope_close(scope); + } + } + if(name.size != 0) + { + rd_cmd(RD_CmdKind_GoToName, .string = name); } else { @@ -10214,30 +10259,6 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str }break; } } - -#if 0 - // rjf: try to map as symbol - if(!mapped && kind == TXT_TokenKind_Identifier) - { - U64 voff = d_voff_from_dbgi_key_symbol_name(&dbgi_key, string); - if(voff != 0) - { - mapped = 1; - color = RD_ThemeColor_CodeSymbol; - } - } - - // rjf: try to map as type - if(!mapped && kind == TXT_TokenKind_Identifier) - { - U64 type_num = d_type_num_from_dbgi_key_name(&dbgi_key, string); - if(type_num != 0) - { - mapped = 1; - color = RD_ThemeColor_CodeType; - } - } -#endif } return color; } @@ -11769,57 +11790,70 @@ rd_frame(void) } ProfEnd(); - //////////////////////////// - //- rjf: build eval type context - // - E_TypeCtx *type_ctx = push_array(scratch.arena, E_TypeCtx, 1); - ProfScope("build eval type context") - { - E_TypeCtx *ctx = type_ctx; - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; - } - e_select_type_ctx(type_ctx); + //~ + //~ NOTE(rjf): NEW VVVVV + //~ //////////////////////////// - //- rjf: build eval parse context + //- rjf: build base evaluation context // - E_ParseCtx *parse_ctx = push_array(scratch.arena, E_ParseCtx, 1); - ProfScope("build eval parse context") + E_BaseCtx *eval_base_ctx = push_array(scratch.arena, E_BaseCtx, 1); { - E_ParseCtx *ctx = parse_ctx; - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; - } - e_select_parse_ctx(parse_ctx); - - //////////////////////////// - //- rjf: build eval IR context - // - E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1); - if(e_ir_state != 0) { e_ir_state->ctx = 0; } - { - E_IRCtx *ctx = ir_ctx; - ctx->thread_ip_voff = rip_voff; - ctx->thread_ip_vaddr = rip_vaddr; - ctx->thread_reg_space = rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_CtrlEntity); - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; - ctx->regs_map = ctrl_string2reg_from_arch(ctx->primary_module->arch); - ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->primary_module->arch); - ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); - ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); - ctx->macro_map = push_array(scratch.arena, E_String2ExprMap, 1); - ctx->macro_map[0] = e_string2expr_map_make(scratch.arena, 512); - ctx->auto_hook_map = push_array(scratch.arena, E_AutoHookMap, 1); - ctx->auto_hook_map[0] = e_auto_hook_map_make(scratch.arena, 512); + E_BaseCtx *ctx = eval_base_ctx; - //- rjf: cache meta name -> type key correllation - rd_state->meta_name2type_map = push_array(rd_frame_arena(), E_String2TypeKeyMap, 1); - rd_state->meta_name2type_map[0] = e_string2typekey_map_make(rd_frame_arena(), 256); + //- rjf: fill instruction pointer info + ctx->thread_ip_vaddr = rip_vaddr; + ctx->thread_ip_voff = rip_voff; + ctx->thread_reg_space = rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_CtrlEntity); + ctx->thread_arch = thread->arch; + ctx->thread_unwind_count = unwind_count; + + //- rjf: fill modules + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + + //- rjf: fill space hooks + ctx->space_read = rd_eval_space_read; + ctx->space_write = rd_eval_space_write; + } + e_select_base_ctx(eval_base_ctx); + + //////////////////////////// + //- rjf: begin type evaluation + // + e_type_eval_begin(); + + //////////////////////////// + //- rjf: build extra types & maps + // + E_String2ExprMap *macro_map = push_array(scratch.arena, E_String2ExprMap, 1); + macro_map[0] = e_string2expr_map_make(scratch.arena, 512); + E_AutoHookMap *auto_hook_map = push_array(scratch.arena, E_AutoHookMap, 1); + auto_hook_map[0] = e_auto_hook_map_make(scratch.arena, 512); + rd_state->meta_name2type_map = push_array(rd_frame_arena(), E_String2TypeKeyMap, 1); + rd_state->meta_name2type_map[0] = e_string2typekey_map_make(rd_frame_arena(), 256); + EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1); + rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512); + { + //- rjf: add macro for commands + { + String8 name = str8_lit("commands"); + E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .name = name, + .access = E_TYPE_ACCESS_FUNCTION_NAME(commands), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(commands), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(commands), + }); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->type_key = type_key; + expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); + e_string2expr_map_insert(scratch.arena, macro_map, name, expr); + } + + //- rjf: build schema types & cache (name -> type) mapping for EachElement(idx, rd_name_schema_info_table) { String8 name = rd_name_schema_info_table[idx].name; @@ -11861,18 +11895,72 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x", cfg->id), expr); + e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, "$%I64x", cfg->id), expr); if(exe.size != 0) { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_skip_last_slash(exe), expr); } if(label.size != 0) { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, label, expr); + e_string2expr_map_insert(scratch.arena, macro_map, label, expr); } } } + //- rjf: add macro for watches group + { + String8 collection_name = str8_lit("watches"); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, .flags = E_TypeFlag_EditableChildren, + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(watches), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(watches), + .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches), + .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches), + }); + e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); + } + + //- rjf: add macros for all watches which define identifiers + RD_CfgList watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch")); + for(RD_CfgNode *n = watches.first; n != 0; n = n->next) + { + RD_Cfg *watch = n->v; + String8 expr = rd_expr_from_cfg(watch); + E_Parse parse = e_parse_expr_from_text(scratch.arena, expr); + if(parse.msgs.max_kind == E_MsgKind_Null) + { + for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next) + { + e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, macro_map, expr); + } + } + } + + //- rjf: add macros for all config collections + for EachElement(cfg_name_idx, evallable_cfg_names) + { + String8 cfg_name = evallable_cfg_names[cfg_name_idx]; + String8 collection_name = rd_plural_from_code_name(cfg_name); + E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, + .irext = E_TYPE_IREXT_FUNCTION_NAME(cfgs), + .access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs), + .range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs), + .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs), + .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs), + }); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->type_key = collection_type_key; + expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); + e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); + e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key); + } + //- rjf: add macros for windows/tabs { RD_CfgList windows = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("window")); @@ -11886,7 +11974,7 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x", window->id), expr); + e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, "$%I64x", window->id), expr); } RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window); for(RD_PanelNode *p = panel_tree.root; @@ -11902,12 +11990,13 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x", tab->id), expr); + e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, "$%I64x", tab->id), expr); } } } } + //- rjf: add macros for user/project { E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit("user")); @@ -11916,7 +12005,7 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("user_settings"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("user_settings"), expr); } { E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit("project")); @@ -11925,7 +12014,7 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("project_settings"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("project_settings"), expr); } //- rjf: add macros for evallable control entities @@ -11950,51 +12039,72 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, ctrl_string_from_handle(scratch.arena, entity->handle), expr); + e_string2expr_map_insert(scratch.arena, macro_map, ctrl_string_from_handle(scratch.arena, entity->handle), expr); if(entity->string.size != 0) { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr); + e_string2expr_map_insert(scratch.arena, macro_map, entity->string, expr); } if(kind == CTRL_EntityKind_Machine && entity->handle.machine_id == CTRL_MachineID_Local) { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("local_machine"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("local_machine"), expr); } if(kind == CTRL_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle)) { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_thread"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_thread"), expr); } if(kind == CTRL_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle)) { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_process"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_process"), expr); } if(kind == CTRL_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle)) { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_module"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_module"), expr); } } } + //- rjf: add macros for all ctrl entity collections + for EachElement(ctrl_name_idx, evallable_ctrl_names) + { + String8 kind_name = evallable_ctrl_names[ctrl_name_idx]; + String8 collection_name = rd_plural_from_code_name(kind_name); + E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .name = collection_name, + .access = E_TYPE_ACCESS_FUNCTION_NAME(ctrl_entities), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(ctrl_entities), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(ctrl_entities) + }); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->type_key = collection_type_key; + expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); + e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); + e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key); + } + + //- rjf: add macro / lookup rules for unattached processes + { + String8 collection_name = str8_lit("unattached_processes"); + E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(unattached_processes), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(unattached_processes) + }); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->type_key = collection_type_key; + expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity); + e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); + e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key); + } + //- rjf: add macro for 'call_stack' -> 'query:current_thread.callstack' { E_Expr *expr = e_parse_expr_from_text(scratch.arena, str8_lit("query:current_thread.call_stack")).expr; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("call_stack"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("call_stack"), expr); } - //- rjf: add macro for watches group - { - String8 collection_name = str8_lit("watches"); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, .flags = E_TypeFlag_EditableChildren, - .expand = - { - .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(watches), - .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(watches), - .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches), - .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches), - }); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); - } //- rjf: add types for queries { @@ -12050,7 +12160,7 @@ rd_frame(void) .range = collection_infos[idx].range, }); expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); + e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); } } @@ -12076,82 +12186,7 @@ rd_frame(void) .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(debug_info_table), .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(debug_info_table) }); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr); - } - - //- rjf: add macros for all config collections - for EachElement(cfg_name_idx, evallable_cfg_names) - { - String8 cfg_name = evallable_cfg_names[cfg_name_idx]; - String8 collection_name = rd_plural_from_code_name(cfg_name); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, - .irext = E_TYPE_IREXT_FUNCTION_NAME(cfgs), - .access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs), - .expand = - { - .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs), - .range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs), - .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs), - .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs), - }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = collection_type_key; - expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); - e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key); - } - - //- rjf: add macros for all ctrl entity collections - for EachElement(ctrl_name_idx, evallable_ctrl_names) - { - String8 kind_name = evallable_ctrl_names[ctrl_name_idx]; - String8 collection_name = rd_plural_from_code_name(kind_name); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, - .name = collection_name, - .access = E_TYPE_ACCESS_FUNCTION_NAME(ctrl_entities), - .expand = - { - .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(ctrl_entities), - .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(ctrl_entities) - }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = collection_type_key; - expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); - e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key); - } - - //- rjf: add macro / lookup rules for unattached processes - { - String8 collection_name = str8_lit("unattached_processes"); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, - .expand = - { - .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(unattached_processes), - .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(unattached_processes) - }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = collection_type_key; - expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); - e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key); - } - - //- rjf: add macro for commands - { - String8 name = str8_lit("commands"); - E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set, - .name = name, - .access = E_TYPE_ACCESS_FUNCTION_NAME(commands), - .expand = - { - .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(commands), - .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(commands), - }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = type_key; - expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr); + e_string2expr_map_insert(scratch.arena, macro_map, name, expr); } //- rjf: add macro for output log @@ -12166,7 +12201,7 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("output"), expr); + e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("output"), expr); hs_scope_close(hs_scope); } @@ -12197,28 +12232,12 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0); - e_string2expr_map_insert(scratch.arena, ctx->macro_map, table[idx].name, expr); + e_string2expr_map_insert(scratch.arena, macro_map, table[idx].name, expr); hs_scope_close(hs_scope); } } #endif - //- rjf: add macros for all watches which define identifiers - RD_CfgList watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch")); - for(RD_CfgNode *n = watches.first; n != 0; n = n->next) - { - RD_Cfg *watch = n->v; - String8 expr = rd_expr_from_cfg(watch); - E_Parse parse = e_parse_expr_from_text(scratch.arena, expr); - if(parse.msgs.max_kind == E_MsgKind_Null) - { - for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next) - { - e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, expr); - } - } - } - //- rjf: gather auto-view-rules from loaded modules RD_CfgList immediate_auto_view_rules = {0}; CTRL_EntityArray modules = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); @@ -12260,17 +12279,11 @@ rd_frame(void) RD_Cfg *rule = n->v; String8 type_string = rd_cfg_child_from_string(rule, str8_lit("type"))->first->string; String8 view_rule_string = rd_cfg_child_from_string(rule, str8_lit("view_rule"))->first->string; - e_auto_hook_map_insert_new(scratch.arena, ctx->auto_hook_map, .type_pattern = type_string, .tag_expr_string = view_rule_string); + e_auto_hook_map_insert_new(scratch.arena, auto_hook_map, .type_pattern = type_string, .tag_expr_string = view_rule_string); } } } - } - e_select_ir_ctx(ir_ctx); - - //////////////////////////// - //- rjf: generate macros for all lenses - // - { + //- rjf: choose set of lenses // TODO(rjf): generate via metaprogram struct @@ -12312,9 +12325,6 @@ rd_frame(void) }; //- rjf: fill lenses in ev expand rule map, rd view ui rule map - EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1); - ev_select_expand_rule_table(expand_rule_table); - rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512); { for EachElement(idx, lens_table) { @@ -12352,9 +12362,25 @@ rd_frame(void) .irext = lens_table[idx].irext, .access = lens_table[idx].access, .expand = lens_table[idx].expand); - e_string2expr_map_insert(scratch.arena, e_ir_state->ctx->macro_map, lens_table[idx].name, expr); + e_string2expr_map_insert(scratch.arena, macro_map, lens_table[idx].name, expr); } } + ev_select_expand_rule_table(expand_rule_table); + + //////////////////////////// + //- rjf: build IR evaluation context + // + E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1); + { + E_IRCtx *ctx = ir_ctx; + ctx->regs_map = ctrl_string2reg_from_arch(eval_base_ctx->primary_module->arch); + ctx->reg_alias_map = ctrl_string2alias_from_arch(eval_base_ctx->primary_module->arch); + ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); + ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); + ctx->macro_map = macro_map; + ctx->auto_hook_map = auto_hook_map; + } + e_select_ir_ctx(ir_ctx); //////////////////////////// //- rjf: build eval interpretation context diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 0d796539..84e86383 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1333,7 +1333,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) // rjf: unpack row info RDI_Parsed *rdi = accel->rdis[item->dbgi_idx]; - E_Module *module = &e_parse_state->ctx->modules[item->dbgi_idx]; + E_Module *module = &e_base_ctx->modules[item->dbgi_idx]; // rjf: build expr E_Expr *item_expr = &e_expr_nil; @@ -1353,7 +1353,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) String8 bytecode = e_bytecode_from_oplist(arena, &oplist); U32 type_idx = procedure->type_idx; RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules)); String8 symbol_name = {0}; symbol_name.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &symbol_name.size); String8List strings = {0}; @@ -1377,7 +1377,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) String8 bytecode = e_bytecode_from_oplist(arena, &oplist); U32 type_idx = gvar->type_idx; RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules)); item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); item_expr->mode = E_Mode_Offset; item_expr->space = module->space; @@ -1393,7 +1393,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) String8 bytecode = e_bytecode_from_oplist(arena, &oplist); U32 type_idx = tvar->type_idx; RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules)); item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); item_expr->mode = E_Mode_Offset; item_expr->space = module->space; @@ -1405,7 +1405,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) { RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx); RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_state->ctx->modules)); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_base_ctx->modules)); item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0); item_expr->type_key = type_key; }break; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 6f0b6bd8..72dfa6a5 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2588,7 +2588,29 @@ RD_VIEW_UI_FUNCTION_DEF(memory) CTRL_Entity *module = ctrl_module_from_process_vaddr(process, f_rip); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); U64 rip_voff = ctrl_voff_from_vaddr(module, f_rip); - String8 symbol_name = d_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0, 1); + String8 symbol_name = {0}; + { + U64 vaddr = eval.value.u64; + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + { + DI_Scope *scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); + if(symbol_name.size == 0) + { + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + symbol_name.str = rdi_name_from_procedure(rdi, procedure, &symbol_name.size); + } + if(symbol_name.size == 0) + { + RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); + symbol_name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &symbol_name.size); + } + di_scope_close(scope); + } + } Annotation *annotation = push_array(scratch.arena, Annotation, 1); annotation->name_string = symbol_name.size != 0 ? symbol_name : str8_lit("[external code]"); annotation->kind_string = str8_lit("Call Stack Frame");