mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-21 23:12:01 -07:00
move interaction register stack into frontend layer
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user