mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-01 11:48:10 +00:00
reintroduce support for address/code-bytes toggling in disassembly view; also reintroduce support for toggle-watch-expr and goto-name commands
This commit is contained in:
@@ -383,7 +383,11 @@ dasm_parse_thread__entry_point(void *p)
|
|||||||
{
|
{
|
||||||
for(DASM_Node *n = slot->first; n != 0; n = n->next)
|
for(DASM_Node *n = slot->first; n != 0; n = n->next)
|
||||||
{
|
{
|
||||||
if(u128_match(n->hash, hash) && n->addr == addr && n->arch == arch)
|
if(u128_match(n->hash, hash) &&
|
||||||
|
n->addr == addr &&
|
||||||
|
n->arch == arch &&
|
||||||
|
n->style_flags == style_flags &&
|
||||||
|
n->syntax == syntax)
|
||||||
{
|
{
|
||||||
got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0);
|
got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0);
|
||||||
break;
|
break;
|
||||||
@@ -441,7 +445,26 @@ dasm_parse_thread__entry_point(void *p)
|
|||||||
{
|
{
|
||||||
addr_part = push_str8f(scratch.arena, "%016I64X ", addr+off);
|
addr_part = push_str8f(scratch.arena, "%016I64X ", addr+off);
|
||||||
}
|
}
|
||||||
String8 inst_string = push_str8f(scratch.arena, "%S%s", addr_part, udc.asm_buf);
|
String8 code_bytes_part = {0};
|
||||||
|
if(style_flags & DASM_StyleFlag_CodeBytes)
|
||||||
|
{
|
||||||
|
String8List code_bytes_strings = {0};
|
||||||
|
str8_list_push(scratch.arena, &code_bytes_strings, str8_lit("{"));
|
||||||
|
for(U64 byte_idx = 0; byte_idx < size || byte_idx < 16; byte_idx += 1)
|
||||||
|
{
|
||||||
|
if(byte_idx < size)
|
||||||
|
{
|
||||||
|
str8_list_pushf(scratch.arena, &code_bytes_strings, "%02x%s ", (U32)data.str[off+byte_idx], byte_idx == size-1 ? "}" : "");
|
||||||
|
}
|
||||||
|
else if(byte_idx < 8)
|
||||||
|
{
|
||||||
|
str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" "));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" "));
|
||||||
|
code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0);
|
||||||
|
}
|
||||||
|
String8 inst_string = push_str8f(scratch.arena, "%S%S%s", addr_part, code_bytes_part, udc.asm_buf);
|
||||||
DASM_Inst inst = {off, rel_voff, r1u64(inst_strings.total_size + inst_strings.node_count,
|
DASM_Inst inst = {off, rel_voff, r1u64(inst_strings.total_size + inst_strings.node_count,
|
||||||
inst_strings.total_size + inst_strings.node_count + inst_string.size)};
|
inst_strings.total_size + inst_strings.node_count + inst_string.size)};
|
||||||
dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst);
|
dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst);
|
||||||
@@ -474,6 +497,8 @@ dasm_parse_thread__entry_point(void *p)
|
|||||||
hash.u64[1],
|
hash.u64[1],
|
||||||
addr,
|
addr,
|
||||||
(U64)arch,
|
(U64)arch,
|
||||||
|
(U64)style_flags,
|
||||||
|
(U64)syntax,
|
||||||
0x4d534144,
|
0x4d534144,
|
||||||
};
|
};
|
||||||
text_key = hs_hash_from_data(str8((U8 *)hash_data, sizeof(hash_data)));
|
text_key = hs_hash_from_data(str8((U8 *)hash_data, sizeof(hash_data)));
|
||||||
|
|||||||
+1
-14
@@ -511,20 +511,7 @@ struct DF_EntityFuzzyItemArray
|
|||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Text Slices (output type from data which can be used to produce readable text)
|
//~ rjf: Source <-> Disasm Types
|
||||||
|
|
||||||
//- rjf: text slice construction flags
|
|
||||||
|
|
||||||
typedef U32 DF_TextSliceFlags;
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
DF_TextSliceFlag_CodeBytes = (1<<0),
|
|
||||||
DF_TextSliceFlag_Addresses = (1<<1),
|
|
||||||
DF_TextSliceFlag_Tokens = (1<<2),
|
|
||||||
DF_TextSliceFlag_Src2Dasm = (1<<3),
|
|
||||||
DF_TextSliceFlag_Dasm2Src = (1<<4),
|
|
||||||
DF_TextSliceFlag_VirtualOff= (1<<5),
|
|
||||||
};
|
|
||||||
|
|
||||||
//- rjf: debug info for mapping src -> disasm
|
//- rjf: debug info for mapping src -> disasm
|
||||||
|
|
||||||
|
|||||||
+39
-50
@@ -4863,13 +4863,6 @@ DF_VIEW_CMD_FUNCTION_DEF(Code)
|
|||||||
params.string = expr_text;
|
params.string = expr_text;
|
||||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String);
|
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String);
|
||||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression));
|
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression));
|
||||||
|
|
||||||
// rjf: flash marker for grabbed expr
|
|
||||||
DF_Entity *flash_marker = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker);
|
|
||||||
df_entity_equip_death_timer(flash_marker, 0.5f);
|
|
||||||
df_entity_equip_txt_pt(flash_marker, txt_pt_from_info_off__linear_scan(&text_info, expr_range.min));
|
|
||||||
df_entity_equip_txt_pt_alt(flash_marker, txt_pt_from_info_off__linear_scan(&text_info, expr_range.max));
|
|
||||||
df_entity_equip_color_rgba(flash_marker, df_rgba_from_theme_color(DF_ThemeColor_Highlight0));
|
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
}
|
}
|
||||||
hs_scope_close(hs_scope);
|
hs_scope_close(hs_scope);
|
||||||
@@ -5442,15 +5435,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code)
|
|||||||
//- rjf: copy text
|
//- rjf: copy text
|
||||||
if(!txt_pt_match(sig.copy_range.min, sig.copy_range.max))
|
if(!txt_pt_match(sig.copy_range.min, sig.copy_range.max))
|
||||||
{
|
{
|
||||||
Temp temp = temp_begin(scratch.arena);
|
|
||||||
DF_Entity *flash_range = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker);
|
|
||||||
df_entity_equip_death_timer(flash_range, 0.5f);
|
|
||||||
df_entity_equip_color_rgba(flash_range, df_rgba_from_theme_color(DF_ThemeColor_Highlight0));
|
|
||||||
df_entity_equip_txt_pt(flash_range, sig.copy_range.min);
|
|
||||||
df_entity_equip_txt_pt_alt(flash_range, sig.copy_range.max);
|
|
||||||
String8 text = txt_string_from_info_data_txt_rng(&text_info, data, sig.copy_range);
|
String8 text = txt_string_from_info_data_txt_rng(&text_info, data, sig.copy_range);
|
||||||
os_set_clipboard_text(text);
|
os_set_clipboard_text(text);
|
||||||
temp_end(temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: toggle cursor watch
|
//- rjf: toggle cursor watch
|
||||||
@@ -5736,6 +5722,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Disassembly)
|
|||||||
dv->mark = txt_pt(1, 1);
|
dv->mark = txt_pt(1, 1);
|
||||||
dv->preferred_column = 1;
|
dv->preferred_column = 1;
|
||||||
dv->find_text_arena = df_view_push_arena_ext(view);
|
dv->find_text_arena = df_view_push_arena_ext(view);
|
||||||
|
dv->style_flags = DASM_StyleFlag_Addresses;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5761,7 +5748,7 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly)
|
|||||||
Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64));
|
Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64));
|
||||||
U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0);
|
U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0);
|
||||||
U128 dasm_data_hash = {0};
|
U128 dasm_data_hash = {0};
|
||||||
DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, DASM_StyleFlag_Addresses, DASM_Syntax_Intel, &dasm_data_hash);
|
DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, dv->style_flags, DASM_Syntax_Intel, &dasm_data_hash);
|
||||||
U128 dasm_text_hash = {0};
|
U128 dasm_text_hash = {0};
|
||||||
TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash);
|
TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash);
|
||||||
String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash);
|
String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash);
|
||||||
@@ -5884,56 +5871,63 @@ DF_VIEW_CMD_FUNCTION_DEF(Disassembly)
|
|||||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetThreadIP));
|
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetThreadIP));
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
case DF_CoreCmdKind_ToggleCodeBytesVisibility:
|
||||||
|
{
|
||||||
|
dv->style_flags ^= DASM_StyleFlag_CodeBytes;
|
||||||
|
}break;
|
||||||
|
case DF_CoreCmdKind_ToggleAddressVisibility:
|
||||||
|
{
|
||||||
|
dv->style_flags ^= DASM_StyleFlag_Addresses;
|
||||||
|
}break;
|
||||||
case DF_CoreCmdKind_GoToNameAtCursor:
|
case DF_CoreCmdKind_GoToNameAtCursor:
|
||||||
{
|
{
|
||||||
// TODO(rjf)
|
// rjf: determine expression range
|
||||||
#if 0
|
Rng1U64 expr_range = {0};
|
||||||
Temp scratch = scratch_begin(0, 0);
|
|
||||||
TXTI_Handle txti_handle = df_txti_handle_from_entity(entity);
|
|
||||||
TxtRng expr_range = txt_rng(tv->cursor, tv->mark);
|
|
||||||
if(txt_pt_match(tv->cursor, tv->mark))
|
|
||||||
{
|
{
|
||||||
expr_range = txti_expr_range_from_handle_pt(txti_handle, tv->cursor);
|
TxtRng selection_range = txt_rng(dv->cursor, dv->mark);
|
||||||
|
if(txt_pt_match(selection_range.min, selection_range.max))
|
||||||
|
{
|
||||||
|
expr_range = txt_expr_off_range_from_info_data_pt(&dasm_text_info, dasm_text_data, dv->cursor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
expr_range = r1u64(txt_off_from_info_pt(&dasm_text_info, selection_range.min), txt_off_from_info_pt(&dasm_text_info, selection_range.max));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
String8 expr_text = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_range);
|
|
||||||
|
// rjf: expression range -> text
|
||||||
|
String8 expr_text = str8_substr(dasm_text_data, expr_range);
|
||||||
|
|
||||||
// rjf: go to name
|
// rjf: go to name
|
||||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||||
params.entity = df_handle_from_entity(entity);
|
|
||||||
params.string = expr_text;
|
params.string = expr_text;
|
||||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String);
|
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String);
|
||||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName));
|
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName));
|
||||||
|
|
||||||
scratch_end(scratch);
|
|
||||||
#endif
|
|
||||||
}break;
|
}break;
|
||||||
case DF_CoreCmdKind_ToggleWatchExpressionAtCursor:
|
case DF_CoreCmdKind_ToggleWatchExpressionAtCursor:
|
||||||
{
|
{
|
||||||
// TODO(rjf)
|
// rjf: determine expression range
|
||||||
#if 0
|
Rng1U64 expr_range = {0};
|
||||||
Temp scratch = scratch_begin(0, 0);
|
|
||||||
TXTI_Handle txti_handle = df_txti_handle_from_entity(entity);
|
|
||||||
TxtRng expr_range = txt_rng(tv->cursor, tv->mark);
|
|
||||||
if(txt_pt_match(tv->cursor, tv->mark))
|
|
||||||
{
|
{
|
||||||
expr_range = txti_expr_range_from_handle_pt(txti_handle, tv->cursor);
|
TxtRng selection_range = txt_rng(dv->cursor, dv->mark);
|
||||||
|
if(txt_pt_match(selection_range.min, selection_range.max))
|
||||||
|
{
|
||||||
|
expr_range = txt_expr_off_range_from_info_data_pt(&dasm_text_info, dasm_text_data, dv->cursor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
expr_range = r1u64(txt_off_from_info_pt(&dasm_text_info, selection_range.min), txt_off_from_info_pt(&dasm_text_info, selection_range.max));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
String8 expr_text = txti_string_from_handle_txt_rng(scratch.arena, txti_handle, expr_range);
|
|
||||||
|
// rjf: expression range -> text
|
||||||
|
String8 expr_text = str8_substr(dasm_text_data, expr_range);
|
||||||
|
|
||||||
// rjf: toggle watch expr
|
// rjf: toggle watch expr
|
||||||
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
DF_CmdParams params = df_cmd_params_from_view(ws, panel, view);
|
||||||
params.string = expr_text;
|
params.string = expr_text;
|
||||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String);
|
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String);
|
||||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression));
|
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression));
|
||||||
|
|
||||||
// rjf: flash marker for grabbed expr
|
|
||||||
DF_Entity *flash_marker = df_entity_alloc(entity, DF_EntityKind_FlashMarker);
|
|
||||||
df_entity_equip_death_timer(flash_marker, 0.5f);
|
|
||||||
df_entity_equip_txt_pt(flash_marker, expr_range.min);
|
|
||||||
df_entity_equip_txt_pt_alt(flash_marker, expr_range.max);
|
|
||||||
df_entity_equip_color_rgba(flash_marker, df_rgba_from_theme_color(DF_ThemeColor_Highlight0));
|
|
||||||
scratch_end(scratch);
|
|
||||||
#endif
|
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5997,7 +5991,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly)
|
|||||||
Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64));
|
Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(64));
|
||||||
U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0);
|
U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0);
|
||||||
U128 dasm_data_hash = {0};
|
U128 dasm_data_hash = {0};
|
||||||
DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, DASM_StyleFlag_Addresses, DASM_Syntax_Intel, &dasm_data_hash);
|
DASM_Info dasm_info = dasm_info_from_key_addr_arch_style(dasm_scope, dasm_key, dasm_vaddr_range.min, arch, dv->style_flags, DASM_Syntax_Intel, &dasm_data_hash);
|
||||||
U128 dasm_text_hash = {0};
|
U128 dasm_text_hash = {0};
|
||||||
TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash);
|
TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, dasm_info.text_key, txt_lang_kind_from_architecture(arch), &dasm_text_hash);
|
||||||
String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash);
|
String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash);
|
||||||
@@ -7157,11 +7151,6 @@ DF_VIEW_UI_FUNCTION_DEF(Output)
|
|||||||
if(!txt_pt_match(sig.copy_range.min, sig.copy_range.max))
|
if(!txt_pt_match(sig.copy_range.min, sig.copy_range.max))
|
||||||
{
|
{
|
||||||
Temp temp = temp_begin(scratch.arena);
|
Temp temp = temp_begin(scratch.arena);
|
||||||
DF_Entity *flash_range = df_entity_alloc(0, entity, DF_EntityKind_FlashMarker);
|
|
||||||
df_entity_equip_death_timer(flash_range, 0.5f);
|
|
||||||
df_entity_equip_color_rgba(flash_range, df_rgba_from_theme_color(DF_ThemeColor_Highlight0));
|
|
||||||
df_entity_equip_txt_pt(flash_range, sig.copy_range.min);
|
|
||||||
df_entity_equip_txt_pt_alt(flash_range, sig.copy_range.max);
|
|
||||||
String8 text = txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range);
|
String8 text = txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range);
|
||||||
os_set_clipboard_text(text);
|
os_set_clipboard_text(text);
|
||||||
temp_end(temp);
|
temp_end(temp);
|
||||||
|
|||||||
@@ -364,6 +364,7 @@ struct DF_DisasmViewState
|
|||||||
TxtPt mark;
|
TxtPt mark;
|
||||||
S64 preferred_column;
|
S64 preferred_column;
|
||||||
B32 drifted_for_search;
|
B32 drifted_for_search;
|
||||||
|
DASM_StyleFlags style_flags;
|
||||||
|
|
||||||
// rjf: per-frame command info
|
// rjf: per-frame command info
|
||||||
S64 goto_line_num;
|
S64 goto_line_num;
|
||||||
|
|||||||
@@ -650,6 +650,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
|
|||||||
U64 off = 0;
|
U64 off = 0;
|
||||||
B32 escaped = 0;
|
B32 escaped = 0;
|
||||||
B32 string_is_char = 0;
|
B32 string_is_char = 0;
|
||||||
|
S32 brace_nest = 0;
|
||||||
for(U64 advance = 0; off <= string.size; off += advance)
|
for(U64 advance = 0; off <= string.size; off += advance)
|
||||||
{
|
{
|
||||||
U8 byte = (off+0 < string.size) ? string.str[off+0] : 0;
|
U8 byte = (off+0 < string.size) ? string.str[off+0] : 0;
|
||||||
@@ -708,6 +709,14 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
|
|||||||
active_token_start_off = off;
|
active_token_start_off = off;
|
||||||
active_token_kind = TXT_TokenKind_Symbol;
|
active_token_kind = TXT_TokenKind_Symbol;
|
||||||
advance = 1;
|
advance = 1;
|
||||||
|
if(byte == '{')
|
||||||
|
{
|
||||||
|
brace_nest += 1;
|
||||||
|
}
|
||||||
|
else if(byte == '}')
|
||||||
|
{
|
||||||
|
brace_nest -= 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -786,6 +795,10 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
|
|||||||
}
|
}
|
||||||
if(ender_found != 0)
|
if(ender_found != 0)
|
||||||
{
|
{
|
||||||
|
if(brace_nest != 0 && active_token_kind == TXT_TokenKind_Keyword)
|
||||||
|
{
|
||||||
|
active_token_kind = TXT_TokenKind_Numeric;
|
||||||
|
}
|
||||||
TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)};
|
TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)};
|
||||||
txt_token_chunk_list_push(arena, &tokens, 1024, &token);
|
txt_token_chunk_list_push(arena, &tokens, 1024, &token);
|
||||||
active_token_kind = TXT_TokenKind_Null;
|
active_token_kind = TXT_TokenKind_Null;
|
||||||
|
|||||||
Reference in New Issue
Block a user