diff --git a/src/dbg_frontend/dbg_frontend.mdesk b/src/dbg_frontend/dbg_frontend.mdesk index 3c8210a4..2bc3b37a 100644 --- a/src/dbg_frontend/dbg_frontend.mdesk +++ b/src/dbg_frontend/dbg_frontend.mdesk @@ -28,6 +28,74 @@ @expand(D_CfgSrcTable a) `DF_CmdKind_$(a.apply_cmd)`; } +//////////////////////////////// +//~ rjf: Registers Type Table + +@table(c_type name_lower name) +DF_RegTable: +{ + // rjf: entity slots + {D_Handle machine Machine } + {D_Handle module Module } + {D_Handle process Process } + {D_Handle thread Thread } + {D_Handle window Window } + {D_Handle panel Panel } + {D_Handle view View } + {D_Handle prev_view PrevView } + {D_Handle dst_panel DstPanel } + {D_Handle entity Entity } + {D_HandleList entity_list EntityList } + + // rjf: frame selection + {U64 unwind_count UnwindCount } + {U64 inline_depth InlineDepth } + + // rjf: code / address location info + {String8 file_path FilePath } + {TxtPt cursor Cursor } + {TxtPt mark Mark } + {U128 text_key TextKey } + {TXT_LangKind lang_kind LangKind } + {D_LineList lines Lines } + {DI_Key dbgi_key DbgiKey } + {Rng1U64 vaddr_range VaddrRange } + {Rng1U64 voff_range VoffRange } + + // rjf: general parameters + {U32 pid PID } + {B32 force_confirm ForceConfirm } + {B32 prefer_disasm PreferDisasm } + {Dir2 dir2 Dir2 } + {String8 string String } + {`MD_Node *` params_tree ParamsTree } +} + +@enum DF_RegSlot: +{ + Null, + @expand(DF_RegTable a) `$(a.name)`, + COUNT, +} + +@struct DF_Regs: +{ + @expand(DF_RegTable a) `$(a.c_type) $(a.name_lower)` +} + +@data(Rng1U64) df_reg_slot_range_table: +{ + `{0}`, + @expand(DF_RegTable a) `{OffsetOf(DF_Regs, $(a.name_lower)), OffsetOf(DF_Regs, $(a.name_lower)) + sizeof($(a.c_type))}` +} + +@gen +{ + `#define df_regs_lit_init_top \\` + @expand(DF_RegTable a) `.$(a.name_lower) = df_regs()->$(a.name_lower),\\` + ``; +} + //////////////////////////////// //~ rjf: Command Table diff --git a/src/dbg_frontend/dbg_frontend_core.c b/src/dbg_frontend/dbg_frontend_core.c index 0164e3d8..d0dd887d 100644 --- a/src/dbg_frontend/dbg_frontend_core.c +++ b/src/dbg_frontend/dbg_frontend_core.c @@ -7393,6 +7393,54 @@ df_request_frame(void) df_state->num_frames_requested = 4; } +//////////////////////////////// +//~ rjf: Main State Accessors + +internal Arena * +df_frame_arena(void) +{ + return df_state->frame_arenas[df_state->frame_index%ArrayCount(df_state->frame_arenas)]; +} + +//////////////////////////////// +//~ rjf: Registers + +internal DF_Regs * +df_regs(void) +{ + DF_Regs *regs = &df_state->top_regs->v; + return regs; +} + +internal DF_Regs * +df_base_regs(void) +{ + DF_Regs *regs = &df_state->base_regs.v; + return regs; +} + +internal DF_Regs * +df_push_regs(void) +{ + DF_Regs *top = df_regs(); + DF_RegsNode *n = push_array(df_frame_arena(), DF_RegsNode, 1); + MemoryCopyStruct(&n->v, top); + SLLStackPush(df_state->top_regs, n); + return &n->v; +} + +internal DF_Regs * +df_pop_regs(void) +{ + DF_Regs *regs = &df_state->top_regs->v; + SLLStackPop(df_state->top_regs); + if(df_state->top_regs == 0) + { + df_state->top_regs = &df_state->base_regs; + } + return regs; +} + //////////////////////////////// //~ rjf: Commands @@ -7464,6 +7512,10 @@ df_init(CmdLine *cmdln) Arena *arena = arena_alloc(); df_state = push_array(arena, DF_State, 1); df_state->arena = arena; + for(U64 idx = 0; idx < ArrayCount(df_state->frame_arenas); idx += 1) + { + df_state->frame_arenas[idx] = arena_alloc(); + } df_state->num_frames_requested = 2; df_state->seconds_until_autosave = 0.5f; df_state->cmds_arena = arena_alloc(); @@ -7648,10 +7700,10 @@ df_frame(void) // // TODO(rjf): maximize target, given all windows and their monitors F32 target_hz = os_get_gfx_info()->default_refresh_rate; - if(df_state->frame_time_us_history_idx > 32) + if(df_state->frame_index > 32) { // rjf: calculate average frame time out of the last N - U64 num_frames_in_history = Min(ArrayCount(df_state->frame_time_us_history), df_state->frame_time_us_history_idx); + U64 num_frames_in_history = Min(ArrayCount(df_state->frame_time_us_history), df_state->frame_index); U64 frame_time_history_sum_us = 0; for(U64 idx = 0; idx < num_frames_in_history; idx += 1) { @@ -12208,8 +12260,12 @@ df_frame(void) // U64 end_time_us = os_now_microseconds(); U64 frame_time_us = end_time_us-begin_time_us; - df_state->frame_time_us_history[df_state->frame_time_us_history_idx%ArrayCount(df_state->frame_time_us_history)] = frame_time_us; - df_state->frame_time_us_history_idx += 1; + df_state->frame_time_us_history[df_state->frame_index%ArrayCount(df_state->frame_time_us_history)] = frame_time_us; + + ////////////////////////////// + //- rjf: bump frame index + // + df_state->frame_index += 1; di_scope_close(di_scope); scratch_end(scratch); diff --git a/src/dbg_frontend/dbg_frontend_core.h b/src/dbg_frontend/dbg_frontend_core.h index 311fc186..2f16f1e5 100644 --- a/src/dbg_frontend/dbg_frontend_core.h +++ b/src/dbg_frontend/dbg_frontend_core.h @@ -404,6 +404,16 @@ struct DF_MsgKindInfo #include "generated/dbg_frontend.meta.h" +//////////////////////////////// +//~ rjf: Context Register Types + +typedef struct DF_RegsNode DF_RegsNode; +struct DF_RegsNode +{ + DF_RegsNode *next; + DF_Regs v; +}; + //////////////////////////////// //~ rjf: Theme Types @@ -641,10 +651,21 @@ struct DF_EvalVizViewCacheSlot typedef struct DF_State DF_State; struct DF_State { - // rjf: arenas + // rjf: top-level state Arena *arena; B32 quit; + // rjf: frame state + U64 frame_index; + Arena *frame_arenas[2]; + + // rjf: frame time history + U64 frame_time_us_history[64]; + + // rjf: registers stack + DF_RegsNode base_regs; + DF_RegsNode *top_regs; + // rjf: commands Arena *cmds_arena; D_CmdList cmds; @@ -739,10 +760,6 @@ struct DF_State // rjf: icon texture R_Handle icon_texture; - - // rjf: frame time history - U64 frame_time_us_history[64]; - U64 frame_time_us_history_idx; }; //////////////////////////////// @@ -995,6 +1012,20 @@ internal String8 df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, C internal void df_request_frame(void); +//////////////////////////////// +//~ rjf: Main State Accessors + +internal Arena *df_frame_arena(void); + +//////////////////////////////// +//~ rjf: Registers + +internal DF_Regs *df_regs(void); +internal DF_Regs *df_base_regs(void); +internal DF_Regs *df_push_regs(void); +internal DF_Regs *df_pop_regs(void); +#define DF_RegsScope DeferLoop(df_push_regs(), df_pop_regs()) + //////////////////////////////// //~ rjf: Commands diff --git a/src/dbg_frontend/generated/dbg_frontend.meta.c b/src/dbg_frontend/generated/dbg_frontend.meta.c index 4fd9e4a6..8cceda1a 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.c +++ b/src/dbg_frontend/generated/dbg_frontend.meta.c @@ -28,6 +28,39 @@ DF_CmdKind_Null, DF_CmdKind_Null, }; +Rng1U64 df_reg_slot_range_table[29] = +{ +{0}, +{OffsetOf(DF_Regs, machine), OffsetOf(DF_Regs, machine) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, module), OffsetOf(DF_Regs, module) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, process), OffsetOf(DF_Regs, process) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, thread), OffsetOf(DF_Regs, thread) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, window), OffsetOf(DF_Regs, window) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, panel), OffsetOf(DF_Regs, panel) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, view), OffsetOf(DF_Regs, view) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, prev_view), OffsetOf(DF_Regs, prev_view) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, dst_panel), OffsetOf(DF_Regs, dst_panel) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, entity), OffsetOf(DF_Regs, entity) + sizeof(D_Handle)}, +{OffsetOf(DF_Regs, entity_list), OffsetOf(DF_Regs, entity_list) + sizeof(D_HandleList)}, +{OffsetOf(DF_Regs, unwind_count), OffsetOf(DF_Regs, unwind_count) + sizeof(U64)}, +{OffsetOf(DF_Regs, inline_depth), OffsetOf(DF_Regs, inline_depth) + sizeof(U64)}, +{OffsetOf(DF_Regs, file_path), OffsetOf(DF_Regs, file_path) + sizeof(String8)}, +{OffsetOf(DF_Regs, cursor), OffsetOf(DF_Regs, cursor) + sizeof(TxtPt)}, +{OffsetOf(DF_Regs, mark), OffsetOf(DF_Regs, mark) + sizeof(TxtPt)}, +{OffsetOf(DF_Regs, text_key), OffsetOf(DF_Regs, text_key) + sizeof(U128)}, +{OffsetOf(DF_Regs, lang_kind), OffsetOf(DF_Regs, lang_kind) + sizeof(TXT_LangKind)}, +{OffsetOf(DF_Regs, lines), OffsetOf(DF_Regs, lines) + sizeof(D_LineList)}, +{OffsetOf(DF_Regs, dbgi_key), OffsetOf(DF_Regs, dbgi_key) + sizeof(DI_Key)}, +{OffsetOf(DF_Regs, vaddr_range), OffsetOf(DF_Regs, vaddr_range) + sizeof(Rng1U64)}, +{OffsetOf(DF_Regs, voff_range), OffsetOf(DF_Regs, voff_range) + sizeof(Rng1U64)}, +{OffsetOf(DF_Regs, pid), OffsetOf(DF_Regs, pid) + sizeof(U32)}, +{OffsetOf(DF_Regs, force_confirm), OffsetOf(DF_Regs, force_confirm) + sizeof(B32)}, +{OffsetOf(DF_Regs, prefer_disasm), OffsetOf(DF_Regs, prefer_disasm) + sizeof(B32)}, +{OffsetOf(DF_Regs, dir2), OffsetOf(DF_Regs, dir2) + sizeof(Dir2)}, +{OffsetOf(DF_Regs, string), OffsetOf(DF_Regs, string) + sizeof(String8)}, +{OffsetOf(DF_Regs, params_tree), OffsetOf(DF_Regs, params_tree) + sizeof(MD_Node *)}, +}; + D_CmdSpecInfo df_cmd_kind_spec_info_table[220] = { {0}, diff --git a/src/dbg_frontend/generated/dbg_frontend.meta.h b/src/dbg_frontend/generated/dbg_frontend.meta.h index 64d7f041..f314d18b 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.h +++ b/src/dbg_frontend/generated/dbg_frontend.meta.h @@ -6,6 +6,40 @@ #ifndef DBG_FRONTEND_META_H #define DBG_FRONTEND_META_H +typedef enum DF_RegSlot +{ +DF_RegSlot_Null, +DF_RegSlot_Machine, +DF_RegSlot_Module, +DF_RegSlot_Process, +DF_RegSlot_Thread, +DF_RegSlot_Window, +DF_RegSlot_Panel, +DF_RegSlot_View, +DF_RegSlot_PrevView, +DF_RegSlot_DstPanel, +DF_RegSlot_Entity, +DF_RegSlot_EntityList, +DF_RegSlot_UnwindCount, +DF_RegSlot_InlineDepth, +DF_RegSlot_FilePath, +DF_RegSlot_Cursor, +DF_RegSlot_Mark, +DF_RegSlot_TextKey, +DF_RegSlot_LangKind, +DF_RegSlot_Lines, +DF_RegSlot_DbgiKey, +DF_RegSlot_VaddrRange, +DF_RegSlot_VoffRange, +DF_RegSlot_PID, +DF_RegSlot_ForceConfirm, +DF_RegSlot_PreferDisasm, +DF_RegSlot_Dir2, +DF_RegSlot_String, +DF_RegSlot_ParamsTree, +DF_RegSlot_COUNT, +} DF_RegSlot; + typedef enum DF_CmdKind { DF_CmdKind_Null, @@ -462,6 +496,69 @@ DF_SettingCode_HintCodeText, DF_SettingCode_COUNT, } DF_SettingCode; +typedef struct DF_Regs DF_Regs; +struct DF_Regs +{ +D_Handle machine; +D_Handle module; +D_Handle process; +D_Handle thread; +D_Handle window; +D_Handle panel; +D_Handle view; +D_Handle prev_view; +D_Handle dst_panel; +D_Handle entity; +D_HandleList entity_list; +U64 unwind_count; +U64 inline_depth; +String8 file_path; +TxtPt cursor; +TxtPt mark; +U128 text_key; +TXT_LangKind lang_kind; +D_LineList lines; +DI_Key dbgi_key; +Rng1U64 vaddr_range; +Rng1U64 voff_range; +U32 pid; +B32 force_confirm; +B32 prefer_disasm; +Dir2 dir2; +String8 string; +MD_Node * params_tree; +}; + +#define df_regs_lit_init_top \ +.machine = df_regs()->machine,\ +.module = df_regs()->module,\ +.process = df_regs()->process,\ +.thread = df_regs()->thread,\ +.window = df_regs()->window,\ +.panel = df_regs()->panel,\ +.view = df_regs()->view,\ +.prev_view = df_regs()->prev_view,\ +.dst_panel = df_regs()->dst_panel,\ +.entity = df_regs()->entity,\ +.entity_list = df_regs()->entity_list,\ +.unwind_count = df_regs()->unwind_count,\ +.inline_depth = df_regs()->inline_depth,\ +.file_path = df_regs()->file_path,\ +.cursor = df_regs()->cursor,\ +.mark = df_regs()->mark,\ +.text_key = df_regs()->text_key,\ +.lang_kind = df_regs()->lang_kind,\ +.lines = df_regs()->lines,\ +.dbgi_key = df_regs()->dbgi_key,\ +.vaddr_range = df_regs()->vaddr_range,\ +.voff_range = df_regs()->voff_range,\ +.pid = df_regs()->pid,\ +.force_confirm = df_regs()->force_confirm,\ +.prefer_disasm = df_regs()->prefer_disasm,\ +.dir2 = df_regs()->dir2,\ +.string = df_regs()->string,\ +.params_tree = df_regs()->params_tree,\ + DF_VIEW_SETUP_FUNCTION_DEF(null); DF_VIEW_SETUP_FUNCTION_DEF(empty); DF_VIEW_SETUP_FUNCTION_DEF(getting_started); @@ -581,6 +678,7 @@ C_LINKAGE_BEGIN extern DF_CmdKind d_cfg_src_load_cmd_kind_table[4]; extern DF_CmdKind d_cfg_src_write_cmd_kind_table[4]; extern DF_CmdKind d_cfg_src_apply_cmd_kind_table[4]; +extern Rng1U64 df_reg_slot_range_table[29]; extern DF_StringBindingPair df_g_default_binding_table[110]; extern String8 df_g_binding_version_remap_old_name_table[7]; extern String8 df_g_binding_version_remap_new_name_table[7];