mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
base class -> derived class autocast in eval system; completion of first pass
This commit is contained in:
@@ -43,9 +43,9 @@ if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=add
|
||||
:: --- Compile/Link Line Definitions ------------------------------------------
|
||||
set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /MP
|
||||
set clang_common= -I..\src\ -I..\local\ -maes -mssse3 -msse4 -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf
|
||||
set cl_debug= call cl /Od /D_DEBUG %cl_common%
|
||||
set cl_debug= call cl /Od %cl_common%
|
||||
set cl_release= call cl /O2 /DNDEBUG %cl_common%
|
||||
set clang_debug= call clang -g -O0 -D_DEBUG %clang_common%
|
||||
set clang_debug= call clang -g -O0 %clang_common%
|
||||
set clang_release= call clang -g -O3 -DNDEBUG %clang_common%
|
||||
set cl_link= /link /INCREMENTAL:NO /natvis:"%~dp0\src\natvis\base.natvis"
|
||||
set clang_link= -Xlinker /natvis:"%~dp0\src\natvis\base.natvis"
|
||||
@@ -90,8 +90,9 @@ if "%raddbg_from_pdb%"=="1" %compile% ..\src\raddbg_convert\pdb\r
|
||||
if "%raddbg_from_dwarf%"=="1" %compile% ..\src\raddbg_convert\dwarf\raddbg_from_dwarf.c %compile_link% %out%raddbg_from_dwarf.exe
|
||||
if "%raddbg_dump%"=="1" %compile% ..\src\raddbg_dump\raddbg_dump.c %compile_link% %out%raddbg_dump.exe
|
||||
if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe
|
||||
if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe
|
||||
if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe
|
||||
if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %cl_release% /c ..\src\mule\mule_inline.cpp && %cl_release% /c ..\src\mule\mule_o2.cpp && %cl_debug% /EHsc ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj
|
||||
if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %cl_release% /MT /c ..\src\mule\mule_inline.cpp && %cl_release% /MT /c ..\src\mule\mule_o2.cpp && %cl_debug% /MT /EHsc ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj
|
||||
if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll
|
||||
if "%mule_hotload%"=="1" %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll
|
||||
popd
|
||||
|
||||
+79
-134
@@ -3632,7 +3632,6 @@ df_set_thread_rip(DF_Entity *thread, U64 vaddr)
|
||||
df_state->unwind_cache_invalidated = 1;
|
||||
df_state->locals_cache_invalidated = 1;
|
||||
df_state->member_cache_invalidated = 1;
|
||||
df_state->local_dynamic_type_override_cache_invalidated = 1;
|
||||
}
|
||||
|
||||
// rjf: early mutation of unwind cache for immediate frontend effect
|
||||
@@ -3898,7 +3897,6 @@ df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_Entity *module, U64 vof
|
||||
EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch);
|
||||
EVAL_String2NumMap *locals_map = df_query_cached_locals_map_from_binary_voff(binary, voff);
|
||||
EVAL_String2NumMap *member_map = df_query_cached_member_map_from_binary_voff(binary, voff);
|
||||
EVAL_String2NumMap *local_dynamic_type_override_map = df_query_cached_local_dynamic_type_override_map_from_module_voff(module, voff);
|
||||
|
||||
//- rjf: build ctx
|
||||
EVAL_ParseCtx ctx = zero_struct;
|
||||
@@ -3911,7 +3909,6 @@ df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_Entity *module, U64 vof
|
||||
ctx.reg_alias_map = reg_alias_map;
|
||||
ctx.locals_map = locals_map;
|
||||
ctx.member_map = member_map;
|
||||
ctx.local_dynamic_type_override_map = local_dynamic_type_override_map;
|
||||
}
|
||||
scratch_end(scratch);
|
||||
return ctx;
|
||||
@@ -4024,7 +4021,6 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt)
|
||||
ctx.reg_alias_map = &eval_string2num_map_nil;
|
||||
ctx.locals_map = &eval_string2num_map_nil;
|
||||
ctx.member_map = &eval_string2num_map_nil;
|
||||
ctx.local_dynamic_type_override_map = &eval_string2num_map_nil;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
@@ -4059,6 +4055,19 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: unpack module info & produce eval machine
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr);
|
||||
U64 module_base = df_base_vaddr_from_module(module);
|
||||
U64 tls_base = df_tls_base_vaddr_from_thread(thread);
|
||||
EVAL_Machine machine = {0};
|
||||
machine.u = (void *)thread->parent;
|
||||
machine.arch = arch;
|
||||
machine.memory_read = df_eval_memory_read;
|
||||
machine.reg_data = thread_unwind_regs_block;
|
||||
machine.reg_size = reg_size;
|
||||
machine.module_base = &module_base;
|
||||
machine.tls_base = &tls_base;
|
||||
|
||||
//- rjf: lex & parse
|
||||
EVAL_TokenArray tokens = eval_token_array_from_text(arena, string);
|
||||
EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(arena, parse_ctx, string, &tokens);
|
||||
@@ -4066,32 +4075,6 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
|
||||
B32 parse_has_expr = (parse.expr != &eval_expr_nil);
|
||||
B32 parse_is_type = (parse_has_expr && parse.expr->kind == EVAL_ExprKind_TypeIdent);
|
||||
|
||||
//- rjf: apply dynamic type overrides to expression tree - insert implicit cast
|
||||
// nodes as necessary
|
||||
#if 0
|
||||
if(errors.count != 0)
|
||||
{
|
||||
typedef struct Task Task;
|
||||
struct Task
|
||||
{
|
||||
Task *next;
|
||||
EVAL_Expr *expr;
|
||||
};
|
||||
Task start_task = {0, parse.expr};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = &start_task;
|
||||
for(Task *t = first_task; t != 0; t = t->next)
|
||||
{
|
||||
if(t->expr->kind == EVAL_ExprKind_LeafBytecode &&
|
||||
t->expr->mode == EVAL_EvalMode_Addr)
|
||||
{
|
||||
String8 bytecode = t->expr->kind;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: produce IR tree & type
|
||||
EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil};
|
||||
if(parse_has_expr && errors.count == 0)
|
||||
@@ -4113,23 +4096,10 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
|
||||
bytecode = eval_bytecode_from_oplist(arena, &op_list);
|
||||
}
|
||||
|
||||
//- rjf: grab thread/module
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr);
|
||||
|
||||
//- rjf: evaluate
|
||||
EVAL_Result eval = {0};
|
||||
if(bytecode.size != 0)
|
||||
{
|
||||
U64 module_base = df_base_vaddr_from_module(module);
|
||||
U64 tls_base = df_tls_base_vaddr_from_thread(thread);
|
||||
EVAL_Machine machine = {0};
|
||||
machine.u = (void *)thread->parent;
|
||||
machine.arch = arch;
|
||||
machine.memory_read = df_eval_memory_read;
|
||||
machine.reg_data = thread_unwind_regs_block;
|
||||
machine.reg_size = reg_size;
|
||||
machine.module_base = &module_base;
|
||||
machine.tls_base = &tls_base;
|
||||
eval = eval_interpret(&machine, bytecode);
|
||||
}
|
||||
|
||||
@@ -4160,6 +4130,12 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
|
||||
result.errors = errors;
|
||||
}
|
||||
|
||||
//- rjf: apply dynamic type overrides
|
||||
if(parse.expr != 0 && parse.expr->kind != EVAL_ExprKind_Cast)
|
||||
{
|
||||
result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, result);
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
ProfEnd();
|
||||
return result;
|
||||
@@ -4235,42 +4211,65 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c
|
||||
}
|
||||
|
||||
internal DF_Eval
|
||||
df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg)
|
||||
df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
|
||||
#if 0
|
||||
//- rjf: pointer-to-struct -> read result & find "derived class" for "real"
|
||||
// type of evaluation
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread);
|
||||
Architecture arch = df_architecture_from_entity(thread);
|
||||
DF_Entity *process = thread->parent;
|
||||
U64 unwind_count = ctrl_ctx->unwind_count;
|
||||
U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count);
|
||||
DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr);
|
||||
TG_Key type_key = eval.type_key;
|
||||
TG_Kind type_kind = tg_kind_from_key(type_key);
|
||||
if(type_kind == TG_Kind_Ptr)
|
||||
{
|
||||
TG_Kind kind = tg_kind_from_key(eval.type_key);
|
||||
if(kind == TG_Kind_Ptr)
|
||||
TG_Key ptee_type_key = tg_direct_from_graph_raddbg_key(graph, rdbg, type_key);
|
||||
TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key);
|
||||
if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class)
|
||||
{
|
||||
TG_Key direct_key = tg_direct_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key);
|
||||
TG_Kind direct_kind = tg_kind_from_key(direct_key);
|
||||
if((direct_kind == TG_Kind_Struct || direct_kind == TG_Kind_Class) && parse_ctx->rdbg->global_vmap != 0)
|
||||
TG_Type *ptee_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, ptee_type_key);
|
||||
B32 has_vtable = 0;
|
||||
for(U64 idx = 0; idx < ptee_type->count; idx += 1)
|
||||
{
|
||||
DF_Eval ptr_addr_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval);
|
||||
U64 vaddr = ptr_addr_eval.imm_u64;
|
||||
String8 ptr_val_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(vaddr, vaddr+bit_size_from_arch(parse_ctx->arch)/8));
|
||||
if(ptr_val_memory.size >= bit_size_from_arch(parse_ctx->arch)/8)
|
||||
if(ptee_type->members[idx].kind == TG_MemberKind_VirtualMethod)
|
||||
{
|
||||
U64 vtable_ptr_maybe = 0;
|
||||
MemoryCopy(&vtable_ptr_maybe, ptr_val_memory.str, bit_size_from_arch(parse_ctx->arch)/8);
|
||||
U64 voff = df_voff_from_vaddr(module, vtable_ptr_maybe);
|
||||
U64 global_idx = raddbg_vmap_idx_from_voff(parse_ctx->rdbg->global_vmap, parse_ctx->rdbg->global_vmap_count, voff);
|
||||
if(0 < global_idx && global_idx < parse_ctx->rdbg->global_variable_count)
|
||||
has_vtable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(has_vtable)
|
||||
{
|
||||
U64 ptr_vaddr = eval.offset;
|
||||
U64 addr_size = bit_size_from_arch(arch)/8;
|
||||
String8 ptr_value_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(ptr_vaddr, ptr_vaddr+addr_size));
|
||||
if(ptr_value_memory.size >= addr_size)
|
||||
{
|
||||
U64 class_base_vaddr = 0;
|
||||
MemoryCopy(&class_base_vaddr, ptr_value_memory.str, addr_size);
|
||||
String8 vtable_base_ptr_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(class_base_vaddr, class_base_vaddr+addr_size));
|
||||
if(vtable_base_ptr_memory.size >= addr_size)
|
||||
{
|
||||
RADDBG_GlobalVariable *global_var = &parse_ctx->rdbg->global_variables[global_idx];
|
||||
if(global_var->link_flags & RADDBG_LinkFlag_TypeScoped &&
|
||||
0 < global_var->container_idx && global_var->container_idx < parse_ctx->rdbg->udt_count)
|
||||
U64 vtable_vaddr = 0;
|
||||
MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size);
|
||||
U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr);
|
||||
U64 global_idx = raddbg_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff);
|
||||
if(0 < global_idx && global_idx < rdbg->global_variable_count)
|
||||
{
|
||||
RADDBG_UDT *udt = &parse_ctx->rdbg->udts[global_var->container_idx];
|
||||
if(0 < udt->self_type_idx && udt->self_type_idx < parse_ctx->rdbg->type_node_count)
|
||||
RADDBG_GlobalVariable *global_var = &rdbg->global_variables[global_idx];
|
||||
if(global_var->link_flags & RADDBG_LinkFlag_TypeScoped &&
|
||||
0 < global_var->container_idx && global_var->container_idx < rdbg->udt_count)
|
||||
{
|
||||
RADDBG_TypeNode *type = &parse_ctx->rdbg->type_nodes[udt->self_type_idx];
|
||||
TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type->kind), (U64)udt->self_type_idx);
|
||||
eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, derived_type_key, 0);
|
||||
RADDBG_UDT *udt = &rdbg->udts[global_var->container_idx];
|
||||
if(0 < udt->self_type_idx && udt->self_type_idx < rdbg->type_node_count)
|
||||
{
|
||||
RADDBG_TypeNode *type = &rdbg->type_nodes[udt->self_type_idx];
|
||||
TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type->kind), (U64)udt->self_type_idx);
|
||||
TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0);
|
||||
eval.type_key = ptr_to_derived_type_key;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4278,7 +4277,14 @@ df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ct
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
scratch_end(scratch);
|
||||
return eval;
|
||||
}
|
||||
|
||||
internal DF_Eval
|
||||
df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
|
||||
//- rjf: apply view rules
|
||||
for(DF_CfgVal *val = cfg->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next)
|
||||
@@ -4958,6 +4964,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
|
||||
//////////////////////////////
|
||||
//- rjf: apply view rules & resolve eval
|
||||
//
|
||||
eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval);
|
||||
eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, eval, cfg_table);
|
||||
|
||||
//////////////////////////////
|
||||
@@ -6091,56 +6098,6 @@ df_query_cached_member_map_from_binary_voff(DF_Entity *binary, U64 voff)
|
||||
return map;
|
||||
}
|
||||
|
||||
internal EVAL_String2NumMap *
|
||||
df_query_cached_local_dynamic_type_override_map_from_module_voff(DF_Entity *module, U64 voff)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
EVAL_String2NumMap *map = &eval_string2num_map_nil;
|
||||
{
|
||||
DF_RunLocalsCache *cache = &df_state->local_dynamic_type_override_cache;
|
||||
if(cache->table_size == 0)
|
||||
{
|
||||
cache->table_size = 256;
|
||||
cache->table = push_array(cache->arena, DF_RunLocalsCacheSlot, cache->table_size);
|
||||
}
|
||||
DF_Handle handle = df_handle_from_entity(module);
|
||||
U64 hash = df_hash_from_string(str8_struct(&handle));
|
||||
U64 slot_idx = hash % cache->table_size;
|
||||
DF_RunLocalsCacheSlot *slot = &cache->table[slot_idx];
|
||||
DF_RunLocalsCacheNode *node = 0;
|
||||
for(DF_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next)
|
||||
{
|
||||
if(df_handle_match(n->binary, handle) && n->voff == voff)
|
||||
{
|
||||
node = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(node == 0)
|
||||
{
|
||||
DBGI_Scope *scope = dbgi_scope_open();
|
||||
#if 0
|
||||
EVAL_String2NumMap *map = df_push_member_map_from_binary_voff(cache->arena, scope, binary, voff);
|
||||
if(map->slots_count != 0)
|
||||
{
|
||||
node = push_array(cache->arena, DF_RunLocalsCacheNode, 1);
|
||||
node->binary = handle;
|
||||
node->voff = voff;
|
||||
node->locals_map = map;
|
||||
SLLQueuePush_N(slot->first, slot->last, node, hash_next);
|
||||
}
|
||||
#endif
|
||||
dbgi_scope_close(scope);
|
||||
}
|
||||
if(node != 0)
|
||||
{
|
||||
map = node->locals_map;
|
||||
}
|
||||
}
|
||||
ProfEnd();
|
||||
return map;
|
||||
}
|
||||
|
||||
//- rjf: top-level command dispatch
|
||||
|
||||
internal void
|
||||
@@ -6205,7 +6162,6 @@ df_core_init(String8 user_path, String8 profile_path, DF_StateDeltaHistory *hist
|
||||
df_state->unwind_cache.arena = arena_alloc();
|
||||
df_state->locals_cache.arena = arena_alloc();
|
||||
df_state->member_cache.arena = arena_alloc();
|
||||
df_state->local_dynamic_type_override_cache.arena = arena_alloc();
|
||||
|
||||
// rjf: set up eval view cache
|
||||
df_state->eval_view_cache.slots_count = 4096;
|
||||
@@ -6609,7 +6565,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
df_state->unwind_cache_invalidated = 1;
|
||||
df_state->locals_cache_invalidated = 1;
|
||||
df_state->member_cache_invalidated = 1;
|
||||
df_state->local_dynamic_type_override_cache_invalidated = 1;
|
||||
}
|
||||
|
||||
//- rjf: refresh unwind cache
|
||||
@@ -6661,16 +6616,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
cache->table = 0;
|
||||
}
|
||||
|
||||
//- rjf: clear local -> dynamic type override cache
|
||||
if(df_state->local_dynamic_type_override_cache_invalidated && !df_ctrl_targets_running())
|
||||
{
|
||||
df_state->local_dynamic_type_override_cache_invalidated = 0;
|
||||
DF_RunLocalsCache *cache = &df_state->local_dynamic_type_override_cache;
|
||||
arena_clear(cache->arena);
|
||||
cache->table_size = 0;
|
||||
cache->table = 0;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
|
||||
@@ -1135,8 +1135,6 @@ struct DF_State
|
||||
DF_RunLocalsCache locals_cache;
|
||||
B32 member_cache_invalidated;
|
||||
DF_RunLocalsCache member_cache;
|
||||
B32 local_dynamic_type_override_cache_invalidated;
|
||||
DF_RunLocalsCache local_dynamic_type_override_cache;
|
||||
|
||||
// rjf: eval view cache
|
||||
DF_EvalViewCache eval_view_cache;
|
||||
@@ -1565,6 +1563,7 @@ internal EVAL_ParseCtx df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_
|
||||
internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt);
|
||||
internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, String8 string);
|
||||
internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
|
||||
internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
|
||||
internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg);
|
||||
|
||||
////////////////////////////////
|
||||
@@ -1657,7 +1656,6 @@ internal U64 df_query_cached_rip_from_thread(DF_Entity *thread);
|
||||
internal U64 df_query_cached_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count);
|
||||
internal EVAL_String2NumMap *df_query_cached_locals_map_from_binary_voff(DF_Entity *binary, U64 voff);
|
||||
internal EVAL_String2NumMap *df_query_cached_member_map_from_binary_voff(DF_Entity *binary, U64 voff);
|
||||
internal EVAL_String2NumMap *df_query_cached_local_dynamic_type_override_map_from_module_voff(DF_Entity *module, U64 voff);
|
||||
|
||||
//- rjf: top-level command dispatch
|
||||
internal void df_push_cmd__root(DF_CmdParams *params, DF_CmdSpec *spec);
|
||||
|
||||
@@ -7195,6 +7195,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
|
||||
|
||||
// rjf: apply view rules to eval
|
||||
{
|
||||
member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, member_eval);
|
||||
member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, member_eval, &view_rule_table);
|
||||
}
|
||||
|
||||
@@ -7275,6 +7276,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
|
||||
|
||||
// rjf: apply view rules to eval
|
||||
{
|
||||
elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, elem_eval);
|
||||
elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, elem_eval, &view_rule_table);
|
||||
}
|
||||
|
||||
@@ -7354,6 +7356,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
|
||||
df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User);
|
||||
|
||||
// rjf: apply view rules to eval
|
||||
link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, link_eval);
|
||||
link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, link_eval, &view_rule_table);
|
||||
TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key);
|
||||
|
||||
|
||||
@@ -980,20 +980,6 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: identifier refers to type which may be possibly overridden -> look up into
|
||||
// identifier -> dynamic type table & patch
|
||||
if(identifier_type_is_possibly_dynamically_overridden)
|
||||
{
|
||||
U64 base_type_num = eval_num_from_string(ctx->local_dynamic_type_override_map, token_string);
|
||||
if(base_type_num != 0)
|
||||
{
|
||||
U64 type_idx = base_type_num;
|
||||
RADDBG_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx];
|
||||
TG_Key base_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), type_idx);
|
||||
type_key = tg_cons_type_make(ctx->type_graph, TG_Kind_Ptr, base_type_key, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: attach on map
|
||||
if(mapped_identifier != 0)
|
||||
{
|
||||
|
||||
@@ -98,7 +98,6 @@ struct EVAL_ParseCtx
|
||||
EVAL_String2NumMap *reg_alias_map;
|
||||
EVAL_String2NumMap *locals_map;
|
||||
EVAL_String2NumMap *member_map;
|
||||
EVAL_String2NumMap *local_dynamic_type_override_map;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
@@ -1151,6 +1151,22 @@ struct Derived : Base
|
||||
virtual void Foo() {a += 1;}
|
||||
};
|
||||
|
||||
struct DerivedA : Base
|
||||
{
|
||||
float a;
|
||||
float b;
|
||||
virtual void Foo() {a += 1;}
|
||||
virtual ~DerivedA() = default;
|
||||
};
|
||||
|
||||
struct DerivedB : Base
|
||||
{
|
||||
double c;
|
||||
double d;
|
||||
virtual void Foo() {c += 1;}
|
||||
virtual ~DerivedB() = default;
|
||||
};
|
||||
|
||||
struct OverloadedMethods{
|
||||
int x;
|
||||
int cool_method(void){
|
||||
@@ -1367,6 +1383,19 @@ extended_type_coverage_eval_tests(void){
|
||||
derived->Foo();
|
||||
delete derived;
|
||||
|
||||
Base *base_array[1024] = {0};
|
||||
for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1)
|
||||
{
|
||||
if(i & 1 == 1)
|
||||
{
|
||||
base_array[i] = new DerivedA();
|
||||
}
|
||||
else
|
||||
{
|
||||
base_array[i] = new DerivedB();
|
||||
}
|
||||
}
|
||||
|
||||
OverloadedMethods overloaded_methods;
|
||||
{
|
||||
overloaded_methods.x = 0;
|
||||
|
||||
@@ -1316,6 +1316,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){
|
||||
case CV_LeafKind_STRUCTURE:
|
||||
{
|
||||
ProfBegin("CV_LeafKind_CLASS/CV_LeafKind_STRUCTURE");
|
||||
|
||||
// TODO(allen): error if bad range
|
||||
if (sizeof(CV_LeafStruct) <= cap){
|
||||
CV_LeafStruct *lf_struct = (CV_LeafStruct*)first;
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#include <fstream>
|
||||
|
||||
int main()
|
||||
{
|
||||
std::fstream temp;
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user