deduplication from evaluation ctxs - just have base ctx with deduplicated info, then separate type-state, ir-ctx, and interpretation-ctx

This commit is contained in:
Ryan Fleury
2025-04-23 11:49:44 -07:00
parent 0ce85082ec
commit 264dbc8199
18 changed files with 546 additions and 697 deletions
+6 -35
View File
@@ -53,35 +53,6 @@ e_eval_from_stringf(Arena *arena, char *fmt, ...)
return eval;
}
internal E_Eval
e_autoresolved_eval_from_eval(E_Eval eval)
{
if(e_parse_state &&
e_interpret_ctx &&
e_parse_state->ctx->modules_count > 0 &&
e_interpret_ctx->module_base != 0 &&
(e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S64)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U64)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S32)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U32))))
{
U64 vaddr = eval.value.u64;
U64 voff = vaddr - e_interpret_ctx->module_base[0];
RDI_Parsed *rdi = e_parse_state->ctx->primary_module->rdi;
RDI_Scope *scope = rdi_scope_from_voff(rdi, voff);
RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);
RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);
U32 string_idx = 0;
if(string_idx == 0) { string_idx = procedure->name_string_idx; }
if(string_idx == 0) { string_idx = gvar->name_string_idx; }
if(string_idx != 0)
{
eval.irtree.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0);
}
}
return eval;
}
internal E_Eval
e_dynamically_typed_eval_from_eval(E_Eval eval)
{
@@ -117,18 +88,18 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) &&
e_space_read(eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size)))
{
Arch arch = e_type_state->ctx->primary_module->arch;
Arch arch = e_base_ctx->primary_module->arch;
U32 rdi_idx = 0;
RDI_Parsed *rdi = 0;
U64 module_base = 0;
for(U64 idx = 0; idx < e_type_state->ctx->modules_count; idx += 1)
for(U64 idx = 0; idx < e_base_ctx->modules_count; idx += 1)
{
if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vtable_vaddr))
if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vtable_vaddr))
{
arch = e_type_state->ctx->modules[idx].arch;
arch = e_base_ctx->modules[idx].arch;
rdi_idx = (U32)idx;
rdi = e_type_state->ctx->modules[idx].rdi;
module_base = e_type_state->ctx->modules[idx].vaddr_range.min;
rdi = e_base_ctx->modules[idx].rdi;
module_base = e_base_ctx->modules[idx].vaddr_range.min;
break;
}
}
-1
View File
@@ -30,7 +30,6 @@ read_only global E_Eval e_eval_nil = {zero_struct, zero_struct, &e_expr_nil, {&e
internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr);
internal E_Eval e_eval_from_string(Arena *arena, String8 string);
internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...);
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);
internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval);
internal E_Eval e_value_eval_from_eval(E_Eval eval);
internal E_Value e_value_from_string(String8 string);
+82
View File
@@ -22,6 +22,37 @@ e_hash_from_string(U64 seed, String8 string)
return result;
}
//- rjf: type key data structures
internal void
e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key)
{
E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1);
n->v = key;
SLLQueuePush(list->first, list->last, n);
list->count += 1;
}
internal void
e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key)
{
E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1);
n->v = key;
SLLQueuePushFront(list->first, list->last, n);
list->count += 1;
}
internal E_TypeKeyList
e_type_key_list_copy(Arena *arena, E_TypeKeyList *src)
{
E_TypeKeyList dst = {0};
for(E_TypeKeyNode *n = src->first; n != 0; n = n->next)
{
e_type_key_list_push(arena, &dst, n->v);
}
return dst;
}
////////////////////////////////
//~ rjf: Message Functions
@@ -270,6 +301,45 @@ e_string2expr_lookup(E_String2ExprMap *map, String8 string)
return expr;
}
//- rjf: string -> type-key
internal E_String2TypeKeyMap
e_string2typekey_map_make(Arena *arena, U64 slots_count)
{
E_String2TypeKeyMap map = {0};
map.slots_count = slots_count;
map.slots = push_array(arena, E_String2TypeKeySlot, map.slots_count);
return map;
}
internal void
e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key)
{
E_String2TypeKeyNode *n = push_array(arena, E_String2TypeKeyNode, 1);
U64 hash = e_hash_from_string(5381, string);
U64 slot_idx = hash%map->slots_count;
SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n);
n->string = push_str8_copy(arena, string);
n->key = key;
}
internal E_TypeKey
e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string)
{
E_TypeKey key = zero_struct;
U64 hash = e_hash_from_string(5381, string);
U64 slot_idx = hash%map->slots_count;
for(E_String2TypeKeyNode *n = map->slots[slot_idx].first; n != 0; n = n->next)
{
if(str8_match(n->string, string, 0))
{
key = n->key;
break;
}
}
return key;
}
////////////////////////////////
//~ rjf: Debug-Info-Driven Map Building Functions
@@ -392,3 +462,15 @@ e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff)
return map;
}
////////////////////////////////
//~ rjf: Base Evaluation Context Selection
internal void
e_select_base_ctx(E_BaseCtx *ctx)
{
if(ctx->modules == 0) { ctx->modules = &e_module_nil; }
if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; }
e_base_ctx = ctx;
e_base_ctx_gen += 1;
}
+92 -1
View File
@@ -55,6 +55,34 @@ union E_Value
F32 f32;
};
////////////////////////////////
//~ rjf: Bytecode Operation Types
enum
{
E_IRExtKind_Bytecode = RDI_EvalOp_COUNT,
E_IRExtKind_SetSpace,
E_IRExtKind_COUNT
};
typedef struct E_Op E_Op;
struct E_Op
{
E_Op *next;
RDI_EvalOp opcode;
E_Value value;
String8 string;
};
typedef struct E_OpList E_OpList;
struct E_OpList
{
E_Op *first;
E_Op *last;
U64 op_count;
U64 encoded_size;
};
////////////////////////////////
//~ rjf: Operator Info
@@ -504,6 +532,31 @@ struct E_String2ExprMap
E_String2ExprMapSlot *slots;
};
////////////////////////////////
//~ rjf: String -> Type Key Map Data Structure
typedef struct E_String2TypeKeyNode E_String2TypeKeyNode;
struct E_String2TypeKeyNode
{
E_String2TypeKeyNode *next;
String8 string;
E_TypeKey key;
};
typedef struct E_String2TypeKeySlot E_String2TypeKeySlot;
struct E_String2TypeKeySlot
{
E_String2TypeKeyNode *first;
E_String2TypeKeyNode *last;
};
typedef struct E_String2TypeKeyMap E_String2TypeKeyMap;
struct E_String2TypeKeyMap
{
U64 slots_count;
E_String2TypeKeySlot *slots;
};
////////////////////////////////
//~ rjf: Type Pattern -> Hook Key Data Structure (Auto View Rules)
@@ -542,10 +595,31 @@ struct E_AutoHookParams
};
////////////////////////////////
//~ rjf: Contextual & Implicit Evaluation Parameters
//~ rjf: Evaluation Context
typedef B32 E_SpaceRWFunction(void *user_data, E_Space space, void *out, Rng1U64 offset_range);
typedef struct E_BaseCtx E_BaseCtx;
struct E_BaseCtx
{
// rjf: instruction pointer info
U64 thread_ip_vaddr;
U64 thread_ip_voff;
E_Space thread_reg_space;
Arch thread_arch;
U64 thread_unwind_count;
// rjf: modules
E_Module *modules;
U64 modules_count;
E_Module *primary_module;
// rjf: space hooks
void *space_rw_user_data;
E_SpaceRWFunction *space_read;
E_SpaceRWFunction *space_write;
};
////////////////////////////////
//~ rjf: Generated Code
@@ -555,6 +629,8 @@ typedef B32 E_SpaceRWFunction(void *user_data, E_Space space, void *out, Rng1U64
//~ rjf: Globals
global read_only E_Module e_module_nil = {&rdi_parsed_nil};
thread_static E_BaseCtx *e_base_ctx = 0;
thread_static U64 e_base_ctx_gen = 0;
////////////////////////////////
//~ rjf: Basic Helper Functions
@@ -562,6 +638,11 @@ global read_only E_Module e_module_nil = {&rdi_parsed_nil};
internal U64 e_hash_from_string(U64 seed, String8 string);
#define e_value_u64(v) (E_Value){.u64 = (v)}
//- rjf: type key data structures
internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
internal void e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src);
////////////////////////////////
//~ rjf: Message Functions
@@ -592,10 +673,20 @@ internal void e_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string
internal void e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string);
internal E_Expr *e_string2expr_lookup(E_String2ExprMap *map, String8 string);
//- rjf: string -> type-key
internal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count);
internal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key);
internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string);
////////////////////////////////
//~ rjf: Debug-Info-Driven Map Building Functions
internal E_String2NumMap *e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff);
internal E_String2NumMap *e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff);
////////////////////////////////
//~ rjf: Base Evaluation Context Selection
internal void e_select_base_ctx(E_BaseCtx *ctx);
#endif // EVAL_CORE_H
+22 -24
View File
@@ -69,15 +69,13 @@ 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->modules == 0) { ctx->modules = &e_module_nil; }
if(ctx->primary_module == 0) { ctx->primary_module = &e_module_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 = push_array(e_ir_state->arena, E_String2ExprMap, 1); ctx->macro_map[0] = e_string2expr_map_make(e_ir_state->arena, 512); }
e_ir_state->ctx = ctx;
e_ir_state->thread_ip_procedure = rdi_procedure_from_voff(ctx->primary_module->rdi, ctx->thread_ip_voff);
e_ir_state->thread_ip_procedure = rdi_procedure_from_voff(e_base_ctx->primary_module->rdi, e_base_ctx->thread_ip_voff);
e_ir_state->used_expr_map = push_array(e_ir_state->arena, E_UsedExprMap, 1);
e_ir_state->used_expr_map->slots_count = 64;
e_ir_state->used_expr_map->slots = push_array(e_ir_state->arena, E_UsedExprSlot, e_ir_state->used_expr_map->slots_count);
@@ -1057,7 +1055,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
// rjf: generate
result.root = r_tree.root;
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 1, 0);
result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, r_type_unwrapped, 1, 0);
result.mode = E_Mode_Value;
}break;
@@ -1448,7 +1446,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
E_TypeKey ptr_type = ptr_tree->type_key;
if(ptr_is_decay)
{
ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 1, 0);
ptr_type = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type, 1, 0);
}
E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root);
result.root = new_root;
@@ -1765,7 +1763,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
//- rjf: form namespaceified fallback versions of this lookup string
String8List namespaceified_strings = {0};
{
E_Module *module = e_ir_state->ctx->primary_module;
E_Module *module = e_base_ctx->primary_module;
RDI_Parsed *rdi = module->rdi;
RDI_Procedure *procedure = e_ir_state->thread_ip_procedure;
U64 name_size = 0;
@@ -1819,8 +1817,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
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);
E_Module *module = e_base_ctx->primary_module;
U32 module_idx = (U32)(module - e_base_ctx->modules);
RDI_Parsed *rdi = module->rdi;
RDI_Procedure *procedure = e_ir_state->thread_ip_procedure;
RDI_UDT *udt = rdi_container_udt_from_procedure(rdi, procedure);
@@ -1837,8 +1835,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
//- rjf: try locals
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("local"), 0)))
{
E_Module *module = e_ir_state->ctx->primary_module;
U32 module_idx = (U32)(module - e_ir_state->ctx->modules);
E_Module *module = e_base_ctx->primary_module;
U32 module_idx = (U32)(module - e_base_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)
@@ -1850,7 +1848,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
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
U64 ip_voff = e_ir_state->ctx->thread_ip_voff;
U64 ip_voff = e_base_ctx->thread_ip_voff;
for(U32 loc_block_idx = local->location_first;
loc_block_idx < local->location_opl;
loc_block_idx += 1)
@@ -1960,9 +1958,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
//- rjf: try globals
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("global"), 0)))
{
for(U64 module_idx = 0; module_idx < e_ir_state->ctx->modules_count; module_idx += 1)
for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1)
{
E_Module *module = &e_ir_state->ctx->modules[module_idx];
E_Module *module = &e_base_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};
@@ -1999,9 +1997,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
//- rjf: try thread-locals
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("thread_local"), 0)))
{
for(U64 module_idx = 0; module_idx < e_ir_state->ctx->modules_count; module_idx += 1)
for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1)
{
E_Module *module = &e_ir_state->ctx->modules[module_idx];
E_Module *module = &e_base_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};
@@ -2038,9 +2036,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
//- rjf: try procedures
if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("procedure"), 0)))
{
for(U64 module_idx = 0; module_idx < e_ir_state->ctx->modules_count; module_idx += 1)
for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1)
{
E_Module *module = &e_ir_state->ctx->modules[module_idx];
E_Module *module = &e_base_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};
@@ -2093,13 +2091,13 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
if(reg_num != 0)
{
string_mapped = 1;
REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_parse_state->ctx->primary_module->arch)[reg_num];
REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_base_ctx->primary_module->arch)[reg_num];
E_OpList oplist = {0};
e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off);
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
mapped_bytecode_mode = E_Mode_Offset;
mapped_bytecode_space = e_ir_state->ctx->thread_reg_space;
mapped_type_key = e_type_key_reg(e_parse_state->ctx->primary_module->arch, reg_num);
mapped_bytecode_space = e_base_ctx->thread_reg_space;
mapped_type_key = e_type_key_reg(e_base_ctx->primary_module->arch, reg_num);
}
}
@@ -2110,14 +2108,14 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
if(alias_num != 0)
{
string_mapped = 1;
REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_ir_state->ctx->primary_module->arch)[alias_num];
REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_ir_state->ctx->primary_module->arch)[alias_slice.code];
REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_base_ctx->primary_module->arch)[alias_num];
REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_base_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);
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
mapped_bytecode_mode = E_Mode_Offset;
mapped_bytecode_space = e_ir_state->ctx->thread_reg_space;
mapped_type_key = e_type_key_reg_alias(e_parse_state->ctx->primary_module->arch, alias_num);
mapped_bytecode_space = e_base_ctx->thread_reg_space;
mapped_type_key = e_type_key_reg_alias(e_base_ctx->primary_module->arch, alias_num);
}
}
-41
View File
@@ -4,34 +4,6 @@
#ifndef EVAL_IR_H
#define EVAL_IR_H
////////////////////////////////
//~ rjf: Bytecode Operation Types
enum
{
E_IRExtKind_Bytecode = RDI_EvalOp_COUNT,
E_IRExtKind_SetSpace,
E_IRExtKind_COUNT
};
typedef struct E_Op E_Op;
struct E_Op
{
E_Op *next;
RDI_EvalOp opcode;
E_Value value;
String8 string;
};
typedef struct E_OpList E_OpList;
struct E_OpList
{
E_Op *first;
E_Op *last;
U64 op_count;
U64 encoded_size;
};
////////////////////////////////
//~ rjf: Used Tag Map Data Structure
@@ -116,24 +88,11 @@ struct E_StringIDMap
typedef struct E_IRCtx E_IRCtx;
struct E_IRCtx
{
// rjf: instruction pointer info
U64 thread_ip_vaddr;
U64 thread_ip_voff;
E_Space thread_reg_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_AutoHookMap *auto_hook_map;
};
+4 -44
View File
@@ -295,46 +295,6 @@ e_token_array_make_first_opl(E_Token *first, E_Token *opl)
return array;
}
////////////////////////////////
//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)
internal E_ParseCtx *
e_selected_parse_ctx(void)
{
return e_parse_state->ctx;
}
internal void
e_select_parse_ctx(E_ParseCtx *ctx)
{
if(e_parse_state == 0)
{
Arena *arena = arena_alloc();
e_parse_state = push_array(arena, E_ParseState, 1);
e_parse_state->arena = arena;
e_parse_state->arena_eval_start_pos = arena_pos(arena);
}
arena_pop_to(e_parse_state->arena, e_parse_state->arena_eval_start_pos);
if(ctx->modules == 0) { ctx->modules = &e_module_nil; }
if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; }
e_parse_state->ctx = ctx;
}
internal U32
e_parse_ctx_module_idx_from_rdi(RDI_Parsed *rdi)
{
U32 result = 0;
for(U64 idx = 0; idx < e_parse_state->ctx->modules_count; idx += 1)
{
if(e_parse_state->ctx->modules[idx].rdi == rdi)
{
result = (U32)idx;
break;
}
}
return result;
}
////////////////////////////////
//~ rjf: Expression Tree Building Functions
@@ -688,9 +648,9 @@ e_leaf_type_from_name(String8 name)
}
if(!found)
{
for(U64 module_idx = 0; module_idx < e_parse_state->ctx->modules_count; module_idx += 1)
for(U64 module_idx = 0; module_idx < e_base_ctx->modules_count; module_idx += 1)
{
RDI_Parsed *rdi = e_parse_state->ctx->modules[module_idx].rdi;
RDI_Parsed *rdi = e_base_ctx->modules[module_idx].rdi;
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);
@@ -728,7 +688,7 @@ e_type_from_expr(E_Expr *expr)
case E_ExprKind_Ptr:
{
E_TypeKey direct_type_key = e_type_from_expr(expr->first);
result = e_type_key_cons_ptr(e_parse_state->ctx->primary_module->arch, direct_type_key, 1, 0);
result = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type_key, 1, 0);
}break;
case E_ExprKind_Array:
{
@@ -1090,7 +1050,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray tok
else
{
E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
type->type_key = e_type_key_cons_ptr(e_parse_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0);
type->type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0);
E_Expr *casted = atom;
E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str);
e_expr_push_child(cast, type);
+1 -20
View File
@@ -17,25 +17,13 @@ struct E_Parse
};
////////////////////////////////
//~ rjf: Parse Context
typedef struct E_ParseCtx E_ParseCtx;
struct E_ParseCtx
{
E_Module *modules;
U64 modules_count;
E_Module *primary_module;
};
////////////////////////////////
//~ rjf: Parse State (stateful thread-local caching mechanisms, not provided by user)
//~ rjf: Parse Evaluation State
typedef struct E_ParseState E_ParseState;
struct E_ParseState
{
Arena *arena;
U64 arena_eval_start_pos;
E_ParseCtx *ctx;
};
////////////////////////////////
@@ -56,13 +44,6 @@ internal E_TokenArray e_token_array_from_chunk_list(Arena *arena, E_TokenChunkLi
internal E_TokenArray e_token_array_from_text(Arena *arena, String8 text);
internal E_TokenArray e_token_array_make_first_opl(E_Token *first, E_Token *opl);
////////////////////////////////
//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)
internal E_ParseCtx *e_selected_parse_ctx(void);
internal void e_select_parse_ctx(E_ParseCtx *ctx);
internal U32 e_parse_ctx_module_idx_from_rdi(RDI_Parsed *rdi);
////////////////////////////////
//~ rjf: Expression Tree Building Functions
+20 -91
View File
@@ -223,10 +223,10 @@ e_member_array_from_list(Arena *arena, E_MemberList *list)
}
////////////////////////////////
//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)
//~ rjf: Type Evaluation Phase Beginning Marker (Required For All Subsequent APIs)
internal void
e_select_type_ctx(E_TypeCtx *ctx)
e_type_eval_begin(void)
{
if(e_type_state == 0)
{
@@ -235,10 +235,7 @@ e_select_type_ctx(E_TypeCtx *ctx)
e_type_state->arena = arena;
e_type_state->arena_eval_start_pos = arena_pos(e_type_state->arena);
}
if(ctx->modules == 0) { ctx->modules = &e_module_nil; }
if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; }
arena_pop_to(e_type_state->arena, e_type_state->arena_eval_start_pos);
e_type_state->ctx = ctx;
e_type_state->cons_id_gen = 0;
e_type_state->cons_content_slots_count = 256;
e_type_state->cons_key_slots_count = 256;
@@ -665,7 +662,7 @@ e_type_byte_size_from_key(E_TypeKey key)
{
U64 type_node_idx = key.u32[1];
U32 rdi_idx = key.u32[2];
RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi;
RDI_Parsed *rdi = e_base_ctx->modules[rdi_idx].rdi;
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
result = rdi_type->byte_size;
}break;
@@ -777,7 +774,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_type_state->ctx->modules[rdi_idx].rdi;
RDI_Parsed *rdi = e_base_ctx->modules[rdi_idx].rdi;
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
if(rdi_type->kind != RDI_TypeKind_NULL)
{
@@ -824,7 +821,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->name = push_str8_copy(arena, name);
type->byte_size = (U64)rdi_type->byte_size;
type->count = members_count;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
type->members = members;
}
@@ -869,7 +866,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->name = push_str8_copy(arena, name);
type->byte_size = (U64)rdi_type->byte_size;
type->count = enum_vals_count;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
type->enum_vals = enum_vals;
type->direct_type_key = direct_type_key;
}
@@ -909,7 +906,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->direct_type_key = direct_type_key;
type->byte_size = direct_type_byte_size;
type->flags = flags;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
}break;
case RDI_TypeKind_Ptr:
case RDI_TypeKind_LRef:
@@ -918,9 +915,9 @@ 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_type_state->ctx->modules[rdi_idx].arch)/8;
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8;
type->count = 1;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
}break;
case RDI_TypeKind_Array:
@@ -930,7 +927,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->direct_type_key = direct_type_key;
type->count = rdi_type->constructed.count;
type->byte_size = direct_type_byte_size * type->count;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
}break;
case RDI_TypeKind_Function:
{
@@ -942,11 +939,11 @@ 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_type_state->ctx->modules[rdi_idx].arch)/8;
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].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);
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
for(U32 idx = 0; idx < type->count; idx += 1)
{
U32 param_type_idx = idx_run[idx];
@@ -976,11 +973,11 @@ 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_type_state->ctx->modules[rdi_idx].arch)/8;
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].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);
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
for(U32 idx = 0; idx < type->count; idx += 1)
{
U32 param_type_idx = idx_run[idx];
@@ -1015,10 +1012,10 @@ 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_type_state->ctx->modules[rdi_idx].arch)/8;
type->byte_size = bit_size_from_arch(e_base_ctx->modules[rdi_idx].arch)/8;
type->owner_type_key = owner_type_key;
type->direct_type_key = direct_type_key;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
}break;
}
}
@@ -1047,7 +1044,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->name = push_str8_copy(arena, name);
type->byte_size = direct_type_byte_size;
type->direct_type_key = direct_type_key;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
}
//- rjf: bitfields
@@ -1071,7 +1068,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->direct_type_key = direct_type_key;
type->off = (U32)rdi_type->bitfield.off;
type->count = (U64)rdi_type->bitfield.size;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
}
//- rjf: incomplete types
@@ -1085,7 +1082,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type = push_array(arena, E_Type, 1);
type->kind = kind;
type->name = push_str8_copy(arena, name);
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->arch = e_base_ctx->modules[rdi_idx].arch;
}
}
@@ -1990,74 +1987,6 @@ e_default_expansion_type_from_key(E_TypeKey root_key)
return type_key;
}
//- rjf: type key data structures
internal void
e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key)
{
E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1);
n->v = key;
SLLQueuePush(list->first, list->last, n);
list->count += 1;
}
internal void
e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key)
{
E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1);
n->v = key;
SLLQueuePushFront(list->first, list->last, n);
list->count += 1;
}
internal E_TypeKeyList
e_type_key_list_copy(Arena *arena, E_TypeKeyList *src)
{
E_TypeKeyList dst = {0};
for(E_TypeKeyNode *n = src->first; n != 0; n = n->next)
{
e_type_key_list_push(arena, &dst, n->v);
}
return dst;
}
internal E_String2TypeKeyMap
e_string2typekey_map_make(Arena *arena, U64 slots_count)
{
E_String2TypeKeyMap map = {0};
map.slots_count = slots_count;
map.slots = push_array(arena, E_String2TypeKeySlot, map.slots_count);
return map;
}
internal void
e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key)
{
E_String2TypeKeyNode *n = push_array(arena, E_String2TypeKeyNode, 1);
U64 hash = e_hash_from_string(5381, string);
U64 slot_idx = hash%map->slots_count;
SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n);
n->string = push_str8_copy(arena, string);
n->key = key;
}
internal E_TypeKey
e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string)
{
E_TypeKey key = zero_struct;
U64 hash = e_hash_from_string(5381, string);
U64 slot_idx = hash%map->slots_count;
for(E_String2TypeKeyNode *n = map->slots[slot_idx].first; n != 0; n = n->next)
{
if(str8_match(n->string, string, 0))
{
key = n->key;
break;
}
}
return key;
}
////////////////////////////////
//~ rjf: Cache Lookups
@@ -2546,7 +2475,7 @@ E_TYPE_IREXT_FUNCTION_DEF(slice)
}
// rjf: determine architecture
Arch arch = e_type_state->ctx->primary_module->arch;
Arch arch = e_base_ctx->primary_module->arch;
if(base_ptr_member != 0)
{
E_Type *type = e_type_from_key__cached(base_ptr_member->type_key);
+4 -50
View File
@@ -4,31 +4,6 @@
#ifndef EVAL_TYPES_H
#define EVAL_TYPES_H
////////////////////////////////
//~ rjf: String -> Type Key Map Data Structure
typedef struct E_String2TypeKeyNode E_String2TypeKeyNode;
struct E_String2TypeKeyNode
{
E_String2TypeKeyNode *next;
String8 string;
E_TypeKey key;
};
typedef struct E_String2TypeKeySlot E_String2TypeKeySlot;
struct E_String2TypeKeySlot
{
E_String2TypeKeyNode *first;
E_String2TypeKeyNode *last;
};
typedef struct E_String2TypeKeyMap E_String2TypeKeyMap;
struct E_String2TypeKeyMap
{
U64 slots_count;
E_String2TypeKeySlot *slots;
};
////////////////////////////////
//~ rjf: Type Unwrapping
@@ -46,7 +21,7 @@ enum
};
////////////////////////////////
//~ rjf: Evaluation Context
//~ rjf: Type Evaluation State
//- rjf: constructed type cache types
@@ -152,17 +127,7 @@ struct E_MemberCacheSlot
E_MemberCacheNode *last;
};
//- rjf: context parameterization
typedef struct E_TypeCtx E_TypeCtx;
struct E_TypeCtx
{
E_Module *modules;
U64 modules_count;
E_Module *primary_module;
};
//- rjf: stateful machine part of context (not provided by user)
//- rjf: bundle
typedef struct E_TypeState E_TypeState;
struct E_TypeState
@@ -170,9 +135,6 @@ struct E_TypeState
Arena *arena;
U64 arena_eval_start_pos;
// rjf: evaluation context
E_TypeCtx *ctx;
// rjf: JIT-constructed types tables
U64 cons_id_gen;
U64 cons_content_slots_count;
@@ -231,9 +193,9 @@ internal void e_member_list_push(Arena *arena, E_MemberList *list, E_Member *mem
internal E_MemberArray e_member_array_from_list(Arena *arena, E_MemberList *list);
////////////////////////////////
//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)
//~ rjf: Type Evaluation Phase Beginning Marker (Required For All Subsequent APIs)
internal void e_select_type_ctx(E_TypeCtx *ctx);
internal void e_type_eval_begin(void);
////////////////////////////////
//~ rjf: Type Operation Functions
@@ -288,14 +250,6 @@ internal void e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8Lis
internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key);
internal E_TypeKey e_default_expansion_type_from_key(E_TypeKey key);
//- rjf: type key data structures
internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
internal void e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src);
internal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count);
internal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key);
internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string);
////////////////////////////////
//~ rjf: Cache Lookups