more progress on entity simplification; df -> rd; eliminate dbg_frontend distinction from raddbg layer

This commit is contained in:
Ryan Fleury
2024-09-13 15:55:58 -07:00
parent 48ae9b6973
commit 8ffc9f4a9b
22 changed files with 9832 additions and 10000 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+6
View File
@@ -0,0 +1,6 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#include "raddbg_core.c"
#include "raddbg_widgets.c"
#include "raddbg_views.c"
+11
View File
@@ -0,0 +1,11 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBG_INC_H
#define RADDBG_INC_H
#include "raddbg_core.h"
#include "raddbg_widgets.h"
#include "raddbg_views.h"
#endif // RADDBG_INC_H
+31 -31
View File
@@ -50,7 +50,7 @@
// [ ] transient view timeout releasing
//
// [ ] save view column pcts; generalize to being a first-class thing in
// DF_View, e.g. by just having a string -> f32 store
// RD_View, e.g. by just having a string -> f32 store
// [ ] decay arrays to pointers in pointer/value comparison
// [ ] EVAL LOOKUP RULES -> currently going 0 -> rdis_count, but we need
// to prioritize the primary rdi
@@ -471,7 +471,7 @@
// "blocks" vs. "canvas" vs. "expansion" - etc.
// [x] @cleanup collapse DF_CfgNodes into just being MD trees, find another way
// to encode config source - don't need it at every node
// [x] @cleanup in the frontend, we are starting to have to pass down "DF_Window"
// [x] @cleanup in the frontend, we are starting to have to pass down "RD_Window"
// everywhere, because of per-window parameters (e.g. font rendering settings).
// this is really better solved by implicit thread-local parameters, similar to
// interaction registers, so that one window can "pick" all of the implicit
@@ -494,7 +494,7 @@
#define GEO_INIT_MANUAL 1
#define FNT_INIT_MANUAL 1
#define D_INIT_MANUAL 1
#define DF_INIT_MANUAL 1
#define RD_INIT_MANUAL 1
////////////////////////////////
//~ rjf: Includes
@@ -543,7 +543,7 @@
#include "draw/draw.h"
#include "ui/ui_inc.h"
#include "dbg_engine/dbg_engine_inc.h"
#include "dbg_frontend/dbg_frontend_inc.h"
#include "raddbg/raddbg_inc.h"
//- rjf: [c]
#include "base/base_inc.c"
@@ -583,7 +583,7 @@
#include "draw/draw.c"
#include "ui/ui_inc.c"
#include "dbg_engine/dbg_engine_inc.c"
#include "dbg_frontend/dbg_frontend_inc.c"
#include "raddbg/raddbg_inc.c"
////////////////////////////////
//~ rjf: Top-Level Execution Types
@@ -668,8 +668,8 @@ internal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl)
internal B32
frame(void)
{
df_frame();
return df_state->quit;
rd_frame();
return rd_state->quit;
}
////////////////////////////////
@@ -766,7 +766,7 @@ entry_point(CmdLine *cmd_line)
geo_init();
fnt_init();
d_init();
df_init(cmd_line);
rd_init(cmd_line);
}
//- rjf: setup initial target from command line args
@@ -775,8 +775,8 @@ entry_point(CmdLine *cmd_line)
if(args.node_count > 0 && args.first->string.size != 0)
{
Temp scratch = scratch_begin(0, 0);
DF_Entity *target = df_entity_alloc(df_entity_root(), DF_EntityKind_Target);
df_entity_equip_cfg_src(target, DF_CfgSrc_CommandLine);
RD_Entity *target = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Target);
rd_entity_equip_cfg_src(target, RD_CfgSrc_CommandLine);
String8List passthrough_args_list = {0};
for(String8Node *n = args.first->next; n != 0; n = n->next)
{
@@ -790,14 +790,14 @@ entry_point(CmdLine *cmd_line)
if(args.first->string.size != 0)
{
String8 exe_name = args.first->string;
DF_Entity *exe = df_entity_alloc(target, DF_EntityKind_Executable);
RD_Entity *exe = rd_entity_alloc(target, RD_EntityKind_Executable);
PathStyle style = path_style_from_str8(exe_name);
if(style == PathStyle_Relative)
{
exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name);
exe_name = path_normalized_from_string(scratch.arena, exe_name);
}
df_entity_equip_name(exe, exe_name);
rd_entity_equip_name(exe, exe_name);
}
// rjf: equip working directory
@@ -805,8 +805,8 @@ entry_point(CmdLine *cmd_line)
if(path_part_of_arg.size != 0)
{
String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg);
DF_Entity *wdir = df_entity_alloc(target, DF_EntityKind_WorkingDirectory);
df_entity_equip_name(wdir, path);
RD_Entity *wdir = rd_entity_alloc(target, RD_EntityKind_WorkingDirectory);
rd_entity_equip_name(wdir, path);
}
// rjf: equip args
@@ -814,8 +814,8 @@ entry_point(CmdLine *cmd_line)
String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join);
if(args_str.size != 0)
{
DF_Entity *args_entity = df_entity_alloc(target, DF_EntityKind_Arguments);
df_entity_equip_name(args_entity, args_str);
RD_Entity *args_entity = rd_entity_alloc(target, RD_EntityKind_Arguments);
rd_entity_equip_name(args_entity, args_str);
}
scratch_end(scratch);
}
@@ -868,8 +868,8 @@ entry_point(CmdLine *cmd_line)
if(msg.size != 0)
{
log_infof("ipc_msg: \"%S\"", msg);
DF_Window *dst_window = df_state->first_window;
for(DF_Window *window = dst_window; window != 0; window = window->next)
RD_Window *dst_window = rd_state->first_window;
for(RD_Window *window = dst_window; window != 0; window = window->next)
{
if(os_window_is_focused(window->os))
{
@@ -883,23 +883,23 @@ entry_point(CmdLine *cmd_line)
U64 first_space_pos = str8_find_needle(msg, 0, str8_lit(" "), 0);
String8 cmd_kind_name_string = str8_prefix(msg, first_space_pos);
String8 cmd_args_string = str8_skip_chop_whitespace(str8_skip(msg, first_space_pos));
DF_CmdKindInfo *cmd_kind_info = df_cmd_kind_info_from_string(cmd_kind_name_string);
if(cmd_kind_info != &df_nil_cmd_kind_info) DF_RegsScope()
RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name_string);
if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope()
{
if(dst_window != df_window_from_handle(df_regs()->window))
if(dst_window != rd_window_from_handle(rd_regs()->window))
{
df_regs()->window = df_handle_from_window(dst_window);
df_regs()->panel = df_handle_from_panel(dst_window->focused_panel);
df_regs()->view = dst_window->focused_panel->selected_tab_view;
rd_regs()->window = rd_handle_from_window(dst_window);
rd_regs()->panel = rd_handle_from_panel(dst_window->focused_panel);
rd_regs()->view = dst_window->focused_panel->selected_tab_view;
}
df_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_args_string);
df_push_cmd(cmd_kind_name_string, df_regs());
df_request_frame();
rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_args_string);
rd_push_cmd(cmd_kind_name_string, rd_regs());
rd_request_frame();
}
else
{
log_user_errorf("\"%S\" is not a command.", cmd_kind_name_string);
df_request_frame();
rd_request_frame();
}
}
}
@@ -913,21 +913,21 @@ entry_point(CmdLine *cmd_line)
if(auto_run)
{
auto_run = 0;
df_cmd(DF_CmdKind_LaunchAndRun);
rd_cmd(RD_CmdKind_LaunchAndRun);
}
//- rjf: auto step
if(auto_step)
{
auto_step = 0;
df_cmd(DF_CmdKind_StepInto);
rd_cmd(RD_CmdKind_StepInto);
}
//- rjf: jit attach
if(jit_attach)
{
jit_attach = 0;
df_cmd(DF_CmdKind_Attach, .pid = jit_pid);
rd_cmd(RD_CmdKind_Attach, .pid = jit_pid);
}
}
}
File diff suppressed because it is too large Load Diff
+183
View File
@@ -0,0 +1,183 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBG_VIEWS_H
#define RADDBG_VIEWS_H
////////////////////////////////
//~ rjf: Code View Types
typedef U32 RD_CodeViewBuildFlags;
enum
{
RD_CodeViewBuildFlag_Margins = (1<<0),
RD_CodeViewBuildFlag_All = 0xffffffff,
};
typedef struct RD_CodeViewState RD_CodeViewState;
struct RD_CodeViewState
{
// rjf: stable state
B32 initialized;
S64 preferred_column;
B32 drifted_for_search;
// rjf: per-frame command info
S64 goto_line_num;
B32 center_cursor;
B32 contain_cursor;
B32 watch_expr_at_mouse;
Arena *find_text_arena;
String8 find_text_fwd;
String8 find_text_bwd;
};
typedef struct RD_CodeViewBuildResult RD_CodeViewBuildResult;
struct RD_CodeViewBuildResult
{
DI_KeyList dbgi_keys;
};
////////////////////////////////
//~ rjf: Watch View Types
typedef enum RD_WatchViewColumnKind
{
RD_WatchViewColumnKind_Expr,
RD_WatchViewColumnKind_Value,
RD_WatchViewColumnKind_Type,
RD_WatchViewColumnKind_ViewRule,
RD_WatchViewColumnKind_Module,
RD_WatchViewColumnKind_FrameSelection,
RD_WatchViewColumnKind_Member,
RD_WatchViewColumnKind_COUNT
}
RD_WatchViewColumnKind;
typedef struct RD_WatchViewColumnParams RD_WatchViewColumnParams;
struct RD_WatchViewColumnParams
{
String8 string;
String8 display_string;
String8 view_rule;
B32 is_non_code;
B32 dequote_string;
};
typedef struct RD_WatchViewColumn RD_WatchViewColumn;
struct RD_WatchViewColumn
{
RD_WatchViewColumn *next;
RD_WatchViewColumn *prev;
RD_WatchViewColumnKind kind;
F32 pct;
U8 string_buffer[1024];
U64 string_size;
U8 display_string_buffer[1024];
U64 display_string_size;
U8 view_rule_buffer[1024];
U64 view_rule_size;
B32 is_non_code;
B32 dequote_string;
};
typedef enum RD_WatchViewFillKind
{
RD_WatchViewFillKind_Watch,
RD_WatchViewFillKind_Breakpoints,
RD_WatchViewFillKind_WatchPins,
RD_WatchViewFillKind_CallStack,
RD_WatchViewFillKind_Registers,
RD_WatchViewFillKind_Locals,
RD_WatchViewFillKind_Globals,
RD_WatchViewFillKind_ThreadLocals,
RD_WatchViewFillKind_Types,
RD_WatchViewFillKind_Procedures,
RD_WatchViewFillKind_COUNT
}
RD_WatchViewFillKind;
typedef struct RD_WatchViewPoint RD_WatchViewPoint;
struct RD_WatchViewPoint
{
S64 x;
EV_Key parent_key;
EV_Key key;
};
typedef struct RD_WatchViewTextEditState RD_WatchViewTextEditState;
struct RD_WatchViewTextEditState
{
RD_WatchViewTextEditState *pt_hash_next;
RD_WatchViewPoint pt;
TxtPt cursor;
TxtPt mark;
U8 input_buffer[1024];
U64 input_size;
U8 initial_buffer[1024];
U64 initial_size;
};
typedef struct RD_WatchViewState RD_WatchViewState;
struct RD_WatchViewState
{
B32 initialized;
// rjf: fill kinds (way that the contents of the watch view are computed)
RD_WatchViewFillKind fill_kind;
// rjf: column state
Arena *column_arena;
RD_WatchViewColumn *first_column;
RD_WatchViewColumn *last_column;
RD_WatchViewColumn *free_column;
U64 column_count;
// rjf; table cursor state
RD_WatchViewPoint cursor;
RD_WatchViewPoint mark;
RD_WatchViewPoint next_cursor;
RD_WatchViewPoint next_mark;
// rjf: text input state
Arena *text_edit_arena;
U64 text_edit_state_slots_count;
RD_WatchViewTextEditState dummy_text_edit_state;
RD_WatchViewTextEditState **text_edit_state_slots;
B32 text_editing;
};
////////////////////////////////
//~ rjf: Code View Functions
internal void rd_code_view_init(RD_CodeViewState *cv, RD_View *view);
internal void rd_code_view_cmds(RD_View *view, RD_CodeViewState *cv, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key);
internal RD_CodeViewBuildResult rd_code_view_build(Arena *arena, RD_View *view, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key);
////////////////////////////////
//~ rjf: Watch View Functions
//- rjf: index -> column
internal RD_WatchViewColumn *rd_watch_view_column_from_x(RD_WatchViewState *wv, S64 index);
//- rjf: watch view points <-> table coordinates
internal B32 rd_watch_view_point_match(RD_WatchViewPoint a, RD_WatchViewPoint b);
internal RD_WatchViewPoint rd_watch_view_point_from_tbl(EV_BlockList *blocks, Vec2S64 tbl);
internal Vec2S64 rd_tbl_from_watch_view_point(EV_BlockList *blocks, RD_WatchViewPoint pt);
//- rjf: table coordinates -> strings
internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_WatchViewColumn *col, B32 editable, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px);
//- rjf: table coordinates -> text edit state
internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchViewPoint pt);
//- rjf: watch view column state mutation
internal RD_WatchViewColumn *rd_watch_view_column_alloc_(RD_WatchViewState *wv, RD_WatchViewColumnKind kind, F32 pct, RD_WatchViewColumnParams *params);
#define rd_watch_view_column_alloc(wv, kind, pct, ...) rd_watch_view_column_alloc_((wv), (kind), (pct), &(RD_WatchViewColumnParams){.string = str8_zero(), __VA_ARGS__})
internal void rd_watch_view_column_release(RD_WatchViewState *wv, RD_WatchViewColumn *col);
//- rjf: watch view main hooks
internal void rd_watch_view_init(RD_WatchViewState *ewv, RD_View *view, RD_WatchViewFillKind fill_kind);
internal void rd_watch_view_build(RD_View *view, RD_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect);
#endif // RADDBG_VIEWS_H
File diff suppressed because it is too large Load Diff
+122
View File
@@ -0,0 +1,122 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBG_WIDGETS_H
#define RADDBG_WIDGETS_H
////////////////////////////////
//~ rjf: Line Edit Types
typedef U32 RD_LineEditFlags;
enum
{
RD_LineEditFlag_Expander = (1<<0),
RD_LineEditFlag_ExpanderSpace = (1<<1),
RD_LineEditFlag_ExpanderPlaceholder = (1<<2),
RD_LineEditFlag_DisableEdit = (1<<3),
RD_LineEditFlag_CodeContents = (1<<4),
RD_LineEditFlag_Border = (1<<5),
RD_LineEditFlag_NoBackground = (1<<6),
RD_LineEditFlag_PreferDisplayString = (1<<7),
RD_LineEditFlag_DisplayStringIsCode = (1<<8),
};
////////////////////////////////
//~ rjf: Code Slice Types
typedef U32 RD_CodeSliceFlags;
enum
{
RD_CodeSliceFlag_Clickable = (1<<0),
RD_CodeSliceFlag_PriorityMargin = (1<<1),
RD_CodeSliceFlag_CatchallMargin = (1<<2),
RD_CodeSliceFlag_LineNums = (1<<3),
};
typedef struct RD_CodeSliceParams RD_CodeSliceParams;
struct RD_CodeSliceParams
{
// rjf: content
RD_CodeSliceFlags flags;
Rng1S64 line_num_range;
String8 *line_text;
Rng1U64 *line_ranges;
TXT_TokenArray *line_tokens;
RD_EntityList *line_bps;
CTRL_EntityList *line_ips;
RD_EntityList *line_pins;
U64 *line_vaddrs;
D_LineList *line_infos;
DI_KeyList relevant_dbgi_keys;
// rjf: visual parameters
FNT_Tag font;
F32 font_size;
F32 tab_size;
String8 search_query;
F32 line_height_px;
F32 priority_margin_width_px;
F32 catchall_margin_width_px;
F32 line_num_width_px;
F32 line_text_max_width_px;
F32 margin_float_off_px;
};
typedef struct RD_CodeSliceSignal RD_CodeSliceSignal;
struct RD_CodeSliceSignal
{
UI_Signal base;
TxtPt mouse_pt;
TxtRng mouse_expr_rng;
};
////////////////////////////////
//~ rjf: UI Building Helpers
#define RD_Palette(code) UI_Palette(rd_palette_from_code(code))
#define RD_Font(slot) UI_Font(rd_font_from_slot(slot)) UI_TextRasterFlags(rd_raster_flags_from_slot((slot)))
////////////////////////////////
//~ rjf: UI Widgets: Loading Overlay
internal void rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_target);
////////////////////////////////
//~ rjf: UI Widgets: Fancy Buttons
internal void rd_cmd_binding_buttons(String8 name);
internal UI_Signal rd_menu_bar_button(String8 string);
internal UI_Signal rd_cmd_spec_button(String8 name);
internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints);
internal UI_Signal rd_icon_button(RD_IconKind kind, FuzzyMatchRangeList *matches, String8 string);
internal UI_Signal rd_icon_buttonf(RD_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...);
internal void rd_entity_tooltips(RD_Entity *entity);
internal UI_Signal rd_entity_desc_button(RD_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit);
internal void rd_src_loc_button(String8 file_path, TxtPt point);
////////////////////////////////
//~ rjf: UI Widgets: Text View
internal UI_BOX_CUSTOM_DRAW(rd_thread_box_draw_extensions);
internal UI_BOX_CUSTOM_DRAW(rd_bp_box_draw_extensions);
internal RD_CodeSliceSignal rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string);
internal RD_CodeSliceSignal rd_code_slicef(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...);
internal B32 rd_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column);
////////////////////////////////
//~ rjf: UI Widgets: Fancy Labels
internal UI_Signal rd_label(String8 string);
internal UI_Signal rd_error_label(String8 string);
internal B32 rd_help_label(String8 string);
internal DR_FancyStringList rd_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
internal UI_Box *rd_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
////////////////////////////////
//~ rjf: UI Widgets: Line Edit
internal UI_Signal rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string);
internal UI_Signal rd_line_editf(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...);
#endif // RADDBG_WIDGETS_H