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;
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
View File
@@ -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);