complete eval2 first pass

This commit is contained in:
Ryan Fleury
2024-07-30 13:50:27 -07:00
parent d2c363ada2
commit ba45dd161d
2 changed files with 124 additions and 105 deletions
+105 -93
View File
@@ -81,27 +81,27 @@ e_opcode_from_expr_kind(E_ExprKind kind)
RDI_EvalOp result = RDI_EvalOp_Stop; RDI_EvalOp result = RDI_EvalOp_Stop;
switch(kind) switch(kind)
{ {
case EVAL_ExprKind_Neg: result = RDI_EvalOp_Neg; break; case E_ExprKind_Neg: result = RDI_EvalOp_Neg; break;
case EVAL_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break; case E_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break;
case EVAL_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break; case E_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break;
case EVAL_ExprKind_Mul: result = RDI_EvalOp_Mul; break; case E_ExprKind_Mul: result = RDI_EvalOp_Mul; break;
case EVAL_ExprKind_Div: result = RDI_EvalOp_Div; break; case E_ExprKind_Div: result = RDI_EvalOp_Div; break;
case EVAL_ExprKind_Mod: result = RDI_EvalOp_Mod; break; case E_ExprKind_Mod: result = RDI_EvalOp_Mod; break;
case EVAL_ExprKind_Add: result = RDI_EvalOp_Add; break; case E_ExprKind_Add: result = RDI_EvalOp_Add; break;
case EVAL_ExprKind_Sub: result = RDI_EvalOp_Sub; break; case E_ExprKind_Sub: result = RDI_EvalOp_Sub; break;
case EVAL_ExprKind_LShift: result = RDI_EvalOp_LShift; break; case E_ExprKind_LShift: result = RDI_EvalOp_LShift; break;
case EVAL_ExprKind_RShift: result = RDI_EvalOp_RShift; break; case E_ExprKind_RShift: result = RDI_EvalOp_RShift; break;
case EVAL_ExprKind_Less: result = RDI_EvalOp_Less; break; case E_ExprKind_Less: result = RDI_EvalOp_Less; break;
case EVAL_ExprKind_LsEq: result = RDI_EvalOp_LsEq; break; case E_ExprKind_LsEq: result = RDI_EvalOp_LsEq; break;
case EVAL_ExprKind_Grtr: result = RDI_EvalOp_Grtr; break; case E_ExprKind_Grtr: result = RDI_EvalOp_Grtr; break;
case EVAL_ExprKind_GrEq: result = RDI_EvalOp_GrEq; break; case E_ExprKind_GrEq: result = RDI_EvalOp_GrEq; break;
case EVAL_ExprKind_EqEq: result = RDI_EvalOp_EqEq; break; case E_ExprKind_EqEq: result = RDI_EvalOp_EqEq; break;
case EVAL_ExprKind_NtEq: result = RDI_EvalOp_NtEq; break; case E_ExprKind_NtEq: result = RDI_EvalOp_NtEq; break;
case EVAL_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break; case E_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break;
case EVAL_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break; case E_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break;
case EVAL_ExprKind_BitOr: result = RDI_EvalOp_BitOr; break; case E_ExprKind_BitOr: result = RDI_EvalOp_BitOr; break;
case EVAL_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break; case E_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break;
case EVAL_ExprKind_LogOr: result = RDI_EvalOp_LogOr; break; case E_ExprKind_LogOr: result = RDI_EvalOp_LogOr; break;
} }
return result; return result;
} }
@@ -113,12 +113,12 @@ e_expr_kind_is_comparison(E_ExprKind kind)
switch(kind) switch(kind)
{ {
default:{}break; default:{}break;
case EVAL_ExprKind_EqEq: case E_ExprKind_EqEq:
case EVAL_ExprKind_NtEq: case E_ExprKind_NtEq:
case EVAL_ExprKind_Less: case E_ExprKind_Less:
case EVAL_ExprKind_Grtr: case E_ExprKind_Grtr:
case EVAL_ExprKind_LsEq: case E_ExprKind_LsEq:
case EVAL_ExprKind_GrEq: case E_ExprKind_GrEq:
{ {
result = 1; result = 1;
}break; }break;
@@ -932,7 +932,19 @@ e_expr_push_child(E_Expr *parent, E_Expr *child)
internal void internal void
e_select_ctx(E_Ctx *ctx) 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), (U32)((u64 & 0xffffffff00000000ull)>> 32),
}; };
U64 content_hash = e_hash_from_string(str8((U8 *)buffer, sizeof(buffer))); U64 content_hash = e_hash_from_string(str8((U8 *)buffer, sizeof(buffer)));
U64 content_slot_idx = content_hash%e_ctx->cons_content_slots_count; U64 content_slot_idx = content_hash%e_state->cons_content_slots_count;
E_ConsTypeSlot *content_slot = &e_ctx->cons_content_slots[content_slot_idx]; E_ConsTypeSlot *content_slot = &e_state->cons_content_slots[content_slot_idx];
E_ConsTypeNode *node = 0; E_ConsTypeNode *node = 0;
for(E_ConsTypeNode *n = content_slot->first; n != 0; n = n->content_next) 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}; E_TypeKey key = {E_TypeKeyKind_Cons};
key.u32[0] = (U32)kind; key.u32[0] = (U32)kind;
key.u32[1] = (U32)e_ctx->cons_id_gen; key.u32[1] = (U32)e_state->cons_id_gen;
e_ctx->cons_id_gen += 1; e_state->cons_id_gen += 1;
U64 key_hash = e_hash_from_string(str8_struct(&key)); U64 key_hash = e_hash_from_string(str8_struct(&key));
U64 key_slot_idx = key_hash%e_ctx->cons_key_slots_count; U64 key_slot_idx = key_hash%e_state->cons_key_slots_count;
E_ConsTypeSlot *key_slot = &e_ctx->cons_key_slots[key_slot_idx]; E_ConsTypeSlot *key_slot = &e_state->cons_key_slots[key_slot_idx];
E_ConsTypeNode *node = push_array(e_ctx->eval_arena, E_ConsTypeNode, 1); E_ConsTypeNode *node = push_array(e_state->arena, E_ConsTypeNode, 1);
SLLQueuePush_N(content_slot->first, content_slot->last, node, content_next); SLLQueuePush_N(content_slot->first, content_slot->last, node, content_next);
SLLQueuePush_N(key_slot->first, key_slot->last, node, key_next); SLLQueuePush_N(key_slot->first, key_slot->last, node, key_next);
node->key = key; node->key = key;
@@ -1089,8 +1101,8 @@ e_type_from_key(Arena *arena, E_TypeKey key)
case E_TypeKeyKind_Cons: case E_TypeKeyKind_Cons:
{ {
U64 key_hash = e_hash_from_string(str8_struct(&key)); U64 key_hash = e_hash_from_string(str8_struct(&key));
U64 key_slot_idx = key_hash%e_ctx->cons_key_slots_count; U64 key_slot_idx = key_hash%e_state->cons_key_slots_count;
E_ConsTypeSlot *key_slot = &e_ctx->cons_key_slots[key_slot_idx]; E_ConsTypeSlot *key_slot = &e_state->cons_key_slots[key_slot_idx];
for(E_ConsTypeNode *node = key_slot->first; for(E_ConsTypeNode *node = key_slot->first;
node != 0; node != 0;
node = node->key_next) node = node->key_next)
@@ -1105,7 +1117,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
{ {
default: 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; }break;
case E_TypeKind_Array: case E_TypeKind_Array:
{ {
@@ -1122,7 +1134,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
{ {
U64 type_node_idx = key.u32[1]; U64 type_node_idx = key.u32[1];
U32 rdi_idx = key.u32[2]; 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); RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
if(rdi_type->kind != RDI_TypeKind_NULL) 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 = push_array(arena, E_Type, 1);
type->kind = kind; type->kind = kind;
type->direct_type_key = direct_type_key; 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; }break;
case RDI_TypeKind_Array: 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 = push_array(arena, E_Type, 1);
type->kind = kind; 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->direct_type_key = direct_type_key;
type->count = count; type->count = count;
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->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 = push_array(arena, E_Type, 1);
type->kind = kind; 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->owner_type_key = direct_type_key;
type->count = count; type->count = count;
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->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 = push_array(arena, E_Type, 1);
type->kind = kind; 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->owner_type_key = owner_type_key;
type->direct_type_key = direct_type_key; type->direct_type_key = direct_type_key;
}break; }break;
@@ -2253,9 +2265,9 @@ e_leaf_type_from_name(String8 name)
{ {
E_TypeKey key = zero_struct; E_TypeKey key = zero_struct;
B32 found = 0; 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_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types);
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); 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 //- rjf: form namespaceified fallback versions of this lookup string
String8List namespaceified_token_strings = {0}; 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); 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_ctx->rdis[0], Scopes, scope_idx); RDI_Scope *scope = rdi_element_from_name_idx(e_state->ctx->rdis[0], Scopes, scope_idx);
U64 proc_idx = scope->proc_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; 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); String8 containing_procedure_name = str8(name_ptr, name_size);
U64 last_past_scope_resolution_pos = 0; U64 last_past_scope_resolution_pos = 0;
for(;;) for(;;)
@@ -2682,7 +2694,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
//- rjf: try members //- rjf: try members
if(mapped_identifier == 0) 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) if(data_member_num != 0)
{ {
atom_implicit_member_name = token_string; 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 //- rjf: try locals
if(mapped_identifier == 0) 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) if(local_num != 0)
{ {
mapped_identifier = 1; mapped_identifier = 1;
identifier_type_is_possibly_dynamically_overridden = 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_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_ctx->rdis[0], TypeNodes, local_var->type_idx); 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); type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local_var->type_idx, 0);
// rjf: grab location info // 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 < local_var->location_opl;
loc_block_idx += 1) loc_block_idx += 1)
{ {
RDI_LocationBlock *block = rdi_element_from_name_idx(e_ctx->rdis[0], LocationBlocks, loc_block_idx); RDI_LocationBlock *block = rdi_element_from_name_idx(e_state->ctx->rdis[0], LocationBlocks, loc_block_idx);
if(block->scope_off_first <= e_ctx->ip_voff && e_ctx->ip_voff < block->scope_off_opl) 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; 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)); loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off));
switch(loc_kind) switch(loc_kind)
{ {
@@ -2752,23 +2764,23 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
//- rjf: try registers //- rjf: try registers
if(mapped_identifier == 0) 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) if(reg_num != 0)
{ {
reg_code = reg_num; reg_code = reg_num;
mapped_identifier = 1; 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 //- rjf: try register aliases
if(mapped_identifier == 0) 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) if(alias_num != 0)
{ {
alias_code = (REGS_AliasCode)alias_num; 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; 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 //- rjf: try global variables
if(mapped_identifier == 0) 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_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables);
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); 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 //- rjf: try thread variables
if(mapped_identifier == 0) 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_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_ThreadVariables);
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); 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 //- rjf: try procedures
if(mapped_identifier == 0) 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_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures);
RDI_ParsedNameMap parsed_name_map = {0}; RDI_ParsedNameMap parsed_name_map = {0};
rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); 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) 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 oplist = {0};
e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off);
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); 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) else if(alias_code != 0)
{ {
REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(e_ctx->arch)[alias_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_ctx->arch)[alias_slice.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 oplist = {0};
e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off); 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); 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: case RDI_LocationKind_AddrRegPlusU16:
{ {
E_OpList oplist = {0}; 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); 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_RegRead, regread_param);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); 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: case RDI_LocationKind_AddrAddrRegPlusU16:
{ {
E_OpList oplist = {0}; 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); 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_RegRead, regread_param);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); 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_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 = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
atom->mode = E_Mode_Addr; atom->mode = E_Mode_Addr;
atom->type_key = type_key; atom->type_key = type_key;
@@ -2989,8 +3001,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
}break; }break;
case RDI_LocationKind_ValReg: case RDI_LocationKind_ValReg:
{ {
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(e_ctx->arch, loc_reg.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_ctx->arch)[regs_reg_code]; REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_state->ctx->arch)[regs_reg_code];
E_OpList oplist = {0}; E_OpList oplist = {0};
U64 byte_size = (U64)reg_rng.byte_size; U64 byte_size = (U64)reg_rng.byte_size;
U64 byte_pos = 0; 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 internal E_Parse
e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) 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; 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); 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); RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind);
E_TypeKey r_type_promoted = e_type_promote(r_type); 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); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
// rjf: bad conditions? -> error if applicable, exit // 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 //- rjf: leaf identifiers
case E_ExprKind_LeafIdent: 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) if(macro_expr == &e_expr_nil)
{ {
e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "\"%S\" could not be found.", expr->string); e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "\"%S\" could not be found.", expr->string);
} }
else 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); 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; }break;
} }
@@ -4620,7 +4632,7 @@ e_interpret(String8 bytecode)
U64 addr = svals[0].u64; U64 addr = svals[0].u64;
U64 size = imm; U64 size = imm;
B32 good_read = 0; 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; good_read = 1;
} }
@@ -4636,13 +4648,13 @@ e_interpret(String8 bytecode)
U8 rdi_reg_code = (imm&0x0000FF)>>0; U8 rdi_reg_code = (imm&0x0000FF)>>0;
U8 byte_size = (imm&0x00FF00)>>8; U8 byte_size = (imm&0x00FF00)>>8;
U8 byte_off = (imm&0xFF0000)>>16; 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_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_ctx->arch)[base_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 off = (U64)rng.byte_off + byte_off;
U64 size = (U64)byte_size; 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 else
{ {
@@ -4654,10 +4666,10 @@ e_interpret(String8 bytecode)
case RDI_EvalOp_RegReadDyn: case RDI_EvalOp_RegReadDyn:
{ {
U64 off = svals[0].u64; U64 off = svals[0].u64;
U64 size = bit_size_from_arch(e_ctx->arch)/8; U64 size = bit_size_from_arch(e_state->ctx->arch)/8;
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 else
{ {
@@ -4668,9 +4680,9 @@ e_interpret(String8 bytecode)
case RDI_EvalOp_FrameOff: 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 else
{ {
@@ -4681,9 +4693,9 @@ e_interpret(String8 bytecode)
case RDI_EvalOp_ModuleOff: 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 else
{ {
@@ -4694,9 +4706,9 @@ e_interpret(String8 bytecode)
case RDI_EvalOp_TLSOff: 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 else
{ {
+19 -12
View File
@@ -407,9 +407,6 @@ typedef B32 E_MemoryReadFunction(void *user_data, void *out, Rng1U64 vaddr_range
typedef struct E_Ctx E_Ctx; typedef struct E_Ctx E_Ctx;
struct E_Ctx struct E_Ctx
{ {
// rjf: eval arena
Arena *eval_arena;
// rjf: architecture // rjf: architecture
Architecture arch; Architecture arch;
@@ -428,13 +425,6 @@ struct E_Ctx
E_String2NumMap *member_map; // (within `rdis[0]`) E_String2NumMap *member_map; // (within `rdis[0]`)
E_String2ExprMap *macro_map; 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 // rjf: interpretation environment info
void *memory_read_user_data; void *memory_read_user_data;
E_MemoryReadFunction *memory_read; E_MemoryReadFunction *memory_read;
@@ -445,6 +435,23 @@ struct E_Ctx
U64 *tls_base; 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 //~ 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_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_Type e_type_nil = {E_TypeKind_Null};
global read_only E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil}; 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 //~ rjf: Basic Helper Functions
@@ -543,7 +550,7 @@ internal void e_select_ctx(E_Ctx *ctx);
//- rjf: key constructors //- rjf: key constructors
internal E_TypeKey e_type_key_zero(void); internal E_TypeKey e_type_key_zero(void);
internal E_TypeKey e_type_key_basic(E_TypeKind kind); 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(Architecture arch, REGS_RegCode code);
internal E_TypeKey e_type_key_reg_alias(Architecture arch, REGS_AliasCode 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); internal E_TypeKey e_type_key_cons(E_TypeKind kind, E_TypeKey direct_key, U64 u64);