mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 15:42:23 -07:00
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:
+40
-29
@@ -4704,14 +4704,18 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread)
|
||||
CTRL_EvalScope *scope = push_array(arena, CTRL_EvalScope, 1);
|
||||
scope->di_scope = di_scope_open();
|
||||
|
||||
// rjf: unpack thread
|
||||
//////////////////////////////
|
||||
//- rjf: unpack thread
|
||||
//
|
||||
Arch arch = thread->arch;
|
||||
U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle);
|
||||
CTRL_Entity *process = ctrl_process_from_entity(thread);
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr);
|
||||
U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr);
|
||||
|
||||
// rjf: gather evaluation modules
|
||||
//////////////////////////////
|
||||
//- rjf: gather evaluation modules
|
||||
//
|
||||
U64 eval_modules_count = Max(1, ctrl_state->ctrl_thread_entity_store->entity_kind_counts[CTRL_EntityKind_Module]);
|
||||
E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count);
|
||||
E_Module *eval_modules_primary = &eval_modules[0];
|
||||
@@ -4751,35 +4755,40 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread)
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: build eval type context
|
||||
//////////////////////////////
|
||||
//- rjf: build base evaluation context
|
||||
//
|
||||
{
|
||||
E_TypeCtx *ctx = &scope->type_ctx;
|
||||
ctx->modules = eval_modules;
|
||||
ctx->modules_count = eval_modules_count;
|
||||
ctx->primary_module = eval_modules_primary;
|
||||
}
|
||||
e_select_type_ctx(&scope->type_ctx);
|
||||
|
||||
// rjf: build eval parse context
|
||||
ProfScope("build eval parse context")
|
||||
{
|
||||
E_ParseCtx *ctx = &scope->parse_ctx;
|
||||
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->thread_ip_vaddr = thread_rip_vaddr;
|
||||
ctx->thread_ip_voff = thread_rip_voff;
|
||||
E_BaseCtx *ctx = &scope->base_ctx;
|
||||
|
||||
//- rjf: fill instruction pointer info
|
||||
ctx->thread_ip_vaddr = thread_rip_vaddr;
|
||||
ctx->thread_ip_voff = thread_rip_voff;
|
||||
ctx->thread_arch = thread->arch;
|
||||
ctx->thread_reg_space = e_space_make(CTRL_EvalSpaceKind_Entity);
|
||||
ctx->thread_reg_space.u64_0 = (U64)thread;
|
||||
ctx->modules = eval_modules;
|
||||
ctx->modules_count = eval_modules_count;
|
||||
ctx->primary_module = eval_modules_primary;
|
||||
|
||||
//- rjf: fill modules
|
||||
ctx->modules = eval_modules;
|
||||
ctx->modules_count = eval_modules_count;
|
||||
ctx->primary_module = eval_modules_primary;
|
||||
|
||||
//- rjf: fill space hooks
|
||||
ctx->space_rw_user_data = ctrl_state->ctrl_thread_entity_store;
|
||||
ctx->space_read = ctrl_eval_space_read;
|
||||
}
|
||||
e_select_base_ctx(&scope->base_ctx);
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: begin type evaluation
|
||||
//
|
||||
e_type_eval_begin();
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: build IR evaluation context
|
||||
//
|
||||
{
|
||||
E_IRCtx *ctx = &scope->ir_ctx;
|
||||
ctx->regs_map = ctrl_string2reg_from_arch(arch);
|
||||
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);
|
||||
@@ -4791,7 +4800,9 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_Entity *thread)
|
||||
}
|
||||
e_select_ir_ctx(&scope->ir_ctx);
|
||||
|
||||
// rjf: build eval interpretation context
|
||||
//////////////////////////////
|
||||
//- rjf: build eval interpretation context
|
||||
//
|
||||
{
|
||||
E_InterpretCtx *ctx = &scope->interpret_ctx;
|
||||
ctx->space_rw_user_data = ctrl_state->ctrl_thread_entity_store;
|
||||
|
||||
@@ -658,8 +658,7 @@ typedef struct CTRL_EvalScope CTRL_EvalScope;
|
||||
struct CTRL_EvalScope
|
||||
{
|
||||
DI_Scope *di_scope;
|
||||
E_TypeCtx type_ctx;
|
||||
E_ParseCtx parse_ctx;
|
||||
E_BaseCtx base_ctx;
|
||||
E_IRCtx ir_ctx;
|
||||
E_InterpretCtx interpret_ctx;
|
||||
};
|
||||
|
||||
@@ -613,135 +613,6 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread)
|
||||
////////////////////////////////
|
||||
//~ rjf: Debug Info Lookups
|
||||
|
||||
//- rjf: symbol lookups
|
||||
|
||||
internal String8
|
||||
d_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, U64 depth, B32 decorated)
|
||||
{
|
||||
String8 result = {0};
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
DI_Scope *scope = di_scope_open();
|
||||
RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0);
|
||||
|
||||
//- rjf: try scopes
|
||||
if(result.size == 0)
|
||||
{
|
||||
// rjf: voff -> scope
|
||||
U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff);
|
||||
|
||||
// rjf: scope -> # of max possible inline depth
|
||||
U64 inline_site_count = 0;
|
||||
for(U64 s_idx = scope_idx, s_idx_next = 0; s_idx != 0; s_idx = s_idx_next)
|
||||
{
|
||||
RDI_Scope *s = rdi_element_from_name_idx(rdi, Scopes, s_idx);
|
||||
s_idx_next = s->parent_scope_idx;
|
||||
if(s->inline_site_idx != 0)
|
||||
{
|
||||
inline_site_count += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: depth in [1, max]? -> form name from inline site
|
||||
if(0 < depth && depth <= inline_site_count)
|
||||
{
|
||||
RDI_InlineSite *inline_site = 0;
|
||||
U64 s_inline_depth = inline_site_count;
|
||||
for(U64 s_idx = scope_idx, s_idx_next = 0; s_idx != 0; s_idx = s_idx_next)
|
||||
{
|
||||
RDI_Scope *s = rdi_element_from_name_idx(rdi, Scopes, s_idx);
|
||||
s_idx_next = s->parent_scope_idx;
|
||||
if(s_inline_depth == depth)
|
||||
{
|
||||
inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx);
|
||||
break;
|
||||
}
|
||||
s_inline_depth -= 1;
|
||||
if(s_inline_depth == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(inline_site != 0)
|
||||
{
|
||||
E_TypeKey type = e_type_key_ext(E_TypeKind_Function, inline_site->type_idx, e_parse_ctx_module_idx_from_rdi(rdi));
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size);
|
||||
if(decorated && inline_site->type_idx != 0)
|
||||
{
|
||||
String8List list = {0};
|
||||
str8_list_pushf(scratch.arena, &list, "[inlined] ");
|
||||
e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0);
|
||||
str8_list_push(scratch.arena, &list, name);
|
||||
e_type_rhs_string_from_key(scratch.arena, type, &list, 0);
|
||||
result = str8_list_join(arena, &list, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = push_str8_copy(arena, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: depth == 0 or depth >= max? -> form name from scope procedure
|
||||
else
|
||||
{
|
||||
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);
|
||||
E_TypeKey type = e_type_key_ext(E_TypeKind_Function, procedure->type_idx, e_parse_ctx_module_idx_from_rdi(rdi));
|
||||
String8 name = {0};
|
||||
name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size);
|
||||
if(decorated && procedure->type_idx != 0)
|
||||
{
|
||||
String8List list = {0};
|
||||
e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0);
|
||||
str8_list_push(scratch.arena, &list, name);
|
||||
e_type_rhs_string_from_key(scratch.arena, type, &list, 0);
|
||||
result = str8_list_join(arena, &list, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = push_str8_copy(arena, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: try global variables
|
||||
if(result.size == 0)
|
||||
{
|
||||
U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff);
|
||||
RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx);
|
||||
U64 name_size = 0;
|
||||
U8 *name_ptr = rdi_string_from_idx(rdi, global_var->name_string_idx, &name_size);
|
||||
result = push_str8_copy(arena, str8(name_ptr, name_size));
|
||||
}
|
||||
|
||||
di_scope_close(scope);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal String8
|
||||
d_symbol_name_from_process_vaddr(Arena *arena, CTRL_Entity *process, U64 vaddr, U64 depth, B32 decorated)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
String8 result = {0};
|
||||
{
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);
|
||||
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
|
||||
U64 voff = ctrl_voff_from_vaddr(module, vaddr);
|
||||
result = d_symbol_name_from_dbgi_key_voff(arena, &dbgi_key, voff, depth, decorated);
|
||||
}
|
||||
ProfEnd();
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: symbol -> voff lookups
|
||||
|
||||
internal U64
|
||||
|
||||
@@ -395,10 +395,6 @@ internal CTRL_TrapList d_trap_net_from_thread__step_into_line(Arena *arena, CTRL
|
||||
////////////////////////////////
|
||||
//~ rjf: Debug Info Lookups
|
||||
|
||||
//- rjf: voff|vaddr -> symbol lookups
|
||||
internal String8 d_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, U64 depth, B32 decorated);
|
||||
internal String8 d_symbol_name_from_process_vaddr(Arena *arena, CTRL_Entity *process, U64 vaddr, U64 depth, B32 decorated);
|
||||
|
||||
//- rjf: symbol -> voff lookups
|
||||
internal U64 d_voff_from_dbgi_key_symbol_name(DI_Key *dbgi_key, String8 symbol_name);
|
||||
internal U64 d_type_num_from_dbgi_key_name(DI_Key *dbgi_key, String8 name);
|
||||
|
||||
+6
-35
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -469,18 +469,18 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr)
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1867,11 +1867,11 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
||||
U64 vaddr = ptr_data->value_eval.value.u64;
|
||||
E_Module *module = &e_module_nil;
|
||||
U32 module_idx = 0;
|
||||
for EachIndex(idx, e_type_state->ctx->modules_count)
|
||||
for EachIndex(idx, e_base_ctx->modules_count)
|
||||
{
|
||||
if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vaddr))
|
||||
if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vaddr))
|
||||
{
|
||||
module = &e_type_state->ctx->modules[idx];
|
||||
module = &e_base_ctx->modules[idx];
|
||||
module_idx = (U32)idx;
|
||||
break;
|
||||
}
|
||||
|
||||
+237
-211
@@ -2998,8 +2998,31 @@ rd_view_ui(Rng2F32 rect)
|
||||
{
|
||||
default:
|
||||
{
|
||||
String8 symbol_name = d_symbol_name_from_process_vaddr(scratch.arena, ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), eval.value.u64, 0, 0);
|
||||
rd_cmd(RD_CmdKind_CompleteQuery, .string = symbol_name);
|
||||
U64 vaddr = eval.value.u64;
|
||||
CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process);
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);
|
||||
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
|
||||
U64 voff = ctrl_voff_from_vaddr(module, vaddr);
|
||||
{
|
||||
DI_Scope *scope = di_scope_open();
|
||||
RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0);
|
||||
String8 name = {0};
|
||||
if(name.size == 0)
|
||||
{
|
||||
RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);
|
||||
name.str = rdi_name_from_procedure(rdi, procedure, &name.size);
|
||||
}
|
||||
if(name.size == 0)
|
||||
{
|
||||
RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);
|
||||
name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size);
|
||||
}
|
||||
if(name.size != 0)
|
||||
{
|
||||
rd_cmd(RD_CmdKind_CompleteQuery, .string = name);
|
||||
}
|
||||
di_scope_close(scope);
|
||||
}
|
||||
}break;
|
||||
case E_SpaceKind_File:
|
||||
case E_SpaceKind_FileSystem:
|
||||
@@ -3050,10 +3073,32 @@ rd_view_ui(Rng2F32 rect)
|
||||
{
|
||||
default:
|
||||
{
|
||||
String8 symbol_name = d_symbol_name_from_process_vaddr(scratch.arena, ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), eval.value.u64, 0, 0);
|
||||
if(symbol_name.size != 0)
|
||||
String8 name = {0};
|
||||
{
|
||||
rd_cmd(RD_CmdKind_GoToName, .string = symbol_name);
|
||||
U64 vaddr = eval.value.u64;
|
||||
CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process);
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);
|
||||
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
|
||||
U64 voff = ctrl_voff_from_vaddr(module, vaddr);
|
||||
{
|
||||
DI_Scope *scope = di_scope_open();
|
||||
RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0);
|
||||
if(name.size == 0)
|
||||
{
|
||||
RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);
|
||||
name.str = rdi_name_from_procedure(rdi, procedure, &name.size);
|
||||
}
|
||||
if(name.size == 0)
|
||||
{
|
||||
RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);
|
||||
name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size);
|
||||
}
|
||||
di_scope_close(scope);
|
||||
}
|
||||
}
|
||||
if(name.size != 0)
|
||||
{
|
||||
rd_cmd(RD_CmdKind_GoToName, .string = name);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -10214,30 +10259,6 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
// rjf: try to map as symbol
|
||||
if(!mapped && kind == TXT_TokenKind_Identifier)
|
||||
{
|
||||
U64 voff = d_voff_from_dbgi_key_symbol_name(&dbgi_key, string);
|
||||
if(voff != 0)
|
||||
{
|
||||
mapped = 1;
|
||||
color = RD_ThemeColor_CodeSymbol;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: try to map as type
|
||||
if(!mapped && kind == TXT_TokenKind_Identifier)
|
||||
{
|
||||
U64 type_num = d_type_num_from_dbgi_key_name(&dbgi_key, string);
|
||||
if(type_num != 0)
|
||||
{
|
||||
mapped = 1;
|
||||
color = RD_ThemeColor_CodeType;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return color;
|
||||
}
|
||||
@@ -11769,57 +11790,70 @@ rd_frame(void)
|
||||
}
|
||||
ProfEnd();
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval type context
|
||||
//
|
||||
E_TypeCtx *type_ctx = push_array(scratch.arena, E_TypeCtx, 1);
|
||||
ProfScope("build eval type context")
|
||||
{
|
||||
E_TypeCtx *ctx = type_ctx;
|
||||
ctx->modules = eval_modules;
|
||||
ctx->modules_count = eval_modules_count;
|
||||
ctx->primary_module = eval_modules_primary;
|
||||
}
|
||||
e_select_type_ctx(type_ctx);
|
||||
//~
|
||||
//~ NOTE(rjf): NEW VVVVV
|
||||
//~
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval parse context
|
||||
//- rjf: build base evaluation context
|
||||
//
|
||||
E_ParseCtx *parse_ctx = push_array(scratch.arena, E_ParseCtx, 1);
|
||||
ProfScope("build eval parse context")
|
||||
E_BaseCtx *eval_base_ctx = push_array(scratch.arena, E_BaseCtx, 1);
|
||||
{
|
||||
E_ParseCtx *ctx = parse_ctx;
|
||||
ctx->modules = eval_modules;
|
||||
ctx->modules_count = eval_modules_count;
|
||||
ctx->primary_module = eval_modules_primary;
|
||||
}
|
||||
e_select_parse_ctx(parse_ctx);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval IR context
|
||||
//
|
||||
E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1);
|
||||
if(e_ir_state != 0) { e_ir_state->ctx = 0; }
|
||||
{
|
||||
E_IRCtx *ctx = ir_ctx;
|
||||
ctx->thread_ip_voff = rip_voff;
|
||||
ctx->thread_ip_vaddr = rip_vaddr;
|
||||
ctx->thread_reg_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);
|
||||
ctx->macro_map = push_array(scratch.arena, E_String2ExprMap, 1);
|
||||
ctx->macro_map[0] = e_string2expr_map_make(scratch.arena, 512);
|
||||
ctx->auto_hook_map = push_array(scratch.arena, E_AutoHookMap, 1);
|
||||
ctx->auto_hook_map[0] = e_auto_hook_map_make(scratch.arena, 512);
|
||||
E_BaseCtx *ctx = eval_base_ctx;
|
||||
|
||||
//- rjf: cache meta name -> type key correllation
|
||||
rd_state->meta_name2type_map = push_array(rd_frame_arena(), E_String2TypeKeyMap, 1);
|
||||
rd_state->meta_name2type_map[0] = e_string2typekey_map_make(rd_frame_arena(), 256);
|
||||
//- rjf: fill instruction pointer info
|
||||
ctx->thread_ip_vaddr = rip_vaddr;
|
||||
ctx->thread_ip_voff = rip_voff;
|
||||
ctx->thread_reg_space = rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_CtrlEntity);
|
||||
ctx->thread_arch = thread->arch;
|
||||
ctx->thread_unwind_count = unwind_count;
|
||||
|
||||
//- rjf: fill modules
|
||||
ctx->modules = eval_modules;
|
||||
ctx->modules_count = eval_modules_count;
|
||||
ctx->primary_module = eval_modules_primary;
|
||||
|
||||
//- rjf: fill space hooks
|
||||
ctx->space_read = rd_eval_space_read;
|
||||
ctx->space_write = rd_eval_space_write;
|
||||
}
|
||||
e_select_base_ctx(eval_base_ctx);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: begin type evaluation
|
||||
//
|
||||
e_type_eval_begin();
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build extra types & maps
|
||||
//
|
||||
E_String2ExprMap *macro_map = push_array(scratch.arena, E_String2ExprMap, 1);
|
||||
macro_map[0] = e_string2expr_map_make(scratch.arena, 512);
|
||||
E_AutoHookMap *auto_hook_map = push_array(scratch.arena, E_AutoHookMap, 1);
|
||||
auto_hook_map[0] = e_auto_hook_map_make(scratch.arena, 512);
|
||||
rd_state->meta_name2type_map = push_array(rd_frame_arena(), E_String2TypeKeyMap, 1);
|
||||
rd_state->meta_name2type_map[0] = e_string2typekey_map_make(rd_frame_arena(), 256);
|
||||
EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1);
|
||||
rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512);
|
||||
{
|
||||
//- rjf: add macro for commands
|
||||
{
|
||||
String8 name = str8_lit("commands");
|
||||
E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set,
|
||||
.name = name,
|
||||
.access = E_TYPE_ACCESS_FUNCTION_NAME(commands),
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(commands),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(commands),
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, name, expr);
|
||||
}
|
||||
|
||||
//- rjf: build schema types & cache (name -> type) mapping
|
||||
for EachElement(idx, rd_name_schema_info_table)
|
||||
{
|
||||
String8 name = rd_name_schema_info_table[idx].name;
|
||||
@@ -11861,18 +11895,72 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x", cfg->id), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, "$%I64x", cfg->id), expr);
|
||||
if(exe.size != 0)
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_skip_last_slash(exe), expr);
|
||||
}
|
||||
if(label.size != 0)
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, label, expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, label, expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: add macro for watches group
|
||||
{
|
||||
String8 collection_name = str8_lit("watches");
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, .flags = E_TypeFlag_EditableChildren,
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(watches),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(watches),
|
||||
.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches),
|
||||
.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches),
|
||||
});
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);
|
||||
}
|
||||
|
||||
//- rjf: add macros for all watches which define identifiers
|
||||
RD_CfgList watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch"));
|
||||
for(RD_CfgNode *n = watches.first; n != 0; n = n->next)
|
||||
{
|
||||
RD_Cfg *watch = n->v;
|
||||
String8 expr = rd_expr_from_cfg(watch);
|
||||
E_Parse parse = e_parse_expr_from_text(scratch.arena, expr);
|
||||
if(parse.msgs.max_kind == E_MsgKind_Null)
|
||||
{
|
||||
for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next)
|
||||
{
|
||||
e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, macro_map, expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: add macros for all config collections
|
||||
for EachElement(cfg_name_idx, evallable_cfg_names)
|
||||
{
|
||||
String8 cfg_name = evallable_cfg_names[cfg_name_idx];
|
||||
String8 collection_name = rd_plural_from_code_name(cfg_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name,
|
||||
.irext = E_TYPE_IREXT_FUNCTION_NAME(cfgs),
|
||||
.access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs),
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs),
|
||||
.range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs),
|
||||
.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs),
|
||||
.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs),
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);
|
||||
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);
|
||||
}
|
||||
|
||||
//- rjf: add macros for windows/tabs
|
||||
{
|
||||
RD_CfgList windows = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("window"));
|
||||
@@ -11886,7 +11974,7 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x", window->id), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, "$%I64x", window->id), expr);
|
||||
}
|
||||
RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window);
|
||||
for(RD_PanelNode *p = panel_tree.root;
|
||||
@@ -11902,12 +11990,13 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x", tab->id), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, "$%I64x", tab->id), expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//- rjf: add macros for user/project
|
||||
{
|
||||
E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit("user"));
|
||||
@@ -11916,7 +12005,7 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("user_settings"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("user_settings"), expr);
|
||||
}
|
||||
{
|
||||
E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit("project"));
|
||||
@@ -11925,7 +12014,7 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("project_settings"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("project_settings"), expr);
|
||||
}
|
||||
|
||||
//- rjf: add macros for evallable control entities
|
||||
@@ -11950,51 +12039,72 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, ctrl_string_from_handle(scratch.arena, entity->handle), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, ctrl_string_from_handle(scratch.arena, entity->handle), expr);
|
||||
if(entity->string.size != 0)
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, entity->string, expr);
|
||||
}
|
||||
if(kind == CTRL_EntityKind_Machine && entity->handle.machine_id == CTRL_MachineID_Local)
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("local_machine"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("local_machine"), expr);
|
||||
}
|
||||
if(kind == CTRL_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle))
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_thread"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_thread"), expr);
|
||||
}
|
||||
if(kind == CTRL_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle))
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_process"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_process"), expr);
|
||||
}
|
||||
if(kind == CTRL_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle))
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_module"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_module"), expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: add macros for all ctrl entity collections
|
||||
for EachElement(ctrl_name_idx, evallable_ctrl_names)
|
||||
{
|
||||
String8 kind_name = evallable_ctrl_names[ctrl_name_idx];
|
||||
String8 collection_name = rd_plural_from_code_name(kind_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set,
|
||||
.name = collection_name,
|
||||
.access = E_TYPE_ACCESS_FUNCTION_NAME(ctrl_entities),
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(ctrl_entities),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(ctrl_entities)
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);
|
||||
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);
|
||||
}
|
||||
|
||||
//- rjf: add macro / lookup rules for unattached processes
|
||||
{
|
||||
String8 collection_name = str8_lit("unattached_processes");
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name,
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(unattached_processes),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(unattached_processes)
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);
|
||||
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);
|
||||
}
|
||||
|
||||
//- rjf: add macro for 'call_stack' -> 'query:current_thread.callstack'
|
||||
{
|
||||
E_Expr *expr = e_parse_expr_from_text(scratch.arena, str8_lit("query:current_thread.call_stack")).expr;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("call_stack"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("call_stack"), expr);
|
||||
}
|
||||
|
||||
//- rjf: add macro for watches group
|
||||
{
|
||||
String8 collection_name = str8_lit("watches");
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, .flags = E_TypeFlag_EditableChildren,
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(watches),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(watches),
|
||||
.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches),
|
||||
.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches),
|
||||
});
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
|
||||
}
|
||||
|
||||
//- rjf: add types for queries
|
||||
{
|
||||
@@ -12050,7 +12160,7 @@ rd_frame(void)
|
||||
.range = collection_infos[idx].range,
|
||||
});
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12076,82 +12186,7 @@ rd_frame(void)
|
||||
.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(debug_info_table),
|
||||
.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(debug_info_table)
|
||||
});
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr);
|
||||
}
|
||||
|
||||
//- rjf: add macros for all config collections
|
||||
for EachElement(cfg_name_idx, evallable_cfg_names)
|
||||
{
|
||||
String8 cfg_name = evallable_cfg_names[cfg_name_idx];
|
||||
String8 collection_name = rd_plural_from_code_name(cfg_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name,
|
||||
.irext = E_TYPE_IREXT_FUNCTION_NAME(cfgs),
|
||||
.access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs),
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs),
|
||||
.range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs),
|
||||
.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs),
|
||||
.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs),
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
|
||||
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);
|
||||
}
|
||||
|
||||
//- rjf: add macros for all ctrl entity collections
|
||||
for EachElement(ctrl_name_idx, evallable_ctrl_names)
|
||||
{
|
||||
String8 kind_name = evallable_ctrl_names[ctrl_name_idx];
|
||||
String8 collection_name = rd_plural_from_code_name(kind_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set,
|
||||
.name = collection_name,
|
||||
.access = E_TYPE_ACCESS_FUNCTION_NAME(ctrl_entities),
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(ctrl_entities),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(ctrl_entities)
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
|
||||
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);
|
||||
}
|
||||
|
||||
//- rjf: add macro / lookup rules for unattached processes
|
||||
{
|
||||
String8 collection_name = str8_lit("unattached_processes");
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name,
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(unattached_processes),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(unattached_processes)
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
|
||||
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);
|
||||
}
|
||||
|
||||
//- rjf: add macro for commands
|
||||
{
|
||||
String8 name = str8_lit("commands");
|
||||
E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set,
|
||||
.name = name,
|
||||
.access = E_TYPE_ACCESS_FUNCTION_NAME(commands),
|
||||
.expand =
|
||||
{
|
||||
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(commands),
|
||||
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(commands),
|
||||
});
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, name, expr);
|
||||
}
|
||||
|
||||
//- rjf: add macro for output log
|
||||
@@ -12166,7 +12201,7 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("output"), expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("output"), expr);
|
||||
hs_scope_close(hs_scope);
|
||||
}
|
||||
|
||||
@@ -12197,28 +12232,12 @@ rd_frame(void)
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, table[idx].name, expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, table[idx].name, expr);
|
||||
hs_scope_close(hs_scope);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: add macros for all watches which define identifiers
|
||||
RD_CfgList watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch"));
|
||||
for(RD_CfgNode *n = watches.first; n != 0; n = n->next)
|
||||
{
|
||||
RD_Cfg *watch = n->v;
|
||||
String8 expr = rd_expr_from_cfg(watch);
|
||||
E_Parse parse = e_parse_expr_from_text(scratch.arena, expr);
|
||||
if(parse.msgs.max_kind == E_MsgKind_Null)
|
||||
{
|
||||
for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next)
|
||||
{
|
||||
e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: gather auto-view-rules from loaded modules
|
||||
RD_CfgList immediate_auto_view_rules = {0};
|
||||
CTRL_EntityArray modules = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module);
|
||||
@@ -12260,17 +12279,11 @@ rd_frame(void)
|
||||
RD_Cfg *rule = n->v;
|
||||
String8 type_string = rd_cfg_child_from_string(rule, str8_lit("type"))->first->string;
|
||||
String8 view_rule_string = rd_cfg_child_from_string(rule, str8_lit("view_rule"))->first->string;
|
||||
e_auto_hook_map_insert_new(scratch.arena, ctx->auto_hook_map, .type_pattern = type_string, .tag_expr_string = view_rule_string);
|
||||
e_auto_hook_map_insert_new(scratch.arena, auto_hook_map, .type_pattern = type_string, .tag_expr_string = view_rule_string);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
e_select_ir_ctx(ir_ctx);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: generate macros for all lenses
|
||||
//
|
||||
{
|
||||
|
||||
//- rjf: choose set of lenses
|
||||
// TODO(rjf): generate via metaprogram
|
||||
struct
|
||||
@@ -12312,9 +12325,6 @@ rd_frame(void)
|
||||
};
|
||||
|
||||
//- rjf: fill lenses in ev expand rule map, rd view ui rule map
|
||||
EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1);
|
||||
ev_select_expand_rule_table(expand_rule_table);
|
||||
rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512);
|
||||
{
|
||||
for EachElement(idx, lens_table)
|
||||
{
|
||||
@@ -12352,9 +12362,25 @@ rd_frame(void)
|
||||
.irext = lens_table[idx].irext,
|
||||
.access = lens_table[idx].access,
|
||||
.expand = lens_table[idx].expand);
|
||||
e_string2expr_map_insert(scratch.arena, e_ir_state->ctx->macro_map, lens_table[idx].name, expr);
|
||||
e_string2expr_map_insert(scratch.arena, macro_map, lens_table[idx].name, expr);
|
||||
}
|
||||
}
|
||||
ev_select_expand_rule_table(expand_rule_table);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build IR evaluation context
|
||||
//
|
||||
E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1);
|
||||
{
|
||||
E_IRCtx *ctx = ir_ctx;
|
||||
ctx->regs_map = ctrl_string2reg_from_arch(eval_base_ctx->primary_module->arch);
|
||||
ctx->reg_alias_map = ctrl_string2alias_from_arch(eval_base_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 = macro_map;
|
||||
ctx->auto_hook_map = auto_hook_map;
|
||||
}
|
||||
e_select_ir_ctx(ir_ctx);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval interpretation context
|
||||
|
||||
@@ -1333,7 +1333,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
|
||||
|
||||
// rjf: unpack row info
|
||||
RDI_Parsed *rdi = accel->rdis[item->dbgi_idx];
|
||||
E_Module *module = &e_parse_state->ctx->modules[item->dbgi_idx];
|
||||
E_Module *module = &e_base_ctx->modules[item->dbgi_idx];
|
||||
|
||||
// rjf: build expr
|
||||
E_Expr *item_expr = &e_expr_nil;
|
||||
@@ -1353,7 +1353,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = procedure->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules));
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules));
|
||||
String8 symbol_name = {0};
|
||||
symbol_name.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &symbol_name.size);
|
||||
String8List strings = {0};
|
||||
@@ -1377,7 +1377,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = gvar->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules));
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Offset;
|
||||
item_expr->space = module->space;
|
||||
@@ -1393,7 +1393,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = tvar->type_idx;
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_state->ctx->modules));
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_base_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0);
|
||||
item_expr->mode = E_Mode_Offset;
|
||||
item_expr->space = module->space;
|
||||
@@ -1405,7 +1405,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)
|
||||
{
|
||||
RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx);
|
||||
RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx);
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_state->ctx->modules));
|
||||
E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_base_ctx->modules));
|
||||
item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0);
|
||||
item_expr->type_key = type_key;
|
||||
}break;
|
||||
|
||||
@@ -2588,7 +2588,29 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, f_rip);
|
||||
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
|
||||
U64 rip_voff = ctrl_voff_from_vaddr(module, f_rip);
|
||||
String8 symbol_name = d_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0, 1);
|
||||
String8 symbol_name = {0};
|
||||
{
|
||||
U64 vaddr = eval.value.u64;
|
||||
CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process);
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);
|
||||
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
|
||||
U64 voff = ctrl_voff_from_vaddr(module, vaddr);
|
||||
{
|
||||
DI_Scope *scope = di_scope_open();
|
||||
RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0);
|
||||
if(symbol_name.size == 0)
|
||||
{
|
||||
RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);
|
||||
symbol_name.str = rdi_name_from_procedure(rdi, procedure, &symbol_name.size);
|
||||
}
|
||||
if(symbol_name.size == 0)
|
||||
{
|
||||
RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);
|
||||
symbol_name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &symbol_name.size);
|
||||
}
|
||||
di_scope_close(scope);
|
||||
}
|
||||
}
|
||||
Annotation *annotation = push_array(scratch.arena, Annotation, 1);
|
||||
annotation->name_string = symbol_name.size != 0 ? symbol_name : str8_lit("[external code]");
|
||||
annotation->kind_string = str8_lit("Call Stack Frame");
|
||||
|
||||
Reference in New Issue
Block a user