diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 12bfedec..dd3f5d0b 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -3796,8 +3796,9 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, //- rjf: eval helpers internal B32 -ctrl_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range) +ctrl_eval_memory_read(void *u, E_Space space, void *out, Rng1U64 vaddr_range) { + // TODO(rjf): @spaces pick the correct process from space DMN_Handle process = *(DMN_Handle *)u; U64 read_size = dmn_process_read(process, vaddr_range, out); B32 result = (read_size == dim_1u64(vaddr_range)); @@ -4721,6 +4722,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ctx->arch = arch; ctx->memory_read_user_data = &event->process; ctx->memory_read = ctrl_eval_memory_read; + ctx->primary_space = eval_modules_primary->space; ctx->reg_size = regs_block_size_from_architecture(ctx->arch); ctx->reg_data = push_array(temp.arena, U8, ctx->reg_size); dmn_thread_read_reg_block(event->thread, ctx->reg_data); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 8ee14867..7753d0f9 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -818,7 +818,7 @@ internal void ctrl_thread__module_close(CTRL_MachineID machine_id, DMN_Handle mo internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); //- rjf: eval helpers -internal B32 ctrl_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range); +internal B32 ctrl_eval_memory_read(void *u, E_Space space, void *out, Rng1U64 vaddr_range); //- rjf: log flusher internal void ctrl_thread__flush_info_log(String8 string); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 076b987e..94e7a0a2 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3689,8 +3689,9 @@ df_ctrl_last_stop_event(void) //~ rjf: Evaluation Context internal B32 -df_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range) +df_eval_memory_read(void *u, E_Space space, void *out, Rng1U64 vaddr_range) { + // TODO(rjf): @spaces pick the correct process from space B32 result = 0; DF_Entity *process = (DF_Entity *)u; if(process->kind == DF_EntityKind_Process) @@ -4314,27 +4315,30 @@ df_commit_eval_value(E_Eval dst_eval, E_Eval src_eval) //- rjf: commit if(result && commit_data.size != 0) { - switch(dst_eval.mode) + if(dst_eval.mode == E_Mode_Offset) { - default:{}break; - case E_Mode_Addr: + switch(dst_eval.space) { - ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.value.u64, dst_eval.value.u64+commit_data.size), commit_data.str); - }break; - case E_Mode_Reg: - { - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - Architecture arch = df_architecture_from_entity(thread); - U64 reg_block_size = regs_block_size_from_architecture(arch); - if(unwind.frames.count != 0 && - (0 <= dst_eval.value.u64 && dst_eval.value.u64+commit_data.size < reg_block_size)) + case E_Space_Regs: { - void *new_regs = push_array(scratch.arena, U8, reg_block_size); - MemoryCopy(new_regs, unwind.frames.v[0].regs, reg_block_size); - MemoryCopy((U8 *)new_regs+dst_eval.value.u64, commit_data.str, commit_data.size); - result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, new_regs); - } - }break; + CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); + Architecture arch = df_architecture_from_entity(thread); + U64 reg_block_size = regs_block_size_from_architecture(arch); + if(unwind.frames.count != 0 && + (0 <= dst_eval.value.u64 && dst_eval.value.u64+commit_data.size < reg_block_size)) + { + void *new_regs = push_array(scratch.arena, U8, reg_block_size); + MemoryCopy(new_regs, unwind.frames.v[0].regs, reg_block_size); + MemoryCopy((U8 *)new_regs+dst_eval.value.u64, commit_data.str, commit_data.size); + result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, new_regs); + } + }break; + default: + { + // TODO(rjf): @spaces pick the right process, from the space + ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.value.u64, dst_eval.value.u64+commit_data.size), commit_data.str); + }break; + } } } @@ -4445,7 +4449,6 @@ df_eval_link_base_chunk_list_from_eval(Arena *arena, E_TypeKey link_member_type_ chunk->count = 0; SLLQueuePush(list.first, list.last, chunk); } - chunk->b[chunk->count].mode = base_eval.mode; chunk->b[chunk->count].offset = base_eval.value.u64; chunk->count += 1; list.count += 1; @@ -4455,14 +4458,15 @@ df_eval_link_base_chunk_list_from_eval(Arena *arena, E_TypeKey link_member_type_ E_Eval link_member_eval = { .value = {.u64 = base_eval.value.u64 + link_member_off}, - base_eval.mode, + .mode = E_Mode_Offset, + .space = base_eval.space, .type_key = link_member_type_key, }; E_Eval link_member_value_eval = e_value_eval_from_eval(link_member_eval); // rjf: advance to next link last_eval = base_eval; - base_eval.mode = E_Mode_Addr; + base_eval.mode = E_Mode_Offset; base_eval.value.u64 = link_member_value_eval.value.u64; } return list; @@ -4609,7 +4613,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex direct_type_kind == E_TypeKind_IncompleteClass)) { udt_eval.type_key = direct_type_key; - udt_eval.mode = E_Mode_Addr; + udt_eval.mode = E_Mode_Offset; + udt_eval.space = ptr_val_eval.space; udt_eval.value = ptr_val_eval.value; udt_type_kind = e_type_kind_from_key(direct_type_key); } @@ -4618,7 +4623,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex if(direct_type_kind == E_TypeKind_Array) { arr_eval.type_key = direct_type_key; - arr_eval.mode = E_Mode_Addr; + arr_eval.mode = E_Mode_Offset; + arr_eval.space = ptr_val_eval.space; arr_eval.value = ptr_val_eval.value; arr_type_kind = e_type_kind_from_key(direct_type_key); } @@ -4627,7 +4633,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex if(direct_type_kind == E_TypeKind_Ptr || direct_type_kind == E_TypeKind_LRef || direct_type_kind == E_TypeKind_RRef) { ptr_eval.type_key = direct_type_key; - ptr_eval.mode = E_Mode_Addr; + ptr_eval.mode = E_Mode_Offset; + ptr_eval.space = ptr_val_eval.space; ptr_eval.value = ptr_val_eval.value; ptr_type_kind = e_type_kind_from_key(direct_type_key); } @@ -4748,8 +4755,9 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex E_Member *member = &filtered_data_members.v[child_idx]; E_Eval child_eval = zero_struct; { - child_eval.type_key = member->type_key; - child_eval.mode = udt_eval.mode; + child_eval.type_key = member->type_key; + child_eval.mode = udt_eval.mode; + child_eval.space = udt_eval.space; child_eval.value.u64 = udt_eval.value.u64 + member->off; } df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, member->name, child_eval, member, &child_cfg, depth+1, list_out); @@ -4867,7 +4875,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex E_Eval child_eval = zero_struct; { child_eval.type_key = udt_eval.type_key; - child_eval.mode = link_base.mode; + child_eval.mode = E_Mode_Offset; + child_eval.space = udt_eval.space; child_eval.value.u64= link_base.offset; } df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); @@ -4926,6 +4935,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex { child_eval.type_key = element_type_key; child_eval.mode = arr_eval.mode; + child_eval.space = arr_eval.space; child_eval.value.u64= arr_eval.value.u64 + child_idx*element_type_byte_size; } df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); @@ -8322,6 +8332,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) ctx->arch = arch; ctx->memory_read_user_data = process; ctx->memory_read = df_eval_memory_read; + ctx->primary_space = eval_modules_primary->space; ctx->reg_size = regs_block_size_from_architecture(ctx->arch); ctx->reg_data = push_array(arena, U8, ctx->reg_size); ctx->module_base = push_array(arena, U64, 1); diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 45698aa1..4f2c931b 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -650,7 +650,6 @@ struct DF_EvalViewCache typedef struct DF_EvalLinkBase DF_EvalLinkBase; struct DF_EvalLinkBase { - E_Mode mode; U64 offset; }; @@ -1564,7 +1563,7 @@ internal CTRL_Event df_ctrl_last_stop_event(void); //////////////////////////////// //~ rjf: Evaluation Context -internal B32 df_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range); +internal B32 df_eval_memory_read(void *u, E_Space space, void *out, Rng1U64 vaddr_range); internal E_Eval df_eval_from_eval_cfg_table(Arena *arena, E_Eval eval, DF_CfgTable *cfg); //////////////////////////////// diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 4c20a585..612bb022 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6133,7 +6133,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_ExpandKey parent_key = df_expand_key_make(5381, 1); DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1); DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, expr, parent_key, key); - U32 default_radix = (eval.mode == E_Mode_Reg ? 16 : 10); + U32 default_radix = (eval.space == E_Space_Regs ? 16 : 10); DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); //- rjf: animate @@ -6221,8 +6221,9 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) switch(row->eval.mode) { default:{}break; - case E_Mode_Addr: + case E_Mode_Offset: { + // TODO(rjf): @spaces pick the right process from the eval's space U64 size = e_type_byte_size_from_key(row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.value.u64, row->eval.value.u64+size); @@ -8455,7 +8456,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags { E_Eval pted_eval = zero_struct; pted_eval.type_key = direct_type_key; - pted_eval.mode = E_Mode_Addr; + pted_eval.mode = E_Mode_Offset; + pted_eval.space = value_eval.space; pted_eval.value = value_eval.value; String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); if(pted_strs.total_size == 0) @@ -8512,8 +8514,9 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags switch(eval.mode) { default:{}break; - case E_Mode_Addr: + case E_Mode_Offset: { + // TODO(rjf): @spaces pick the right process from the eval's space CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.value.u64, 256, element_size, 0); text_data = text_slice.data; }break; @@ -8612,6 +8615,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags E_Eval member_eval = zero_struct; member_eval.type_key = mem->type_key; member_eval.mode = eval.mode; + member_eval.space = eval.space; member_eval.value = eval.value; member_eval.value.u64 += mem->off; String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); @@ -8820,6 +8824,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, { member_eval.type_key = member->type_key; member_eval.mode = block->eval.mode; + member_eval.space = block->eval.space; member_eval.value = block->eval.value; member_eval.value.u64 += member->off; } @@ -8876,6 +8881,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, { eval.type_key = block->eval.type_key; eval.mode = E_Mode_Value; + eval.space = block->eval.space; eval.value.u64 = enum_val->val; } @@ -8971,7 +8977,8 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, E_Eval link_eval = zero_struct; { link_eval.type_key = block->eval.type_key; - link_eval.mode = link_base->mode; + link_eval.mode = E_Mode_Offset; + link_eval.space = block->eval.space; link_eval.value.u64= link_base->offset; } diff --git a/src/df/gfx/df_view_rules.c b/src/df/gfx/df_view_rules.c index 6e545670..c3c80910 100644 --- a/src/df/gfx/df_view_rules.c +++ b/src/df/gfx/df_view_rules.c @@ -147,7 +147,7 @@ df_vr_rgba_from_eval(E_Eval eval, DF_Entity *process) // rjf: extract r/g/b/a values from array case E_TypeKind_Array: - if(eval.mode == E_Mode_Addr) + if(eval.mode == E_Mode_Offset) { U64 array_total_size = e_type_byte_size_from_key(type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); @@ -184,7 +184,7 @@ df_vr_rgba_from_eval(E_Eval eval, DF_Entity *process) case E_TypeKind_Struct: case E_TypeKind_Class: case E_TypeKind_Union: - if(eval.mode == E_Mode_Addr) + if(eval.mode == E_Mode_Offset) { U64 struct_total_size = e_type_byte_size_from_key(type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 469adba3..81a8a39f 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -2377,8 +2377,9 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS switch(row->eval.mode) { default:{}break; - case E_Mode_Addr: + case E_Mode_Offset: { + // TODO(rjf): @spaces pick the right process from the eval's space U64 size = e_type_byte_size_from_key(row->eval.type_key); size = Min(size, 64); Rng1U64 vaddr_rng = r1u64(row->eval.value.u64, row->eval.value.u64+size); @@ -2485,7 +2486,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //////////////////// //- rjf: draw start of cache lines in expansions // - if((row->eval.mode == E_Mode_Addr || row->eval.mode == E_Mode_Null) && + if((row->eval.mode == E_Mode_Offset || row->eval.mode == E_Mode_Null) && row->eval.msgs.count == 0 && row->eval.value.u64%64 == 0 && row->depth > 0 && !row_expanded) @@ -2500,7 +2501,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //////////////////// //- rjf: draw mid-row cache line boundaries in expansions // - if((row->eval.mode == E_Mode_Addr || row->eval.mode == E_Mode_Null) && + if((row->eval.mode == E_Mode_Offset || row->eval.mode == E_Mode_Null) && row->eval.msgs.max_kind == E_MsgKind_Null && row->eval.value.u64%64 != 0 && row->depth > 0 && @@ -2695,6 +2696,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { default:{}break; case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; + case E_IRExtKind_SetSpace:{op_string = str8_lit("SetSpace");}break; #define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; RDI_EvalOp_XList #undef X @@ -2720,6 +2722,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS { default:{}break; case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; + case E_IRExtKind_SetSpace:{op_string = str8_lit("SetSpace");}break; #define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; RDI_EvalOp_XList #undef X @@ -7532,7 +7535,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory) { String8 local_name = n->string; E_Eval local_eval = e_eval_from_string(scratch.arena, local_name); - if(local_eval.mode == E_Mode_Addr) + if(local_eval.mode == E_Mode_Offset) { E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.type_key); U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.type_key); diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 03b17fae..039ba732 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -17,6 +17,7 @@ e_eval_from_string(Arena *arena, String8 string) { .value = interp.value, .mode = irtree.mode, + .space = irtree.space, .type_key = irtree.type_key, .code = interp.code, .advance = parse.last_token >= tokens.v + tokens.count ? string.size : parse.last_token->range.min, @@ -37,7 +38,7 @@ e_autoresolved_eval_from_eval(E_Eval eval) e_interpret_ctx && e_parse_ctx->modules_count > 0 && e_interpret_ctx->module_base != 0 && - (eval.mode == E_Mode_Value || eval.mode == E_Mode_Reg) && + (eval.mode == E_Mode_Value || eval.space == E_Space_Regs) && (e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S64)) || e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U64)) || e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S32)) || @@ -92,8 +93,8 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) U64 addr_size = bit_size_from_arch(e_interpret_ctx->arch)/8; U64 class_base_vaddr = 0; U64 vtable_vaddr = 0; - if(e_interpret_ctx->memory_read(e_interpret_ctx->memory_read_user_data, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && - e_interpret_ctx->memory_read(e_interpret_ctx->memory_read_user_data, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) + if(e_interpret_ctx->memory_read(e_interpret_ctx->memory_read_user_data, eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && + e_interpret_ctx->memory_read(e_interpret_ctx->memory_read_user_data, eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) { U32 rdi_idx = 0; RDI_Parsed *rdi = 0; @@ -133,6 +134,56 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) internal E_Eval e_value_eval_from_eval(E_Eval eval) { + if(eval.mode == E_Mode_Offset) + { + E_TypeKey type_key = e_type_unwrap(eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(type_kind == E_TypeKind_Array) + { + eval.mode = E_Mode_Value; + } + else if(e_interpret_ctx->memory_read != 0) + { + U64 type_byte_size = e_type_byte_size_from_key(type_key); + Rng1U64 value_vaddr_range = r1u64(eval.value.u64, eval.value.u64 + type_byte_size); + MemoryZeroStruct(&eval.value); + if(!e_type_key_match(type_key, e_type_key_zero()) && + type_byte_size <= sizeof(E_Value) && + e_interpret_ctx->memory_read(e_interpret_ctx->memory_read_user_data, eval.space, &eval.value, value_vaddr_range)) + { + eval.mode = E_Mode_Value; + + // rjf: mask&shift, for bitfields + if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64)) + { + Temp scratch = scratch_begin(0, 0); + E_Type *type = e_type_from_key(scratch.arena, type_key); + U64 valid_bits_mask = 0; + for(U64 idx = 0; idx < type->count; idx += 1) + { + valid_bits_mask |= (1<> type->off; + eval.value.u64 = eval.value.u64 & valid_bits_mask; + eval.type_key = type->direct_type_key; + scratch_end(scratch); + } + + // rjf: manually sign-extend + switch(type_kind) + { + default: break; + case E_TypeKind_S8: {eval.value.s64 = (S64)*((S8 *)&eval.value.u64);}break; + case E_TypeKind_S16: {eval.value.s64 = (S64)*((S16 *)&eval.value.u64);}break; + case E_TypeKind_S32: {eval.value.s64 = (S64)*((S32 *)&eval.value.u64);}break; + } + } + } + } + return eval; + + // TODO(rjf): @spaces check regs path +#if 0 switch(eval.mode) { //- rjf: no work to be done. already in value mode @@ -140,7 +191,7 @@ e_value_eval_from_eval(E_Eval eval) case E_Mode_Value:{}break; //- rjf: address => resolve into value, if leaf - case E_Mode_Addr: + case E_Mode_Offset: { E_TypeKey type_key = e_type_unwrap(eval.type_key); E_TypeKind type_kind = e_type_kind_from_key(type_key); @@ -198,6 +249,7 @@ e_value_eval_from_eval(E_Eval eval) eval.mode = E_Mode_Value; }break; } +#endif return eval; } @@ -207,6 +259,7 @@ e_element_eval_from_array_eval_index(E_Eval eval, U64 index) { E_Eval result = {0}; result.mode = eval.mode; + result.space = eval.space; result.type_key = e_type_direct_from_key(eval.type_key); result.code = eval.code; result.msgs = eval.msgs; @@ -222,8 +275,7 @@ e_element_eval_from_array_eval_index(E_Eval eval, U64 index) (U8 *)(&eval.value.u512[0]) + index*element_size, element_size); }break; - case E_Mode_Addr: - case E_Mode_Reg: + case E_Mode_Offset: { result.value.u64 = eval.value.u64 + element_size*index; }break; diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index a5c7b304..0d195c04 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -12,6 +12,7 @@ struct E_Eval { E_Value value; E_Mode mode; + E_Space space; E_TypeKey type_key; E_InterpretationCode code; E_MsgList msgs; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 17d1b061..9ae6e678 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -42,15 +42,14 @@ struct E_MsgList typedef U64 E_Space; // // NOTE(rjf): Evaluations occur within the context of a "space". Each "space" -// refers to a different offset or address space, but it's a bit looser of a +// refers to a different offset/address-space, but it's a bit looser of a // concept than just address space, since it can also refer to offsets into -// a register block, only type information, or the "space" of all possibly -// values. It is also used to refer to spaces of unique IDs for key-value -// stores, e.g. for information in the debugger. +// a register block, and it is also used to refer to spaces of unique IDs for +// key-value stores, e.g. for information in the debugger. // // Effectively, when considering the result of an evaluation, you use the -// value for understanding a key *into* a space, e.g. 1+2 -> 3, in the space -// of all values, or &foo, in the space of all addresses in PID: 1234. +// value for understanding a key *into* a space, e.g. 1+2 -> 3, in a null +// space, or &foo, in the space of PID: 1234. // // The values in the E_Space enum are reserved, but apart from those, any // arbitrary value can be used, and then later interpreted. @@ -58,11 +57,20 @@ typedef U64 E_Space; enum { E_Space_Null, - E_Space_Types, // values are not used; evaluation only contain type content - E_Space_Values, // values do not refer to any space, but are standalone numeric values - E_Space_Regs, // values index into evaluator thread's register block + E_Space_Regs, }; +//////////////////////////////// +//~ rjf: Evaluation Modes + +typedef enum E_Mode +{ + E_Mode_Null, + E_Mode_Value, + E_Mode_Offset, +} +E_Mode; + //////////////////////////////// //~ rjf: Modules diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 00cd7de5..6cdcdc11 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -25,10 +25,11 @@ e_interpret(String8 bytecode) E_Interpretation result = {0}; Temp scratch = scratch_begin(0, 0); - //- rjf: allocate stack + //- rjf: allocate stack & "registers" U64 stack_cap = 128; // TODO(rjf): scan bytecode; determine maximum stack depth E_Value *stack = push_array_no_zero(scratch.arena, E_Value, stack_cap); U64 stack_count = 0; + E_Space selected_space = e_interpret_ctx->primary_space; //- rjf: iterate bytecode & perform ops U8 *ptr = bytecode.str; @@ -37,12 +38,20 @@ e_interpret(String8 bytecode) { // rjf: consume next opcode RDI_EvalOp op = (RDI_EvalOp)*ptr; - if(op >= RDI_EvalOp_COUNT) + U8 ctrlbits = 0; + if(op < RDI_EvalOp_COUNT) { - result.code = E_InterpretationCode_BadOp; - goto done; + ctrlbits = rdi_eval_op_ctrlbits_table[op]; + } + else switch(op) + { + case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(8, 0, 0);}break; + default: + { + result.code = E_InterpretationCode_BadOp; + goto done; + }break; } - U8 ctrlbits = rdi_eval_op_ctrlbits_table[op]; ptr += 1; // rjf: decode @@ -87,6 +96,11 @@ e_interpret(String8 bytecode) E_Value nval = {0}; switch(op) { + case E_IRExtKind_SetSpace: + { + selected_space = imm; + }break; + case RDI_EvalOp_Stop: { goto done; @@ -113,7 +127,7 @@ e_interpret(String8 bytecode) U64 addr = svals[0].u64; U64 size = imm; B32 good_read = 0; - if(e_interpret_ctx->memory_read != 0 && e_interpret_ctx->memory_read(e_interpret_ctx->memory_read_user_data, &nval, r1u64(addr, addr+size))) + if(e_interpret_ctx->memory_read != 0 && e_interpret_ctx->memory_read(e_interpret_ctx->memory_read_user_data, selected_space, &nval, r1u64(addr, addr+size))) { good_read = 1; } diff --git a/src/eval/eval_interpret.h b/src/eval/eval_interpret.h index 3b1875b6..cc1fb7e8 100644 --- a/src/eval/eval_interpret.h +++ b/src/eval/eval_interpret.h @@ -29,7 +29,7 @@ struct E_Interpretation //////////////////////////////// //~ rjf: Interpretation Context -typedef B32 E_MemoryReadFunction(void *user_data, void *out, Rng1U64 vaddr_range); +typedef B32 E_MemoryReadFunction(void *user_data, E_Space space, void *out, Rng1U64 vaddr_range); typedef struct E_InterpretCtx E_InterpretCtx; struct E_InterpretCtx @@ -37,6 +37,7 @@ struct E_InterpretCtx Architecture arch; void *memory_read_user_data; E_MemoryReadFunction *memory_read; + E_Space primary_space; void *reg_data; U64 reg_size; U64 *module_base; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 48853923..52f09299 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -133,6 +133,17 @@ e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode) list->encoded_size += bytecode.size; } +internal void +e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space) +{ + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = E_IRExtKind_SetSpace; + node->u64 = space; + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += sizeof(space); +} + internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string) { @@ -252,43 +263,43 @@ e_irtree_string_literal(Arena *arena, String8 string) } internal E_IRNode * -e_irtree_set_space(Arena *arena, E_Space space) +e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c) { E_IRNode *root = e_push_irnode(arena, E_IRExtKind_SetSpace); root->u64 = space; + e_irnode_push_child(root, c); return root; } internal E_IRNode * -e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key) +e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key) { - U64 byte_size = e_type_byte_size_from_key(type_key); E_IRNode *result = &e_irnode_nil; - if(0 < byte_size && byte_size <= 64) + U64 byte_size = e_type_byte_size_from_key(type_key); + byte_size = Min(64, byte_size); + + // rjf: build the read node + E_IRNode *read_node = e_push_irnode(arena, RDI_EvalOp_MemRead); + read_node->u64 = byte_size; + e_irnode_push_child(read_node, c); + + // rjf: build a signed trunc node if needed + U64 bit_size = byte_size << 3; + E_IRNode *with_trunc = read_node; + E_TypeKind kind = e_type_kind_from_key(type_key); + if(bit_size < 64 && e_type_kind_is_signed(kind)) { - // rjf: build the read node - E_IRNode *read_node = e_push_irnode(arena, RDI_EvalOp_MemRead); - read_node->u64 = byte_size; - e_irnode_push_child(read_node, c); - - // rjf: build a signed trunc node if needed - U64 bit_size = byte_size << 3; - E_IRNode *with_trunc = read_node; - E_TypeKind kind = e_type_kind_from_key(type_key); - if(bit_size < 64 && e_type_kind_is_signed(kind)) - { - with_trunc = e_push_irnode(arena, RDI_EvalOp_TruncSigned); - with_trunc->u64 = bit_size; - e_irnode_push_child(with_trunc, read_node); - } - - // rjf: fill - result = with_trunc; - } - else - { - // TODO(rjf): unexpected path + with_trunc = e_push_irnode(arena, RDI_EvalOp_TruncSigned); + with_trunc->u64 = bit_size; + e_irnode_push_child(with_trunc, read_node); } + + // rjf: set space for this mem read + E_IRNode *set_space_node = e_irtree_set_space(arena, space, with_trunc); + + // rjf: fill + result = set_space_node; + return result; } @@ -345,20 +356,22 @@ e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in) } internal E_IRNode * -e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key) +e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key) { E_IRNode *result = tree; - switch(from_mode) + if(from_mode == E_Mode_Offset) { - default:{}break; - case E_Mode_Reg: + switch(from_space) { - result = e_irtree_unary_op(arena, RDI_EvalOp_RegReadDyn, RDI_EvalTypeGroup_U, tree); - }break; - case E_Mode_Addr: - { - result = e_irtree_mem_read_type(arena, tree, type_key); - }break; + case E_Space_Regs: + { + result = e_irtree_unary_op(arena, RDI_EvalOp_RegReadDyn, RDI_EvalTypeGroup_U, tree); + }break; + default: + { + result = e_irtree_mem_read_type(arena, from_space, tree, type_key); + }break; + } } return result; } @@ -427,7 +440,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { // rjf: ops to compute the index - E_IRNode *index_tree = e_irtree_resolve_to_value(arena, r.mode, r.root, r_restype); + E_IRNode *index_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); if(direct_type_size > 1) { E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); @@ -438,7 +451,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *base_tree = l.root; if(l_restype_kind == E_TypeKind_Ptr && l.mode != E_Mode_Value) { - base_tree = e_irtree_resolve_to_value(arena, l.mode, base_tree, l_restype); + base_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, base_tree, l_restype); } // rjf: ops to compute the final address @@ -447,7 +460,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: fill result.root = new_tree; result.type_key = direct_type; - result.mode = E_Mode_Addr; + result.mode = E_Mode_Offset; + result.space = l.space; } }break; @@ -537,8 +551,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) l_restype_kind == E_TypeKind_LRef || l_restype_kind == E_TypeKind_RRef) { - new_tree = e_irtree_resolve_to_value(arena, l.mode, new_tree, l_restype); - mode = E_Mode_Addr; + new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype); + mode = E_Mode_Offset; } if(r_off != 0) { @@ -550,6 +564,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = r_type; result.mode = mode; + result.space = l.space; } }break; @@ -600,11 +615,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) r_type_kind == E_TypeKind_LRef || r_type_kind == E_TypeKind_RRef)) { - new_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); + new_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); } result.root = new_tree; result.type_key = r_type_direct; - result.mode = E_Mode_Addr; + result.mode = E_Mode_Offset; + result.space = r_tree.space; } }break; @@ -628,7 +644,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { break; } - else if(r_tree.mode != E_Mode_Addr) + else if(r_tree.mode != E_Mode_Offset || r_tree.space <= E_Space_Regs) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->location, "Cannot take address of non-memory."); break; @@ -638,6 +654,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = r_tree.root; result.type_key = e_type_key_cons_ptr(r_type_unwrapped); result.mode = E_Mode_Value; + result.space = r_tree.space; }break; //- rjf: cast @@ -681,7 +698,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { - E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.mode, casted_tree.root, casted_type); + E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.space, casted_tree.mode, casted_tree.root, casted_type); E_IRNode *new_tree = in_tree; if(conversion_rule == RDI_EvalConversionKind_Legal) { @@ -694,6 +711,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = cast_type; result.mode = E_Mode_Value; + result.space = casted_tree.space; } }break; @@ -703,6 +721,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: unpack operand E_Expr *r_expr = expr->first; E_TypeKey r_type = zero_struct; + E_Space space = r_expr->space; switch(r_expr->kind) { case E_ExprKind_TypeIdent: @@ -717,6 +736,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); r_type = r_tree.type_key; + space = r_tree.space; }break; } @@ -736,6 +756,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = e_irtree_const_u(arena, r_type_byte_size); result.type_key = e_type_key_basic(E_TypeKind_U64); result.mode = E_Mode_Value; + result.space = space; } }break; @@ -767,12 +788,13 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { - E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); + E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); in_tree = e_irtree_convert_hi(arena, in_tree, r_type_promoted, r_type); E_IRNode *new_tree = e_irtree_unary_op(arena, op, r_type_group, in_tree); result.root = new_tree; result.type_key = r_type_promoted; result.mode = E_Mode_Value; + result.space = r_tree.space; } }break; @@ -820,10 +842,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) r_type = e_type_key_basic(r_type_kind); } B32 l_is_pointer = (l_type_kind == E_TypeKind_Ptr); - B32 l_is_decay = (l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Addr); + B32 l_is_decay = (l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Offset); B32 l_is_pointer_like = (l_is_pointer || l_is_decay); B32 r_is_pointer = (r_type_kind == E_TypeKind_Ptr); - B32 r_is_decay = (r_type_kind == E_TypeKind_Array && r_tree.mode == E_Mode_Addr); + B32 r_is_decay = (r_type_kind == E_TypeKind_Array && r_tree.mode == E_Mode_Offset); B32 r_is_pointer_like = (r_is_pointer || r_is_decay); RDI_EvalTypeGroup l_type_group = e_type_group_from_kind(l_type_kind); RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); @@ -900,14 +922,15 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { E_TypeKey final_type_key = is_comparison ? e_type_key_basic(E_TypeKind_Bool) : l_type; - E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type); - E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); + E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type); + E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); l_value_tree = e_irtree_convert_hi(arena, l_value_tree, l_type, l_type); r_value_tree = e_irtree_convert_hi(arena, r_value_tree, l_type, r_type); E_IRNode *new_tree = e_irtree_binary_op(arena, op, l_type_group, l_value_tree, r_value_tree); result.root = new_tree; result.type_key = final_type_key; result.mode = E_Mode_Value; + result.space = l_tree.space ? l_tree.space : r_tree.space; } }break; @@ -934,7 +957,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *ptr_root = ptr_tree->root; if(!ptr_is_decay) { - ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_root, ptr_tree->type_key); + ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_root, ptr_tree->type_key); } E_IRNode *int_root = int_tree->root; if(direct_type_size > 1) @@ -951,6 +974,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_root; result.type_key = ptr_type; result.mode = E_Mode_Value; + result.space = l_tree.space ? l_tree.space : r_tree.space; } }break; @@ -966,11 +990,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *r_root = r_tree.root; if(!l_is_decay) { - l_root = e_irtree_resolve_to_value(arena, l_tree.mode, l_root, l_type); + l_root = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_root, l_type); } if(!r_is_decay) { - r_root = e_irtree_resolve_to_value(arena, r_tree.mode, r_root, r_type); + r_root = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_root, r_type); } E_IRNode *op_tree = e_irtree_binary_op_u(arena, op, l_root, r_root); E_IRNode *new_tree = op_tree; @@ -982,6 +1006,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = e_type_key_basic(E_TypeKind_U64); result.mode = E_Mode_Value; + result.space = l_tree.space ? l_tree.space : r_tree.space; }break; //- rjf: pointer array comparison @@ -1000,16 +1025,17 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *ptr_root = ptr_tree->root; E_IRNode *arr_root = arr_tree->root; { - ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key); + ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key); } // rjf: read from pointer into value, to compare with array - E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_root, arr_tree->type_key); + E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_tree->space, ptr_root, arr_tree->type_key); // rjf: generate result.root = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_Other, mem_root, arr_root); result.type_key = e_type_key_basic(E_TypeKind_Bool); result.mode = E_Mode_Value; + result.space = ptr_tree->space ? ptr_tree->space : arr_tree->space; }break; } }break; @@ -1051,15 +1077,16 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { - E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.mode, c_tree.root, c_type); - E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type); - E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); + E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.space, c_tree.mode, c_tree.root, c_type); + E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type); + E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); l_value_tree = e_irtree_convert_hi(arena, l_value_tree, result_type, l_type); r_value_tree = e_irtree_convert_hi(arena, r_value_tree, result_type, r_type); E_IRNode *new_tree = e_irtree_conditional(arena, c_value_tree, l_value_tree, r_value_tree); result.root = new_tree; result.type_key = result_type; result.mode = E_Mode_Value; + result.space = l_expr->space ? l_expr->space : r_expr->space; } }break; @@ -1071,6 +1098,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = final_type_key; result.mode = expr->mode; + result.space = expr->space; }break; //- rjf: (unexpected) leaf member @@ -1147,6 +1175,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = &e_irnode_nil; result.type_key = expr->type_key; result.mode = E_Mode_Null; + result.space = expr->space; }break; //- rjf: (unexpected) type expressions @@ -1193,6 +1222,11 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out) e_oplist_push_bytecode(arena, out, root->string); }break; + case E_IRExtKind_SetSpace: + { + e_oplist_push_set_space(arena, out, root->u64); + }break; + case RDI_EvalOp_Cond: { // rjf: generate oplists for each child @@ -1319,6 +1353,21 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) // rjf: advance ptr = next_ptr; }break; + + case E_IRExtKind_SetSpace: + { + // rjf: compute bytecode advance + U64 extra_byte_count = sizeof(E_Space); + U8 *next_ptr = ptr + 1 + extra_byte_count; + Assert(next_ptr <= opl); + + // rjf: fill bytecode + ptr[0] = opcode; + MemoryCopy(ptr + 1, &op->u64, extra_byte_count); + + // rjf: advance + ptr = next_ptr; + }break; } } diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 2ed1375b..67c575c1 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -52,7 +52,7 @@ struct E_IRTreeAndType E_IRNode *root; E_TypeKey type_key; E_Mode mode; - // E_Space space; + E_Space space; E_MsgList msgs; }; @@ -91,6 +91,7 @@ internal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, internal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x); internal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x); internal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode); +internal void e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space); internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string); internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push); @@ -106,12 +107,12 @@ internal E_IRNode *e_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, E_IRNode *l internal E_IRNode *e_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l, E_IRNode *r); internal E_IRNode *e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode); internal E_IRNode *e_irtree_string_literal(Arena *arena, String8 string); -internal E_IRNode *e_irtree_set_space(Arena *arena, E_Space space); -internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key); +internal E_IRNode *e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c); +internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key); internal E_IRNode *e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in); internal E_IRNode *e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key); internal E_IRNode *e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in); -internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key); +internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key); //- rjf: top-level irtree/type extraction internal E_IRTreeAndType e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr); diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 7b8c2950..3572aa81 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -1207,14 +1207,15 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to if(block->scope_off_first <= e_parse_ctx->ip_voff && e_parse_ctx->ip_voff < block->scope_off_opl) { mapped_identifier = 1; + space = module->space; 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)); switch(loc_kind) { default:{mapped_identifier = 0;}break; - case RDI_LocationKind_ValBytecodeStream: space = E_Space_Values; goto bytecode_stream; - case RDI_LocationKind_AddrBytecodeStream: space = module->space; goto bytecode_stream; + case RDI_LocationKind_ValBytecodeStream: goto bytecode_stream; + case RDI_LocationKind_AddrBytecodeStream: goto bytecode_stream; bytecode_stream:; { U8 *bytecode_base = all_location_data + block->location_data_off + sizeof(RDI_LocationKind); @@ -1235,12 +1236,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to case RDI_LocationKind_AddrRegPlusU16: case RDI_LocationKind_AddrAddrRegPlusU16: { - space = module->space; MemoryCopy(&loc_reg_u16, (all_location_data + block->location_data_off), sizeof(loc_reg_u16)); }break; case RDI_LocationKind_ValReg: { - space = E_Space_Values; MemoryCopy(&loc_reg, (all_location_data + block->location_data_off), sizeof(loc_reg)); }break; } @@ -1392,7 +1391,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx); mapped_identifier = 1; - space = E_Space_Values; + space = module->space; break; } } @@ -1406,7 +1405,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_Types; + space = E_Space_Null; } } @@ -1435,7 +1434,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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); - atom->mode = E_Mode_Reg; + atom->mode = E_Mode_Offset; + atom->space = space; atom->type_key = type_key; atom->string = e_bytecode_from_oplist(arena, &oplist); } @@ -1446,7 +1446,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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); - atom->mode = E_Mode_Reg; + atom->mode = E_Mode_Offset; + atom->space = space; atom->type_key = type_key; atom->string = e_bytecode_from_oplist(arena, &oplist); } @@ -1458,7 +1459,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to case RDI_LocationKind_AddrBytecodeStream: { atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); - atom->mode = E_Mode_Addr; + atom->mode = E_Mode_Offset; + atom->space = space; atom->type_key = type_key; atom->string = loc_bytecode; }break; @@ -1466,6 +1468,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to { atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom->mode = E_Mode_Value; + atom->space = space; atom->type_key = type_key; atom->string = loc_bytecode; }break; @@ -1478,7 +1481,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); - atom->mode = E_Mode_Addr; + atom->mode = E_Mode_Offset; + atom->space = space; atom->type_key = type_key; atom->string = e_bytecode_from_oplist(arena, &oplist); }break; @@ -1492,7 +1496,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to 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); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); - atom->mode = E_Mode_Addr; + atom->mode = E_Mode_Offset; + atom->space = space; atom->type_key = type_key; atom->string = e_bytecode_from_oplist(arena, &oplist); }break; @@ -1507,6 +1512,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom->mode = E_Mode_Value; + atom->space = space; atom->type_key = type_key; atom->string = e_bytecode_from_oplist(arena, &oplist); }break; @@ -1519,6 +1525,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to E_Expr *member_expr = e_push_expr(arena, E_ExprKind_LeafMember, atom_implicit_member_name.str); member_expr->string = atom_implicit_member_name; atom = e_push_expr(arena, E_ExprKind_MemberAccess, atom_implicit_member_name.str); + atom->space = space; e_expr_push_child(atom, member_container); e_expr_push_child(atom, member_expr); } diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 82037237..d9dfdddc 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -47,15 +47,6 @@ struct E_TokenArray //////////////////////////////// //~ rjf: Expression Tree Types -typedef enum E_Mode -{ - E_Mode_Null, - E_Mode_Value, - E_Mode_Addr, - E_Mode_Reg, -} -E_Mode; - typedef struct E_Expr E_Expr; struct E_Expr { @@ -65,7 +56,7 @@ struct E_Expr void *location; E_ExprKind kind; E_Mode mode; - // E_Space space; + E_Space space; E_TypeKey type_key; U32 u32; F32 f32;