From c1b92c1b2717424a6e2ecc3be04cb64ea3b47ece Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 11:51:20 -0700 Subject: [PATCH] reintroduce support for address/code-bytes toggling in disassembly view; also reintroduce support for toggle-watch-expr and goto-name commands --- src/dasm_cache/dasm_cache.c | 29 +++++++++++- src/df/core/df_core.h | 15 +------ src/df/gfx/df_views.c | 89 ++++++++++++++++--------------------- src/df/gfx/df_views.h | 1 + src/text_cache/text_cache.c | 13 ++++++ 5 files changed, 81 insertions(+), 66 deletions(-) diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index a3935cae..7bc0ec02 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -383,7 +383,11 @@ dasm_parse_thread__entry_point(void *p) { 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); break; @@ -441,7 +445,26 @@ dasm_parse_thread__entry_point(void *p) { 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, inst_strings.total_size + inst_strings.node_count + inst_string.size)}; 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], addr, (U64)arch, + (U64)style_flags, + (U64)syntax, 0x4d534144, }; text_key = hs_hash_from_data(str8((U8 *)hash_data, sizeof(hash_data))); diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index c97f215a..b038b254 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -511,20 +511,7 @@ struct DF_EntityFuzzyItemArray }; //////////////////////////////// -//~ rjf: Text Slices (output type from data which can be used to produce readable text) - -//- 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: Source <-> Disasm Types //- rjf: debug info for mapping src -> disasm diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index b168524b..d48213ed 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -4863,13 +4863,6 @@ DF_VIEW_CMD_FUNCTION_DEF(Code) params.string = expr_text; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); 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); } hs_scope_close(hs_scope); @@ -5442,15 +5435,8 @@ DF_VIEW_UI_FUNCTION_DEF(Code) //- rjf: copy text 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); os_set_clipboard_text(text); - temp_end(temp); } //- rjf: toggle cursor watch @@ -5736,6 +5722,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(Disassembly) dv->mark = txt_pt(1, 1); dv->preferred_column = 1; 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)); 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}; - 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}; 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); @@ -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)); } }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: { - // TODO(rjf) -#if 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)) + // rjf: determine expression range + Rng1U64 expr_range = {0}; { - 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 DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(entity); params.string = expr_text; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); - - scratch_end(scratch); -#endif }break; case DF_CoreCmdKind_ToggleWatchExpressionAtCursor: { - // TODO(rjf) -#if 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)) + // rjf: determine expression range + Rng1U64 expr_range = {0}; { - 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 DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); params.string = expr_text; df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); 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; } } @@ -5997,7 +5991,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) 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_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}; 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); @@ -7157,11 +7151,6 @@ DF_VIEW_UI_FUNCTION_DEF(Output) 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 = txti_string_from_handle_txt_rng(temp.arena, txti_handle, sig.copy_range); os_set_clipboard_text(text); temp_end(temp); diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 1d27436b..ebccf953 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -364,6 +364,7 @@ struct DF_DisasmViewState TxtPt mark; S64 preferred_column; B32 drifted_for_search; + DASM_StyleFlags style_flags; // rjf: per-frame command info S64 goto_line_num; diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 3c69d0cb..a9a3ea43 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -650,6 +650,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed U64 off = 0; B32 escaped = 0; B32 string_is_char = 0; + S32 brace_nest = 0; for(U64 advance = 0; off <= string.size; off += advance) { 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_kind = TXT_TokenKind_Symbol; advance = 1; + if(byte == '{') + { + brace_nest += 1; + } + else if(byte == '}') + { + brace_nest -= 1; + } } else { @@ -786,6 +795,10 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed } 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_chunk_list_push(arena, &tokens, 1024, &token); active_token_kind = TXT_TokenKind_Null;