From 1848acd47e28432e43c563a0cf27296f7a4a08ec Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 21 Aug 2024 12:55:50 -0700 Subject: [PATCH] eliminate eval assumption of single architecture; equip each eval module with an architecture; use to correctly specify the debugger process architecture; do initial pass of debugger space evaluation --- src/ctrl/ctrl_core.c | 11 ++++---- src/df/core/df_core.c | 54 +++++++++++++++++++++++++++++++------- src/df/core/df_core.h | 15 +++++++++++ src/df/gfx/df_view_rules.c | 2 +- src/df/gfx/df_views.c | 10 +++---- src/eval/eval_bundles.c | 8 +++--- src/eval/eval_core.h | 1 + src/eval/eval_interpret.c | 6 ++--- src/eval/eval_interpret.h | 2 +- src/eval/eval_ir.c | 5 ++-- src/eval/eval_parse.c | 32 +++++++++++++--------- src/eval/eval_parse.h | 3 --- src/eval/eval_types.c | 14 +++++----- src/eval/eval_types.h | 8 +++--- 14 files changed, 114 insertions(+), 57 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 9fa9cd3c..e060cef6 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4672,6 +4672,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) if(mod->kind != CTRL_EntityKind_Module) { continue; } CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(mod, CTRL_EntityKind_DebugInfoPath); DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; + eval_modules[eval_module_idx].arch = arch; eval_modules[eval_module_idx].rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); eval_modules[eval_module_idx].vaddr_range = mod->vaddr_range; eval_modules[eval_module_idx].space = (U64)process; @@ -4692,7 +4693,6 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) E_TypeCtx type_ctx = zero_struct; { E_TypeCtx *ctx = &type_ctx; - ctx->arch = arch; ctx->ip_vaddr = thread_rip_vaddr; ctx->ip_voff = thread_rip_voff; ctx->modules = eval_modules; @@ -4705,14 +4705,13 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ProfScope("build eval parse context") { E_ParseCtx *ctx = &parse_ctx; - ctx->arch = arch; ctx->ip_vaddr = thread_rip_vaddr; ctx->ip_voff = thread_rip_voff; ctx->modules = eval_modules; ctx->modules_count = eval_modules_count; ctx->primary_module = eval_modules_primary; - ctx->regs_map = ctrl_string2reg_from_arch(ctx->arch); - ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->arch); + 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(temp.arena, eval_modules_primary->rdi, thread_rip_voff); ctx->member_map = e_push_member_map_from_rdi_voff(temp.arena, eval_modules_primary->rdi, thread_rip_voff); } @@ -4728,11 +4727,11 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) E_InterpretCtx interpret_ctx = zero_struct; { E_InterpretCtx *ctx = &interpret_ctx; - ctx->arch = arch; ctx->space_read_user_data = ctrl_state->ctrl_thread_entity_store; ctx->space_read = ctrl_eval_space_read; ctx->primary_space = eval_modules_primary->space; - ctx->reg_size = regs_block_size_from_architecture(ctx->arch); + ctx->reg_arch = eval_modules_primary->arch; + ctx->reg_size = regs_block_size_from_architecture(eval_modules_primary->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); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 1f631664..e0049efa 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1411,6 +1411,32 @@ df_parent_expand_key_from_entity(DF_Entity *entity) return parent_key; } +//- rjf: entity -> evaluation + +internal DF_EntityEval * +df_eval_from_entity(Arena *arena, DF_Entity *entity) +{ + DF_EntityEval *eval = push_array(arena, DF_EntityEval, 1); + { + DF_Entity *loc = df_entity_child_from_kind(entity, DF_EntityKind_Location); + String8 label_string = push_str8_copy(arena, entity->name); + String8 loc_string = {0}; + if(loc->flags & DF_EntityFlag_HasTextPoint) + { + loc_string = push_str8f(arena, "%S:%I64u:%I64u", loc->name, loc->text_point.line, loc->text_point.column); + } + else if(loc->flags & DF_EntityFlag_HasVAddr) + { + loc_string = push_str8f(arena, "0x%I64x", loc->vaddr); + } + eval->enabled = !entity->disabled; + eval->hit_count = entity->u64; + eval->label_off = (U64)((U8 *)label_string.str - (U8 *)eval); + eval->location_off = (U64)((U8 *)loc_string.str - (U8 *)eval); + } + return eval; +} + //////////////////////////////// //~ rjf: Name Allocation @@ -3707,10 +3733,21 @@ df_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) DF_Entity *entity = (DF_Entity *)space; switch(entity->kind) { - default:{}break; - case DF_EntityKind_Breakpoint: + default: { - // TODO(rjf) + Temp scratch = scratch_begin(0, 0); + arena_push(scratch.arena, 0, 64); + U64 pos_min = arena_pos(scratch.arena); + DF_EntityEval *eval = df_eval_from_entity(scratch.arena, entity); + U64 pos_opl = arena_pos(scratch.arena); + U64 off_min = 0; + U64 off_opl = pos_opl - pos_min; + if(off_min <= range.min && range.max <= off_opl) + { + result = 1; + MemoryCopy(out, (U8 *)eval + range.min, dim_1u64(range)); + } + scratch_end(scratch); }break; case DF_EntityKind_Process: { @@ -8322,6 +8359,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) { DF_Entity *m = n->entity; DI_Key dbgi_key = df_dbgi_key_from_module(m); + eval_modules[eval_module_idx].arch = df_architecture_from_entity(m); eval_modules[eval_module_idx].rdi = di_rdi_from_key(df_state->frame_di_scope, &dbgi_key, 0); eval_modules[eval_module_idx].vaddr_range = m->vaddr_rng; eval_modules[eval_module_idx].space = (U64)df_entity_ancestor_from_kind(m, DF_EntityKind_Process); @@ -8355,7 +8393,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) E_TypeCtx *type_ctx = push_array(arena, E_TypeCtx, 1); { E_TypeCtx *ctx = type_ctx; - ctx->arch = arch; ctx->ip_vaddr = rip_vaddr; ctx->ip_voff = rip_voff; ctx->modules = eval_modules; @@ -8369,14 +8406,13 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) ProfScope("build eval parse context") { E_ParseCtx *ctx = parse_ctx; - ctx->arch = arch; ctx->ip_vaddr = rip_vaddr; ctx->ip_voff = rip_voff; ctx->modules = eval_modules; ctx->modules_count = eval_modules_count; ctx->primary_module = eval_modules_primary; - ctx->regs_map = ctrl_string2reg_from_arch(ctx->arch); - ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->arch); + 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 = 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); } @@ -8428,11 +8464,11 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) E_InterpretCtx *interpret_ctx = push_array(arena, E_InterpretCtx, 1); { E_InterpretCtx *ctx = interpret_ctx; - ctx->arch = arch; ctx->space_read_user_data = process; ctx->space_read = df_eval_space_read; ctx->primary_space = eval_modules_primary->space; - ctx->reg_size = regs_block_size_from_architecture(ctx->arch); + ctx->reg_arch = eval_modules_primary->arch; + ctx->reg_size = regs_block_size_from_architecture(eval_modules_primary->arch); ctx->reg_data = push_array(arena, U8, ctx->reg_size); ctx->module_base = push_array(arena, U64, 1); ctx->module_base[0]= module->vaddr_rng.min; diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index d8108357..1289cc4b 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -400,6 +400,18 @@ struct DF_EntityRec S32 pop_count; }; +//////////////////////////////// +//~ rjf: Entity Evaluation Types + +typedef struct DF_EntityEval DF_EntityEval; +struct DF_EntityEval +{ + B64 enabled; + U64 hit_count; + U64 label_off; + U64 location_off; +}; + //////////////////////////////// //~ rjf: Entity Fuzzy Listing Types @@ -1413,6 +1425,9 @@ internal Vec4F32 df_rgba_from_entity(DF_Entity *entity); internal DF_ExpandKey df_expand_key_from_entity(DF_Entity *entity); internal DF_ExpandKey df_parent_expand_key_from_entity(DF_Entity *entity); +//- rjf: entity -> evaluation +internal DF_EntityEval *df_eval_from_entity(Arena *arena, DF_Entity *entity); + //////////////////////////////// //~ rjf: Name Allocation diff --git a/src/df/gfx/df_view_rules.c b/src/df/gfx/df_view_rules.c index 5ca693a8..6a1cbc82 100644 --- a/src/df/gfx/df_view_rules.c +++ b/src/df/gfx/df_view_rules.c @@ -199,7 +199,7 @@ DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) // rjf: apply array size to type E_TypeKey pointee = e_type_ptee_from_key(type_key); E_TypeKey array_type = e_type_key_cons_array(pointee, array_size); - eval.type_key = e_type_key_cons_ptr(array_type); + eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type); } } scratch_end(scratch); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 19798d9f..c406599c 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1502,13 +1502,13 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { E_MemberList bp_members = {0}; { - e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Disabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64)); + e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64)); e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Hit Count"),.off = 0+8, .type_key = e_type_key_basic(E_TypeKind_U64)); - e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Label"), .off = 0+8+8, .type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_Char8), 256)); - e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Location"), .off = 0+8+8+8, .type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_Char8), 256)); + e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Label"), .off = 0+8+8, .type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); + e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Location"), .off = 0+8+8+8, .type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); } E_MemberArray bp_members_array = e_member_array_from_list(scratch.arena, &bp_members); - E_TypeKey bp_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = str8_lit("Breakpoint"), .members = bp_members_array.v, .count = bp_members_array.count); + E_TypeKey bp_type = e_type_key_cons(.arch = architecture_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Breakpoint"), .members = bp_members_array.v, .count = bp_members_array.count); E_Expr *bp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafID, 0); bp_expr->type_key = bp_type; bp_expr->mode = E_Mode_Offset; @@ -1544,7 +1544,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS e_member_list_push_new(scratch.arena, &wp_members, .name = str8_lit("Location"), .off = 0, .type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_Char8), 256)); } E_MemberArray wp_members_array = e_member_array_from_list(scratch.arena, &wp_members); - E_TypeKey wp_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = str8_lit("Watch Pin"), .members = wp_members_array.v, .count = wp_members_array.count); + E_TypeKey wp_type = e_type_key_cons(.arch = architecture_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Watch Pin"), .members = wp_members_array.v, .count = wp_members_array.count); E_Expr *wp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafID, 0); wp_expr->type_key = wp_type; wp_expr->mode = E_Mode_Offset; diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 3f505f11..2e005efc 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -62,7 +62,7 @@ e_autoresolved_eval_from_eval(E_Eval eval) if(string_idx == 0) { string_idx = gvar->name_string_idx; } if(string_idx != 0) { - eval.type_key = e_type_key_cons_ptr(e_type_key_basic(E_TypeKind_Void)); + eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void)); } } return eval; @@ -97,12 +97,13 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) if(has_vtable) { U64 ptr_vaddr = eval.value.u64; - U64 addr_size = bit_size_from_arch(e_interpret_ctx->arch)/8; + U64 addr_size = e_type_byte_size_from_key(e_type_unwrap(type_key)); U64 class_base_vaddr = 0; U64 vtable_vaddr = 0; 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))) { + Architecture arch = e_type_state->ctx->primary_module->arch; U32 rdi_idx = 0; RDI_Parsed *rdi = 0; U64 module_base = 0; @@ -110,6 +111,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) { if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vtable_vaddr)) { + arch = e_type_state->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; @@ -126,7 +128,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) 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_ptr(derived_type_key); + E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key); eval.type_key = ptr_to_derived_type_key; } } diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index f24564d8..10af3a1b 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -101,6 +101,7 @@ struct E_Module { RDI_Parsed *rdi; Rng1U64 vaddr_range; + Architecture arch; E_Space space; }; diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 85edb4f4..cf904643 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -169,8 +169,8 @@ e_interpret(String8 bytecode) U8 rdi_reg_code = (imm&0x0000FF)>>0; U8 byte_size = (imm&0x00FF00)>>8; U8 byte_off = (imm&0xFF0000)>>16; - REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->arch, rdi_reg_code); - REGS_Rng rng = regs_reg_code_rng_table_from_architecture(e_interpret_ctx->arch)[base_reg_code]; + REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->reg_arch, rdi_reg_code); + REGS_Rng rng = regs_reg_code_rng_table_from_architecture(e_interpret_ctx->reg_arch)[base_reg_code]; U64 off = (U64)rng.byte_off + byte_off; U64 size = (U64)byte_size; if(off + size <= e_interpret_ctx->reg_size) @@ -187,7 +187,7 @@ e_interpret(String8 bytecode) case RDI_EvalOp_RegReadDyn: { U64 off = svals[0].u64; - U64 size = bit_size_from_arch(e_interpret_ctx->arch)/8; + U64 size = bit_size_from_arch(e_interpret_ctx->reg_arch)/8; if(off + size <= e_interpret_ctx->reg_size) { MemoryCopy(&nval, (U8*)e_interpret_ctx->reg_data + off, size); diff --git a/src/eval/eval_interpret.h b/src/eval/eval_interpret.h index 4f456cbd..b718692a 100644 --- a/src/eval/eval_interpret.h +++ b/src/eval/eval_interpret.h @@ -34,10 +34,10 @@ typedef B32 E_SpaceReadFunction(void *user_data, E_Space space, void *out, Rng1U typedef struct E_InterpretCtx E_InterpretCtx; struct E_InterpretCtx { - Architecture arch; void *space_read_user_data; E_SpaceReadFunction *space_read; E_Space primary_space; + Architecture reg_arch; void *reg_data; U64 reg_size; U64 *module_base; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index ca937de9..9343d11c 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -689,7 +689,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate result.root = r_tree.root; - result.type_key = e_type_key_cons_ptr(r_type_unwrapped); + result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped); result.mode = E_Mode_Value; result.space = r_tree.space; }break; @@ -1005,7 +1005,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_TypeKey ptr_type = ptr_tree->type_key; if(ptr_is_decay) { - ptr_type = e_type_key_cons_ptr(direct_type); + ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type); } E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root); result.root = new_root; @@ -1214,6 +1214,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = expr->type_key; result.mode = E_Mode_Offset; + result.space = expr->space; }break; //- rjf: types diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index c5059057..78d53c4a 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -904,7 +904,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(direct_type_key); + result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key); }break; case E_ExprKind_Array: { @@ -1198,7 +1198,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to else { E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); - type->type_key = e_type_key_cons_ptr(e_type_key_basic(E_TypeKind_U64)); + type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64)); E_Expr *casted = atom; E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str); e_expr_push_child(cast, type); @@ -1243,6 +1243,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to E_TypeKey type_key = zero_struct; String8 local_lookup_string = token_string; E_Space space = E_Space_Null; + Architecture arch = Architecture_Null; //- rjf: identifiers surrounded by ``s should have those `s stripped if(local_lookup_string.size >= 2 && @@ -1315,6 +1316,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to { mapped_identifier = 1; space = module->space; + arch = module->arch; U64 all_location_data_size = 0; U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size); loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off)); @@ -1362,9 +1364,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to if(reg_num != 0) { reg_code = reg_num; - type_key = e_type_key_reg(e_parse_ctx->arch, reg_code); + type_key = e_type_key_reg(e_parse_ctx->primary_module->arch, reg_code); mapped_identifier = 1; space = E_Space_Regs; + arch = e_parse_ctx->primary_module->arch; } } @@ -1375,9 +1378,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to if(alias_num != 0) { alias_code = (REGS_AliasCode)alias_num; - type_key = e_type_key_reg_alias(e_parse_ctx->arch, alias_code); + type_key = e_type_key_reg_alias(e_parse_ctx->primary_module->arch, alias_code); mapped_identifier = 1; space = E_Space_Regs; + arch = e_parse_ctx->primary_module->arch; } } @@ -1419,6 +1423,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx); mapped_identifier = 1; space = module->space; + arch = module->arch; break; } } @@ -1458,6 +1463,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx); mapped_identifier = 1; space = module->space; + arch = module->arch; break; } } @@ -1499,6 +1505,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx); mapped_identifier = 1; space = module->space; + arch = module->arch; break; } } @@ -1513,6 +1520,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to mapped_identifier = 1; identifier_looks_like_type_expr = 1; space = E_Space_Null; + arch = e_parse_ctx->primary_module->arch; } } @@ -1537,7 +1545,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to } else if(reg_code != 0) { - REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_parse_ctx->arch)[reg_code]; + REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_parse_ctx->primary_module->arch)[reg_code]; E_OpList oplist = {0}; e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); @@ -1549,8 +1557,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to } else if(alias_code != 0) { - REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(e_parse_ctx->arch)[alias_code]; - REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_architecture(e_parse_ctx->arch)[alias_slice.code]; + REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(e_parse_ctx->primary_module->arch)[alias_code]; + REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_architecture(e_parse_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); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); @@ -1586,7 +1594,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to case RDI_LocationKind_AddrRegPlusU16: { E_OpList oplist = {0}; - U64 byte_size = bit_size_from_arch(e_parse_ctx->arch)/8; + U64 byte_size = bit_size_from_arch(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); @@ -1601,12 +1609,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to case RDI_LocationKind_AddrAddrRegPlusU16: { E_OpList oplist = {0}; - U64 byte_size = bit_size_from_arch(e_parse_ctx->arch)/8; + U64 byte_size = bit_size_from_arch(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_parse_ctx->arch)/8); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(arch)/8); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom->mode = E_Mode_Offset; atom->space = space; @@ -1616,8 +1624,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to }break; case RDI_LocationKind_ValReg: { - REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(e_parse_ctx->arch, loc_reg.reg_code); - REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_parse_ctx->arch)[regs_reg_code]; + REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc_reg.reg_code); + REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(arch)[regs_reg_code]; E_OpList oplist = {0}; U64 byte_size = (U64)reg_rng.byte_size; U64 byte_pos = 0; diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index d7641e60..501e158d 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -136,9 +136,6 @@ struct E_String2ExprMap typedef struct E_ParseCtx E_ParseCtx; struct E_ParseCtx { - // rjf: architecture - Architecture arch; - // rjf: instruction pointer info U64 ip_vaddr; U64 ip_voff; diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 38faefbc..4a1881bf 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -398,9 +398,9 @@ e_type_key_cons_array(E_TypeKey element_type_key, U64 count) } internal E_TypeKey -e_type_key_cons_ptr(E_TypeKey element_type_key) +e_type_key_cons_ptr(Architecture arch, E_TypeKey element_type_key) { - E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_Ptr, .direct_key = element_type_key); + E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .direct_key = element_type_key); return key; } @@ -479,7 +479,7 @@ e_type_from_key(Arena *arena, E_TypeKey key) }break; case E_TypeKind_Ptr: { - type->byte_size = bit_size_from_arch(e_type_state->ctx->arch)/8; + type->byte_size = bit_size_from_arch(node->params.arch)/8; }break; case E_TypeKind_Array: { @@ -651,7 +651,7 @@ 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->arch)/8; + type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; }break; case RDI_TypeKind_Array: @@ -672,7 +672,7 @@ 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->arch)/8; + type->byte_size = bit_size_from_arch(e_type_state->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); @@ -705,7 +705,7 @@ 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->arch)/8; + type->byte_size = bit_size_from_arch(e_type_state->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); @@ -743,7 +743,7 @@ 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->arch)/8; + type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; type->owner_type_key = owner_type_key; type->direct_type_key = direct_type_key; }break; diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index a3b95300..60d2c487 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -138,6 +138,7 @@ struct E_Type typedef struct E_ConsTypeParams E_ConsTypeParams; struct E_ConsTypeParams { + Architecture arch; E_TypeKind kind; String8 name; E_TypeKey direct_key; @@ -165,12 +166,9 @@ struct E_ConsTypeSlot typedef struct E_TypeCtx E_TypeCtx; struct E_TypeCtx { - // rjf: architecture - Architecture arch; - // rjf: instruction pointer info U64 ip_vaddr; - U64 ip_voff; // (within module, which uses `rdis[rdis_primary_idx]` for debug info) + U64 ip_voff; // (within `primary_module`) // rjf: debug info E_Module *modules; @@ -243,7 +241,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params); //- rjf: constructed type construction helpers internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count); -internal E_TypeKey e_type_key_cons_ptr(E_TypeKey element_type_key); +internal E_TypeKey e_type_key_cons_ptr(Architecture arch, E_TypeKey element_type_key); //- rjf: basic type key functions internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r);