From 2dbcc26cdbd93bf3f5b1b86e8fdfc598479c8c9e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 24 Jan 2024 15:26:12 -0800 Subject: [PATCH 01/13] switch local dev debugger to using local user/profile files, to explicitly separate from stable build --- project.4coder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.4coder b/project.4coder index ed349729..c9063119 100644 --- a/project.4coder +++ b/project.4coder @@ -65,7 +65,7 @@ commands = }, .rjf_f3 = { - .win = "pushd build && raddbg.exe && popd", + .win = "pushd build && raddbg.exe --user:local_dev.raddbg_user --profile:local_dev.raddbg_profile && popd", .linux = "", .out = "*compilation*", .footer_panel = true, From 96b0dd078330cb0e17f9ef66eab6228b58e1da58 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 24 Jan 2024 16:10:11 -0800 Subject: [PATCH 02/13] note on bilinear sampling requirement (e.g. not interpolating per-vertex coordinates) for specific UI --- src/raddbg/raddbg.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index d0bc585d..6de66459 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -7,6 +7,9 @@ // [ ] source view -> floating margin/line-nums // [ ] theme colors -> more explicit about e.g. opaque backgrounds vs. floating // & scrollbars etc. +// [ ] need bilinear interpolation on color picker - fine for most UI to not do +// do it but it needs to be correct for the color picker, so maybe that +// should be a heavier path // [ ] drag/drop tab cleanup // [ ] target/breakpoint/watch-pin reordering // [ ] watch window reordering From 66b56789c6898049b994fdc7af5b2f99d53915ac Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 06:15:28 -0800 Subject: [PATCH 03/13] eval: support for multiple namespacified fallback token lookups, to account for the several possibilities of namespaces & nested namespaces & static class members nested inside of namespaces & namespaces within namespaces within classes within namespaces & wow C++ is very bad; also ui: temporarily disable space-to-click, as it conflicts with typing and this case is not yet well supported --- src/eval/eval_parser.c | 41 +++++++++++++++++------------- src/scratch/i_hate_c_plus_plus.cpp | 25 +++++++++--------- src/ui/ui_core.c | 6 +++-- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/eval/eval_parser.c b/src/eval/eval_parser.c index e273efc1..70c376bb 100644 --- a/src/eval/eval_parser.c +++ b/src/eval/eval_parser.c @@ -834,8 +834,8 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 TG_Key type_key = zero_struct; String8 local_lookup_string = token_string; - //- rjf: form namespaceify fallback - String8 namespaceified_token_string = token_string; + //- rjf: form namespaceified fallback versions of this lookup string + String8List namespaceified_token_strings = {0}; if(ctx->rdbg->procedures != 0 && ctx->rdbg->scopes != 0 && ctx->rdbg->scope_vmap != 0) { U64 scope_idx = raddbg_vmap_idx_from_voff(ctx->rdbg->scope_vmap, ctx->rdbg->scope_vmap_count, ctx->ip_voff); @@ -844,23 +844,22 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 RADDBG_Procedure *procedure = &ctx->rdbg->procedures[proc_idx]; U64 name_size = 0; U8 *name_ptr = raddbg_string_from_idx(ctx->rdbg, procedure->name_string_idx, &name_size); - String8 name = str8(name_ptr, name_size); - U64 past_scope_resolution_pos = 0; + String8 containing_procedure_name = str8(name_ptr, name_size); + U64 last_past_scope_resolution_pos = 0; for(;;) { - U64 past_next_dbl_colon_pos = str8_find_needle(name, past_scope_resolution_pos, str8_lit("::"), 0)+2; - U64 past_next_dot_pos = str8_find_needle(name, past_scope_resolution_pos, str8_lit("."), 0)+1; + U64 past_next_dbl_colon_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("::"), 0)+2; + U64 past_next_dot_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("."), 0)+1; U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos); - if(past_next_scope_resolution_pos < name.size) - { - past_scope_resolution_pos = past_next_scope_resolution_pos; - } - else + if(past_next_scope_resolution_pos >= containing_procedure_name.size) { break; } + String8 new_namespace_prefix_possibility = str8_prefix(containing_procedure_name, past_next_scope_resolution_pos); + String8 namespaceified_token_string = push_str8f(scratch.arena, "%S%S", new_namespace_prefix_possibility, token_string); + str8_list_push_front(scratch.arena, &namespaceified_token_strings, namespaceified_token_string); + last_past_scope_resolution_pos = past_next_scope_resolution_pos; } - namespaceified_token_string = push_str8f(scratch.arena, "%S%S", str8_prefix(name, past_scope_resolution_pos), token_string); } //- rjf: try members @@ -974,9 +973,11 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); - if(matches_count == 0) + for(String8Node *n = namespaceified_token_strings.first; + n != 0 && matches_count == 0; + n = n->next) { - node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, namespaceified_token_string.str, namespaceified_token_string.size); + node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); } @@ -1014,9 +1015,11 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); - if(matches_count == 0) + for(String8Node *n = namespaceified_token_strings.first; + n != 0 && matches_count == 0; + n = n->next) { - node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, namespaceified_token_string.str, namespaceified_token_string.size); + node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); } @@ -1050,9 +1053,11 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 RADDBG_NameMapNode *node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, token_string.str, token_string.size); U32 matches_count = 0; U32 *matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); - if(matches_count == 0) + for(String8Node *n = namespaceified_token_strings.first; + n != 0 && matches_count == 0; + n = n->next) { - node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, namespaceified_token_string.str, namespaceified_token_string.size); + node = raddbg_name_map_lookup(ctx->rdbg, &parsed_name_map, n->string.str, n->string.size); matches_count = 0; matches = raddbg_matches_from_map_node(ctx->rdbg, node, &matches_count); } diff --git a/src/scratch/i_hate_c_plus_plus.cpp b/src/scratch/i_hate_c_plus_plus.cpp index ac4e9f96..a3ad1e14 100644 --- a/src/scratch/i_hate_c_plus_plus.cpp +++ b/src/scratch/i_hate_c_plus_plus.cpp @@ -1,20 +1,21 @@ -#include - -namespace SomeWeirdNamespace +namespace NS { - int X = 0; - int Y = 0; - void Foo(void) + static int X = 123; + static int Y = 456; + namespace SubNS { - X = 123; - Y = 456; - int x = 0; + static int X = 111; + static int Y = 222; + int Foo(int x, int y) + { + int z = x + y + X + Y + NS::X + NS::Y; + return z; + } } } -int main() +int main(void) { - std::fstream temp; - SomeWeirdNamespace::Foo(); + int result = NS::SubNS::Foo(5, 6); return 0; } diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 73abb6a4..cf902b74 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2443,8 +2443,10 @@ ui_signal_from_box(UI_Box *box) B32 keyboard_click = 0; if(!disabled && is_focused && box->flags & UI_BoxFlag_KeyboardClickable) { - if(os_key_press(ui_events(), ui_window(), 0, OS_Key_Return) != 0 || - os_key_press(ui_events(), ui_window(), 0, OS_Key_Space) != 0) + if(os_key_press(ui_events(), ui_window(), 0, OS_Key_Return) != 0) + // TODO(rjf): need to handle case where this would conflict with typing. + // if(os_key_press(ui_events(), ui_window(), 0, OS_Key_Return) != 0 || + // os_key_press(ui_events(), ui_window(), 0, OS_Key_Space) != 0) { keyboard_click = 1; result.clicked = 1; From ed7d31d7eafb4892e92c0ffc3e6b3a2f53f38ed0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 06:18:47 -0800 Subject: [PATCH 04/13] support C++ style scope resolution in txti buffer * point -> expression range path --- src/txti/txti.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/txti/txti.c b/src/txti/txti.c index 34b2e98e..533065ea 100644 --- a/src/txti/txti.c +++ b/src/txti/txti.c @@ -821,13 +821,15 @@ txti_expr_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, S default:{}break; case TXTI_TokenKind_Symbol: { + B32 is_scope_resolution = str8_match(wb_token_string, str8_lit("::"), 0); B32 is_dot = str8_match(wb_token_string, str8_lit("."), 0); B32 is_arrow = str8_match(wb_token_string, str8_lit("->"), 0); B32 is_open_bracket = str8_match(wb_token_string, str8_lit("["), 0); B32 is_close_bracket = str8_match(wb_token_string, str8_lit("]"), 0); nest -= !!(is_open_bracket); nest += !!(is_close_bracket); - if(is_dot || + if(is_scope_resolution || + is_dot || is_arrow || is_open_bracket|| is_close_bracket) From 7cf08541784f1f286b675ad61b13c058029c3e95 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 07:07:22 -0800 Subject: [PATCH 05/13] reimplement run-to-line and run-to-address with temporary user breakpoints which die-on-stop, which provides the desired flow for e.g. run-to-line while nothing runs --- src/ctrl/ctrl_core.c | 15 ++++---- src/df/core/df_core.c | 51 ++++++++++++++++++++++---- src/df/core/df_core.h | 23 ++++++------ src/df/core/df_core.mdesk | 4 +- src/df/core/generated/df_core.meta.c | 3 +- src/df/core/generated/df_core.meta.h | 8 +++- src/df/gfx/df_views.c | 55 ++++------------------------ 7 files changed, 83 insertions(+), 76 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index f969fc84..733248ec 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -2206,16 +2206,17 @@ ctrl_thread__launch_and_init(CTRL_Msg *msg) { CTRL_EventList evts = {0}; CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; + event->kind = CTRL_EventKind_Stopped; + event->msg_id = msg->msg_id; if(stop_event != 0) { - event->cause = ctrl_event_cause_from_demon_event_kind(stop_event->kind); - event->machine_id = CTRL_MachineID_Client; - event->entity = ctrl_handle_from_demon(stop_event->thread); - event->parent = ctrl_handle_from_demon(stop_event->process); + event->cause = ctrl_event_cause_from_demon_event_kind(stop_event->kind); + event->machine_id = CTRL_MachineID_Client; + event->entity = ctrl_handle_from_demon(stop_event->thread); + event->parent = ctrl_handle_from_demon(stop_event->process); event->exception_code = stop_event->code; - event->vaddr_rng = r1u64(stop_event->address, stop_event->address); - event->rip_vaddr = stop_event->instruction_pointer; + event->vaddr_rng = r1u64(stop_event->address, stop_event->address); + event->rip_vaddr = stop_event->instruction_pointer; } ctrl_c2u_push_events(&evts); } diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index f6213e08..abc88674 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -1621,7 +1621,7 @@ df_entity_notify_mutation(DF_Entity *entity) DF_CmdParams p = {0}; df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteProfileData)); } - if(e == entity && flags & DF_EntityKindFlag_LeafMutationSoftHalt) + if(e == entity && flags & DF_EntityKindFlag_LeafMutationSoftHalt && df_ctrl_targets_running()) { df_state->entities_mut_soft_halt = 1; } @@ -1629,7 +1629,7 @@ df_entity_notify_mutation(DF_Entity *entity) { df_state->entities_mut_dbg_info_map = 1; } - if(flags & DF_EntityKindFlag_TreeMutationSoftHalt) + if(flags & DF_EntityKindFlag_TreeMutationSoftHalt && df_ctrl_targets_running()) { df_state->entities_mut_soft_halt = 1; } @@ -6440,6 +6440,23 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) DF_CmdParams params = df_cmd_params_zero(); df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); } + + // rjf: kill all entities which are marked to die on stop + { + DF_Entity *request = df_entity_from_id(event->msg_id); + if(df_entity_is_nil(request)) + { + for(DF_Entity *entity = df_entity_root(); + !df_entity_is_nil(entity); + entity = df_entity_rec_df_pre(entity, df_entity_root()).next) + { + if(entity->flags & DF_EntityFlag_DiesOnRunStop) + { + df_entity_mark_for_deletion(entity); + } + } + } + } }break; //- rjf: entity creation/deletion @@ -7036,7 +7053,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) case DF_CoreCmdKind_StepIntoLine: case DF_CoreCmdKind_StepOverLine: case DF_CoreCmdKind_StepOut: - case DF_CoreCmdKind_RunToAddress: { DF_Entity *thread = df_entity_from_handle(params.entity); if(df_ctrl_targets_running()) @@ -7088,11 +7104,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) good = 0; } }break; - case DF_CoreCmdKind_RunToAddress: - { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck, params.vaddr}; - ctrl_trap_list_push(scratch.arena, &traps, &trap); - }break; } if(good && traps.count != 0) { @@ -7127,6 +7138,30 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) }break; //- rjf: high-level composite target control operations + case DF_CoreCmdKind_RunToLine: + { + DF_Entity *file = df_entity_from_handle(params.entity); + TxtPt point = params.text_point; + if(file->kind == DF_EntityKind_File) + { + DF_Entity *bp = df_entity_alloc(0, file, DF_EntityKind_Breakpoint); + bp->flags |= DF_EntityFlag_DiesOnRunStop; + df_entity_equip_b32(bp, 1); + df_entity_equip_txt_pt(bp, point); + df_entity_equip_cfg_src(bp, DF_CfgSrc_Transient); + DF_CmdParams p = df_cmd_params_zero(); + df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Run)); + } + }break; + case DF_CoreCmdKind_RunToAddress: + { + DF_Entity *bp = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Breakpoint); + bp->flags |= DF_EntityFlag_DiesOnRunStop; + df_entity_equip_vaddr(bp, params.vaddr); + df_entity_equip_cfg_src(bp, DF_CfgSrc_Transient); + DF_CmdParams p = df_cmd_params_zero(); + df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Run)); + }break; case DF_CoreCmdKind_Run: { DF_CmdParams params = df_cmd_params_zero(); diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 7fb97677..2a6e3e57 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -463,21 +463,22 @@ enum DF_EntityFlag_HasRng1U64 = (1<<5), DF_EntityFlag_HasColor = (1<<6), DF_EntityFlag_DiesWithTime = (1<<7), + DF_EntityFlag_DiesOnRunStop = (1<<8), //- rjf: ctrl entity equipment - DF_EntityFlag_HasCtrlMachineID = (1<<8), - DF_EntityFlag_HasCtrlHandle = (1<<9), - DF_EntityFlag_HasArch = (1<<10), - DF_EntityFlag_HasCtrlID = (1<<11), - DF_EntityFlag_HasStackBase = (1<<12), - DF_EntityFlag_HasTLSRoot = (1<<13), - DF_EntityFlag_HasVAddrRng = (1<<14), - DF_EntityFlag_HasVAddr = (1<<15), + DF_EntityFlag_HasCtrlMachineID = (1<<9), + DF_EntityFlag_HasCtrlHandle = (1<<10), + DF_EntityFlag_HasArch = (1<<11), + DF_EntityFlag_HasCtrlID = (1<<12), + DF_EntityFlag_HasStackBase = (1<<13), + DF_EntityFlag_HasTLSRoot = (1<<14), + DF_EntityFlag_HasVAddrRng = (1<<15), + DF_EntityFlag_HasVAddr = (1<<16), //- rjf: file properties - DF_EntityFlag_IsFolder = (1<<16), - DF_EntityFlag_IsMissing = (1<<17), - DF_EntityFlag_Output = (1<<18), // NOTE(rjf): might be missing, but written by us + DF_EntityFlag_IsFolder = (1<<17), + DF_EntityFlag_IsMissing = (1<<18), + DF_EntityFlag_Output = (1<<19), // NOTE(rjf): might be missing, but written by us //- rjf: deletion DF_EntityFlag_MarkedForDeletion = (1<<31), diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 22c750b6..8586d052 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -10,6 +10,7 @@ DF_CfgSrcTable: {"user" User LoadUser WriteUserData ApplyUserData } {"profile" Profile LoadProfile WriteProfileData ApplyProfileData } {"command_line" CommandLine Null Null Null } + {"transient" Transient Null Null Null } } //////////////////////////////// @@ -128,12 +129,13 @@ DF_CoreCmdTable:// | | | {StepIntoLine 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" } {StepOverLine 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" } {StepOut 0 Null Nil 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" } - {RunToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 PlayStepForward "run_to_address" "Run To Address" "Runs the selected thread to the specified address." "" } {Halt 0 Null Nil 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all running processes." "pause" } {SoftHaltRefresh 0 Null Nil 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all running processes to collect data, and then resumes them." "" } {SetThreadIP 1 VirtualAddr Nil 0 0 0 0 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the passed thread's instruction pointer at the passed address." "" } //- rjf: high-level composite target control operations + {RunToLine 1 Null Nil 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" } + {RunToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 PlayStepForward "run_to_address" "Run To Address" "Runs until a particular address is hit." "" } {Run 0 Null Nil 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" } {Restart 0 Null Nil 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all running processes, then restarts the targets which were used to launch all current processes (if any)." "restart,retry" } {StepInto 0 Null Nil 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either line or instructions." "" } diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c index 01992214..9529ab7c 100644 --- a/src/df/core/generated/df_core.meta.c +++ b/src/df/core/generated/df_core.meta.c @@ -20,10 +20,11 @@ DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[] = { str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Into (Line)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto}, { str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Over (Line)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOver}, { str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp("Step Out"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOut}, -{ str8_lit_comp("run_to_address"), str8_lit_comp("Runs the selected thread to the specified address."), str8_lit_comp(""), str8_lit_comp("Run To Address"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_PlayStepForward}, { str8_lit_comp("halt"), str8_lit_comp("Halts all running processes."), str8_lit_comp("pause"), str8_lit_comp("Halt"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Pause}, { str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all running processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Refresh}, { str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the passed thread's instruction pointer at the passed address."), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, +{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("Run To Line"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play}, +{ str8_lit_comp("run_to_address"), str8_lit_comp("Runs until a particular address is hit."), str8_lit_comp(""), str8_lit_comp("Run To Address"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_PlayStepForward}, { str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp("Run"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play}, { str8_lit_comp("restart"), str8_lit_comp("Kills all running processes, then restarts the targets which were used to launch all current processes (if any)."), str8_lit_comp("restart,retry"), str8_lit_comp("Restart"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Redo}, { str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Into"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto}, diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h index 8e787be5..e858451b 100644 --- a/src/df/core/generated/df_core.meta.h +++ b/src/df/core/generated/df_core.meta.h @@ -11,6 +11,7 @@ typedef enum DF_CfgSrc DF_CfgSrc_User, DF_CfgSrc_Profile, DF_CfgSrc_CommandLine, +DF_CfgSrc_Transient, DF_CfgSrc_COUNT } DF_CfgSrc; @@ -70,10 +71,11 @@ DF_CoreCmdKind_StepOverInst, DF_CoreCmdKind_StepIntoLine, DF_CoreCmdKind_StepOverLine, DF_CoreCmdKind_StepOut, -DF_CoreCmdKind_RunToAddress, DF_CoreCmdKind_Halt, DF_CoreCmdKind_SoftHaltRefresh, DF_CoreCmdKind_SetThreadIP, +DF_CoreCmdKind_RunToLine, +DF_CoreCmdKind_RunToAddress, DF_CoreCmdKind_Run, DF_CoreCmdKind_Restart, DF_CoreCmdKind_StepInto, @@ -1680,6 +1682,7 @@ String8 df_g_cfg_src_string_table[] = str8_lit_comp("user"), str8_lit_comp("profile"), str8_lit_comp("command_line"), +str8_lit_comp("transient"), }; DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[] = @@ -1687,6 +1690,7 @@ DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[] = DF_CoreCmdKind_LoadUser, DF_CoreCmdKind_LoadProfile, DF_CoreCmdKind_Null, +DF_CoreCmdKind_Null, }; DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[] = @@ -1694,6 +1698,7 @@ DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[] = DF_CoreCmdKind_WriteUserData, DF_CoreCmdKind_WriteProfileData, DF_CoreCmdKind_Null, +DF_CoreCmdKind_Null, }; DF_CoreCmdKind df_g_cfg_src_apply_cmd_kind_table[] = @@ -1701,6 +1706,7 @@ DF_CoreCmdKind df_g_cfg_src_apply_cmd_kind_table[] = DF_CoreCmdKind_ApplyUserData, DF_CoreCmdKind_ApplyProfileData, DF_CoreCmdKind_Null, +DF_CoreCmdKind_Null, }; String8 df_g_icon_kind_text_table[] = diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index c477bd16..dc66c9c6 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -4621,30 +4621,10 @@ DF_VIEW_CMD_FUNCTION_DEF(Code) }break; case DF_CoreCmdKind_RunToCursor: { - Temp scratch = scratch_begin(0, 0); - DF_Entity *thread = df_entity_from_handle(cmd->params.entity); - S64 line_num = tv->cursor.line; - DF_TextLineSrc2DasmInfoListArray src2dasm = df_text_line_src2dasm_info_list_array_from_src_line_range(scratch.arena, entity, r1s64(line_num, line_num)); - if(!df_entity_is_nil(thread) && src2dasm.count != 0) - { - DF_TextLineSrc2DasmInfoList *src2dasm_list = &src2dasm.v[0]; - if(src2dasm_list->first != 0) - { - Rng1U64 voff_rng = src2dasm_list->first->v.voff_range; - DF_Entity *binary = src2dasm_list->first->v.binary; - DF_EntityList possible_modules = df_modules_from_binary_file(scratch.arena, binary); - DF_Entity *thread_dst_module = df_module_from_thread_candidates(thread, &possible_modules); - U64 thread_dst_voff = voff_rng.min; - if(!df_entity_is_nil(thread_dst_module) && thread_dst_voff != 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.vaddr = df_vaddr_from_voff(thread_dst_module, thread_dst_voff); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToAddress)); - } - } - } - scratch_end(scratch); + DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); + params.entity = view->entity; + params.text_point = tv->cursor; + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToLine)); }break; case DF_CoreCmdKind_SetNextStatement: { @@ -5310,29 +5290,10 @@ DF_VIEW_UI_FUNCTION_DEF(Code) //- rjf: run-to-line if(sig.run_to_line_num != 0 && contains_1s64(visible_line_num_range, sig.run_to_line_num)) { - U64 line_idx = (sig.run_to_line_num-visible_line_num_range.min); - DF_TextLineSrc2DasmInfoList *src2dasm_list = &code_slice_params.line_src2dasm[line_idx]; - if(src2dasm_list->first != 0) - { - Rng1U64 voff_rng = src2dasm_list->first->v.voff_range; - DF_Entity *binary = src2dasm_list->first->v.binary; - DF_EntityList possible_modules = df_modules_from_binary_file(scratch.arena, binary); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - DF_Entity *thread_dst_module = df_module_from_thread_candidates(thread, &possible_modules); - DF_Entity *module = thread_dst_module; - if(df_entity_is_nil(module)) - { - module = df_first_entity_from_list(&possible_modules); - } - U64 voff = voff_rng.min; - if(!df_entity_is_nil(module) && voff != 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.vaddr = df_vaddr_from_voff(module, voff); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToAddress)); - } - } + DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); + params.entity = df_handle_from_entity(entity); + params.text_point = txt_pt(sig.run_to_line_num, 1); + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToLine)); } //- rjf: go to disasm From 813554fa62751d19faf1f280c4c1c6af214f43d0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 07:29:55 -0800 Subject: [PATCH 06/13] detect alt-held character inputs; short-circuit menu bar shenanigans on chars-with-alt --- src/df/core/df_core.mdesk | 392 ++++++++++++++++---------------- src/os/gfx/win32/os_gfx_win32.c | 4 + src/raddbg/raddbg.c | 4 + 3 files changed, 204 insertions(+), 196 deletions(-) diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk index 8586d052..9e03e81e 100644 --- a/src/df/core/df_core.mdesk +++ b/src/df/core/df_core.mdesk @@ -106,280 +106,280 @@ DF_CmdParamSlotTable: // / | | \ / | | | | | DF_CoreCmdTable:// | | | | | | | | | { - {Null 1 Null Nil 0 0 0 0 0 0 Null "" "" "" "" } + {Null 1 Null Nil 0 0 0 0 0 0 Null "" "" "" "" } //- rjf: exiting - {Exit 0 Null Nil 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" } + {Exit 0 Null Nil 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" } //- rjf: command runner - {RunCommand 0 CmdSpec Nil 0 0 0 0 0 0 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" } + {RunCommand 0 CmdSpec Nil 0 0 0 0 0 0 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" } //- rjf: notifications - {Error 1 Null Nil 0 0 0 0 0 0 Null "error" "Error" "Notifies of an error." "" } + {Error 1 Null Nil 0 0 0 0 0 0 Null "error" "Error" "Notifies of an error." "" } //- rjf: low-level target control operations - {LaunchAndRun 0 EntityList Target 0 0 0 0 0 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" } - {LaunchAndInit 0 EntityList Target 0 0 0 0 0 1 PlayStepForward "launch_and_init" "Launch and Initialize" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" } - {Kill 0 EntityList Process 0 0 0 0 0 1 Stop "kill" "Kill" "Kills the specified existing debugged process(es)." "stop,kill" } - {KillAll 0 Null Nil 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all debugged child processes." "stop,kill,all" } - {Detach 0 EntityList Process 0 0 0 0 0 1 Null "detach" "Detach" "Detaches the specified debugged process." "detach" } - {Continue 0 Null Nil 0 0 0 0 0 0 Play "continue" "Continue" "Continues all halted threads." "" } - {StepIntoInst 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" } - {StepOverInst 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" } - {StepIntoLine 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" } - {StepOverLine 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" } - {StepOut 0 Null Nil 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" } - {Halt 0 Null Nil 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all running processes." "pause" } - {SoftHaltRefresh 0 Null Nil 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all running processes to collect data, and then resumes them." "" } - {SetThreadIP 1 VirtualAddr Nil 0 0 0 0 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the passed thread's instruction pointer at the passed address." "" } + {LaunchAndRun 0 EntityList Target 0 0 0 0 0 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" } + {LaunchAndInit 0 EntityList Target 0 0 0 0 0 1 PlayStepForward "launch_and_init" "Launch and Initialize" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" } + {Kill 0 EntityList Process 0 0 0 0 0 1 Stop "kill" "Kill" "Kills the specified existing debugged process(es)." "stop,kill" } + {KillAll 0 Null Nil 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all debugged child processes." "stop,kill,all" } + {Detach 0 EntityList Process 0 0 0 0 0 1 Null "detach" "Detach" "Detaches the specified debugged process." "detach" } + {Continue 0 Null Nil 0 0 0 0 0 0 Play "continue" "Continue" "Continues all halted threads." "" } + {StepIntoInst 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" } + {StepOverInst 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" } + {StepIntoLine 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" } + {StepOverLine 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" } + {StepOut 0 Null Nil 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" } + {Halt 0 Null Nil 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all running processes." "pause" } + {SoftHaltRefresh 0 Null Nil 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all running processes to collect data, and then resumes them." "" } + {SetThreadIP 1 VirtualAddr Nil 0 0 0 0 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the passed thread's instruction pointer at the passed address." "" } //- rjf: high-level composite target control operations - {RunToLine 1 Null Nil 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" } - {RunToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 PlayStepForward "run_to_address" "Run To Address" "Runs until a particular address is hit." "" } - {Run 0 Null Nil 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" } - {Restart 0 Null Nil 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all running processes, then restarts the targets which were used to launch all current processes (if any)." "restart,retry" } - {StepInto 0 Null Nil 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either line or instructions." "" } - {StepOver 0 Null Nil 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either line or instructions." "" } - {RunToCursor 0 Null Nil 0 0 0 0 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "" } - {SetNextStatement 0 Null Nil 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" } + {RunToLine 1 Null Nil 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" } + {RunToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 PlayStepForward "run_to_address" "Run To Address" "Runs until a particular address is hit." "" } + {Run 0 Null Nil 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" } + {Restart 0 Null Nil 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all running processes, then restarts the targets which were used to launch all current processes (if any)." "restart,retry" } + {StepInto 0 Null Nil 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either line or instructions." "" } + {StepOver 0 Null Nil 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either line or instructions." "" } + {RunToCursor 0 Null Nil 0 0 0 0 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "" } + {SetNextStatement 0 Null Nil 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" } //- rjf: solo stepping mode - {EnableSoloSteppingMode 0 Null Nil 0 0 0 0 0 0 Thread "enable_solo_stepping_mode" "Enable Solo Stepping Mode" "Enables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" } - {DisableSoloSteppingMode 0 Null Nil 0 0 0 0 0 0 Thread "disable_solo_stepping_mode" "Disable Solo Stepping Mode" "Disables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" } + {EnableSoloSteppingMode 0 Null Nil 0 0 0 0 0 0 Thread "enable_solo_stepping_mode" "Enable Solo Stepping Mode" "Enables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" } + {DisableSoloSteppingMode 0 Null Nil 0 0 0 0 0 0 Thread "disable_solo_stepping_mode" "Disable Solo Stepping Mode" "Disables 'solo stepping mode', which suspends all non-selected threads before stepping." "solo,stepping,mode,suspend" } //- rjf: debug control context management operations - {SelectThread 0 Entity Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" } - {SelectThreadWindow 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_window" "Select Thread On Window" "Selects a thread for the active window, overriding the global selected thread." "" } - {SelectThreadView 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_view" "Select Thread On View" "Selects a thread for the active view, overriding the global and per-window selected threads." "" } - {SelectUnwind 1 Null Nil 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" } - {UpOneFrame 0 Null Nil 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the callstack frame above the currently selected." "" } - {DownOneFrame 0 Null Nil 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the callstack frame below the currently selected." "" } - {FreezeThread 0 Entity Thread 0 0 0 0 0 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "" } - {ThawThread 0 Entity Thread 0 0 0 0 0 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" } - {FreezeProcess 0 Entity Process 0 0 0 0 0 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" } - {ThawProcess 0 Entity Process 0 0 0 0 0 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" } - {FreezeMachine 1 Entity Machine 0 0 0 0 0 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" } - {ThawMachine 1 Entity Machine 0 0 0 0 0 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" } - {FreezeLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" } - {ThawLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" } + {SelectThread 0 Entity Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" } + {SelectThreadWindow 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_window" "Select Thread On Window" "Selects a thread for the active window, overriding the global selected thread." "" } + {SelectThreadView 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_view" "Select Thread On View" "Selects a thread for the active view, overriding the global and per-window selected threads." "" } + {SelectUnwind 1 Null Nil 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" } + {UpOneFrame 0 Null Nil 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the callstack frame above the currently selected." "" } + {DownOneFrame 0 Null Nil 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the callstack frame below the currently selected." "" } + {FreezeThread 0 Entity Thread 0 0 0 0 0 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "" } + {ThawThread 0 Entity Thread 0 0 0 0 0 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" } + {FreezeProcess 0 Entity Process 0 0 0 0 0 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" } + {ThawProcess 0 Entity Process 0 0 0 0 0 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" } + {FreezeMachine 1 Entity Machine 0 0 0 0 0 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" } + {ThawMachine 1 Entity Machine 0 0 0 0 0 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" } + {FreezeLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" } + {ThawLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" } //- rjf: font sizes - {IncUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" } - {DecUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_ui_font_scale" "Decrease UI Font Scale" "Decreases the font size used for UI." "" } - {IncCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_code_font_scale" "Increase Code Font Scale" "Increases the font size used for code." "" } - {DecCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_code_font_scale" "Decrease Code Font Scale" "Decreases the font size used for code." "" } + {IncUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" } + {DecUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_ui_font_scale" "Decrease UI Font Scale" "Decreases the font size used for UI." "" } + {IncCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_code_font_scale" "Increase Code Font Scale" "Increases the font size used for code." "" } + {DecCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_code_font_scale" "Decrease Code Font Scale" "Decreases the font size used for code." "" } //- rjf: windows - {OpenWindow 0 Null Nil 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" } - {CloseWindow 0 Null Nil 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" } - {ToggleFullscreen 0 Null Nil 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" } + {OpenWindow 0 Null Nil 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" } + {CloseWindow 0 Null Nil 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" } + {ToggleFullscreen 0 Null Nil 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" } //- rjf: confirmations - {ConfirmAccept 1 Null Nil 0 0 0 0 0 0 Null "confirm_accept" "Confirm Accept" "Accepts the active confirmation prompt." "" } - {ConfirmCancel 1 Null Nil 0 0 0 0 0 0 Null "confirm_cancel" "Confirm Cancel" "Cancels the active confirmation prompt." "" } + {ConfirmAccept 1 Null Nil 0 0 0 0 0 0 Null "confirm_accept" "Confirm Accept" "Accepts the active confirmation prompt." "" } + {ConfirmCancel 1 Null Nil 0 0 0 0 0 0 Null "confirm_cancel" "Confirm Cancel" "Cancels the active confirmation prompt." "" } //- rjf: panel splitting - {ResetToDefaultPanels 0 Null Nil 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" } - {NewPanelRight 0 Null Nil 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Vertically" "Creates a new panel to the right of the active panel." "panel" } - {NewPanelDown 0 Null Nil 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Horizontally" "Creates a new panel at the bottom of the active panel." "panel" } + {ResetToDefaultPanels 0 Null Nil 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" } + {NewPanelRight 0 Null Nil 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Vertically" "Creates a new panel to the right of the active panel." "panel" } + {NewPanelDown 0 Null Nil 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Horizontally" "Creates a new panel at the bottom of the active panel." "panel" } //- rjf: panel rotation - {RotatePanelColumns 0 Null Nil 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" } + {RotatePanelColumns 0 Null Nil 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" } //- rjf: focused panel changing - {NextPanel 0 Null Nil 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" } - {PrevPanel 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" } - {FocusPanel 1 Null Nil 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" } - {FocusPanelRight 0 Null Nil 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" } - {FocusPanelLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" } - {FocusPanelUp 0 Null Nil 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" } - {FocusPanelDown 0 Null Nil 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" } + {NextPanel 0 Null Nil 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" } + {PrevPanel 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" } + {FocusPanel 1 Null Nil 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" } + {FocusPanelRight 0 Null Nil 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" } + {FocusPanelLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" } + {FocusPanelUp 0 Null Nil 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" } + {FocusPanelDown 0 Null Nil 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" } //- rjf: undo/redo - {Undo 1 Null Nil 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" } - {Redo 1 Null Nil 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" } + {Undo 1 Null Nil 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" } + {Redo 1 Null Nil 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" } //- rjf: focus history - {GoBack 1 Null Nil 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" } - {GoForward 1 Null Nil 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" } + {GoBack 1 Null Nil 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" } + {GoForward 1 Null Nil 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" } //- rjf: panel removal - {ClosePanel 0 Null Nil 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" } + {ClosePanel 0 Null Nil 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" } //- rjf: panel tab - {NextTab 0 Null Nil 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" } - {PrevTab 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" } - {MoveTabRight 0 Null Nil 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" } - {MoveTabLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" } - {OpenTab 1 Null Nil 0 0 0 0 0 0 Null "open_tab" "Open Tab" "Opens a new tab with the parameterized view specification." "" } - {CloseTab 0 Null Nil 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" } - {MoveTab 1 Null Nil 0 0 0 0 0 0 Null "move_tab" "Move Tab" "Moves a tab to a new panel." "" } - {TabBarTop 0 Null Nil 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" } - {TabBarBottom 0 Null Nil 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" } + {NextTab 0 Null Nil 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" } + {PrevTab 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" } + {MoveTabRight 0 Null Nil 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" } + {MoveTabLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" } + {OpenTab 1 Null Nil 0 0 0 0 0 0 Null "open_tab" "Open Tab" "Opens a new tab with the parameterized view specification." "" } + {CloseTab 0 Null Nil 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" } + {MoveTab 1 Null Nil 0 0 0 0 0 0 Null "move_tab" "Move Tab" "Moves a tab to a new panel." "" } + {TabBarTop 0 Null Nil 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" } + {TabBarBottom 0 Null Nil 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" } //- rjf: files - {SetCurrentPath 1 Null Nil 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" } - {Open 0 FilePath Nil 1 0 0 0 0 1 FileOutline "open" "Open" "Opens a file." "code,source,file" } - {Reload 0 Entity File 0 0 0 0 0 1 FileOutline "reload" "Reload" "Reloads a loaded file." "code,source,file,reload" } - {ReloadActive 0 Null Nil 0 0 0 0 0 0 FileOutline "reload_active" "Reload Active File" "Reloads the active file." "code,source,file,reload" } - {Switch 0 Entity File 0 0 0 0 0 1 FileOutline "switch" "Switch" "Switches to a loaded file." "code,source,file" } - {SwitchToPartnerFile 0 Null Nil 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" } + {SetCurrentPath 1 Null Nil 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" } + {Open 0 FilePath Nil 1 0 0 0 0 1 FileOutline "open" "Open" "Opens a file." "code,source,file" } + {Reload 0 Entity File 0 0 0 0 0 1 FileOutline "reload" "Reload" "Reloads a loaded file." "code,source,file,reload" } + {ReloadActive 0 Null Nil 0 0 0 0 0 0 FileOutline "reload_active" "Reload Active File" "Reloads the active file." "code,source,file,reload" } + {Switch 0 Entity File 0 0 0 0 0 1 FileOutline "switch" "Switch" "Switches to a loaded file." "code,source,file" } + {SwitchToPartnerFile 0 Null Nil 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" } //- rjf: override file links - {SetFileOverrideLinkSrc 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_src" "Set File Override Link Source" "Sets the source path for an override file link." "" } - {SetFileOverrideLinkDst 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_dst" "Set File Override Link Destination" "Sets the destination path for an override file link." "" } - {SetFileReplacementPath 1 Null Nil 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" } + {SetFileOverrideLinkSrc 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_src" "Set File Override Link Source" "Sets the source path for an override file link." "" } + {SetFileOverrideLinkDst 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_dst" "Set File Override Link Destination" "Sets the destination path for an override file link." "" } + {SetFileReplacementPath 1 Null Nil 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" } //- rjf: setting config paths - {LoadUser 0 FilePath Nil 1 0 0 0 0 1 Person "load_user" "Load User" "Loads and applies a user file." "load,user,profile,layout" } - {LoadProfile 0 FilePath Nil 1 0 0 0 0 1 Briefcase "load_profile" "Load Profile" "Loads and applies a profile file." "profile,project,session" } + {LoadUser 0 FilePath Nil 1 0 0 0 0 1 Person "load_user" "Load User" "Loads and applies a user file." "load,user,profile,layout" } + {LoadProfile 0 FilePath Nil 1 0 0 0 0 1 Briefcase "load_profile" "Load Profile" "Loads and applies a profile file." "profile,project,session" } //- rjf: loading/applying stateful config changes - {ApplyUserData 1 Null Nil 0 0 0 0 0 0 Null "apply_user_data" "Apply User Data" "Applies user data from the active user file." "" } - {ApplyProfileData 1 Null Nil 0 0 0 0 0 0 Null "apply_profile_data" "Apply Profile Data" "Applies profile data from the active profile file." "" } + {ApplyUserData 1 Null Nil 0 0 0 0 0 0 Null "apply_user_data" "Apply User Data" "Applies user data from the active user file." "" } + {ApplyProfileData 1 Null Nil 0 0 0 0 0 0 Null "apply_profile_data" "Apply Profile Data" "Applies profile data from the active profile file." "" } //- rjf: writing config changes - {WriteUserData 1 Null Nil 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" } - {WriteProfileData 1 Null Nil 0 0 0 0 0 0 Null "write_profile_data" "Write Profile Data" "Writes profile data to the active profile file." "" } + {WriteUserData 1 Null Nil 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" } + {WriteProfileData 1 Null Nil 0 0 0 0 0 0 Null "write_profile_data" "Write Profile Data" "Writes profile data to the active profile file." "" } //- rjf: directional movement & text controls - {MoveLeft 0 Null Nil 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" } - {MoveRight 0 Null Nil 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" } - {MoveUp 0 Null Nil 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" } - {MoveDown 0 Null Nil 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" } - {MoveLeftSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" } - {MoveRightSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" } - {MoveUpSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" } - {MoveDownSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" } - {MoveLeftChunk 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Select" "Moves the cursor or selection left one chunk." "" } - {MoveRightChunk 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Select" "Moves the cursor or selection right one chunk." "" } - {MoveUpChunk 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" } - {MoveDownChunk 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" } - {MoveUpPage 0 Null Nil 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" } - {MoveDownPage 0 Null Nil 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" } - {MoveUpWhole 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" } - {MoveDownWhole 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" } - {MoveLeftChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" } - {MoveRightChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" } - {MoveUpChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" } - {MoveDownChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" } - {MoveUpPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" } - {MoveDownPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" } - {MoveUpWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" } - {MoveDownWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" } - {MoveHome 0 Null Nil 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" } - {MoveEnd 0 Null Nil 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" } - {MoveHomeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" } - {MoveEndSelect 0 Null Nil 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" } - {SelectAll 0 Null Nil 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" } - {DeleteSingle 0 Null Nil 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" } - {DeleteChunk 0 Null Nil 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" } - {BackspaceSingle 0 Null Nil 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" } - {BackspaceChunk 0 Null Nil 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" } - {Copy 0 Null Nil 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" } - {Cut 0 Null Nil 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" } - {Paste 0 Null Nil 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" } - {InsertText 1 Null Nil 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" } + {MoveLeft 0 Null Nil 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" } + {MoveRight 0 Null Nil 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" } + {MoveUp 0 Null Nil 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" } + {MoveDown 0 Null Nil 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" } + {MoveLeftSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" } + {MoveRightSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" } + {MoveUpSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" } + {MoveDownSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" } + {MoveLeftChunk 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Select" "Moves the cursor or selection left one chunk." "" } + {MoveRightChunk 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Select" "Moves the cursor or selection right one chunk." "" } + {MoveUpChunk 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" } + {MoveDownChunk 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" } + {MoveUpPage 0 Null Nil 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" } + {MoveDownPage 0 Null Nil 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" } + {MoveUpWhole 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" } + {MoveDownWhole 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" } + {MoveLeftChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" } + {MoveRightChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" } + {MoveUpChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" } + {MoveDownChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" } + {MoveUpPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" } + {MoveDownPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" } + {MoveUpWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" } + {MoveDownWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" } + {MoveHome 0 Null Nil 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" } + {MoveEnd 0 Null Nil 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" } + {MoveHomeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" } + {MoveEndSelect 0 Null Nil 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" } + {SelectAll 0 Null Nil 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" } + {DeleteSingle 0 Null Nil 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" } + {DeleteChunk 0 Null Nil 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" } + {BackspaceSingle 0 Null Nil 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" } + {BackspaceChunk 0 Null Nil 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" } + {Copy 0 Null Nil 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" } + {Cut 0 Null Nil 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" } + {Paste 0 Null Nil 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" } + {InsertText 1 Null Nil 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" } //- rjf: code navigation - {GoToLine 0 TextPoint Nil 0 0 0 0 1 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" } - {GoToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" } - {CenterCursor 0 Null Nil 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" } - {ContainCursor 0 Null Nil 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" } - {FindTextForward 0 String Nil 0 0 1 1 1 1 Find "find_text_forward" "Find Text (Forward)" "Searches the current code file forward (from the cursor) for a string." "" } - {FindTextBackward 0 String Nil 0 0 1 1 1 1 Find "find_text_backward" "Find Text (Backwards)" "Searches the current code file backwards (from the cursor) for a string." "" } - {FindNext 0 Null Nil 0 0 1 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" } - {FindPrev 0 Null Nil 0 0 1 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" } + {GoToLine 0 TextPoint Nil 0 0 0 0 1 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" } + {GoToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" } + {CenterCursor 0 Null Nil 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" } + {ContainCursor 0 Null Nil 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" } + {FindTextForward 0 String Nil 0 0 1 1 1 1 Find "find_text_forward" "Find Text (Forward)" "Searches the current code file forward (from the cursor) for a string." "" } + {FindTextBackward 0 String Nil 0 0 1 1 1 1 Find "find_text_backward" "Find Text (Backwards)" "Searches the current code file backwards (from the cursor) for a string." "" } + {FindNext 0 Null Nil 0 0 1 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" } + {FindPrev 0 Null Nil 0 0 1 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" } //- rjf: thread finding - {FindThread 0 Entity Thread 0 0 0 0 0 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" } - {FindSelectedThread 0 Null Nil 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "" } + {FindThread 0 Entity Thread 0 0 0 0 0 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" } + {FindSelectedThread 0 Null Nil 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "" } //- rjf: name finding - {GoToName 0 String Nil 0 0 0 0 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" } - {GoToNameAtCursor 0 Null Nil 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" } + {GoToName 0 String Nil 0 0 0 0 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" } + {GoToNameAtCursor 0 Null Nil 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" } //- rjf: watch expressions - {ToggleWatchExpression 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" } - {ToggleWatchExpressionAtCursor 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" } + {ToggleWatchExpression 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" } + {ToggleWatchExpressionAtCursor 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" } //- rjf: memory view parameterization - {SetColumns 0 Index Nil 0 0 0 0 1 1 Thumbnails "set_columns" "Set Columns" "Sets the number of columns for a memory view." "" } + {SetColumns 0 Index Nil 0 0 0 0 1 1 Thumbnails "set_columns" "Set Columns" "Sets the number of columns for a memory view." "" } //- rjf: disassembly view parameterization - {ToggleAddressVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_address_visibility" "Toggle Address Visibility" "Toggles the visibility of addresses in a disassembly view." "" } - {ToggleCodeBytesVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_code_bytes_visibility""Toggle Code Bytes Visibility" "Toggles the visibility of machine code bytes in a disassembly view." "" } + {ToggleAddressVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_address_visibility" "Toggle Address Visibility" "Toggles the visibility of addresses in a disassembly view." "" } + {ToggleCodeBytesVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_code_bytes_visibility""Toggle Code Bytes Visibility" "Toggles the visibility of machine code bytes in a disassembly view." "" } //- rjf: general entity operations - {EnableEntity 1 Null Nil 0 0 0 0 0 0 Null "enable_entity" "Enable Entity" "Enables an entity." "" } - {DisableEntity 1 Null Nil 0 0 0 0 0 0 Null "disable_entity" "Disable Entity" "Disables an entity." "" } - {FreezeEntity 1 Null Nil 0 0 0 0 0 0 Null "freeze_entity" "Freeze Entity" "Freezes an entity." "" } - {ThawEntity 1 Null Nil 0 0 0 0 0 0 Null "thaw_entity" "Thaw Entity" "Thaws an entity." "" } - {RemoveEntity 1 Null Nil 0 0 0 0 0 0 Null "remove_entity" "Remove Entity" "Removes an entity." "" } - {NameEntity 1 Null Nil 0 0 0 0 0 0 Null "name_entity" "Name Entity" "Equips an entity with a name." "" } - {EditEntity 1 Null Nil 0 0 0 0 0 0 Null "edit_entity" "Edit Entity" "Opens the editor for an entity." "" } - {DuplicateEntity 1 Null Nil 0 0 0 0 0 0 Null "duplicate_entity" "Duplicate Entity" "Duplicates an entity." "" } + {EnableEntity 1 Null Nil 0 0 0 0 0 0 Null "enable_entity" "Enable Entity" "Enables an entity." "" } + {DisableEntity 1 Null Nil 0 0 0 0 0 0 Null "disable_entity" "Disable Entity" "Disables an entity." "" } + {FreezeEntity 1 Null Nil 0 0 0 0 0 0 Null "freeze_entity" "Freeze Entity" "Freezes an entity." "" } + {ThawEntity 1 Null Nil 0 0 0 0 0 0 Null "thaw_entity" "Thaw Entity" "Thaws an entity." "" } + {RemoveEntity 1 Null Nil 0 0 0 0 0 0 Null "remove_entity" "Remove Entity" "Removes an entity." "" } + {NameEntity 1 Null Nil 0 0 0 0 0 0 Null "name_entity" "Name Entity" "Equips an entity with a name." "" } + {EditEntity 1 Null Nil 0 0 0 0 0 0 Null "edit_entity" "Edit Entity" "Opens the editor for an entity." "" } + {DuplicateEntity 1 Null Nil 0 0 0 0 0 0 Null "duplicate_entity" "Duplicate Entity" "Duplicates an entity." "" } //- rjf: breakpoints - {TextBreakpoint 1 Null Nil 0 0 0 0 0 0 CircleFilled "text_breakpoint" "Text Breakpoint" "Places or removes a breakpoint on the specified line of source code." "" } - {AddressBreakpoint 0 VirtualAddr Nil 0 0 0 0 1 1 CircleFilled "address_breakpoint" "Address Breakpoint" "Places or removes a breakpoint on the specified address." "" } - {FunctionBreakpoint 0 String Nil 0 0 0 0 1 1 CircleFilled "function_breakpoint" "Function Breakpoint" "Places or removes a breakpoint on the first address(es) of the specified function." "" } - {ToggleBreakpointAtCursor 0 Null Nil 0 0 0 0 0 0 CircleFilled "toggle_breakpoint_cursor" "Toggle Breakpoint At Cursor" "Places or removes a breakpoint on the line on which the active cursor sits." "" } - {RemoveBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "" } - {EnableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" } - {DisableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" } + {TextBreakpoint 1 Null Nil 0 0 0 0 0 0 CircleFilled "text_breakpoint" "Text Breakpoint" "Places or removes a breakpoint on the specified line of source code." "" } + {AddressBreakpoint 0 VirtualAddr Nil 0 0 0 0 1 1 CircleFilled "address_breakpoint" "Address Breakpoint" "Places or removes a breakpoint on the specified address." "" } + {FunctionBreakpoint 0 String Nil 0 0 0 0 1 1 CircleFilled "function_breakpoint" "Function Breakpoint" "Places or removes a breakpoint on the first address(es) of the specified function." "" } + {ToggleBreakpointAtCursor 0 Null Nil 0 0 0 0 0 0 CircleFilled "toggle_breakpoint_cursor" "Toggle Breakpoint At Cursor" "Places or removes a breakpoint on the line on which the active cursor sits." "" } + {RemoveBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "" } + {EnableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" } + {DisableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" } //- rjf: watches - {ToggleWatchPin 1 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin on a textual location on a particular entity." "" } - {ToggleWatchPinAtCursor 0 String Nil 0 0 0 0 1 1 Binoculars "toggle_watch_pin_at_cursor" "Toggle Watch Pin At Cursor" "Places or removes a watch pin at the cursor on the currently active file." "" } + {ToggleWatchPin 1 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin on a textual location on a particular entity." "" } + {ToggleWatchPinAtCursor 0 String Nil 0 0 0 0 1 1 Binoculars "toggle_watch_pin_at_cursor" "Toggle Watch Pin At Cursor" "Places or removes a watch pin at the cursor on the currently active file." "" } //- rjf: targets - {AddTarget 0 FilePath Nil 1 0 0 0 0 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" } - {RemoveTarget 0 Entity Target 0 0 0 0 0 1 Trash "remove_target" "Remove Target" "Removes an existing target." "delete,remove,target" } - {EditTarget 0 Entity Target 0 0 0 0 0 1 Pencil "edit_target" "Edit Target" "Edits an existing target." "" } + {AddTarget 0 FilePath Nil 1 0 0 0 0 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" } + {RemoveTarget 0 Entity Target 0 0 0 0 0 1 Trash "remove_target" "Remove Target" "Removes an existing target." "delete,remove,target" } + {EditTarget 0 Entity Target 0 0 0 0 0 1 Pencil "edit_target" "Edit Target" "Edits an existing target." "" } //- rjf: ended processes - {RetryEndedProcess 1 Entity Process 0 0 0 0 0 0 Null "retry_ended_process" "Retry Ended Process" "Launches a new process with the same options as the passed ended process." "" } + {RetryEndedProcess 1 Entity Process 0 0 0 0 0 0 Null "retry_ended_process" "Retry Ended Process" "Launches a new process with the same options as the passed ended process." "" } //- rjf: attaching - {Attach 0 ID Nil 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" } - {RegisterAsJITDebugger 0 Null Nil 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" } + {Attach 0 ID Nil 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" } + {RegisterAsJITDebugger 0 Null Nil 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" } //- rjf: catchall general entity activation paths (drag/drop, clicking) - {EntityRefFastPath 1 Null Nil 0 0 0 0 0 0 Null "entity_ref_fast_path" "Entity Reference Fast Path" "Activates the default behavior when clicking an entity reference." "" } - {SpawnEntityView 1 Null Nil 0 0 0 0 0 0 Null "spawn_entity_view" "Spawn Entity View" "Spawns a new view, given an entity and other parameterizations." "" } - {FindCodeLocation 1 FilePath Nil 0 0 0 0 0 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" } + {EntityRefFastPath 1 Null Nil 0 0 0 0 0 0 Null "entity_ref_fast_path" "Entity Reference Fast Path" "Activates the default behavior when clicking an entity reference." "" } + {SpawnEntityView 1 Null Nil 0 0 0 0 0 0 Null "spawn_entity_view" "Spawn Entity View" "Spawns a new view, given an entity and other parameterizations." "" } + {FindCodeLocation 1 FilePath Nil 0 0 0 0 0 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" } //- rjf: view drivers - {Commands 0 Null Nil 0 0 0 0 0 0 List "commands" "Commands" "Opens the list of all commands." "" } - {Target 1 Null Nil 0 0 0 0 0 0 Target "target" "Target" "Opens the editor for a target." "" } - {Targets 0 Null Nil 0 0 0 0 0 0 Target "targets" "Targets" "Opens the list of all targets." "" } - {FilePathMap 0 Null Nil 0 0 0 0 0 0 FileOutline "file_path_map" "File Path Map" "Opens the file path mapping editor." "" } - {Scheduler 0 Null Nil 0 0 0 0 0 0 Scheduler "scheduler" "Scheduler" "Opens the scheduler view, for process and thread controls." "" } - {CallStack 0 Null Nil 0 0 0 0 0 0 Thread "call_stack" "Call Stack" "Opens the call stack view." "callstack,thread" } - {Modules 0 Null Nil 0 0 0 0 0 0 Module "modules" "Modules" "Opens the modules view." "" } - {PendingEntity 1 Null Nil 0 0 0 0 0 0 FileOutline "pending_entity" "Pending Entity" "Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view." "" } - {Code 1 Null Nil 0 0 0 0 0 0 FileOutline "code" "Code" "Opens the code view for an already-loaded file." "" } - {Watch 0 Null Nil 0 0 0 0 0 0 Binoculars "watch" "Watch" "Opens a watch view." "" } - {Locals 0 Null Nil 0 0 0 0 0 0 Binoculars "locals" "Locals" "Opens a locals view." "" } - {Registers 0 Null Nil 0 0 0 0 0 0 Binoculars "registers" "Registers" "Opens a registers view for the currently selected thread." "" } - {Output 0 Null Nil 0 0 0 0 0 0 List "output" "Output" "Opens an output view." "" } - {Memory 0 Null Nil 0 0 0 0 0 0 Grid "memory" "Memory" "Opens a memory view." "" } - {Disassembly 0 Null Nil 0 0 0 0 0 0 Glasses "disassembly" "Disassembly" "Opens the disassembly view." "disasm" } - {Breakpoints 0 Null Nil 0 0 0 0 0 0 CircleFilled "breakpoints" "Breakpoints" "Opens the breakpoints view." "" } - {WatchPins 0 Null Nil 0 0 0 0 0 0 Pin "watch_pins" "Watch Pins" "Opens the watch pins view." "" } - {ExceptionFilters 0 Null Nil 0 0 0 0 0 0 Gear "exception_filters" "Exception Filters" "Opens the exception filters view." "exceptions,filters" } - {Theme 0 Null Nil 0 0 0 0 0 0 Palette "theme" "Theme" "Opens the theme view." "theme,color,scheme,palette" } - {PickFile 1 FilePath Nil 1 0 0 0 0 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" } - {PickFolder 1 FilePath Nil 0 1 0 0 0 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" } - {PickFileOrFolder 1 FilePath Nil 1 1 0 0 0 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" } + {Commands 0 Null Nil 0 0 0 0 0 0 List "commands" "Commands" "Opens the list of all commands." "" } + {Target 1 Null Nil 0 0 0 0 0 0 Target "target" "Target" "Opens the editor for a target." "" } + {Targets 0 Null Nil 0 0 0 0 0 0 Target "targets" "Targets" "Opens the list of all targets." "" } + {FilePathMap 0 Null Nil 0 0 0 0 0 0 FileOutline "file_path_map" "File Path Map" "Opens the file path mapping editor." "" } + {Scheduler 0 Null Nil 0 0 0 0 0 0 Scheduler "scheduler" "Scheduler" "Opens the scheduler view, for process and thread controls." "" } + {CallStack 0 Null Nil 0 0 0 0 0 0 Thread "call_stack" "Call Stack" "Opens the call stack view." "callstack,thread" } + {Modules 0 Null Nil 0 0 0 0 0 0 Module "modules" "Modules" "Opens the modules view." "" } + {PendingEntity 1 Null Nil 0 0 0 0 0 0 FileOutline "pending_entity" "Pending Entity" "Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view." "" } + {Code 1 Null Nil 0 0 0 0 0 0 FileOutline "code" "Code" "Opens the code view for an already-loaded file." "" } + {Watch 0 Null Nil 0 0 0 0 0 0 Binoculars "watch" "Watch" "Opens a watch view." "" } + {Locals 0 Null Nil 0 0 0 0 0 0 Binoculars "locals" "Locals" "Opens a locals view." "" } + {Registers 0 Null Nil 0 0 0 0 0 0 Binoculars "registers" "Registers" "Opens a registers view for the currently selected thread." "" } + {Output 0 Null Nil 0 0 0 0 0 0 List "output" "Output" "Opens an output view." "" } + {Memory 0 Null Nil 0 0 0 0 0 0 Grid "memory" "Memory" "Opens a memory view." "" } + {Disassembly 0 Null Nil 0 0 0 0 0 0 Glasses "disassembly" "Disassembly" "Opens the disassembly view." "disasm" } + {Breakpoints 0 Null Nil 0 0 0 0 0 0 CircleFilled "breakpoints" "Breakpoints" "Opens the breakpoints view." "" } + {WatchPins 0 Null Nil 0 0 0 0 0 0 Pin "watch_pins" "Watch Pins" "Opens the watch pins view." "" } + {ExceptionFilters 0 Null Nil 0 0 0 0 0 0 Gear "exception_filters" "Exception Filters" "Opens the exception filters view." "exceptions,filters" } + {Theme 0 Null Nil 0 0 0 0 0 0 Palette "theme" "Theme" "Opens the theme view." "theme,color,scheme,palette" } + {PickFile 1 FilePath Nil 1 0 0 0 0 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" } + {PickFolder 1 FilePath Nil 0 1 0 0 0 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" } + {PickFileOrFolder 1 FilePath Nil 1 1 0 0 0 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" } //- rjf: query completion - {CompleteQuery 1 Null Nil 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes a query." "" } - {CancelQuery 1 Null Nil 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Cancels a query." "" } + {CompleteQuery 1 Null Nil 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes a query." "" } + {CancelQuery 1 Null Nil 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Cancels a query." "" } //- rjf: developer commands - {ToggleDevMenu 0 Null Nil 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" } + {ToggleDevMenu 0 Null Nil 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" } } //////////////////////////////// diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/os/gfx/win32/os_gfx_win32.c index 8332e1d1..0ef4f561 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/os/gfx/win32/os_gfx_win32.c @@ -493,6 +493,10 @@ w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if(character >= 32 && character != 127) { OS_Event *event = w32_push_event(OS_EventKind_Text, window); + if(lParam & bit29) + { + event->flags |= OS_EventFlag_Alt; + } event->character = character; } }break; diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index 03935c02..ca7e2be1 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -167,6 +167,10 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data) df_push_cmd__root(¶ms, spec); df_gfx_request_frame(); os_eat_event(&events, event); + if(event->flags & OS_EventFlag_Alt) + { + window->menu_bar_focus_press_started = 0; + } } } } From 76b2facbf4ebafbb1b9fb359703c46e6fd73b314 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 07:47:11 -0800 Subject: [PATCH 07/13] restrict menu bar keyboard shortcuts to being modifierless --- src/raddbg/raddbg.c | 8 ++++---- src/raddbg/raddbg.h | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c index ca7e2be1..d877c146 100644 --- a/src/raddbg/raddbg.c +++ b/src/raddbg/raddbg.c @@ -186,7 +186,7 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data) continue; } B32 take = 0; - if(event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->is_repeat == 0) + if(event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->flags == 0 && event->is_repeat == 0) { take = 1; df_gfx_request_frame(); @@ -194,19 +194,19 @@ update_and_render(OS_Handle repaint_window_handle, void *user_data) ws->menu_bar_key_held = 1; ws->menu_bar_focus_press_started = 1; } - if(event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->is_repeat == 0) + if(event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->flags == 0 && event->is_repeat == 0) { take = 1; df_gfx_request_frame(); ws->menu_bar_key_held = 0; } - if(ws->menu_bar_focused && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->is_repeat == 0) + if(ws->menu_bar_focused && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->flags == 0 && event->is_repeat == 0) { take = 1; df_gfx_request_frame(); ws->menu_bar_focused = 0; } - else if(ws->menu_bar_focus_press_started && !ws->menu_bar_focused && event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->is_repeat == 0) + else if(ws->menu_bar_focus_press_started && !ws->menu_bar_focused && event->kind == OS_EventKind_Release && event->flags == 0 && event->key == OS_Key_Alt && event->is_repeat == 0) { take = 1; df_gfx_request_frame(); diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 6de66459..10c213a9 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -85,8 +85,6 @@ // [ ] escaping in config files - breakpoint labels etc. // [ ] focus changing between query bar & panel content via mouse // -// [ ] ** while typing, "Alt" Windows menu things should not happen -// // [ ] visualize conversion failures // // [ ] I was a little confused about what a profile file was. I understood From d0c3d9dc21979444c834983d3ad79120639508ba Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 09:06:03 -0800 Subject: [PATCH 08/13] extend ctrl process memory cache reads with freshness info - it is a bit too coarse grained at page granularity, that should've been easy to predict... in any case, to start addressing that, start keeping >1 hash key hash history in hash store layer, such that history may be preserved for a bit longer & diff'd with new key hashes --- src/ctrl/ctrl_core.c | 29 ++++++++++++++++++++--------- src/ctrl/ctrl_core.h | 13 +++++++++++-- src/df/core/df_core.c | 22 ++++++++++++++-------- src/df/gfx/df_gfx.c | 19 ++++++++++++------- src/df/gfx/df_view_rule_hooks.c | 6 ++++-- src/df/gfx/df_views.c | 18 +++++++++++++++++- src/hash_store/hash_store.c | 22 +++++++++++++--------- src/hash_store/hash_store.h | 3 ++- 8 files changed, 93 insertions(+), 39 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 733248ec..37e5f437 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -754,10 +754,10 @@ ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, return actual_bytes_read; } -internal String8 +internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range) { - String8 result = {0}; + CTRL_ProcessMemorySlice result = {0}; if(range.max > range.min && dim_1u64(range) <= MB(256) && range.min <= 0x000FFFFFFFFFFFFFull && @@ -821,6 +821,7 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac { page_found = 1; MemoryCopy((U8*)read_out + (page_vaddr-page_range.min), page_data.str, KB(4)); + result.fresh = result.fresh || !!(node4->page_fresh_flags[lvl5_idx/64] & (1ull<<(lvl5_idx%64))); } else { @@ -898,6 +899,16 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac }; U128 page_key = hs_hash_from_data(str8((U8 *)page_key_data, sizeof(page_key_data))); U128 page_hash = hs_submit_data(page_key, &page_arena, str8((U8 *)page_base, KB(4))); + if(!u128_match(node4->page_hashes[lvl5_idx], u128_zero()) && + !u128_match(node4->page_hashes[lvl5_idx], page_hash)) + { + node4->page_fresh_flags[lvl5_idx/64] |= (1ull<<(lvl5_idx%64)); + } + else + { + node4->page_fresh_flags[lvl5_idx/64] &= ~(1ull<<(lvl5_idx%64)); + } + result.fresh = result.fresh || !!(node4->page_fresh_flags[lvl5_idx/64] & (1ull<<(lvl5_idx%64))); node4->page_hashes[lvl5_idx] = page_hash; } else @@ -910,22 +921,22 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac //- rjf: fill result by skipping/chopping read memory U64 byte_in_page_idx = (range.min&0x0000000000000FFFull) >> 0; - result.str = (U8*)read_out + byte_in_page_idx; - result.size = dim_1u64(range); + result.data.str = (U8*)read_out + byte_in_page_idx; + result.data.size = dim_1u64(range); hs_scope_close(scope); } return result; } -internal String8 +internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us) { - String8 result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit)); - for(U64 idx = 0; idx < result.size; idx += 1) + CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit)); + for(U64 idx = 0; idx < result.data.size; idx += 1) { - if(result.str[idx] == 0) + if(result.data.str[idx] == 0) { - result.size = idx; + result.data.size = idx; break; } } diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 6947bde7..c667c7de 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -333,6 +333,8 @@ struct CTRL_ProcessMemoryCacheNode4 { U64 page_memgen_idxs[256]; U128 page_hashes[256]; + U128 last_page_hashes[256]; + U64 page_fresh_flags[4]; }; typedef struct CTRL_ProcessMemoryCacheNode3 CTRL_ProcessMemoryCacheNode3; @@ -406,6 +408,13 @@ struct CTRL_ProcessMemoryCache CTRL_ProcessMemoryCacheStripe *stripes; }; +typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; +struct CTRL_ProcessMemorySlice +{ + String8 data; + B32 fresh; +}; + //////////////////////////////// //~ rjf: Wakeup Hook Function Types @@ -560,8 +569,8 @@ internal Architecture ctrl_arch_from_handle(CTRL_MachineID machine, CTRL_Handle //- rjf: process memory reading/writing internal U64 ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *dst); -internal String8 ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range); -internal String8 ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us); +internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range); +internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us); internal B32 ctrl_process_write_data(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, String8 data); internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index abc88674..62f0ca98 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -3486,12 +3486,14 @@ df_tls_base_vaddr_from_thread(DF_Entity *thread) U64 thread_info_addr = ctrl_tls_root_vaddr_from_thread(thread->ctrl_machine_id, thread->ctrl_handle); U64 tls_addr_off = tls_index*addr_size; U64 tls_addr_array = 0; - String8 tls_addr_array_data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size)); + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size)); + String8 tls_addr_array_data = tls_addr_array_slice.data; if(tls_addr_array_data.size >= 8) { MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); } - String8 result_data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size)); + CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size)); + String8 result_data = result_slice.data; if(result_data.size >= 8) { MemoryCopy(&base_vaddr, result_data.str, sizeof(U64)); @@ -3953,7 +3955,8 @@ df_eval_memory_read(void *u, void *out, U64 addr, U64 size) Assert(process->kind == DF_EntityKind_Process); Temp scratch = scratch_begin(0, 0); B32 result = 0; - String8 data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(addr, addr+size)); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(addr, addr+size)); + String8 data = slice.data; if(data.size == size) { result = 1; @@ -4251,7 +4254,8 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c Rng1U64 vaddr_range = r1u64(eval.offset, eval.offset + type_byte_size); if(dim_1u64(vaddr_range) == type_byte_size) { - String8 data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_range); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_range); + String8 data = slice.data; MemoryZeroArray(eval.imm_u128); MemoryCopy(eval.imm_u128, data.str, Min(data.size, sizeof(U64)*2)); eval.mode = EVAL_EvalMode_Value; @@ -4328,14 +4332,16 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_Ctr { 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)); + CTRL_ProcessMemorySlice ptr_value_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, + r1u64(ptr_vaddr, ptr_vaddr+addr_size)); + String8 ptr_value_memory = ptr_value_slice.data; 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)); + CTRL_ProcessMemorySlice vtable_base_ptr_slice = 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)); + String8 vtable_base_ptr_memory = vtable_base_ptr_slice.data; if(vtable_base_ptr_memory.size >= addr_size) { U64 vtable_vaddr = 0; diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index f73482dd..8a559f2d 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6786,7 +6786,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(!has_array && direct_type_is_string && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && eval.mode == EVAL_EvalMode_Addr) { U64 string_memory_addr = value_eval.imm_u64; - String8 text = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, max_U64); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, max_U64); + String8 text = text_slice.data; space_taken += f_dim_from_tag_size_string(font, font_size, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\"")); @@ -6858,7 +6859,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags special_case = 1; DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - String8 text = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, max_U64); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, max_U64); + String8 text = text_slice.data; space_taken += f_dim_from_tag_size_string(font, font_size, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\"")); @@ -9009,6 +9011,9 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx->thread); + DF_Entity *selected_thread_process = df_entity_ancestor_from_kind(selected_thread, DF_EntityKind_Process); + U64 selected_thread_rip_unwind_vaddr = df_query_cached_rip_from_thread_unwind(selected_thread, ctrl_ctx->unwind_count); + DF_Entity *selected_thread_module = df_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); CTRL_Event stop_event = df_ctrl_last_stop_event(); DF_Entity *stopper_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); B32 is_focused = ui_is_focus_active(); @@ -9847,7 +9852,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { has_line_info = (src2dasm_list->first->v.remap_line == line_num); line_info_line_num = line_num; - line_info_t = src2dasm_list->first->v.binary->alive_t; + line_info_t = selected_thread_module->alive_t; } if(dasm2src_list->first != 0) { @@ -9866,7 +9871,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ DF_Entity *binary = dasm2src_info->binary; has_line_info = 1; line_info_line_num = dasm2src_info->pt.line; - line_info_t = binary->alive_t; + line_info_t = selected_thread_module->alive_t; } } if(has_line_info) @@ -9969,7 +9974,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { mapped_special = 1; new_color_kind = DF_ThemeColor_CodeFunction; - mix_t = binary->alive_t; + mix_t = selected_thread_module->alive_t; } } if(!mapped_special) @@ -9979,7 +9984,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { mapped_special = 1; new_color_kind = DF_ThemeColor_CodeType; - mix_t = binary->alive_t; + mix_t = selected_thread_module->alive_t; } } if(!mapped_special) @@ -9989,7 +9994,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { mapped_special = 1; new_color_kind = DF_ThemeColor_CodeLocal; - mix_t = binary->alive_t; + mix_t = selected_thread_module->alive_t; } } break; diff --git a/src/df/gfx/df_view_rule_hooks.c b/src/df/gfx/df_view_rule_hooks.c index 2d4c0550..6b53f149 100644 --- a/src/df/gfx/df_view_rule_hooks.c +++ b/src/df/gfx/df_view_rule_hooks.c @@ -30,7 +30,8 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed U64 array_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key); U64 array_total_size_capped = ClampTop(array_total_size, 64); Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); - String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng); + CTRL_ProcessMemorySlice array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng); + String8 array_memory = array_slice.data; TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, raddbg, type_key); TG_Kind element_type_kind = tg_kind_from_key(element_type_key); U64 element_type_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, element_type_key); @@ -66,7 +67,8 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed U64 struct_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key); U64 struct_total_size_capped = ClampTop(struct_total_size, 64); Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); - String8 struct_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng); + CTRL_ProcessMemorySlice struct_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng); + String8 struct_memory = struct_slice.data; TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, raddbg, type_key); for(U64 element_idx = 0, member_idx = 0; element_idx < 4 && member_idx < type->count; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index dc66c9c6..2e0b8ca1 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1032,7 +1032,23 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: build normal row if(!(row->flags & DF_EvalVizRowFlag_Canvas)) { - ui_set_next_flags(disabled_flags); + B32 row_is_fresh = 0; + if(row->eval.mode == EVAL_EvalMode_Addr) + { + Temp temp = temp_begin(scratch.arena); + U64 vaddr = row->eval.offset; + U64 size = tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(vaddr, vaddr+size)); + row_is_fresh = slice.fresh; + temp_end(temp); + } + ui_set_next_flags(disabled_flags|(UI_BoxFlag_DrawBackground*row_is_fresh)); + if(row_is_fresh) + { + Vec4F32 fresh_bg_color = df_rgba_from_theme_color(DF_ThemeColor_Highlight0); + fresh_bg_color.w *= 0.25f; + ui_set_next_background_color(fresh_bg_color); + } UI_NamedTableVectorF("row_%I64x", row_hash) { //- rjf: expression diff --git a/src/hash_store/hash_store.c b/src/hash_store/hash_store.c index b8d89673..0d25bdce 100644 --- a/src/hash_store/hash_store.c +++ b/src/hash_store/hash_store.c @@ -122,7 +122,7 @@ hs_submit_data(U128 key, Arena **data_arena, String8 data) } //- rjf: commit this hash to key cache - U128 key_old_hash = {0}; + U128 key_expired_hash = {0}; OS_MutexScopeW(key_stripe->rw_mutex) { HS_KeyNode *key_node = 0; @@ -142,15 +142,19 @@ hs_submit_data(U128 key, Arena **data_arena, String8 data) } if(key_node) { - key_old_hash = key_node->hash; - key_node->hash = hash; + if(key_node->hash_history_gen+1 >= ArrayCount(key_node->hash_history)) + { + key_expired_hash = key_node->hash_history[(key_node->hash_history_gen-1)%ArrayCount(key_node->hash_history)]; + } + key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)] = hash; + key_node->hash_history_gen += 1; } } - //- rjf: if this key was correllated with an old hash, dec key ref count of old hash - if(!u128_match(key_old_hash, u128_zero())) + //- rjf: if this key's history cache was full, dec key ref count of oldest hash + if(!u128_match(key_expired_hash, u128_zero())) { - U64 old_hash_slot_idx = key_old_hash.u64[1]%hs_shared->slots_count; + U64 old_hash_slot_idx = key_expired_hash.u64[1]%hs_shared->slots_count; U64 old_hash_stripe_idx = old_hash_slot_idx%hs_shared->stripes_count; HS_Slot *old_hash_slot = &hs_shared->slots[old_hash_slot_idx]; HS_Stripe *old_hash_stripe = &hs_shared->stripes[old_hash_stripe_idx]; @@ -158,7 +162,7 @@ hs_submit_data(U128 key, Arena **data_arena, String8 data) { for(HS_Node *n = old_hash_slot->first; n != 0; n = n->next) { - if(u128_match(n->hash, key_old_hash)) + if(u128_match(n->hash, key_expired_hash)) { ins_atomic_u64_dec_eval(&n->key_ref_count); break; @@ -250,9 +254,9 @@ hs_hash_from_key(U128 key) { for(HS_KeyNode *n = key_slot->first; n != 0; n = n->next) { - if(u128_match(n->key, key)) + if(u128_match(n->key, key) && n->hash_history_gen > 0) { - result = n->hash; + result = n->hash_history[(n->hash_history_gen-1)%ArrayCount(n->hash_history)]; break; } } diff --git a/src/hash_store/hash_store.h b/src/hash_store/hash_store.h index 10e11e3d..bec35029 100644 --- a/src/hash_store/hash_store.h +++ b/src/hash_store/hash_store.h @@ -12,7 +12,8 @@ struct HS_KeyNode { HS_KeyNode *next; U128 key; - U128 hash; + U128 hash_history[2]; + U64 hash_history_gen; }; typedef struct HS_KeySlot HS_KeySlot; From b14b9f034454384ed1a255c94d2dd4c7be08884f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 09:09:36 -0800 Subject: [PATCH 09/13] strip out ctrl process memory cache fresh flags & hash history, since both will be replaced by hash store layer's capabilities --- src/ctrl/ctrl_core.c | 11 ----------- src/ctrl/ctrl_core.h | 2 -- src/hash_store/hash_store.c | 6 +++--- src/hash_store/hash_store.h | 2 +- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 37e5f437..a0363a3c 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -821,7 +821,6 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac { page_found = 1; MemoryCopy((U8*)read_out + (page_vaddr-page_range.min), page_data.str, KB(4)); - result.fresh = result.fresh || !!(node4->page_fresh_flags[lvl5_idx/64] & (1ull<<(lvl5_idx%64))); } else { @@ -899,16 +898,6 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac }; U128 page_key = hs_hash_from_data(str8((U8 *)page_key_data, sizeof(page_key_data))); U128 page_hash = hs_submit_data(page_key, &page_arena, str8((U8 *)page_base, KB(4))); - if(!u128_match(node4->page_hashes[lvl5_idx], u128_zero()) && - !u128_match(node4->page_hashes[lvl5_idx], page_hash)) - { - node4->page_fresh_flags[lvl5_idx/64] |= (1ull<<(lvl5_idx%64)); - } - else - { - node4->page_fresh_flags[lvl5_idx/64] &= ~(1ull<<(lvl5_idx%64)); - } - result.fresh = result.fresh || !!(node4->page_fresh_flags[lvl5_idx/64] & (1ull<<(lvl5_idx%64))); node4->page_hashes[lvl5_idx] = page_hash; } else diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index c667c7de..2187459c 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -333,8 +333,6 @@ struct CTRL_ProcessMemoryCacheNode4 { U64 page_memgen_idxs[256]; U128 page_hashes[256]; - U128 last_page_hashes[256]; - U64 page_fresh_flags[4]; }; typedef struct CTRL_ProcessMemoryCacheNode3 CTRL_ProcessMemoryCacheNode3; diff --git a/src/hash_store/hash_store.c b/src/hash_store/hash_store.c index 0d25bdce..81b7d6a2 100644 --- a/src/hash_store/hash_store.c +++ b/src/hash_store/hash_store.c @@ -243,7 +243,7 @@ hs_scope_touch_node__stripe_r_guarded(HS_Scope *scope, HS_Node *node) //~ rjf: Cache Lookup internal U128 -hs_hash_from_key(U128 key) +hs_hash_from_key(U128 key, U64 rewind_count) { U128 result = {0}; U64 key_slot_idx = key.u64[1]%hs_shared->key_slots_count; @@ -254,9 +254,9 @@ hs_hash_from_key(U128 key) { for(HS_KeyNode *n = key_slot->first; n != 0; n = n->next) { - if(u128_match(n->key, key) && n->hash_history_gen > 0) + if(u128_match(n->key, key) && n->hash_history_gen > 0 && n->hash_history_gen-1 >= rewind_count) { - result = n->hash_history[(n->hash_history_gen-1)%ArrayCount(n->hash_history)]; + result = n->hash_history[(n->hash_history_gen-1-rewind_count)%ArrayCount(n->hash_history)]; break; } } diff --git a/src/hash_store/hash_store.h b/src/hash_store/hash_store.h index bec35029..d2eae943 100644 --- a/src/hash_store/hash_store.h +++ b/src/hash_store/hash_store.h @@ -139,7 +139,7 @@ internal void hs_scope_touch_node__stripe_r_guarded(HS_Scope *scope, HS_Node *no //////////////////////////////// //~ rjf: Cache Lookups -internal U128 hs_hash_from_key(U128 key); +internal U128 hs_hash_from_key(U128 key, U64 rewind_count); internal String8 hs_data_from_hash(HS_Scope *scope, U128 hash); //////////////////////////////// From 38b113f1d0139998435dd7a7810e9b9009565135 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 10:04:03 -0800 Subject: [PATCH 10/13] simplify & consolidate ctrl layer process memory caching mechanisms - move all non-necessarily-synchronous caching to background memory streaming thread cache --- src/ctrl/ctrl_core.c | 303 ++++++++++++++++-------------------------- src/ctrl/ctrl_core.h | 53 ++------ src/df/core/df_core.c | 2 +- src/df/gfx/df_views.c | 18 +-- 4 files changed, 123 insertions(+), 253 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index a0363a3c..a974beb4 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -754,189 +754,12 @@ ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, return actual_bytes_read; } -internal CTRL_ProcessMemorySlice -ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range) -{ - CTRL_ProcessMemorySlice result = {0}; - if(range.max > range.min && - dim_1u64(range) <= MB(256) && - range.min <= 0x000FFFFFFFFFFFFFull && - range.max <= 0x000FFFFFFFFFFFFFull) - { - HS_Scope *scope = hs_scope_open(); - CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; - - //- rjf: unpack address range - Rng1U64 page_range = r1u64(AlignDownPow2(range.min, KB(4)), AlignPow2(range.max, KB(4))); - - //- rjf: setup output memory for read - void *read_out = push_array(arena, U8, dim_1u64(page_range)); - - //- rjf: unpack process/machine params - U64 hash = ctrl_hash_from_string(str8_struct(&process)); - U64 slot_idx = hash%cache->slots_count; - U64 stripe_idx = slot_idx%cache->stripes_count; - CTRL_ProcessMemoryCacheSlot *slot = &cache->slots[slot_idx]; - CTRL_ProcessMemoryCacheStripe *stripe = &cache->stripes[stripe_idx]; - - //- rjf: cache lookup & fill loop - for(U64 page_vaddr = page_range.min; page_vaddr < page_range.max; page_vaddr += KB(4)) - { - // rjf: unpack page base address - U64 lvl5_idx = (page_vaddr&0x00000000000FF000ull) >> 12; - U64 lvl4_idx = (page_vaddr&0x000000000FF00000ull) >> 20; - U64 lvl3_idx = (page_vaddr&0x0000000FF0000000ull) >> 28; - U64 lvl2_idx = (page_vaddr&0x00000FF000000000ull) >> 36; - U64 lvl1_idx = (page_vaddr&0x000FF00000000000ull) >> 44; - - // rjf: try to find node & read from it - B32 node_found = 0; - B32 page_found = 0; - B32 page_stale = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - CTRL_ProcessMemoryCacheNode *node = 0; - for(CTRL_ProcessMemoryCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(process, n->process) && n->machine_id == machine_id) - { - node = n; - break; - } - } - if(node != 0) - { - node_found = 1; - CTRL_ProcessMemoryCacheNode1 *node1 = node->children[lvl1_idx]; - CTRL_ProcessMemoryCacheNode2 *node2 = node1 ? node1->children[lvl2_idx] : 0; - CTRL_ProcessMemoryCacheNode3 *node3 = node2 ? node2->children[lvl3_idx] : 0; - CTRL_ProcessMemoryCacheNode4 *node4 = node3 ? node3->children[lvl4_idx] : 0; - U128 page_hash = node4 ? node4->page_hashes[lvl5_idx] : u128_zero(); - B32 stale = (node4 && node4->page_memgen_idxs[lvl5_idx] < ctrl_memgen_idx()); - if(!u128_match(page_hash, u128_zero())) - { - page_stale = stale; - String8 page_data = hs_data_from_hash(scope, page_hash); - if(page_data.size >= KB(4)) - { - page_found = 1; - MemoryCopy((U8*)read_out + (page_vaddr-page_range.min), page_data.str, KB(4)); - } - else - { - page_stale = 1; - } - } - } - } - - // rjf: either node or page not found? -> need a hard-lock & fill - if(!node_found || !page_found || page_stale) OS_MutexScopeW(stripe->rw_mutex) - { - CTRL_ProcessMemoryCacheNode *node = 0; - for(CTRL_ProcessMemoryCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(process, n->process) && n->machine_id == machine_id) - { - node = n; - break; - } - } - if(node == 0) - { - Arena *node_arena = arena_alloc(); - node = push_array(node_arena, CTRL_ProcessMemoryCacheNode, 1); - node->arena = node_arena; - node->machine_id = machine_id; - node->process = process; - node->range_hash_slots_count = 1024; - node->range_hash_slots = push_array(node_arena, CTRL_ProcessMemoryRangeHashSlot, node->range_hash_slots_count); - DLLPushBack(slot->first, slot->last, node); - } - if(!page_found || page_stale) - { - CTRL_ProcessMemoryCacheNode1 *node1 = node->children[lvl1_idx]; - if(node1 == 0) - { - node1 = push_array(node->arena, CTRL_ProcessMemoryCacheNode1, 1); - node->children[lvl1_idx] = node1; - } - CTRL_ProcessMemoryCacheNode2 *node2 = node1->children[lvl2_idx]; - if(node2 == 0) - { - node2 = push_array(node->arena, CTRL_ProcessMemoryCacheNode2, 1); - node1->children[lvl2_idx] = node2; - } - CTRL_ProcessMemoryCacheNode3 *node3 = node2->children[lvl3_idx]; - if(node3 == 0) - { - node3 = push_array(node->arena, CTRL_ProcessMemoryCacheNode3, 1); - node2->children[lvl3_idx] = node3; - } - CTRL_ProcessMemoryCacheNode4 *node4 = node3->children[lvl4_idx]; - if(node4 == 0) - { - node4 = push_array(node->arena, CTRL_ProcessMemoryCacheNode4, 1); - node3->children[lvl4_idx] = node4; - } - Arena *page_arena = arena_alloc__sized(KB(8), KB(8)); - void *page_base = push_array_no_zero(page_arena, U8, KB(4)); - U64 actual_read_size = ctrl_process_read(machine_id, process, r1u64(page_vaddr, page_vaddr+KB(4)), page_base); - if(actual_read_size >= KB(4)) - { - node4->page_memgen_idxs[lvl5_idx] = ctrl_memgen_idx(); - if(page_stale) - { - MemoryCopy((U8*)read_out + (page_vaddr-page_range.min), page_base, KB(4)); - } - U64 page_key_data[] = - { - (U64)machine_id, - (U64)process.u64[0], - page_vaddr, - page_vaddr+KB(4), - }; - U128 page_key = hs_hash_from_data(str8((U8 *)page_key_data, sizeof(page_key_data))); - U128 page_hash = hs_submit_data(page_key, &page_arena, str8((U8 *)page_base, KB(4))); - node4->page_hashes[lvl5_idx] = page_hash; - } - else - { - arena_release(page_arena); - } - } - } - } - - //- rjf: fill result by skipping/chopping read memory - U64 byte_in_page_idx = (range.min&0x0000000000000FFFull) >> 0; - result.data.str = (U8*)read_out + byte_in_page_idx; - result.data.size = dim_1u64(range); - hs_scope_close(scope); - } - return result; -} - -internal CTRL_ProcessMemorySlice -ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us) -{ - CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit)); - for(U64 idx = 0; idx < result.data.size; idx += 1) - { - if(result.data.str[idx] == 0) - { - result.data.size = idx; - break; - } - } - return result; -} - internal B32 -ctrl_process_write_data(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, String8 data) +ctrl_process_write(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *src) { ProfBeginFunction(); - B32 result = demon_write_memory(ctrl_demon_handle_from_ctrl(process), vaddr, data.str, data.size); + U64 size = dim_1u64(range); + B32 result = demon_write_memory(ctrl_demon_handle_from_ctrl(process), range.min, src, size); if(result) { ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx); @@ -945,6 +768,23 @@ ctrl_process_write_data(CTRL_MachineID machine_id, CTRL_Handle process, U64 vadd return result; } +//- rjf: process memory cache interaction + +internal U128 +ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated) +{ + U64 key_hash_data[] = + { + (U64)machine_id, + (U64)process.u64[0], + range.min, + range.max, + (U64)zero_terminated, + }; + U128 key = hs_hash_from_data(str8((U8*)key_hash_data, sizeof(key_hash_data))); + return key; +} + internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated) { @@ -1056,6 +896,98 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle return result; } +//- rjf: process memory cache reading helpers + +internal CTRL_ProcessMemorySlice +ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range) +{ + CTRL_ProcessMemorySlice result = {0}; + if(range.max > range.min && + dim_1u64(range) <= MB(256) && + range.min <= 0x000FFFFFFFFFFFFFull && + range.max <= 0x000FFFFFFFFFFFFFull) + { + Temp scratch = scratch_begin(&arena, 1); + HS_Scope *scope = hs_scope_open(); + CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; + + //- rjf: unpack address range, prepare per-touched-page info + U64 page_size = KB(4); + Rng1U64 page_range = r1u64(AlignDownPow2(range.min, page_size), AlignPow2(range.max, page_size)); + U64 page_count = dim_1u64(page_range)/page_size; + U128 *page_hashes = push_array(scratch.arena, U128, page_count); + U128 *page_last_hashes = push_array(scratch.arena, U128, page_count); + + //- rjf: gather hashes for each page + for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) + { + U64 page_base_vaddr = page_range.min + page_idx*page_size; + U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); + page_hashes[page_idx] = page_hash; + } + + //- rjf: gather last hashes for each page + for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) + { + U64 page_base_vaddr = page_range.min + page_idx*page_size; + U128 page_key = ctrl_hash_store_key_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); + U128 page_last_hash = hs_hash_from_key(page_key, 1); + page_last_hashes[page_idx] = page_last_hash; + } + + //- rjf: setup output buffer + void *read_out = push_array(arena, U8, dim_1u64(range)); + + //- rjf: iterate pages, fill output + { + U64 write_off = 0; + for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) + { + String8 data = hs_data_from_hash(scope, page_hashes[page_idx]); + Rng1U64 data_vaddr_range = r1u64(page_range.min + page_idx*page_size, page_range.min + page_idx*page_size+data.size); + String8 in_range_data = data; + if(page_idx == page_count-1 && data_vaddr_range.max > range.max) + { + in_range_data = str8_chop(in_range_data, data_vaddr_range.max-range.max); + } + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + in_range_data = str8_skip(in_range_data, range.min-data_vaddr_range.min); + } + MemoryCopy((U8*)read_out+write_off, in_range_data.str, in_range_data.size); + write_off += in_range_data.size; + if(data.size < page_size) + { + write_off += page_size-data.size; + } + } + } + + //- rjf: fill result + result.data.str = (U8*)read_out; + result.data.size = dim_1u64(range); + + hs_scope_close(scope); + scratch_end(scratch); + } + return result; +} + +internal CTRL_ProcessMemorySlice +ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us) +{ + CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit)); + for(U64 idx = 0; idx < result.data.size; idx += 1) + { + if(result.data.str[idx] == 0) + { + result.data.size = idx; + break; + } + } + return result; +} + //- rjf: register reading/writing internal void * @@ -3175,6 +3107,7 @@ ctrl_mem_stream_thread__entry_point(void *p) Rng1U64 vaddr_range = {0}; B32 zero_terminated = 0; ctrl_u2ms_dequeue_req(&machine_id, &process, &vaddr_range, &zero_terminated); + U128 key = ctrl_hash_store_key_from_process_vaddr_range(machine_id, process, vaddr_range, zero_terminated); //- rjf: unpack process memory cache key U64 process_hash = ctrl_hash_from_string(str8_struct(&process)); @@ -3247,16 +3180,6 @@ ctrl_mem_stream_thread__entry_point(void *p) } } - //- rjf: determine key for this region - U64 key_hash_data[] = - { - (U64)machine_id, - (U64)process.u64[0], - vaddr_range.min, - vaddr_range.min + zero_terminated_size, - }; - U128 key = hs_hash_from_data(str8((U8 *)key_hash_data, sizeof(key_hash_data))); - //- rjf: read successful -> submit to hash store U128 hash = {0}; if(got_task && range_base != 0) diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 2187459c..2ec06297 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -311,48 +311,6 @@ struct CTRL_EventList //////////////////////////////// //~ rjf: Process Memory Cache Types -// NOTE(rjf): -// -// Process memory is cached with a 5-level page table. Each level has 256 -// slots, and is indexed into with 8 bits. Each index is extracted from a -// virtual address in the following manner: -// -// |1------||2------||3------||4------||5------||byte-n-page| -// xxxxxxxx xxxx0000 00000000 00000000 00000000 00000000 0000xxxx xxxxxxxx -// -// The top 12 bits are not used (a 52-bit address space is supported at most). -// The next 8 most-significant-bits are used to index into the level 1 table. -// The next 8 are used to index into the level 2. Then the level 3. Then the -// level 4. At the level 4 table, instead of pointing to other tables, each -// slot points at the base address of a cached 4KB page. The next 8 bits are -// used to index into that table. The final 12 bits in the address are used -// to refer to unique bytes within each page. - -typedef struct CTRL_ProcessMemoryCacheNode4 CTRL_ProcessMemoryCacheNode4; -struct CTRL_ProcessMemoryCacheNode4 -{ - U64 page_memgen_idxs[256]; - U128 page_hashes[256]; -}; - -typedef struct CTRL_ProcessMemoryCacheNode3 CTRL_ProcessMemoryCacheNode3; -struct CTRL_ProcessMemoryCacheNode3 -{ - CTRL_ProcessMemoryCacheNode4 *children[256]; -}; - -typedef struct CTRL_ProcessMemoryCacheNode2 CTRL_ProcessMemoryCacheNode2; -struct CTRL_ProcessMemoryCacheNode2 -{ - CTRL_ProcessMemoryCacheNode3 *children[256]; -}; - -typedef struct CTRL_ProcessMemoryCacheNode1 CTRL_ProcessMemoryCacheNode1; -struct CTRL_ProcessMemoryCacheNode1 -{ - CTRL_ProcessMemoryCacheNode2 *children[256]; -}; - typedef struct CTRL_ProcessMemoryRangeHashNode CTRL_ProcessMemoryRangeHashNode; struct CTRL_ProcessMemoryRangeHashNode { @@ -379,7 +337,6 @@ struct CTRL_ProcessMemoryCacheNode Arena *arena; CTRL_MachineID machine_id; CTRL_Handle process; - CTRL_ProcessMemoryCacheNode1 *children[256]; U64 range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_hash_slots; }; @@ -410,6 +367,7 @@ typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; struct CTRL_ProcessMemorySlice { String8 data; + U64 *byte_good_flags; B32 fresh; }; @@ -567,10 +525,15 @@ internal Architecture ctrl_arch_from_handle(CTRL_MachineID machine, CTRL_Handle //- rjf: process memory reading/writing internal U64 ctrl_process_read(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *dst); +internal B32 ctrl_process_write(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, void *src); + +//- rjf: process memory cache interaction +internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated); +internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated); + +//- rjf: process memory cache reading helpers internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range); internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, U64 limit, U64 endt_us); -internal B32 ctrl_process_write_data(CTRL_MachineID machine_id, CTRL_Handle process, U64 vaddr, String8 data); -internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, CTRL_Handle process, Rng1U64 range, B32 zero_terminated); //- rjf: register reading/writing internal void *ctrl_reg_block_from_thread(CTRL_MachineID machine_id, CTRL_Handle thread); diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 62f0ca98..3d406cb5 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4878,7 +4878,7 @@ df_commit_eval_value(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, default:{}break; case EVAL_EvalMode_Addr: { - ctrl_process_write_data(process->ctrl_machine_id, process->ctrl_handle, dst_eval.offset, commit_data); + ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.offset, dst_eval.offset+commit_data.size), commit_data.str); }break; case EVAL_EvalMode_Reg: { diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 2e0b8ca1..dc66c9c6 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1032,23 +1032,7 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: build normal row if(!(row->flags & DF_EvalVizRowFlag_Canvas)) { - B32 row_is_fresh = 0; - if(row->eval.mode == EVAL_EvalMode_Addr) - { - Temp temp = temp_begin(scratch.arena); - U64 vaddr = row->eval.offset; - U64 size = tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(vaddr, vaddr+size)); - row_is_fresh = slice.fresh; - temp_end(temp); - } - ui_set_next_flags(disabled_flags|(UI_BoxFlag_DrawBackground*row_is_fresh)); - if(row_is_fresh) - { - Vec4F32 fresh_bg_color = df_rgba_from_theme_color(DF_ThemeColor_Highlight0); - fresh_bg_color.w *= 0.25f; - ui_set_next_background_color(fresh_bg_color); - } + ui_set_next_flags(disabled_flags); UI_NamedTableVectorF("row_%I64x", row_hash) { //- rjf: expression From 168f66cc99455774e60be4e27e6368af99762fe0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jan 2024 11:17:16 -0800 Subject: [PATCH 11/13] further progress on new process memory cache; first pass at visualizing changed watch window rows, based on ctrl process memory cache history --- src/ctrl/ctrl_core.c | 62 +++++++++++++++++++++++++++++-------- src/ctrl/ctrl_core.h | 4 +-- src/df/gfx/df_gfx.c | 1 + src/df/gfx/df_views.c | 27 +++++++++++++++- src/hash_store/hash_store.c | 4 +-- src/scratch/ryan_scratch.c | 15 +++++---- 6 files changed, 87 insertions(+), 26 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index a974beb4..0bc0b513 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -918,33 +918,32 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac U128 *page_hashes = push_array(scratch.arena, U128, page_count); U128 *page_last_hashes = push_array(scratch.arena, U128, page_count); - //- rjf: gather hashes for each page - for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) - { - U64 page_base_vaddr = page_range.min + page_idx*page_size; - U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); - page_hashes[page_idx] = page_hash; - } - - //- rjf: gather last hashes for each page + //- rjf: gather hashes & last-hashes for each page for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) { U64 page_base_vaddr = page_range.min + page_idx*page_size; U128 page_key = ctrl_hash_store_key_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); + U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); U128 page_last_hash = hs_hash_from_key(page_key, 1); + page_hashes[page_idx] = page_hash; page_last_hashes[page_idx] = page_last_hash; } - //- rjf: setup output buffer + //- rjf: setup output buffers void *read_out = push_array(arena, U8, dim_1u64(range)); + U64 *byte_bad_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); + U64 *byte_changed_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); //- rjf: iterate pages, fill output { U64 write_off = 0; for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) { + // rjf: read data for this page String8 data = hs_data_from_hash(scope, page_hashes[page_idx]); Rng1U64 data_vaddr_range = r1u64(page_range.min + page_idx*page_size, page_range.min + page_idx*page_size+data.size); + + // rjf: skip/chop bytes which are irrelevant for the actual requested read String8 in_range_data = data; if(page_idx == page_count-1 && data_vaddr_range.max > range.max) { @@ -954,11 +953,42 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac { in_range_data = str8_skip(in_range_data, range.min-data_vaddr_range.min); } + + // rjf: write this chunk MemoryCopy((U8*)read_out+write_off, in_range_data.str, in_range_data.size); + + // rjf: if this page's hash & last_hash don't match, diff each byte & + // fill out changed flags + if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx])) + { + String8 last_data = hs_data_from_hash(scope, page_last_hashes[page_idx]); + String8 in_range_last_data = last_data; + if(page_idx == page_count-1 && data_vaddr_range.max > range.max) + { + in_range_last_data = str8_chop(in_range_last_data, data_vaddr_range.max-range.max); + } + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + in_range_last_data = str8_skip(in_range_last_data, range.min-data_vaddr_range.min); + } + for(U64 idx = 0; idx < in_range_data.size; idx += 1) + { + U8 last_byte = idx < in_range_last_data.size ? in_range_last_data.str[idx] : 0; + U8 now_byte = idx < in_range_data.size ? in_range_data.str[idx] : 0; + if(last_byte != now_byte) + { + U64 idx_in_read_out = write_off+idx; + byte_changed_flags[idx_in_read_out/64] |= (1ull<<(idx_in_read_out%64)); + } + } + } + + // rjf: increment past this chunk write_off += in_range_data.size; if(data.size < page_size) { - write_off += page_size-data.size; + U64 missed_byte_count = page_size-data.size; + write_off += missed_byte_count; } } } @@ -966,6 +996,8 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac //- rjf: fill result result.data.str = (U8*)read_out; result.data.size = dim_1u64(range); + result.byte_bad_flags = byte_bad_flags; + result.byte_changed_flags = byte_changed_flags; hs_scope_close(scope); scratch_end(scratch); @@ -3121,7 +3153,9 @@ ctrl_mem_stream_thread__entry_point(void *p) //- rjf: take task B32 got_task = 0; - OS_MutexScopeR(process_stripe->rw_mutex) + U64 preexisting_memgen_idx = 0; + U128 preexisting_hash = {0}; + OS_MutexScopeW(process_stripe->rw_mutex) { for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) { @@ -3134,6 +3168,8 @@ ctrl_mem_stream_thread__entry_point(void *p) if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated) { got_task = !ins_atomic_u32_eval_cond_assign(&range_n->is_taken, 1, 0); + preexisting_memgen_idx = range_n->memgen_idx; + preexisting_hash = range_n->hash; goto take_task__break_all; } } @@ -3148,7 +3184,7 @@ ctrl_mem_stream_thread__entry_point(void *p) void *range_base = 0; U64 zero_terminated_size = 0; U64 memgen_idx = ctrl_memgen_idx(); - if(got_task) + if(got_task && memgen_idx != preexisting_memgen_idx) { range_size = dim_1u64(vaddr_range); U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, KB(64)); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 2ec06297..52d1adf8 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -367,8 +367,8 @@ typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; struct CTRL_ProcessMemorySlice { String8 data; - U64 *byte_good_flags; - B32 fresh; + U64 *byte_bad_flags; + U64 *byte_changed_flags; }; //////////////////////////////// diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 8a559f2d..54ace1a9 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -3045,6 +3045,7 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D } ui_labelf("Target Hz: %.2f", 1.f/df_dt()); ui_labelf("Ctrl Run Index: %I64u", ctrl_run_idx()); + ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_memgen_idx()); ui_labelf("Window %p", window); ui_set_next_pref_width(ui_children_sum(1)); ui_set_next_pref_height(ui_children_sum(1)); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index dc66c9c6..78da164c 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -976,6 +976,27 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW B32 row_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); DF_EvalHistoryCacheNode *history_cache_node = df_eval_history_cache_node_from_key(eval_view, row->key); + //- rjf: determine if row's data is fresh + B32 row_is_fresh = 0; + switch(row->eval.mode) + { + default:{}break; + case EVAL_EvalMode_Addr: + { + U64 size = tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key); + Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng); + for(U64 idx = 0; idx < (size+63)/64; idx += 1) + { + if(slice.byte_changed_flags[idx] != 0) + { + row_is_fresh = 1; + break; + } + } + }break; + } + //- rjf: store root edit commit info if(row_selected) { @@ -1032,7 +1053,11 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW //- rjf: build normal row if(!(row->flags & DF_EvalVizRowFlag_Canvas)) { - ui_set_next_flags(disabled_flags); + ui_set_next_flags(disabled_flags|(row_is_fresh*UI_BoxFlag_DrawOverlay)); + if(row_is_fresh) + { + ui_set_next_overlay_color(mul_4f32(df_rgba_from_theme_color(DF_ThemeColor_Highlight0), v4f32(1, 1, 1, 0.2f))); + } UI_NamedTableVectorF("row_%I64x", row_hash) { //- rjf: expression diff --git a/src/hash_store/hash_store.c b/src/hash_store/hash_store.c index 81b7d6a2..c80cd191 100644 --- a/src/hash_store/hash_store.c +++ b/src/hash_store/hash_store.c @@ -142,9 +142,9 @@ hs_submit_data(U128 key, Arena **data_arena, String8 data) } if(key_node) { - if(key_node->hash_history_gen+1 >= ArrayCount(key_node->hash_history)) + if(key_node->hash_history_gen >= ArrayCount(key_node->hash_history)) { - key_expired_hash = key_node->hash_history[(key_node->hash_history_gen-1)%ArrayCount(key_node->hash_history)]; + key_expired_hash = key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)]; } key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)] = hash; key_node->hash_history_gen += 1; diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 0c2a5a40..265cda0c 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -1,17 +1,16 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -int Foo(int x, int y) -{ - return x + y; -} - int main(void) { + int x = 0; + int y = 0; + int z = 0; + for(;;) { - int x = 23; - int y = 45; - Foo(x, y); + x += 1; + y += 1; + z += 1; } return 0; } From fc9449a2d5b9dc57e2a664e6abb1f9a49dba3e48 Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Thu, 25 Jan 2024 11:10:09 -0800 Subject: [PATCH 12/13] make sure github action fails on error --- .github/workflows/builds.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 897f9883..d73f27c3 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -20,9 +20,9 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build raddbg msvc debug - call build raddbg_from_pdb msvc debug - call build raddbg_from_dwarf msvc debug - call build raddbg clang debug - call build raddbg_from_pdb clang debug - call build raddbg_from_dwarf clang debug + call build raddbg msvc debug || exit /b 1 + call build raddbg_from_pdb msvc debug || exit /b 1 + call build raddbg_from_dwarf msvc debug || exit /b 1 + call build raddbg clang debug || exit /b 1 + call build raddbg_from_pdb clang debug || exit /b 1 + call build raddbg_from_dwarf clang debug || exit /b 1 From 644a94d5ef905c3fa46c73fd37c837782e687c2f Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Thu, 25 Jan 2024 11:10:34 -0800 Subject: [PATCH 13/13] fixing clang build --- build.bat | 4 +++- src/render/d3d11/render_d3d11.cpp | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.bat b/build.bat index 130dbd30..ec33d9f8 100644 --- a/build.bat +++ b/build.bat @@ -60,6 +60,8 @@ if "%msvc%"=="1" set only_compile=/c if "%clang%"=="1" set only_compile=-c if "%msvc%"=="1" set EHsc=/EHsc if "%clang%"=="1" set EHsc= +if "%msvc%"=="1" set rc=rc.exe +if "%clang%"=="1" set rc=llvm-rc.exe :: --- Choose Compile/Link Lines ---------------------------------------------- if "%msvc%"=="1" set compile_debug=%cl_debug% @@ -79,7 +81,7 @@ if not exist local mkdir local :: --- Produce Logo Icon File ------------------------------------------------- pushd build -rc /nologo /fo logo.res ..\data\logo.rc +%rc% /nologo /fo logo.res ..\data\logo.rc || exit /b 1 popd :: --- Build & Run Metaprogram ------------------------------------------------ diff --git a/src/render/d3d11/render_d3d11.cpp b/src/render/d3d11/render_d3d11.cpp index cdd6ea66..0c031e28 100644 --- a/src/render/d3d11/render_d3d11.cpp +++ b/src/render/d3d11/render_d3d11.cpp @@ -1300,8 +1300,8 @@ r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) U32 uniform_offset[Axis2_COUNT][2] = { - { 0 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, - { 1 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, + { 0 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, + { 1 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, }; U32 uniform_count[Axis2_COUNT][2] =