mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
complete eval2 first pass
This commit is contained in:
+105
-93
@@ -81,27 +81,27 @@ e_opcode_from_expr_kind(E_ExprKind kind)
|
||||
RDI_EvalOp result = RDI_EvalOp_Stop;
|
||||
switch(kind)
|
||||
{
|
||||
case EVAL_ExprKind_Neg: result = RDI_EvalOp_Neg; break;
|
||||
case EVAL_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break;
|
||||
case EVAL_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break;
|
||||
case EVAL_ExprKind_Mul: result = RDI_EvalOp_Mul; break;
|
||||
case EVAL_ExprKind_Div: result = RDI_EvalOp_Div; break;
|
||||
case EVAL_ExprKind_Mod: result = RDI_EvalOp_Mod; break;
|
||||
case EVAL_ExprKind_Add: result = RDI_EvalOp_Add; break;
|
||||
case EVAL_ExprKind_Sub: result = RDI_EvalOp_Sub; break;
|
||||
case EVAL_ExprKind_LShift: result = RDI_EvalOp_LShift; break;
|
||||
case EVAL_ExprKind_RShift: result = RDI_EvalOp_RShift; break;
|
||||
case EVAL_ExprKind_Less: result = RDI_EvalOp_Less; break;
|
||||
case EVAL_ExprKind_LsEq: result = RDI_EvalOp_LsEq; break;
|
||||
case EVAL_ExprKind_Grtr: result = RDI_EvalOp_Grtr; break;
|
||||
case EVAL_ExprKind_GrEq: result = RDI_EvalOp_GrEq; break;
|
||||
case EVAL_ExprKind_EqEq: result = RDI_EvalOp_EqEq; break;
|
||||
case EVAL_ExprKind_NtEq: result = RDI_EvalOp_NtEq; break;
|
||||
case EVAL_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break;
|
||||
case EVAL_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break;
|
||||
case EVAL_ExprKind_BitOr: result = RDI_EvalOp_BitOr; break;
|
||||
case EVAL_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break;
|
||||
case EVAL_ExprKind_LogOr: result = RDI_EvalOp_LogOr; break;
|
||||
case E_ExprKind_Neg: result = RDI_EvalOp_Neg; break;
|
||||
case E_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break;
|
||||
case E_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break;
|
||||
case E_ExprKind_Mul: result = RDI_EvalOp_Mul; break;
|
||||
case E_ExprKind_Div: result = RDI_EvalOp_Div; break;
|
||||
case E_ExprKind_Mod: result = RDI_EvalOp_Mod; break;
|
||||
case E_ExprKind_Add: result = RDI_EvalOp_Add; break;
|
||||
case E_ExprKind_Sub: result = RDI_EvalOp_Sub; break;
|
||||
case E_ExprKind_LShift: result = RDI_EvalOp_LShift; break;
|
||||
case E_ExprKind_RShift: result = RDI_EvalOp_RShift; break;
|
||||
case E_ExprKind_Less: result = RDI_EvalOp_Less; break;
|
||||
case E_ExprKind_LsEq: result = RDI_EvalOp_LsEq; break;
|
||||
case E_ExprKind_Grtr: result = RDI_EvalOp_Grtr; break;
|
||||
case E_ExprKind_GrEq: result = RDI_EvalOp_GrEq; break;
|
||||
case E_ExprKind_EqEq: result = RDI_EvalOp_EqEq; break;
|
||||
case E_ExprKind_NtEq: result = RDI_EvalOp_NtEq; break;
|
||||
case E_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break;
|
||||
case E_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break;
|
||||
case E_ExprKind_BitOr: result = RDI_EvalOp_BitOr; break;
|
||||
case E_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break;
|
||||
case E_ExprKind_LogOr: result = RDI_EvalOp_LogOr; break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -113,12 +113,12 @@ e_expr_kind_is_comparison(E_ExprKind kind)
|
||||
switch(kind)
|
||||
{
|
||||
default:{}break;
|
||||
case EVAL_ExprKind_EqEq:
|
||||
case EVAL_ExprKind_NtEq:
|
||||
case EVAL_ExprKind_Less:
|
||||
case EVAL_ExprKind_Grtr:
|
||||
case EVAL_ExprKind_LsEq:
|
||||
case EVAL_ExprKind_GrEq:
|
||||
case E_ExprKind_EqEq:
|
||||
case E_ExprKind_NtEq:
|
||||
case E_ExprKind_Less:
|
||||
case E_ExprKind_Grtr:
|
||||
case E_ExprKind_LsEq:
|
||||
case E_ExprKind_GrEq:
|
||||
{
|
||||
result = 1;
|
||||
}break;
|
||||
@@ -932,7 +932,19 @@ e_expr_push_child(E_Expr *parent, E_Expr *child)
|
||||
internal void
|
||||
e_select_ctx(E_Ctx *ctx)
|
||||
{
|
||||
e_ctx = ctx;
|
||||
if(e_state == 0)
|
||||
{
|
||||
Arena *arena = arena_alloc();
|
||||
e_state = push_array(arena, E_State, 1);
|
||||
e_state->arena = arena;
|
||||
e_state->arena_eval_start_pos = arena_pos(e_state->arena);
|
||||
}
|
||||
arena_pop_to(e_state->arena, e_state->arena_eval_start_pos);
|
||||
e_state->ctx = ctx;
|
||||
e_state->cons_content_slots_count = 256;
|
||||
e_state->cons_key_slots_count = 256;
|
||||
e_state->cons_content_slots = push_array(e_state->arena, E_ConsTypeSlot, e_state->cons_content_slots_count);
|
||||
e_state->cons_key_slots = push_array(e_state->arena, E_ConsTypeSlot, e_state->cons_key_slots_count);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
@@ -997,8 +1009,8 @@ e_type_key_cons(E_TypeKind kind, E_TypeKey direct_key, U64 u64)
|
||||
(U32)((u64 & 0xffffffff00000000ull)>> 32),
|
||||
};
|
||||
U64 content_hash = e_hash_from_string(str8((U8 *)buffer, sizeof(buffer)));
|
||||
U64 content_slot_idx = content_hash%e_ctx->cons_content_slots_count;
|
||||
E_ConsTypeSlot *content_slot = &e_ctx->cons_content_slots[content_slot_idx];
|
||||
U64 content_slot_idx = content_hash%e_state->cons_content_slots_count;
|
||||
E_ConsTypeSlot *content_slot = &e_state->cons_content_slots[content_slot_idx];
|
||||
E_ConsTypeNode *node = 0;
|
||||
for(E_ConsTypeNode *n = content_slot->first; n != 0; n = n->content_next)
|
||||
{
|
||||
@@ -1015,12 +1027,12 @@ e_type_key_cons(E_TypeKind kind, E_TypeKey direct_key, U64 u64)
|
||||
{
|
||||
E_TypeKey key = {E_TypeKeyKind_Cons};
|
||||
key.u32[0] = (U32)kind;
|
||||
key.u32[1] = (U32)e_ctx->cons_id_gen;
|
||||
e_ctx->cons_id_gen += 1;
|
||||
key.u32[1] = (U32)e_state->cons_id_gen;
|
||||
e_state->cons_id_gen += 1;
|
||||
U64 key_hash = e_hash_from_string(str8_struct(&key));
|
||||
U64 key_slot_idx = key_hash%e_ctx->cons_key_slots_count;
|
||||
E_ConsTypeSlot *key_slot = &e_ctx->cons_key_slots[key_slot_idx];
|
||||
E_ConsTypeNode *node = push_array(e_ctx->eval_arena, E_ConsTypeNode, 1);
|
||||
U64 key_slot_idx = key_hash%e_state->cons_key_slots_count;
|
||||
E_ConsTypeSlot *key_slot = &e_state->cons_key_slots[key_slot_idx];
|
||||
E_ConsTypeNode *node = push_array(e_state->arena, E_ConsTypeNode, 1);
|
||||
SLLQueuePush_N(content_slot->first, content_slot->last, node, content_next);
|
||||
SLLQueuePush_N(key_slot->first, key_slot->last, node, key_next);
|
||||
node->key = key;
|
||||
@@ -1089,8 +1101,8 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
case E_TypeKeyKind_Cons:
|
||||
{
|
||||
U64 key_hash = e_hash_from_string(str8_struct(&key));
|
||||
U64 key_slot_idx = key_hash%e_ctx->cons_key_slots_count;
|
||||
E_ConsTypeSlot *key_slot = &e_ctx->cons_key_slots[key_slot_idx];
|
||||
U64 key_slot_idx = key_hash%e_state->cons_key_slots_count;
|
||||
E_ConsTypeSlot *key_slot = &e_state->cons_key_slots[key_slot_idx];
|
||||
for(E_ConsTypeNode *node = key_slot->first;
|
||||
node != 0;
|
||||
node = node->key_next)
|
||||
@@ -1105,7 +1117,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
{
|
||||
default:
|
||||
{
|
||||
type->byte_size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
type->byte_size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
}break;
|
||||
case E_TypeKind_Array:
|
||||
{
|
||||
@@ -1122,7 +1134,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
{
|
||||
U64 type_node_idx = key.u32[1];
|
||||
U32 rdi_idx = key.u32[2];
|
||||
RDI_Parsed *rdi = e_ctx->rdis[rdi_idx];
|
||||
RDI_Parsed *rdi = e_state->ctx->rdis[rdi_idx];
|
||||
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
|
||||
if(rdi_type->kind != RDI_TypeKind_NULL)
|
||||
{
|
||||
@@ -1260,7 +1272,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->byte_size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
type->byte_size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
}break;
|
||||
|
||||
case RDI_TypeKind_Array:
|
||||
@@ -1281,7 +1293,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
{
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
type->byte_size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
type->direct_type_key = direct_type_key;
|
||||
type->count = count;
|
||||
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count);
|
||||
@@ -1314,7 +1326,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
{
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
type->byte_size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
type->owner_type_key = direct_type_key;
|
||||
type->count = count;
|
||||
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count);
|
||||
@@ -1352,7 +1364,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
|
||||
}
|
||||
type = push_array(arena, E_Type, 1);
|
||||
type->kind = kind;
|
||||
type->byte_size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
type->byte_size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
type->owner_type_key = owner_type_key;
|
||||
type->direct_type_key = direct_type_key;
|
||||
}break;
|
||||
@@ -2253,9 +2265,9 @@ e_leaf_type_from_name(String8 name)
|
||||
{
|
||||
E_TypeKey key = zero_struct;
|
||||
B32 found = 0;
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_ctx->rdis_count; rdi_idx += 1)
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_state->ctx->rdis_count; rdi_idx += 1)
|
||||
{
|
||||
RDI_Parsed *rdi = e_ctx->rdis[rdi_idx];
|
||||
RDI_Parsed *rdi = e_state->ctx->rdis[rdi_idx];
|
||||
RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types);
|
||||
RDI_ParsedNameMap parsed_name_map = {0};
|
||||
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map);
|
||||
@@ -2655,12 +2667,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: form namespaceified fallback versions of this lookup string
|
||||
String8List namespaceified_token_strings = {0};
|
||||
{
|
||||
U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(e_ctx->rdis[0], RDI_SectionKind_ScopeVMap, e_ctx->ip_voff);
|
||||
RDI_Scope *scope = rdi_element_from_name_idx(e_ctx->rdis[0], Scopes, scope_idx);
|
||||
U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(e_state->ctx->rdis[0], RDI_SectionKind_ScopeVMap, e_state->ctx->ip_voff);
|
||||
RDI_Scope *scope = rdi_element_from_name_idx(e_state->ctx->rdis[0], Scopes, scope_idx);
|
||||
U64 proc_idx = scope->proc_idx;
|
||||
RDI_Procedure *procedure = rdi_element_from_name_idx(e_ctx->rdis[0], Procedures, proc_idx);
|
||||
RDI_Procedure *procedure = rdi_element_from_name_idx(e_state->ctx->rdis[0], Procedures, proc_idx);
|
||||
U64 name_size = 0;
|
||||
U8 *name_ptr = rdi_string_from_idx(e_ctx->rdis[0], procedure->name_string_idx, &name_size);
|
||||
U8 *name_ptr = rdi_string_from_idx(e_state->ctx->rdis[0], procedure->name_string_idx, &name_size);
|
||||
String8 containing_procedure_name = str8(name_ptr, name_size);
|
||||
U64 last_past_scope_resolution_pos = 0;
|
||||
for(;;)
|
||||
@@ -2682,7 +2694,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: try members
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
U64 data_member_num = e_num_from_string(e_ctx->member_map, token_string);
|
||||
U64 data_member_num = e_num_from_string(e_state->ctx->member_map, token_string);
|
||||
if(data_member_num != 0)
|
||||
{
|
||||
atom_implicit_member_name = token_string;
|
||||
@@ -2693,13 +2705,13 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: try locals
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
U64 local_num = e_num_from_string(e_ctx->locals_map, local_lookup_string);
|
||||
U64 local_num = e_num_from_string(e_state->ctx->locals_map, local_lookup_string);
|
||||
if(local_num != 0)
|
||||
{
|
||||
mapped_identifier = 1;
|
||||
identifier_type_is_possibly_dynamically_overridden = 1;
|
||||
RDI_Local *local_var = rdi_element_from_name_idx(e_ctx->rdis[0], Locals, local_num-1);
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(e_ctx->rdis[0], TypeNodes, local_var->type_idx);
|
||||
RDI_Local *local_var = rdi_element_from_name_idx(e_state->ctx->rdis[0], Locals, local_num-1);
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(e_state->ctx->rdis[0], TypeNodes, local_var->type_idx);
|
||||
type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local_var->type_idx, 0);
|
||||
|
||||
// rjf: grab location info
|
||||
@@ -2707,11 +2719,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
loc_block_idx < local_var->location_opl;
|
||||
loc_block_idx += 1)
|
||||
{
|
||||
RDI_LocationBlock *block = rdi_element_from_name_idx(e_ctx->rdis[0], LocationBlocks, loc_block_idx);
|
||||
if(block->scope_off_first <= e_ctx->ip_voff && e_ctx->ip_voff < block->scope_off_opl)
|
||||
RDI_LocationBlock *block = rdi_element_from_name_idx(e_state->ctx->rdis[0], LocationBlocks, loc_block_idx);
|
||||
if(block->scope_off_first <= e_state->ctx->ip_voff && e_state->ctx->ip_voff < block->scope_off_opl)
|
||||
{
|
||||
U64 all_location_data_size = 0;
|
||||
U8 *all_location_data = rdi_table_from_name(e_ctx->rdis[0], LocationData, &all_location_data_size);
|
||||
U8 *all_location_data = rdi_table_from_name(e_state->ctx->rdis[0], LocationData, &all_location_data_size);
|
||||
loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off));
|
||||
switch(loc_kind)
|
||||
{
|
||||
@@ -2752,23 +2764,23 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: try registers
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
U64 reg_num = e_num_from_string(e_ctx->regs_map, token_string);
|
||||
U64 reg_num = e_num_from_string(e_state->ctx->regs_map, token_string);
|
||||
if(reg_num != 0)
|
||||
{
|
||||
reg_code = reg_num;
|
||||
mapped_identifier = 1;
|
||||
type_key = e_type_key_reg(e_ctx->arch, reg_code);
|
||||
type_key = e_type_key_reg(e_state->ctx->arch, reg_code);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: try register aliases
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
U64 alias_num = e_num_from_string(e_ctx->reg_alias_map, token_string);
|
||||
U64 alias_num = e_num_from_string(e_state->ctx->reg_alias_map, token_string);
|
||||
if(alias_num != 0)
|
||||
{
|
||||
alias_code = (REGS_AliasCode)alias_num;
|
||||
type_key = e_type_key_reg_alias(e_ctx->arch, alias_code);
|
||||
type_key = e_type_key_reg_alias(e_state->ctx->arch, alias_code);
|
||||
mapped_identifier = 1;
|
||||
}
|
||||
}
|
||||
@@ -2776,9 +2788,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: try global variables
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_ctx->rdis_count; rdi_idx += 1)
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_state->ctx->rdis_count; rdi_idx += 1)
|
||||
{
|
||||
RDI_Parsed *rdi = e_ctx->rdis[rdi_idx];
|
||||
RDI_Parsed *rdi = e_state->ctx->rdis[rdi_idx];
|
||||
RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables);
|
||||
RDI_ParsedNameMap parsed_name_map = {0};
|
||||
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map);
|
||||
@@ -2817,9 +2829,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: try thread variables
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_ctx->rdis_count; rdi_idx += 1)
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_state->ctx->rdis_count; rdi_idx += 1)
|
||||
{
|
||||
RDI_Parsed *rdi = e_ctx->rdis[rdi_idx];
|
||||
RDI_Parsed *rdi = e_state->ctx->rdis[rdi_idx];
|
||||
RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_ThreadVariables);
|
||||
RDI_ParsedNameMap parsed_name_map = {0};
|
||||
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map);
|
||||
@@ -2854,9 +2866,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: try procedures
|
||||
if(mapped_identifier == 0)
|
||||
{
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_ctx->rdis_count; rdi_idx += 1)
|
||||
for(U64 rdi_idx = 0; rdi_idx < e_state->ctx->rdis_count; rdi_idx += 1)
|
||||
{
|
||||
RDI_Parsed *rdi = e_ctx->rdis[rdi_idx];
|
||||
RDI_Parsed *rdi = e_state->ctx->rdis[rdi_idx];
|
||||
RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures);
|
||||
RDI_ParsedNameMap parsed_name_map = {0};
|
||||
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map);
|
||||
@@ -2922,7 +2934,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
}
|
||||
else if(reg_code != 0)
|
||||
{
|
||||
REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_ctx->arch)[reg_code];
|
||||
REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_state->ctx->arch)[reg_code];
|
||||
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);
|
||||
@@ -2932,8 +2944,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
}
|
||||
else if(alias_code != 0)
|
||||
{
|
||||
REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(e_ctx->arch)[alias_code];
|
||||
REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_architecture(e_ctx->arch)[alias_slice.code];
|
||||
REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(e_state->ctx->arch)[alias_code];
|
||||
REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_architecture(e_state->ctx->arch)[alias_slice.code];
|
||||
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);
|
||||
@@ -2963,7 +2975,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
case RDI_LocationKind_AddrRegPlusU16:
|
||||
{
|
||||
E_OpList oplist = {0};
|
||||
U64 byte_size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
U64 byte_size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset);
|
||||
@@ -2976,12 +2988,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
case RDI_LocationKind_AddrAddrRegPlusU16:
|
||||
{
|
||||
E_OpList oplist = {0};
|
||||
U64 byte_size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
U64 byte_size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(e_ctx->arch)/8);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(e_state->ctx->arch)/8);
|
||||
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
|
||||
atom->mode = E_Mode_Addr;
|
||||
atom->type_key = type_key;
|
||||
@@ -2989,8 +3001,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
}break;
|
||||
case RDI_LocationKind_ValReg:
|
||||
{
|
||||
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(e_ctx->arch, loc_reg.reg_code);
|
||||
REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_ctx->arch)[regs_reg_code];
|
||||
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(e_state->ctx->arch, loc_reg.reg_code);
|
||||
REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_state->ctx->arch)[regs_reg_code];
|
||||
E_OpList oplist = {0};
|
||||
U64 byte_size = (U64)reg_rng.byte_size;
|
||||
U64 byte_pos = 0;
|
||||
@@ -3349,7 +3361,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
internal E_Parse
|
||||
e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
|
||||
{
|
||||
E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, eval_g_max_precedence);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence);
|
||||
return parse;
|
||||
}
|
||||
|
||||
@@ -4016,7 +4028,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
|
||||
RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind);
|
||||
E_TypeKey r_type_promoted = e_type_promote(r_type);
|
||||
RDI_EvalOp op = eval_opcode_from_expr_kind(kind);
|
||||
RDI_EvalOp op = e_opcode_from_expr_kind(kind);
|
||||
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||
|
||||
// rjf: bad conditions? -> error if applicable, exit
|
||||
@@ -4371,16 +4383,16 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
//- rjf: leaf identifiers
|
||||
case E_ExprKind_LeafIdent:
|
||||
{
|
||||
E_Expr *macro_expr = e_expr_from_string(e_ctx->macro_map, expr->string);
|
||||
E_Expr *macro_expr = e_expr_from_string(e_state->ctx->macro_map, expr->string);
|
||||
if(macro_expr == &e_expr_nil)
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "\"%S\" could not be found.", expr->string);
|
||||
}
|
||||
else
|
||||
{
|
||||
e_string2expr_map_inc_poison(e_ctx->macro_map, expr->string);
|
||||
e_string2expr_map_inc_poison(e_state->ctx->macro_map, expr->string);
|
||||
result = e_irtree_and_type_from_expr(arena, macro_expr);
|
||||
e_string2expr_map_dec_poison(e_ctx->macro_map, expr->string);
|
||||
e_string2expr_map_dec_poison(e_state->ctx->macro_map, expr->string);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
@@ -4620,7 +4632,7 @@ e_interpret(String8 bytecode)
|
||||
U64 addr = svals[0].u64;
|
||||
U64 size = imm;
|
||||
B32 good_read = 0;
|
||||
if(e_ctx->memory_read != 0 && e_ctx->memory_read(e_ctx->memory_read_user_data, &nval, r1u64(addr, addr+size)))
|
||||
if(e_state->ctx->memory_read != 0 && e_state->ctx->memory_read(e_state->ctx->memory_read_user_data, &nval, r1u64(addr, addr+size)))
|
||||
{
|
||||
good_read = 1;
|
||||
}
|
||||
@@ -4636,13 +4648,13 @@ e_interpret(String8 bytecode)
|
||||
U8 rdi_reg_code = (imm&0x0000FF)>>0;
|
||||
U8 byte_size = (imm&0x00FF00)>>8;
|
||||
U8 byte_off = (imm&0xFF0000)>>16;
|
||||
REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_ctx->arch, rdi_reg_code);
|
||||
REGS_Rng rng = regs_reg_code_rng_table_from_architecture(e_ctx->arch)[base_reg_code];
|
||||
REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_state->ctx->arch, rdi_reg_code);
|
||||
REGS_Rng rng = regs_reg_code_rng_table_from_architecture(e_state->ctx->arch)[base_reg_code];
|
||||
U64 off = (U64)rng.byte_off + byte_off;
|
||||
U64 size = (U64)byte_size;
|
||||
if(off + size <= e_ctx->reg_size)
|
||||
if(off + size <= e_state->ctx->reg_size)
|
||||
{
|
||||
MemoryCopy(&nval, (U8*)e_ctx->reg_data + off, size);
|
||||
MemoryCopy(&nval, (U8*)e_state->ctx->reg_data + off, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -4654,10 +4666,10 @@ e_interpret(String8 bytecode)
|
||||
case RDI_EvalOp_RegReadDyn:
|
||||
{
|
||||
U64 off = svals[0].u64;
|
||||
U64 size = bit_size_from_arch(e_ctx->arch)/8;
|
||||
if(off + size <= e_ctx->reg_size)
|
||||
U64 size = bit_size_from_arch(e_state->ctx->arch)/8;
|
||||
if(off + size <= e_state->ctx->reg_size)
|
||||
{
|
||||
MemoryCopy(&nval, (U8*)e_ctx->reg_data + off, size);
|
||||
MemoryCopy(&nval, (U8*)e_state->ctx->reg_data + off, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -4668,9 +4680,9 @@ e_interpret(String8 bytecode)
|
||||
|
||||
case RDI_EvalOp_FrameOff:
|
||||
{
|
||||
if(e_ctx->frame_base != 0)
|
||||
if(e_state->ctx->frame_base != 0)
|
||||
{
|
||||
nval.u64 = *e_ctx->frame_base + imm;
|
||||
nval.u64 = *e_state->ctx->frame_base + imm;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -4681,9 +4693,9 @@ e_interpret(String8 bytecode)
|
||||
|
||||
case RDI_EvalOp_ModuleOff:
|
||||
{
|
||||
if(e_ctx->module_base != 0)
|
||||
if(e_state->ctx->module_base != 0)
|
||||
{
|
||||
nval.u64 = *e_ctx->module_base + imm;
|
||||
nval.u64 = *e_state->ctx->module_base + imm;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -4694,9 +4706,9 @@ e_interpret(String8 bytecode)
|
||||
|
||||
case RDI_EvalOp_TLSOff:
|
||||
{
|
||||
if(e_ctx->tls_base != 0)
|
||||
if(e_state->ctx->tls_base != 0)
|
||||
{
|
||||
nval.u64 = *e_ctx->tls_base + imm;
|
||||
nval.u64 = *e_state->ctx->tls_base + imm;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+19
-12
@@ -407,9 +407,6 @@ typedef B32 E_MemoryReadFunction(void *user_data, void *out, Rng1U64 vaddr_range
|
||||
typedef struct E_Ctx E_Ctx;
|
||||
struct E_Ctx
|
||||
{
|
||||
// rjf: eval arena
|
||||
Arena *eval_arena;
|
||||
|
||||
// rjf: architecture
|
||||
Architecture arch;
|
||||
|
||||
@@ -428,13 +425,6 @@ struct E_Ctx
|
||||
E_String2NumMap *member_map; // (within `rdis[0]`)
|
||||
E_String2ExprMap *macro_map;
|
||||
|
||||
// rjf: JIT-constructed types
|
||||
U64 cons_id_gen;
|
||||
U64 cons_content_slots_count;
|
||||
U64 cons_key_slots_count;
|
||||
E_ConsTypeSlot *cons_content_slots;
|
||||
E_ConsTypeSlot *cons_key_slots;
|
||||
|
||||
// rjf: interpretation environment info
|
||||
void *memory_read_user_data;
|
||||
E_MemoryReadFunction *memory_read;
|
||||
@@ -445,6 +435,23 @@ struct E_Ctx
|
||||
U64 *tls_base;
|
||||
};
|
||||
|
||||
typedef struct E_State E_State;
|
||||
struct E_State
|
||||
{
|
||||
Arena *arena;
|
||||
U64 arena_eval_start_pos;
|
||||
|
||||
// rjf: evaluation context
|
||||
E_Ctx *ctx;
|
||||
|
||||
// rjf: JIT-constructed types tables
|
||||
U64 cons_id_gen;
|
||||
U64 cons_content_slots_count;
|
||||
U64 cons_key_slots_count;
|
||||
E_ConsTypeSlot *cons_content_slots;
|
||||
E_ConsTypeSlot *cons_key_slots;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Parse Results
|
||||
|
||||
@@ -462,7 +469,7 @@ struct E_Parse
|
||||
global read_only E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil};
|
||||
global read_only E_Type e_type_nil = {E_TypeKind_Null};
|
||||
global read_only E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil};
|
||||
thread_static E_Ctx *e_ctx = 0;
|
||||
thread_static E_State *e_state = 0;
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Basic Helper Functions
|
||||
@@ -543,7 +550,7 @@ internal void e_select_ctx(E_Ctx *ctx);
|
||||
//- rjf: key constructors
|
||||
internal E_TypeKey e_type_key_zero(void);
|
||||
internal E_TypeKey e_type_key_basic(E_TypeKind kind);
|
||||
internal E_TypeKey e_type_key_ext(TG_Kind kind, U32 type_idx, U32 rdi_idx);
|
||||
internal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx);
|
||||
internal E_TypeKey e_type_key_reg(Architecture arch, REGS_RegCode code);
|
||||
internal E_TypeKey e_type_key_reg_alias(Architecture arch, REGS_AliasCode code);
|
||||
internal E_TypeKey e_type_key_cons(E_TypeKind kind, E_TypeKey direct_key, U64 u64);
|
||||
|
||||
Reference in New Issue
Block a user