diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c21e4e0..92924ad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# v0.9.23-alpha + +## Debugger Changes + +- Further improved PDB -> RDI conversion performance & memory usage. +- Adjusted limits for the amount of PDB -> RDI conversion work that the + debugger will kick off, to prevent PDB -> RDI conversion interfering with + debuggee performance. +- Reintroduced the `list` lens, which gathers all nodes in a linked list, and + visualizes them as a flat list of pointers (the same as how an array of + pointers is visualized). + # v0.9.22-alpha ## Debugger Changes diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 7c9a2a78..3bd826ce 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4200,6 +4200,21 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, //- rjf: eval helpers +internal U64 +ctrl_eval_space_gen(E_Space space) +{ + U64 result = 0; + switch(space.kind) + { + default:{}break; + case CTRL_EvalSpaceKind_Entity: + { + result = ctrl_mem_gen(); + }break; + } + return result; +} + internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) { @@ -4418,6 +4433,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C ctx->primary_module = eval_modules_primary; //- rjf: fill space hooks + ctx->space_gen = ctrl_eval_space_gen; ctx->space_read = ctrl_eval_space_read; } e_select_base_ctx(&scope->base_ctx); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 9879a71a..f7304452 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -980,7 +980,8 @@ internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, //- rjf: attached process running/event gathering internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); -//- rjf: eval helpers +//- rjf: eval helpers +internal U64 ctrl_eval_space_gen(E_Space space); internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); //- rjf: control thread eval scopes diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 5575990d..cdf5a029 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -2422,12 +2422,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I } if(irext != 0 && result.user_data == 0) { - E_IRTreeAndType irtree_stripped = result; - if(type->kind == E_TypeKind_Lens) - { - irtree_stripped.type_key = e_type_key_direct(irtree_stripped.type_key); - } - E_IRExt ext = irext(arena, expr, &irtree_stripped); + E_IRExt ext = irext(arena, expr, &result); result.user_data = ext.user_data; } } diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 208686e5..1d29a8d9 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2711,13 +2711,54 @@ E_TYPE_IREXT_FUNCTION_DEF(list) { E_IRExt result = {0}; E_Type *type = e_type_from_key(irtree->type_key); - String8 next_link_member_name = str8_lit("next"); - if(type->args != 0 && type->count > 0) + + //- rjf: get member encoding the link to the next node + E_Member next_link_member = {0}; { - next_link_member_name = type->args[0]->string; + E_TypeKey node_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All); + + // rjf: try explicitly-passed name + if(next_link_member.kind == E_MemberKind_Null && type->args != 0 && type->count > 0 && type->args[0]->kind == E_ExprKind_LeafIdentifier) + { + String8 name = type->args[0]->string; + next_link_member = e_type_member_from_key_name__cached(node_type_key, name); + } + + // rjf: try `next` + if(next_link_member.kind == E_MemberKind_Null) + { + next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit("next")); + } + + // rjf: try `prev` + if(next_link_member.kind == E_MemberKind_Null) + { + next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit("prev")); + } + + // rjf: try any pointer to the same type + if(next_link_member.kind == E_MemberKind_Null) + { + E_Type *node_type = e_type_from_key(node_type_key); + if(node_type->members != 0) + { + for EachIndex(idx, node_type->count) + { + E_TypeKey member_type_key = node_type->members[idx].type_key; + E_TypeKey member_type_key_undecorated = e_type_key_unwrap(member_type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKey member_ptee_type_key = e_type_key_unwrap(member_type_key_undecorated, E_TypeUnwrapFlag_All); + if(e_type_kind_from_key(member_type_key_undecorated) == E_TypeKind_Ptr && + e_type_key_match(member_ptee_type_key, node_type_key)) + { + next_link_member = node_type->members[idx]; + break; + } + } + } + } } - E_TypeKey node_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All); - E_Member next_link_member = e_type_member_from_key_name__cached(node_type_key, next_link_member_name); + + //- rjf: generate expansion info E_TypeExpandInfo info = {0, 0}; if(next_link_member.kind != E_MemberKind_DataField) { @@ -2765,6 +2806,7 @@ E_TYPE_IREXT_FUNCTION_DEF(list) access_close(access); scratch_end(scratch); } + return result; } diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index c363a09e..28bb2355 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -572,14 +572,16 @@ type_coverage_eval_tests(void) struct SLLNode { SLLNode *next; + SLLNode *the_real_next_ptr; int x; }; - SLLNode node6 = {0, 6}; - SLLNode node5 = {&node6, 5}; - SLLNode node4 = {&node5, 4}; - SLLNode node3 = {&node4, 3}; - SLLNode node2 = {&node3, 2}; - SLLNode node1 = {&node2, 1}; + SLLNode node6 = {0, 0, 6}; + SLLNode node5 = {0, &node6, 5}; + SLLNode node4 = {0, &node5, 4}; + SLLNode node3 = {0, &node4, 3}; + SLLNode node2 = {0, &node3, 2}; + SLLNode node1 = {0, &node2, 1}; + raddbg_pin(list(node1, the_real_next_ptr)); Alias1 a1 = has_enums.kind; Alias2 a2 = has_enums.flags; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index d7d09916..7b3cb5c7 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1726,6 +1726,10 @@ rd_eval_space_gen(E_Space space) U64 result = 0; switch(space.kind) { + default: + { + result = ctrl_eval_space_gen(space); + }break; case RD_EvalSpaceKind_MetaCfg: case RD_EvalSpaceKind_MetaQuery: {