mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-28 06:11:49 -07:00
expand eval to collecting irtree/type/lookup-rule, base all value string generation on entire root_eval rather than just root_expr; fixes wrong inheritance of tags in single-line visualization
This commit is contained in:
+23
-85
@@ -16,18 +16,19 @@ internal E_Eval
|
||||
e_eval_from_exprs(Arena *arena, E_ExprChain exprs)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last);
|
||||
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
E_Interpretation interp = e_interpret(bytecode);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last);
|
||||
E_LookupRuleTagPair lookup = e_lookup_rule_tag_pair_from_expr_irtree(exprs.last, &irtree);
|
||||
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
E_Interpretation interp = e_interpret(bytecode);
|
||||
E_Eval eval =
|
||||
{
|
||||
.value = interp.value,
|
||||
.mode = irtree.mode,
|
||||
.space = interp.space,
|
||||
.exprs = exprs,
|
||||
.type_key = irtree.type_key,
|
||||
.code = interp.code,
|
||||
.value = interp.value,
|
||||
.space = interp.space,
|
||||
.exprs = exprs,
|
||||
.irtree = irtree,
|
||||
.lookup_rule_tag = lookup,
|
||||
.code = interp.code,
|
||||
};
|
||||
e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs);
|
||||
if(E_InterpretationCode_Good < eval.code && eval.code < E_InterpretationCode_COUNT)
|
||||
@@ -68,10 +69,10 @@ e_autoresolved_eval_from_eval(E_Eval eval)
|
||||
e_interpret_ctx &&
|
||||
e_parse_state->ctx->modules_count > 0 &&
|
||||
e_interpret_ctx->module_base != 0 &&
|
||||
(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)) ||
|
||||
e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U32))))
|
||||
(e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S64)) ||
|
||||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U64)) ||
|
||||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S32)) ||
|
||||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U32))))
|
||||
{
|
||||
U64 vaddr = eval.value.u64;
|
||||
U64 voff = vaddr - e_interpret_ctx->module_base[0];
|
||||
@@ -84,7 +85,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
|
||||
if(string_idx == 0) { string_idx = gvar->name_string_idx; }
|
||||
if(string_idx != 0)
|
||||
{
|
||||
eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0);
|
||||
eval.irtree.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0);
|
||||
}
|
||||
}
|
||||
return eval;
|
||||
@@ -93,7 +94,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
|
||||
internal E_Eval
|
||||
e_dynamically_typed_eval_from_eval(E_Eval eval)
|
||||
{
|
||||
E_TypeKey type_key = eval.type_key;
|
||||
E_TypeKey type_key = eval.irtree.type_key;
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
if(e_type_state != 0 &&
|
||||
e_interpret_ctx != 0 &&
|
||||
@@ -151,7 +152,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
|
||||
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
|
||||
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
|
||||
eval.type_key = ptr_to_derived_type_key;
|
||||
eval.irtree.type_key = ptr_to_derived_type_key;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -166,13 +167,13 @@ internal E_Eval
|
||||
e_value_eval_from_eval(E_Eval eval)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
if(eval.mode == E_Mode_Offset)
|
||||
if(eval.irtree.mode == E_Mode_Offset)
|
||||
{
|
||||
E_TypeKey type_key = e_type_unwrap(eval.type_key);
|
||||
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
if(type_kind == E_TypeKind_Array)
|
||||
{
|
||||
eval.mode = E_Mode_Value;
|
||||
eval.irtree.mode = E_Mode_Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -183,7 +184,7 @@ e_value_eval_from_eval(E_Eval eval)
|
||||
type_byte_size <= sizeof(E_Value) &&
|
||||
e_space_read(eval.space, &eval.value, value_vaddr_range))
|
||||
{
|
||||
eval.mode = E_Mode_Value;
|
||||
eval.irtree.mode = E_Mode_Value;
|
||||
|
||||
// rjf: mask&shift, for bitfields
|
||||
if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64))
|
||||
@@ -197,7 +198,7 @@ e_value_eval_from_eval(E_Eval eval)
|
||||
}
|
||||
eval.value.u64 = eval.value.u64 >> type->off;
|
||||
eval.value.u64 = eval.value.u64 & valid_bits_mask;
|
||||
eval.type_key = type->direct_type_key;
|
||||
eval.irtree.type_key = type->direct_type_key;
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
@@ -219,69 +220,6 @@ e_value_eval_from_eval(E_Eval eval)
|
||||
return eval;
|
||||
}
|
||||
|
||||
internal E_Eval
|
||||
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;
|
||||
U64 element_size = e_type_byte_size_from_key(result.type_key);
|
||||
switch(eval.mode)
|
||||
{
|
||||
default:{}break;
|
||||
case E_Mode_Value:
|
||||
if(element_size <= sizeof(E_Value) &&
|
||||
index < sizeof(E_Value)/element_size)
|
||||
{
|
||||
MemoryCopy((U8 *)(&result.value.u512[0]),
|
||||
(U8 *)(&eval.value.u512[0]) + index*element_size,
|
||||
element_size);
|
||||
}break;
|
||||
case E_Mode_Offset:
|
||||
{
|
||||
result.value.u64 = eval.value.u64 + element_size*index;
|
||||
}break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal E_Eval
|
||||
e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name)
|
||||
{
|
||||
E_Eval result = {0};
|
||||
{
|
||||
E_Member member = e_type_member_from_key_name__cached(eval.type_key, member_name);
|
||||
if(member.kind != E_MemberKind_Null)
|
||||
{
|
||||
result.mode = eval.mode;
|
||||
result.space = eval.space;
|
||||
result.type_key = member.type_key;
|
||||
result.code = eval.code;
|
||||
result.msgs = eval.msgs;
|
||||
switch(eval.mode)
|
||||
{
|
||||
default:{}break;
|
||||
case E_Mode_Value:
|
||||
if(member.off < sizeof(eval.value))
|
||||
{
|
||||
U64 member_size = e_type_byte_size_from_key(member.type_key);
|
||||
MemoryCopy((U8 *)(&result.value.u512[0]),
|
||||
(U8 *)(&eval.value.u512[0]) + member.off,
|
||||
Min(member_size, sizeof(eval.value) - member.off));
|
||||
}break;
|
||||
case E_Mode_Offset:
|
||||
{
|
||||
result.value.u64 = eval.value.u64 + member.off;
|
||||
}break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal E_Value
|
||||
e_value_from_string(String8 string)
|
||||
{
|
||||
|
||||
@@ -11,10 +11,10 @@ typedef struct E_Eval E_Eval;
|
||||
struct E_Eval
|
||||
{
|
||||
E_Value value;
|
||||
E_Mode mode;
|
||||
E_Space space;
|
||||
E_ExprChain exprs;
|
||||
E_TypeKey type_key;
|
||||
E_IRTreeAndType irtree;
|
||||
E_LookupRuleTagPair lookup_rule_tag;
|
||||
E_InterpretationCode code;
|
||||
E_MsgList msgs;
|
||||
};
|
||||
@@ -29,8 +29,6 @@ internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...);
|
||||
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);
|
||||
internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval);
|
||||
internal E_Eval e_value_eval_from_eval(E_Eval eval);
|
||||
internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index);
|
||||
internal E_Eval e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name);
|
||||
internal E_Value e_value_from_string(String8 string);
|
||||
internal E_Value e_value_from_stringf(char *fmt, ...);
|
||||
internal E_Value e_value_from_expr(E_Expr *expr);
|
||||
|
||||
Reference in New Issue
Block a user