mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-30 11:00:02 +00:00
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:
@@ -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);
|
||||
|
||||
@@ -78,7 +78,6 @@ typedef U64 E_Space;
|
||||
enum
|
||||
{
|
||||
E_Space_Null,
|
||||
E_Space_Regs,
|
||||
E_Space_FIXED_COUNT
|
||||
};
|
||||
|
||||
|
||||
+24
-19
@@ -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;
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user