eval: do simplification pass over identifier resolution, shift from parsing stage -> ir generation / typechecking stage; do simplifications over expr tree, eliminate redundant kinds

This commit is contained in:
Ryan Fleury
2025-04-02 14:30:12 -07:00
parent b2ae4d89d7
commit 6113a2e3db
15 changed files with 942 additions and 718 deletions
+9 -12
View File
@@ -4663,8 +4663,6 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread)
// rjf: build eval type context
{
E_TypeCtx *ctx = &scope->type_ctx;
ctx->ip_vaddr = thread_rip_vaddr;
ctx->ip_voff = thread_rip_voff;
ctx->modules = eval_modules;
ctx->modules_count = eval_modules_count;
ctx->primary_module = eval_modules_primary;
@@ -4675,10 +4673,15 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread)
ProfScope("build eval parse context")
{
E_ParseCtx *ctx = &scope->parse_ctx;
ctx->ip_vaddr = thread_rip_vaddr;
ctx->ip_voff = thread_rip_voff;
ctx->ip_thread_space = e_space_make(CTRL_EvalSpaceKind_Entity);
ctx->ip_thread_space.u64_0 = (U64)thread;
ctx->modules = eval_modules;
ctx->modules_count = eval_modules_count;
ctx->primary_module = eval_modules_primary;
}
e_select_parse_ctx(&scope->parse_ctx);
// rjf: build eval IR context
{
E_IRCtx *ctx = &scope->ir_ctx;
ctx->modules = eval_modules;
ctx->modules_count = eval_modules_count;
ctx->primary_module = eval_modules_primary;
@@ -4686,12 +4689,6 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread)
ctx->reg_alias_map = ctrl_string2alias_from_arch(arch);
ctx->locals_map = e_push_locals_map_from_rdi_voff(arena, eval_modules_primary->rdi, thread_rip_voff);
ctx->member_map = e_push_member_map_from_rdi_voff(arena, eval_modules_primary->rdi, thread_rip_voff);
}
e_select_parse_ctx(&scope->parse_ctx);
// rjf: build eval IR context
{
E_IRCtx *ctx = &scope->ir_ctx;
ctx->macro_map = push_array(arena, E_String2ExprMap, 1);
ctx->macro_map[0] = e_string2expr_map_make(arena, 512);
ctx->lookup_rule_map = push_array(arena, E_LookupRuleMap, 1);
-2
View File
@@ -119,9 +119,7 @@ E_ExprKindTable:
{ Call Null 0 "(" "," ")"}
{ LeafBytecode Null 0 "" "" "" }
{ LeafMember Null 0 "" "" "" }
{ LeafStringLiteral Null 0 "" "" "" }
{ LeafBool Null 0 "" "" "" }
{ LeafU64 Null 0 "" "" "" }
{ LeafF64 Null 0 "" "" "" }
{ LeafF32 Null 0 "" "" "" }
+1 -1
View File
@@ -43,7 +43,7 @@ internal E_Eval
e_eval_from_string(Arena *arena, String8 string)
{
E_TokenArray tokens = e_token_array_from_text(arena, string);
E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens);
E_Parse parse = e_parse_expr_from_text_tokens(arena, string, tokens);
E_Eval eval = e_eval_from_exprs(arena, parse.exprs);
e_msg_list_concat_in_place(&eval.msgs, &parse.msgs);
return eval;
+691 -26
View File
@@ -58,12 +58,6 @@ e_expr_kind_is_comparison(E_ExprKind kind)
////////////////////////////////
//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)
internal E_IRCtx *
e_selected_ir_ctx(void)
{
return e_ir_state->ctx;
}
internal void
e_select_ir_ctx(E_IRCtx *ctx)
{
@@ -75,9 +69,14 @@ e_select_ir_ctx(E_IRCtx *ctx)
e_ir_state->arena_eval_start_pos = arena_pos(arena);
}
arena_pop_to(e_ir_state->arena, e_ir_state->arena_eval_start_pos);
if(ctx->macro_map == 0) {ctx->macro_map = &e_string2expr_map_nil;}
if(ctx->regs_map == 0) { ctx->regs_map = &e_string2num_map_nil; }
if(ctx->reg_alias_map == 0) { ctx->reg_alias_map = &e_string2num_map_nil; }
if(ctx->locals_map == 0) { ctx->locals_map = &e_string2num_map_nil; }
if(ctx->member_map == 0) { ctx->member_map = &e_string2num_map_nil; }
if(ctx->macro_map == 0) {ctx->macro_map = &e_string2expr_map_nil;}
e_ir_state->ctx = ctx;
e_ir_state->used_tag_map = push_array(e_ir_state->arena, E_UsedTagMap, 1);
e_ir_state->ip_procedure = rdi_procedure_from_voff(ctx->primary_module->rdi, ctx->ip_voff);
e_ir_state->used_tag_map = push_array(e_ir_state->arena, E_UsedTagMap, 1);
e_ir_state->used_tag_map->slots_count = 64;
e_ir_state->used_tag_map->slots = push_array(e_ir_state->arena, E_UsedTagSlot, e_ir_state->used_tag_map->slots_count);
e_ir_state->type_auto_hook_cache_map = push_array(e_ir_state->arena, E_TypeAutoHookCacheMap, 1);
@@ -340,7 +339,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(file)
{
String8 name = accel->fields.v[idx];
expr = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafMember, 0);
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, 0);
rhs->string = push_str8_copy(arena, name);
e_expr_push_child(expr, e_expr_ref(arena, lhs));
e_expr_push_child(expr, rhs);
@@ -659,7 +658,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(default)
{
break;
}
else if(exprr->kind != E_ExprKind_LeafMember)
else if(exprr->kind != E_ExprKind_LeafIdentifier)
{
e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprl->location, "Expected member name.");
break;
@@ -1320,7 +1319,7 @@ e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *
if(params->type_pattern.size != 0)
{
E_TokenArray tokens = e_token_array_from_text(scratch.arena, params->type_pattern);
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, &tokens);
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, tokens);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.exprs.last);
type_key = irtree.type_key;
}
@@ -2470,12 +2469,6 @@ E_IRGEN_FUNCTION_DEF(default)
result.mode = expr->mode;
}break;
//- rjf: (unexpected) leaf member
case E_ExprKind_LeafMember:
{
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "(internal) Leaf member not expected here.");
}break;
//- rjf: leaf string literal
case E_ExprKind_LeafStringLiteral:
{
@@ -2487,14 +2480,6 @@ E_IRGEN_FUNCTION_DEF(default)
result.mode = E_Mode_Value;
}break;
//- rjf: leaf bools
case E_ExprKind_LeafBool:
{
result.root = e_irtree_const_u(arena, expr->value.u64);
result.type_key = expr->type_key;
result.mode = E_Mode_Value;
}break;
//- rjf: leaf U64s
case E_ExprKind_LeafU64:
{
@@ -2533,6 +2518,683 @@ E_IRGEN_FUNCTION_DEF(default)
//- rjf: leaf identifiers
case E_ExprKind_LeafIdentifier:
{
Temp scratch = scratch_begin(&arena, 1);
String8 qualifier = expr->qualifier;
String8 string = expr->string;
String8 string__redirected = string;
B32 string_mapped = 0;
E_TypeKey mapped_type_key = zero_struct;
E_Module *mapped_location_block_module = &e_module_nil;
RDI_LocationBlock *mapped_location_block = 0;
//- rjf: form namespaceified fallback versions of this lookup string
String8List namespaceified_strings = {0};
{
E_Module *module = e_ir_state->ctx->primary_module;
RDI_Parsed *rdi = module->rdi;
RDI_Procedure *procedure = e_ir_state->ip_procedure;
U64 name_size = 0;
U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);
String8 containing_procedure_name = str8(name_ptr, name_size);
U64 last_past_scope_resolution_pos = 0;
for(;;)
{
U64 past_next_dbl_colon_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("::"), 0)+2;
U64 past_next_dot_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("."), 0)+1;
U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos);
if(past_next_scope_resolution_pos >= containing_procedure_name.size)
{
break;
}
String8 new_namespace_prefix_possibility = str8_prefix(containing_procedure_name, past_next_scope_resolution_pos);
String8 namespaceified_string = push_str8f(scratch.arena, "%S%S", new_namespace_prefix_possibility, string);
str8_list_push_front(scratch.arena, &namespaceified_strings, namespaceified_string);
last_past_scope_resolution_pos = past_next_scope_resolution_pos;
}
}
//- rjf: try to map name as member - if found, string__redirected := "this", and turn
// on later implicit-member-lookup generation
B32 string_is_implicit_member_name = 0;
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("member"), 0)))
{
E_Module *module = e_ir_state->ctx->primary_module;
U32 module_idx = (U32)(module - e_ir_state->ctx->modules);
RDI_Parsed *rdi = module->rdi;
RDI_Procedure *procedure = e_ir_state->ip_procedure;
RDI_UDT *udt = rdi_container_udt_from_procedure(rdi, procedure);
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
E_TypeKey container_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, module_idx);
E_Member member = e_type_member_from_key_name__cached(container_type_key, string);
if(member.kind != E_MemberKind_Null)
{
string_is_implicit_member_name = 1;
string__redirected = str8_lit("this");
}
}
//- rjf: try locals
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("local"), 0)))
{
U64 ip_voff = e_ir_state->ctx->ip_voff;
E_Module *module = e_ir_state->ctx->primary_module;
U32 module_idx = (U32)(module - e_ir_state->ctx->modules);
RDI_Parsed *rdi = module->rdi;
U64 local_num = e_num_from_string(e_ir_state->ctx->locals_map, string__redirected);
if(local_num != 0)
{
RDI_Local *local = rdi_element_from_name_idx(rdi, Locals, local_num-1);
// rjf: extract local's type key
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx);
mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local->type_idx, module_idx);
// rjf: extract local's location block
for(U32 loc_block_idx = local->location_first;
loc_block_idx < local->location_opl;
loc_block_idx += 1)
{
RDI_LocationBlock *block = rdi_element_from_name_idx(rdi, LocationBlocks, loc_block_idx);
if(block->scope_off_first <= ip_voff && ip_voff < block->scope_off_opl)
{
mapped_location_block_module = module;
mapped_location_block = block;
}
}
}
}
//- rjf: mapped to location block -> extract or produce bytecode for this mapping
E_Mode mapped_bytecode_mode = E_Mode_Offset;
E_Space mapped_bytecode_space = zero_struct;
String8 mapped_bytecode = {0};
if(mapped_location_block != 0)
{
E_Module *module = mapped_location_block_module;
E_Space space = module->space;
Arch arch = module->arch;
RDI_Parsed *rdi = module->rdi;
RDI_LocationBlock *block = mapped_location_block;
U64 all_location_data_size = 0;
U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size);
if(block->location_data_off + sizeof(RDI_LocationKind) <= all_location_data_size)
{
RDI_LocationKind loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off));
switch(loc_kind)
{
default:{}break;
case RDI_LocationKind_ValBytecodeStream: {mapped_bytecode_mode = E_Mode_Value;}goto bytecode_stream;
case RDI_LocationKind_AddrBytecodeStream:{mapped_bytecode_mode = E_Mode_Offset;}goto bytecode_stream;
bytecode_stream:;
{
string_mapped = 1;
U64 bytecode_size = 0;
U64 off_first = block->location_data_off + sizeof(RDI_LocationKind);
U64 off_opl = all_location_data_size;
for(U64 off = off_first, next_off = off_opl;
off < all_location_data_size;
off = next_off)
{
next_off = off_opl;
U8 op = all_location_data[off];
if(op == 0)
{
break;
}
U16 ctrlbits = rdi_eval_op_ctrlbits_table[op];
U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
bytecode_size += (1 + p_size);
next_off = (off + 1 + p_size);
}
mapped_bytecode = str8(all_location_data + off_first, bytecode_size);
}break;
case RDI_LocationKind_AddrRegPlusU16:
if(block->location_data_off + sizeof(RDI_LocationRegPlusU16) <= all_location_data_size)
{
string_mapped = 1;
RDI_LocationRegPlusU16 loc = *(RDI_LocationRegPlusU16 *)(all_location_data + block->location_data_off);
E_OpList oplist = {0};
U64 byte_size = bit_size_from_arch(arch)/8;
U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, 0);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc.offset));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
mapped_bytecode_mode = E_Mode_Offset;
mapped_bytecode_space = space;
}break;
case RDI_LocationKind_AddrAddrRegPlusU16:
{
string_mapped = 1;
RDI_LocationRegPlusU16 loc = *(RDI_LocationRegPlusU16 *)(all_location_data + block->location_data_off);
E_OpList oplist = {0};
U64 byte_size = bit_size_from_arch(arch)/8;
U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, 0);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc.offset));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, e_value_u64(bit_size_from_arch(arch)/8));
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
mapped_bytecode_mode = E_Mode_Offset;
mapped_bytecode_space = space;
}break;
case RDI_LocationKind_ValReg:
if(block->location_data_off + sizeof(RDI_LocationReg) <= all_location_data_size)
{
string_mapped = 1;
RDI_LocationReg loc = *(RDI_LocationReg *)(all_location_data + block->location_data_off);
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc.reg_code);
REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code];
E_OpList oplist = {0};
U64 byte_size = (U64)reg_rng.byte_size;
U64 byte_pos = 0;
U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, byte_pos);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
mapped_bytecode_mode = E_Mode_Value;
mapped_bytecode_space = space;
}break;
}
}
}
//- rjf: generate IR trees for bytecode
B32 generated = 0;
if(!generated && mapped_bytecode.size != 0)
{
generated = 1;
E_IRNode *root = e_irtree_bytecode_no_copy(arena, mapped_bytecode);
root->space = mapped_bytecode_space;
result.root = root;
result.type_key = mapped_type_key;
result.mode = mapped_bytecode_mode;
}
//- rjf: generate IR trees for macros
if(!generated)
{
E_Expr *macro_expr = e_string2expr_lookup(e_ir_state->ctx->macro_map, string);
if(macro_expr != &e_expr_nil)
{
generated = 1;
e_string2expr_map_inc_poison(e_ir_state->ctx->macro_map, string);
result = e_irtree_and_type_from_expr(arena, macro_expr);
e_string2expr_map_dec_poison(e_ir_state->ctx->macro_map, string);
}
}
//- rjf: error on failure-to-generate
if(!generated)
{
e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "`%S` could not be found.", string);
}
//- TODO(rjf):
#if 0
B32 mapped_identifier = 0;
B32 identifier_is_constant_value = 0;
B32 identifier_looks_like_type_expr = 0;
RDI_LocationKind loc_kind = RDI_LocationKind_NULL;
RDI_LocationReg loc_reg = {0};
RDI_LocationRegPlusU16 loc_reg_u16 = {0};
String8 loc_bytecode = {0};
U64 constant_value = 0;
REGS_RegCode reg_code = 0;
REGS_AliasCode alias_code = 0;
E_TypeKey type_key = zero_struct;
String8 local_lookup_string = token_string;
E_Space space = {0};
Arch arch = Arch_Null;
//- rjf: identifiers surrounded by ``s should have those `s stripped
if(local_lookup_string.size >= 2 &&
local_lookup_string.str[0] == '`' &&
local_lookup_string.str[local_lookup_string.size-1] == '`')
{
token_string = local_lookup_string = str8_substr(local_lookup_string, r1u64(1, local_lookup_string.size-1));
}
//- rjf: form namespaceified fallback versions of this lookup string
String8List namespaceified_token_strings = {0};
{
E_Module *module = e_parse_state->ctx->primary_module;
RDI_Parsed *rdi = module->rdi;
U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, e_parse_state->ctx->ip_voff);
RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx);
U64 proc_idx = scope->proc_idx;
RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx);
U64 name_size = 0;
U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);
String8 containing_procedure_name = str8(name_ptr, name_size);
U64 last_past_scope_resolution_pos = 0;
for(;;)
{
U64 past_next_dbl_colon_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("::"), 0)+2;
U64 past_next_dot_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("."), 0)+1;
U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos);
if(past_next_scope_resolution_pos >= containing_procedure_name.size)
{
break;
}
String8 new_namespace_prefix_possibility = str8_prefix(containing_procedure_name, past_next_scope_resolution_pos);
String8 namespaceified_token_string = push_str8f(scratch.arena, "%S%S", new_namespace_prefix_possibility, token_string);
str8_list_push_front(scratch.arena, &namespaceified_token_strings, namespaceified_token_string);
last_past_scope_resolution_pos = past_next_scope_resolution_pos;
}
}
//- rjf: try members
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("member"), 0))) ProfScope("try to map name as member")
{
U64 data_member_num = e_num_from_string(e_parse_state->ctx->member_map, token_string);
if(data_member_num != 0)
{
atom_implicit_member_name = token_string;
local_lookup_string = str8_lit("this");
}
}
//- rjf: try locals
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("local"), 0))) ProfScope("try to map name as local")
{
E_Module *module = e_parse_state->ctx->primary_module;
RDI_Parsed *rdi = module->rdi;
U64 local_num = e_num_from_string(e_parse_state->ctx->locals_map, local_lookup_string);
if(local_num != 0)
{
RDI_Local *local_var = rdi_element_from_name_idx(rdi, Locals, local_num-1);
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local_var->type_idx);
type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local_var->type_idx, (U32)(module - e_parse_state->ctx->modules));
// rjf: grab location info
for(U32 loc_block_idx = local_var->location_first;
loc_block_idx < local_var->location_opl;
loc_block_idx += 1)
{
RDI_LocationBlock *block = rdi_element_from_name_idx(rdi, LocationBlocks, loc_block_idx);
if(block->scope_off_first <= e_parse_state->ctx->ip_voff && e_parse_state->ctx->ip_voff < block->scope_off_opl)
{
mapped_identifier = 1;
space = module->space;
arch = module->arch;
U64 all_location_data_size = 0;
U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size);
if(block->location_data_off + sizeof(RDI_LocationKind) <= all_location_data_size)
{
loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off));
switch(loc_kind)
{
default:{mapped_identifier = 0;}break;
case RDI_LocationKind_ValBytecodeStream: goto bytecode_stream;
case RDI_LocationKind_AddrBytecodeStream: goto bytecode_stream;
bytecode_stream:;
{
U64 bytecode_size = 0;
U64 off_first = block->location_data_off + sizeof(RDI_LocationKind);
U64 off_opl = all_location_data_size;
for(U64 off = off_first, next_off = off_opl;
off < all_location_data_size;
off = next_off)
{
next_off = off_opl;
U8 op = all_location_data[off];
if(op == 0)
{
break;
}
U16 ctrlbits = rdi_eval_op_ctrlbits_table[op];
U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
bytecode_size += (1 + p_size);
next_off = (off + 1 + p_size);
}
loc_bytecode = str8(all_location_data + off_first, bytecode_size);
}break;
case RDI_LocationKind_AddrRegPlusU16:
case RDI_LocationKind_AddrAddrRegPlusU16:
{
MemoryCopy(&loc_reg_u16, (all_location_data + block->location_data_off), sizeof(loc_reg_u16));
}break;
case RDI_LocationKind_ValReg:
{
MemoryCopy(&loc_reg, (all_location_data + block->location_data_off), sizeof(loc_reg));
}break;
}
}
}
}
}
}
//- rjf: try registers
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("reg"), 0))) ProfScope("try to map name as register")
{
U64 reg_num = e_num_from_string(e_parse_state->ctx->regs_map, token_string);
if(reg_num != 0)
{
reg_code = reg_num;
type_key = e_type_key_reg(e_parse_state->ctx->primary_module->arch, reg_code);
mapped_identifier = 1;
space = e_parse_state->ctx->ip_thread_space;
arch = e_parse_state->ctx->primary_module->arch;
}
}
//- rjf: try register aliases
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("reg"), 0))) ProfScope("try to map name as register alias")
{
U64 alias_num = e_num_from_string(e_parse_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_parse_state->ctx->primary_module->arch, alias_code);
mapped_identifier = 1;
space = e_parse_state->ctx->ip_thread_space;
arch = e_parse_state->ctx->primary_module->arch;
}
}
//- rjf: try global variables
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("global"), 0))) ProfScope("try to map name as global variable")
{
for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1)
{
E_Module *module = &e_parse_state->ctx->modules[module_idx];
RDI_Parsed *rdi = module->rdi;
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);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0;
U32 *matches = rdi_matches_from_map_node(rdi, node, &matches_count);
for(String8Node *n = namespaceified_token_strings.first;
n != 0 && matches_count == 0;
n = n->next)
{
node = rdi_name_map_lookup(rdi, &parsed_name_map, n->string.str, n->string.size);
matches_count = 0;
matches = rdi_matches_from_map_node(rdi, node, &matches_count);
}
if(matches_count != 0)
{
// NOTE(rjf): apparently, PDBs can be produced such that they
// also keep stale *GLOBAL VARIABLE SYMBOLS* around too. I
// don't know of a magic hash table fixup path in PDBs, so
// in this case, I'm going to prefer the latest-added global.
U32 match_idx = matches[matches_count-1];
RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, match_idx);
E_OpList oplist = {0};
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + global_var->voff));
loc_kind = RDI_LocationKind_AddrBytecodeStream;
loc_bytecode = e_bytecode_from_oplist(arena, &oplist);
U32 type_idx = global_var->type_idx;
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);
type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx);
mapped_identifier = 1;
space = module->space;
arch = module->arch;
break;
}
}
}
//- rjf: try thread variables
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("thread_variable"), 0))) ProfScope("try to map name as thread variable")
{
for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1)
{
E_Module *module = &e_parse_state->ctx->modules[module_idx];
RDI_Parsed *rdi = module->rdi;
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);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0;
U32 *matches = rdi_matches_from_map_node(rdi, node, &matches_count);
for(String8Node *n = namespaceified_token_strings.first;
n != 0 && matches_count == 0;
n = n->next)
{
node = rdi_name_map_lookup(rdi, &parsed_name_map, n->string.str, n->string.size);
matches_count = 0;
matches = rdi_matches_from_map_node(rdi, node, &matches_count);
}
if(matches_count != 0)
{
U32 match_idx = matches[0];
RDI_ThreadVariable *thread_var = rdi_element_from_name_idx(rdi, ThreadVariables, match_idx);
E_OpList oplist = {0};
e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(thread_var->tls_off));
loc_kind = RDI_LocationKind_AddrBytecodeStream;
loc_bytecode = e_bytecode_from_oplist(arena, &oplist);
U32 type_idx = thread_var->type_idx;
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);
type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx);
mapped_identifier = 1;
space = module->space;
arch = module->arch;
break;
}
}
}
//- rjf: try procedures
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("procedure"), 0))) ProfScope("try to map name as procedure")
{
for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1)
{
E_Module *module = &e_parse_state->ctx->modules[module_idx];
RDI_Parsed *rdi = module->rdi;
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);
RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, token_string.str, token_string.size);
U32 matches_count = 0;
U32 *matches = rdi_matches_from_map_node(rdi, node, &matches_count);
for(String8Node *n = namespaceified_token_strings.first;
n != 0 && matches_count == 0;
n = n->next)
{
node = rdi_name_map_lookup(rdi, &parsed_name_map, n->string.str, n->string.size);
matches_count = 0;
matches = rdi_matches_from_map_node(rdi, node, &matches_count);
}
if(matches_count != 0)
{
U32 match_idx = matches[0];
RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, match_idx);
RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx);
U64 voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first);
E_OpList oplist = {0};
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));
loc_kind = RDI_LocationKind_ValBytecodeStream;
loc_bytecode = e_bytecode_from_oplist(arena, &oplist);
U32 type_idx = procedure->type_idx;
RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);
type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx);
mapped_identifier = 1;
space = module->space;
arch = module->arch;
break;
}
}
}
//- rjf: try types
if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("type"), 0))) ProfScope("try to map name as type")
{
type_key = e_leaf_type_from_name(token_string);
if(!e_type_key_match(e_type_key_zero(), type_key))
{
mapped_identifier = 1;
identifier_looks_like_type_expr = 1;
MemoryZeroStruct(&space);
arch = e_parse_state->ctx->primary_module->arch;
}
}
//- rjf: try basic constants
if(mapped_identifier == 0 && str8_match(token_string, str8_lit("true"), 0))
{
mapped_identifier = 1;
identifier_is_constant_value = 1;
type_key = e_type_key_basic(E_TypeKind_Bool);
constant_value = 1;
}
if(mapped_identifier == 0 && str8_match(token_string, str8_lit("false"), 0))
{
mapped_identifier = 1;
identifier_is_constant_value = 1;
type_key = e_type_key_basic(E_TypeKind_Bool);
constant_value = 0;
}
//- rjf: attach on map
if(mapped_identifier != 0) ProfScope("attach on map")
{
it += 1;
// rjf: build atom
switch(loc_kind)
{
default:
{
if(identifier_is_constant_value)
{
atom = e_push_expr(arena, E_ExprKind_LeafBool, token_string.str);
atom->value.u64 = constant_value;
atom->type_key = type_key;
}
else if(identifier_looks_like_type_expr)
{
E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, e_token_array_make_first_opl(it-1, it_opl));
E_Expr *type = type_parse.exprs.last;
e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);
it = type_parse.last_token;
atom = type;
}
else if(reg_code != 0)
{
REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_parse_state->ctx->primary_module->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);
atom->mode = E_Mode_Offset;
atom->space = space;
atom->type_key = type_key;
atom->string = token_string;
atom->bytecode = e_bytecode_from_oplist(arena, &oplist);
}
else if(alias_code != 0)
{
REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_parse_state->ctx->primary_module->arch)[alias_code];
REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_parse_state->ctx->primary_module->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);
atom->mode = E_Mode_Offset;
atom->space = space;
atom->type_key = type_key;
atom->string = token_string;
atom->bytecode = e_bytecode_from_oplist(arena, &oplist);
}
else
{
e_msgf(arena, &result.msgs, E_MsgKind_MissingInfo, token_string.str, "Missing location information for `%S`.", token_string);
}
}break;
case RDI_LocationKind_AddrBytecodeStream:
{
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
atom->mode = E_Mode_Offset;
atom->space = space;
atom->type_key = type_key;
atom->string = token_string;
atom->bytecode = loc_bytecode;
}break;
case RDI_LocationKind_ValBytecodeStream:
{
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
atom->mode = E_Mode_Value;
atom->space = space;
atom->type_key = type_key;
atom->string = token_string;
atom->bytecode = loc_bytecode;
}break;
case RDI_LocationKind_AddrRegPlusU16:
{
E_OpList oplist = {0};
U64 byte_size = bit_size_from_arch(arch)/8;
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc_reg_u16.offset));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
atom->mode = E_Mode_Offset;
atom->space = space;
atom->type_key = type_key;
atom->string = token_string;
atom->bytecode = e_bytecode_from_oplist(arena, &oplist);
}break;
case RDI_LocationKind_AddrAddrRegPlusU16:
{
E_OpList oplist = {0};
U64 byte_size = bit_size_from_arch(arch)/8;
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc_reg_u16.offset));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));
e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, e_value_u64(bit_size_from_arch(arch)/8));
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
atom->mode = E_Mode_Offset;
atom->space = space;
atom->type_key = type_key;
atom->string = token_string;
atom->bytecode = e_bytecode_from_oplist(arena, &oplist);
}break;
case RDI_LocationKind_ValReg:
{
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc_reg.reg_code);
REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code];
E_OpList oplist = {0};
U64 byte_size = (U64)reg_rng.byte_size;
U64 byte_pos = 0;
U64 regread_param = RDI_EncodeRegReadParam(loc_reg.reg_code, byte_size, byte_pos);
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
atom->mode = E_Mode_Value;
atom->space = space;
atom->type_key = type_key;
atom->string = token_string;
atom->bytecode = e_bytecode_from_oplist(arena, &oplist);
}break;
}
// rjf: implicit local lookup -> attach member access node
if(atom_implicit_member_name.size != 0 && atom != &e_expr_nil)
{
E_Expr *member_container = atom;
E_Expr *member_expr = e_push_expr(arena, E_ExprKind_LeafMember, atom_implicit_member_name.str);
member_expr->string = atom_implicit_member_name;
atom = e_push_expr(arena, E_ExprKind_MemberAccess, atom_implicit_member_name.str);
atom->space = space;
e_expr_push_child(atom, member_container);
e_expr_push_child(atom, member_expr);
}
}
//- rjf: map failure -> attach as leaf identifier, to be resolved later
if(!mapped_identifier)
{
atom = e_push_expr(arena, E_ExprKind_LeafIdentifier, token_string.str);
atom->string = token_string;
it += 1;
}
E_Expr *macro_expr = e_string2expr_lookup(e_ir_state->ctx->macro_map, expr->string);
if(macro_expr == &e_expr_nil)
{
@@ -2544,6 +3206,9 @@ E_IRGEN_FUNCTION_DEF(default)
result = e_irtree_and_type_from_expr(arena, macro_expr);
e_string2expr_map_dec_poison(e_ir_state->ctx->macro_map, expr->string);
}
#endif
scratch_end(scratch);
}break;
//- rjf: leaf offsets
@@ -2933,7 +3598,7 @@ e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtre
lhs_bytecode->mode = lhs_irtree->mode;
lhs_bytecode->type_key = lhs_irtree->type_key;
lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist);
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafMember, 0);
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, 0);
rhs->string = push_str8_copy(arena, member_name);
e_expr_push_child(root, lhs_bytecode);
e_expr_push_child(root, rhs);
+20 -1
View File
@@ -116,7 +116,24 @@ struct E_StringIDMap
typedef struct E_IRCtx E_IRCtx;
struct E_IRCtx
{
// rjf: instruction pointer info
U64 ip_vaddr;
U64 ip_voff;
E_Space ip_thread_space;
// rjf: modules
E_Module *modules;
U64 modules_count;
E_Module *primary_module;
// rjf: identifier-resolution maps
E_String2NumMap *regs_map;
E_String2NumMap *reg_alias_map;
E_String2NumMap *locals_map; // (within `primary_module`)
E_String2NumMap *member_map; // (within `primary_module`)
E_String2ExprMap *macro_map;
// rjf: hook maps
E_LookupRuleMap *lookup_rule_map;
E_IRGenRuleMap *irgen_rule_map;
E_AutoHookMap *auto_hook_map;
@@ -134,6 +151,9 @@ struct E_IRState
// rjf: ir context
E_IRCtx *ctx;
// rjf: unpacked ctx
RDI_Procedure *ip_procedure;
// rjf: caches
E_UsedTagMap *used_tag_map;
E_TypeAutoHookCacheMap *type_auto_hook_cache_map;
@@ -179,7 +199,6 @@ internal B32 e_expr_kind_is_comparison(E_ExprKind kind);
////////////////////////////////
//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)
internal E_IRCtx *e_selected_ir_ctx(void);
internal void e_select_ir_ctx(E_IRCtx *ctx);
////////////////////////////////
+173 -629
View File
File diff suppressed because it is too large Load Diff
+4 -16
View File
@@ -21,21 +21,9 @@ struct E_Parse
typedef struct E_ParseCtx E_ParseCtx;
struct E_ParseCtx
{
// rjf: instruction pointer info
U64 ip_vaddr;
U64 ip_voff;
E_Space ip_thread_space;
// rjf: modules
E_Module *modules;
U64 modules_count;
E_Module *primary_module;
// rjf: local identifier resolution maps
E_String2NumMap *regs_map;
E_String2NumMap *reg_alias_map;
E_String2NumMap *locals_map; // (within `rdis[rdis_primary_idx]`)
E_String2NumMap *member_map; // (within `rdis[rdis_primary_idx]`)
};
////////////////////////////////
@@ -60,7 +48,7 @@ thread_static E_ParseState *e_parse_state = 0;
////////////////////////////////
//~ rjf: Tokenization Functions
#define e_token_at_it(it, arr) (((it) < (arr)->v+(arr)->count) ? (*(it)) : e_token_zero())
#define e_token_at_it(it, arr) (((arr)->v <= (it) && (it) < (arr)->v+(arr)->count) ? (*(it)) : e_token_zero())
internal E_Token e_token_zero(void);
internal void e_token_chunk_list_push(Arena *arena, E_TokenChunkList *list, U64 chunk_size, E_Token *token);
internal E_TokenArray e_token_array_from_chunk_list(Arena *arena, E_TokenChunkList *list);
@@ -100,9 +88,9 @@ internal String8 e_string_from_expr(Arena *arena, E_Expr *expr);
internal E_TypeKey e_leaf_type_from_name(String8 name);
internal E_TypeKey e_type_from_expr(E_Expr *expr);
internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr);
internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence, U64 max_chain_count);
internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens);
internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count);
internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens);
internal E_Parse e_parse_expr_from_text(Arena *arena, String8 text);
#endif // EVAL_PARSE_H
-5
View File
@@ -137,11 +137,6 @@ struct E_MemberCacheSlot
typedef struct E_TypeCtx E_TypeCtx;
struct E_TypeCtx
{
// rjf: instruction pointer info
U64 ip_vaddr;
U64 ip_voff; // (within `primary_module`)
// rjf: debug info
E_Module *modules;
U64 modules_count;
E_Module *primary_module;
+2 -6
View File
@@ -134,7 +134,7 @@ U8 e_type_kind_basic_byte_size_table[56] =
0,
};
String8 e_expr_kind_strings[51] =
String8 e_expr_kind_strings[49] =
{
str8_lit_comp("Nil"),
str8_lit_comp("Ref"),
@@ -171,9 +171,7 @@ str8_lit_comp("LogOr"),
str8_lit_comp("Ternary"),
str8_lit_comp("Call"),
str8_lit_comp("LeafBytecode"),
str8_lit_comp("LeafMember"),
str8_lit_comp("LeafStringLiteral"),
str8_lit_comp("LeafBool"),
str8_lit_comp("LeafU64"),
str8_lit_comp("LeafF64"),
str8_lit_comp("LeafF32"),
@@ -189,7 +187,7 @@ str8_lit_comp("Define"),
str8_lit_comp("Tag"),
};
E_OpInfo e_expr_kind_op_info_table[51] =
E_OpInfo e_expr_kind_op_info_table[49] =
{
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
@@ -238,8 +236,6 @@ E_OpInfo e_expr_kind_op_info_table[51] =
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp("=>"), str8_lit_comp(","), str8_lit_comp("") },
};
+2 -4
View File
@@ -126,9 +126,7 @@ E_ExprKind_LogOr,
E_ExprKind_Ternary,
E_ExprKind_Call,
E_ExprKind_LeafBytecode,
E_ExprKind_LeafMember,
E_ExprKind_LeafStringLiteral,
E_ExprKind_LeafBool,
E_ExprKind_LeafU64,
E_ExprKind_LeafF64,
E_ExprKind_LeafF32,
@@ -165,8 +163,8 @@ C_LINKAGE_BEGIN
extern String8 e_token_kind_strings[6];
extern String8 e_type_kind_basic_string_table[56];
extern U8 e_type_kind_basic_byte_size_table[56];
extern String8 e_expr_kind_strings[51];
extern E_OpInfo e_expr_kind_op_info_table[51];
extern String8 e_expr_kind_strings[49];
extern E_OpInfo e_expr_kind_op_info_table[49];
extern String8 e_interpretation_code_display_strings[11];
C_LINKAGE_END
@@ -519,7 +519,7 @@ ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key
// rjf: push explicitly-attached tags (via key) next
String8 tag_expr = push_str8_copy(arena, ev_view_rule_from_key(view, key));
E_TokenArray tag_expr_tokens = e_token_array_from_text(scratch.arena, tag_expr);
E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, &tag_expr_tokens);
E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, tag_expr_tokens);
for(E_Expr *tag = tag_expr_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
{
next = tag->next;
+24
View File
@@ -586,6 +586,30 @@ rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)
return scope;
}
RDI_PROC RDI_UDT *
rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)
{
RDI_U64 idx = 0;
if(procedure->link_flags & RDI_LinkFlag_TypeScoped)
{
idx = procedure->container_idx;
}
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, idx);
return udt;
}
RDI_PROC RDI_Procedure *
rdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)
{
RDI_U64 idx = 0;
if(procedure->link_flags & RDI_LinkFlag_ProcScoped)
{
idx = procedure->container_idx;
}
RDI_Procedure *container_procedure = rdi_element_from_name_idx(rdi, Procedures, idx);
return container_procedure;
}
RDI_PROC RDI_U64
rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)
{
+2
View File
@@ -182,6 +182,8 @@ RDI_PROC RDI_Procedure *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, R
RDI_PROC RDI_Procedure *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr);
RDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out);
RDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);
RDI_PROC RDI_UDT *rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);
RDI_PROC RDI_Procedure *rdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);
RDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);
RDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);
RDI_PROC RDI_Procedure *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff);
+12 -14
View File
@@ -196,7 +196,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(locals)
E_LookupInfo result = {0};
Temp scratch = scratch_begin(&arena, 1);
{
E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_parse_state->ctx->locals_map);
E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_ir_state->ctx->locals_map);
e_string2num_map_node_array_sort__in_place(&nodes);
String8List exprs_filtered = {0};
for EachIndex(idx, nodes.count)
@@ -11873,7 +11873,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str
// rjf: try to map as local
if(!mapped && kind == TXT_TokenKind_Identifier)
{
U64 local_num = e_num_from_string(e_parse_state->ctx->locals_map, string);
U64 local_num = e_num_from_string(e_ir_state->ctx->locals_map, string);
if(local_num != 0)
{
mapped = 1;
@@ -11884,7 +11884,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str
// rjf: try to map as member
if(!mapped && kind == TXT_TokenKind_Identifier)
{
U64 member_num = e_num_from_string(e_parse_state->ctx->member_map, string);
U64 member_num = e_num_from_string(e_ir_state->ctx->member_map, string);
if(member_num != 0)
{
mapped = 1;
@@ -11895,7 +11895,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str
// rjf: try to map as register
if(!mapped)
{
U64 reg_num = e_num_from_string(e_parse_state->ctx->regs_map, string);
U64 reg_num = e_num_from_string(e_ir_state->ctx->regs_map, string);
if(reg_num != 0)
{
mapped = 1;
@@ -11906,7 +11906,7 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str
// rjf: try to map as register alias
if(!mapped)
{
U64 alias_num = e_num_from_string(e_parse_state->ctx->reg_alias_map, string);
U64 alias_num = e_num_from_string(e_ir_state->ctx->reg_alias_map, string);
if(alias_num != 0)
{
mapped = 1;
@@ -13479,8 +13479,6 @@ rd_frame(void)
ProfScope("build eval type context")
{
E_TypeCtx *ctx = type_ctx;
ctx->ip_vaddr = rip_vaddr;
ctx->ip_voff = rip_voff;
ctx->modules = eval_modules;
ctx->modules_count = eval_modules_count;
ctx->primary_module = eval_modules_primary;
@@ -13494,16 +13492,9 @@ rd_frame(void)
ProfScope("build eval parse context")
{
E_ParseCtx *ctx = parse_ctx;
ctx->ip_vaddr = rip_vaddr;
ctx->ip_voff = rip_voff;
ctx->ip_thread_space = rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_CtrlEntity);
ctx->modules = eval_modules;
ctx->modules_count = eval_modules_count;
ctx->primary_module = eval_modules_primary;
ctx->regs_map = ctrl_string2reg_from_arch(ctx->primary_module->arch);
ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->primary_module->arch);
ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff);
ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff);
}
e_select_parse_ctx(parse_ctx);
@@ -13514,6 +13505,13 @@ rd_frame(void)
if(e_ir_state != 0) { e_ir_state->ctx = 0; }
{
E_IRCtx *ctx = ir_ctx;
ctx->modules = eval_modules;
ctx->modules_count = eval_modules_count;
ctx->primary_module = eval_modules_primary;
ctx->regs_map = ctrl_string2reg_from_arch(ctx->primary_module->arch);
ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->primary_module->arch);
ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff);
ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff);
ctx->macro_map = push_array(scratch.arena, E_String2ExprMap, 1);
ctx->macro_map[0] = e_string2expr_map_make(scratch.arena, 512);
ctx->lookup_rule_map = push_array(scratch.arena, E_LookupRuleMap, 1);
+1 -1
View File
@@ -2501,7 +2501,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
ui_color_from_name(str8_lit("code_local")),
};
U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_regs()->unwind_count);
for(E_String2NumMapNode *n = e_parse_state->ctx->locals_map->first; n != 0; n = n->order_next)
for(E_String2NumMapNode *n = e_ir_state->ctx->locals_map->first; n != 0; n = n->order_next)
{
String8 local_name = n->string;
E_Eval local_eval = e_eval_from_string(scratch.arena, local_name);