mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-19 10:32:23 -07:00
complete metacodification of rdi format info into tables
This commit is contained in:
@@ -23,7 +23,7 @@ eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list){
|
||||
default:
|
||||
{
|
||||
// compute bytecode advance
|
||||
U8 ctrlbits = rdi_eval_opcode_ctrlbits[opcode];
|
||||
U8 ctrlbits = rdi_eval_op_ctrlbits_table[opcode];
|
||||
U64 extra_byte_count = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
|
||||
|
||||
U8 *next_ptr = ptr + 1 + extra_byte_count;
|
||||
@@ -63,7 +63,7 @@ eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list){
|
||||
|
||||
internal void
|
||||
eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RDI_EvalOp opcode, U64 p){
|
||||
U8 ctrlbits = rdi_eval_opcode_ctrlbits[opcode];
|
||||
U8 ctrlbits = rdi_eval_op_ctrlbits_table[opcode];
|
||||
U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
|
||||
|
||||
EVAL_Op *node = push_array_no_zero(arena, EVAL_Op, 1);
|
||||
@@ -654,7 +654,7 @@ eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTr
|
||||
TG_Kind out_kind = tg_kind_from_key(out);
|
||||
U8 in_group = eval_type_group_from_kind(in_kind);
|
||||
U8 out_group = eval_type_group_from_kind(out_kind);
|
||||
U32 conversion_rule = rdi_eval_conversion_rule(in_group, out_group);
|
||||
U32 conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group);
|
||||
if(conversion_rule == RDI_EvalConversionKind_Legal)
|
||||
{
|
||||
result = eval_irtree_convert_lo(arena, result, out_group, in_group);
|
||||
@@ -1080,7 +1080,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, E
|
||||
// analyze situation
|
||||
U8 in_group = eval_type_group_from_kind(c_restype_kind);
|
||||
U8 out_group = eval_type_group_from_kind(cast_type_kind);
|
||||
RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_rule(in_group, out_group);
|
||||
RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group);
|
||||
|
||||
// generate tree
|
||||
switch(conversion_rule)
|
||||
@@ -1107,7 +1107,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, E
|
||||
{
|
||||
String8 text = str8_lit("(internal) unknown conversion rule");
|
||||
if (conversion_rule < RDI_EvalConversionKind_COUNT){
|
||||
text.str = rdi_eval_conversion_message(conversion_rule, &text.size);
|
||||
text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size);
|
||||
}
|
||||
eval_error(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, text);
|
||||
}break;
|
||||
@@ -1172,7 +1172,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, E
|
||||
B32 can_generate = 0;
|
||||
RDI_EvalOp op = eval_opcode_from_expr_kind(kind);
|
||||
U8 c_group = eval_type_group_from_kind(c_restype_kind);
|
||||
if (!rdi_eval_opcode_type_compatible(op, c_group)){
|
||||
if (!rdi_eval_op_typegroup_are_compatible(op, c_group)){
|
||||
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Cannot use this operator on this type.");
|
||||
}
|
||||
else{
|
||||
@@ -1301,7 +1301,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, E
|
||||
U8 cv_group = eval_type_group_from_kind(cv_type_kind);
|
||||
|
||||
B32 can_generate = 0;
|
||||
if (rdi_eval_opcode_type_compatible(op, cv_group)){
|
||||
if (rdi_eval_op_typegroup_are_compatible(op, cv_group)){
|
||||
can_generate = 1;
|
||||
}
|
||||
else{
|
||||
@@ -1620,7 +1620,7 @@ eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){
|
||||
}
|
||||
else{
|
||||
// handle all children
|
||||
U8 ctrlbits = rdi_eval_opcode_ctrlbits[op];
|
||||
U8 ctrlbits = rdi_eval_op_ctrlbits_table[op];
|
||||
U64 child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits);
|
||||
EVAL_IRTree**child = tree->children;
|
||||
for (U64 i = 0; i < child_count; i += 1, child += 1){
|
||||
|
||||
@@ -27,7 +27,7 @@ eval_interpret(EVAL_Machine *machine, String8 bytecode)
|
||||
result.code = EVAL_ResultCode_BadOp;
|
||||
goto done;
|
||||
}
|
||||
U8 ctrlbits = rdi_eval_opcode_ctrlbits[op];
|
||||
U8 ctrlbits = rdi_eval_op_ctrlbits_table[op];
|
||||
ptr += 1;
|
||||
|
||||
// decode
|
||||
|
||||
+20
-20
@@ -173,7 +173,7 @@ eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff)
|
||||
*map = eval_string2num_map_make(arena, 64);
|
||||
|
||||
//- rjf: udt -> fill member map
|
||||
if(udt != 0 && !(udt->flags & RDI_UserDefinedTypeFlag_EnumMembers) && rdi->members != 0)
|
||||
if(udt != 0 && !(udt->flags & RDI_UDTFlag_EnumMembers) && rdi->members != 0)
|
||||
{
|
||||
U64 data_member_num = 1;
|
||||
for(U32 member_idx = udt->member_first;
|
||||
@@ -827,14 +827,14 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
B32 mapped_identifier = 0;
|
||||
B32 identifier_type_is_possibly_dynamically_overridden = 0;
|
||||
B32 identifier_looks_like_type_expr = 0;
|
||||
RDI_LocationKind loc_kind = RDI_LocationKind_NULL;
|
||||
RDI_LocationRegister loc_reg = {0};
|
||||
RDI_LocationRegisterPlusU16 loc_reg_u16 = {0};
|
||||
String8 loc_bytecode = {0};
|
||||
REGS_RegCode reg_code = 0;
|
||||
REGS_AliasCode alias_code = 0;
|
||||
TG_Key type_key = zero_struct;
|
||||
String8 local_lookup_string = token_string;
|
||||
RDI_LocationKind loc_kind = RDI_LocationKind_NULL;
|
||||
RDI_LocationReg loc_reg = {0};
|
||||
RDI_LocationRegPlusU16 loc_reg_u16 = {0};
|
||||
String8 loc_bytecode = {0};
|
||||
REGS_RegCode reg_code = 0;
|
||||
REGS_AliasCode alias_code = 0;
|
||||
TG_Key type_key = zero_struct;
|
||||
String8 local_lookup_string = token_string;
|
||||
|
||||
//- rjf: form namespaceified fallback versions of this lookup string
|
||||
String8List namespaceified_token_strings = {0};
|
||||
@@ -911,18 +911,18 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
{
|
||||
break;
|
||||
}
|
||||
U8 ctrlbits = rdi_eval_opcode_ctrlbits[op];
|
||||
U8 ctrlbits = rdi_eval_op_ctrlbits_table[op];
|
||||
U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
|
||||
bytecode_size += 1+p_size;
|
||||
}
|
||||
loc_bytecode = str8(bytecode_base, bytecode_size);
|
||||
}break;
|
||||
case RDI_LocationKind_AddrRegisterPlusU16:
|
||||
case RDI_LocationKind_AddrAddrRegisterPlusU16:
|
||||
case RDI_LocationKind_AddrRegPlusU16:
|
||||
case RDI_LocationKind_AddrAddrRegPlusU16:
|
||||
{
|
||||
MemoryCopy(&loc_reg_u16, (ctx->rdi->location_data + block->location_data_off), sizeof(loc_reg_u16));
|
||||
}break;
|
||||
case RDI_LocationKind_ValRegister:
|
||||
case RDI_LocationKind_ValReg:
|
||||
{
|
||||
MemoryCopy(&loc_reg, (ctx->rdi->location_data + block->location_data_off), sizeof(loc_reg));
|
||||
}break;
|
||||
@@ -1134,35 +1134,35 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
{
|
||||
atom = eval_expr_leaf_bytecode(arena, token_string.str, type_key, loc_bytecode, EVAL_EvalMode_Value);
|
||||
}break;
|
||||
case RDI_LocationKind_AddrRegisterPlusU16:
|
||||
case RDI_LocationKind_AddrRegPlusU16:
|
||||
{
|
||||
EVAL_OpList oplist = {0};
|
||||
U64 byte_size = bit_size_from_arch(ctx->arch)/8;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0);
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0);
|
||||
atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr);
|
||||
}break;
|
||||
case RDI_LocationKind_AddrAddrRegisterPlusU16:
|
||||
case RDI_LocationKind_AddrAddrRegPlusU16:
|
||||
{
|
||||
EVAL_OpList oplist = {0};
|
||||
U64 byte_size = bit_size_from_arch(ctx->arch)/8;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.register_code, byte_size, 0);
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(ctx->arch)/8);
|
||||
atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr);
|
||||
}break;
|
||||
case RDI_LocationKind_ValRegister:
|
||||
case RDI_LocationKind_ValReg:
|
||||
{
|
||||
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(ctx->arch, loc_reg.register_code);
|
||||
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(ctx->arch, loc_reg.reg_code);
|
||||
REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(ctx->arch)[regs_reg_code];
|
||||
EVAL_OpList oplist = {0};
|
||||
U64 byte_size = (U64)reg_rng.byte_size;
|
||||
U64 byte_pos = 0;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg.register_code, byte_size, byte_pos);
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg.reg_code, byte_size, byte_pos);
|
||||
eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Value);
|
||||
}break;
|
||||
|
||||
@@ -73,6 +73,7 @@ extern U8 eval_expr_kind_child_counts[40];
|
||||
extern String8 eval_expr_kind_strings[40];
|
||||
extern String8 eval_result_code_display_strings[11];
|
||||
extern String8 eval_expr_op_strings[40];
|
||||
|
||||
C_LINKAGE_END
|
||||
|
||||
#endif // EVAL_META_H
|
||||
|
||||
Reference in New Issue
Block a user