pipe through space information through eval compiler/interpreter

This commit is contained in:
Ryan Fleury
2024-08-15 11:21:52 -07:00
parent a0d91862a7
commit 59c01a73af
16 changed files with 294 additions and 148 deletions
+3 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
+39 -28
View File
@@ -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);
+1 -2
View File
@@ -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);
////////////////////////////////
+12 -5
View File
@@ -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;
}
+2 -2
View File
@@ -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);
+7 -4
View File
@@ -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);
+58 -6
View File
@@ -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<<idx);
}
eval.value.u64 = eval.value.u64 >> 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;
+1
View File
@@ -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;
+17 -9
View File
@@ -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
+20 -6
View File
@@ -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;
}
+2 -1
View File
@@ -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;
+107 -58
View File
@@ -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;
}
}
+5 -4
View File
@@ -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);
+18 -11
View File
@@ -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);
}
+1 -10
View File
@@ -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;