collapse register mode into being a thread space, unify process/thread/debugger read/write paths, keep differences in core eval read/write paths

This commit is contained in:
Ryan Fleury
2024-08-22 14:50:27 -07:00
parent a7cf64d5e2
commit acd7435553
12 changed files with 201 additions and 70 deletions
+1 -2
View File
@@ -45,7 +45,6 @@ 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.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)) ||
@@ -152,7 +151,7 @@ e_value_eval_from_eval(E_Eval eval)
{
eval.mode = E_Mode_Value;
}
else if(e_interpret_ctx->space_read != 0)
else
{
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);
-1
View File
@@ -78,7 +78,6 @@ typedef U64 E_Space;
enum
{
E_Space_Null,
E_Space_Regs,
E_Space_FIXED_COUNT
};
+24 -19
View File
@@ -28,18 +28,29 @@ e_space_read(E_Space space, void *out, Rng1U64 range)
{
case E_Space_FIXED_COUNT:
case E_Space_Null:{}break;
case E_Space_Regs:
{
Rng1U64 legal_range = r1u64(0, e_interpret_ctx->reg_size);
Rng1U64 read_range = intersect_1u64(legal_range, range);
U64 read_size = dim_1u64(read_range);
MemoryCopy(out, (U8 *)e_interpret_ctx->reg_data + read_range.min, read_size);
result = (read_size == dim_1u64(range));
}break;
default:
if(e_interpret_ctx->space_read != 0)
{
result = e_interpret_ctx->space_read(e_interpret_ctx->space_read_user_data, space, out, range);
result = e_interpret_ctx->space_read(e_interpret_ctx->space_rw_user_data, space, out, range);
}break;
}
ProfEnd();
return result;
}
internal B32
e_space_write(E_Space space, void *in, Rng1U64 range)
{
ProfBeginFunction();
B32 result = 0;
switch(space)
{
case E_Space_FIXED_COUNT:
case E_Space_Null:{}break;
default:
if(e_interpret_ctx->space_write != 0)
{
result = e_interpret_ctx->space_write(e_interpret_ctx->space_rw_user_data, space, in, range);
}break;
}
ProfEnd();
@@ -173,11 +184,8 @@ e_interpret(String8 bytecode)
REGS_Rng rng = regs_reg_code_rng_table_from_architecture(e_interpret_ctx->reg_arch)[base_reg_code];
U64 off = (U64)rng.byte_off + byte_off;
U64 size = (U64)byte_size;
if(off + size <= e_interpret_ctx->reg_size)
{
MemoryCopy(&nval, (U8*)e_interpret_ctx->reg_data + off, size);
}
else
B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size));
if(!good_read)
{
result.code = E_InterpretationCode_BadRegRead;
goto done;
@@ -188,11 +196,8 @@ e_interpret(String8 bytecode)
{
U64 off = svals[0].u64;
U64 size = bit_size_from_arch(e_interpret_ctx->reg_arch)/8;
if(off + size <= e_interpret_ctx->reg_size)
{
MemoryCopy(&nval, (U8*)e_interpret_ctx->reg_data + off, size);
}
else
B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size));
if(!good_read)
{
result.code = E_InterpretationCode_BadRegRead;
goto done;
+7 -5
View File
@@ -29,17 +29,18 @@ struct E_Interpretation
////////////////////////////////
//~ rjf: Interpretation Context
typedef B32 E_SpaceReadFunction(void *user_data, E_Space space, void *out, Rng1U64 offset_range);
typedef B32 E_SpaceRWFunction(void *user_data, E_Space space, void *out, Rng1U64 offset_range);
typedef struct E_InterpretCtx E_InterpretCtx;
struct E_InterpretCtx
{
void *space_read_user_data;
E_SpaceReadFunction *space_read;
void *space_rw_user_data;
E_SpaceRWFunction *space_read;
E_SpaceRWFunction *space_write;
E_Space primary_space;
Architecture reg_arch;
void *reg_data;
U64 reg_size;
E_Space reg_space;
U64 reg_unwind_count;
U64 *module_base;
U64 *frame_base;
U64 *tls_base;
@@ -60,6 +61,7 @@ internal void e_select_interpret_ctx(E_InterpretCtx *ctx);
//~ rjf: Space Reading Helpers
internal B32 e_space_read(E_Space space, void *out, Rng1U64 range);
internal B32 e_space_write(E_Space space, void *in, Rng1U64 range);
////////////////////////////////
//~ rjf: Interpretation Functions
+2 -5
View File
@@ -363,10 +363,12 @@ e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_
{
switch(from_space)
{
#if 0
case E_Space_Regs:
{
result = e_irtree_unary_op(arena, RDI_EvalOp_RegReadDyn, RDI_EvalTypeGroup_U, tree);
}break;
#endif
default:
{
result = e_irtree_mem_read_type(arena, from_space, tree, type_key);
@@ -681,11 +683,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
break;
}
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;
}
// rjf: generate
result.root = r_tree.root;
+2 -2
View File
@@ -1366,7 +1366,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
reg_code = reg_num;
type_key = e_type_key_reg(e_parse_ctx->primary_module->arch, reg_code);
mapped_identifier = 1;
space = E_Space_Regs;
space = e_parse_ctx->ip_thread_space;
arch = e_parse_ctx->primary_module->arch;
}
}
@@ -1380,7 +1380,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
alias_code = (REGS_AliasCode)alias_num;
type_key = e_type_key_reg_alias(e_parse_ctx->primary_module->arch, alias_code);
mapped_identifier = 1;
space = E_Space_Regs;
space = e_parse_ctx->ip_thread_space;
arch = e_parse_ctx->primary_module->arch;
}
}
+1
View File
@@ -139,6 +139,7 @@ struct E_ParseCtx
// rjf: instruction pointer info
U64 ip_vaddr;
U64 ip_voff;
E_Space ip_thread_space;
// rjf: modules
E_Module *modules;