jump destination symbol name visualization in disassembly

This commit is contained in:
Ryan Fleury
2024-04-23 19:12:58 -07:00
parent 579e3e9637
commit 0dbde584bd
4 changed files with 90 additions and 50 deletions
+27 -3
View File
@@ -436,8 +436,11 @@ dasm_parse_thread__entry_point(void *p)
// rjf: analyze // rjf: analyze
struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(&udc, 0); struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(&udc, 0);
U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0; U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0;
U64 jump_dst_vaddr = rel_voff;
// rjf: push strings derived from voff -> line info // rjf: push strings derived from voff -> line info
if(params.style_flags & DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines)
{
if(dbgi != &dbgi_parse_nil) if(dbgi != &dbgi_parse_nil)
{ {
U64 voff = (params.vaddr+off) - params.base_vaddr; U64 voff = (params.vaddr+off) - params.base_vaddr;
@@ -454,7 +457,8 @@ dasm_parse_thread__entry_point(void *p)
file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size); file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size);
if(file != last_file) if(file != last_file)
{ {
if(file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0) if(params.style_flags & DASM_StyleFlag_SourceFilesNames &&
file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0)
{ {
DASM_Inst inst = {0}; DASM_Inst inst = {0};
dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst);
@@ -462,7 +466,9 @@ dasm_parse_thread__entry_point(void *p)
} }
last_file = file; last_file = file;
} }
if(line && line != last_line && file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0) if(line && line != last_line && file->normal_full_path_string_idx != 0 &&
params.style_flags & DASM_StyleFlag_SourceLines &&
file_normalized_full_path.size != 0)
{ {
FileProperties props = os_properties_from_file_path(file_normalized_full_path); FileProperties props = os_properties_from_file_path(file_normalized_full_path);
if(props.modified != 0) if(props.modified != 0)
@@ -498,6 +504,7 @@ dasm_parse_thread__entry_point(void *p)
} }
} }
} }
}
// rjf: push // rjf: push
String8 addr_part = {0}; String8 addr_part = {0};
@@ -524,7 +531,24 @@ dasm_parse_thread__entry_point(void *p)
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); 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); String8 symbol_part = {0};
if(jump_dst_vaddr != 0 && dbgi != &dbgi_parse_nil && params.style_flags & DASM_StyleFlag_SymbolNames)
{
RDI_U32 scope_idx = rdi_vmap_idx_from_voff(rdi->scope_vmap, rdi->scope_vmap_count, jump_dst_vaddr-params.base_vaddr);
if(scope_idx != 0)
{
RDI_Scope *scope = rdi_element_from_idx(rdi, scopes, scope_idx);
RDI_U32 procedure_idx = scope->proc_idx;
RDI_Procedure *procedure = rdi_element_from_idx(rdi, procedures, procedure_idx);
String8 procedure_name = {0};
procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size);
if(procedure_name.size != 0)
{
symbol_part = push_str8f(scratch.arena, " (%S)", procedure_name);
}
}
}
String8 inst_string = push_str8f(scratch.arena, "%S%S%s%S", addr_part, code_bytes_part, udc.asm_buf, symbol_part);
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);
+3
View File
@@ -12,6 +12,9 @@ enum
{ {
DASM_StyleFlag_Addresses = (1<<0), DASM_StyleFlag_Addresses = (1<<0),
DASM_StyleFlag_CodeBytes = (1<<1), DASM_StyleFlag_CodeBytes = (1<<1),
DASM_StyleFlag_SourceFilesNames = (1<<2),
DASM_StyleFlag_SourceLines = (1<<3),
DASM_StyleFlag_SymbolNames = (1<<4),
}; };
typedef enum DASM_Syntax typedef enum DASM_Syntax
+1 -1
View File
@@ -6038,7 +6038,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; dv->style_flags = DASM_StyleFlag_Addresses|DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines|DASM_StyleFlag_SymbolNames;
} }
} }
+13
View File
@@ -1146,6 +1146,7 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
B32 escaped = 0; B32 escaped = 0;
B32 string_is_char = 0; B32 string_is_char = 0;
S32 brace_nest = 0; S32 brace_nest = 0;
S32 paren_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;
@@ -1218,6 +1219,14 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
{ {
brace_nest -= 1; brace_nest -= 1;
} }
if(byte == '(')
{
paren_nest += 1;
}
else if(byte == ')')
{
paren_nest -= 1;
}
} }
else else
{ {
@@ -1306,6 +1315,10 @@ txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed
{ {
active_token_kind = TXT_TokenKind_Numeric; active_token_kind = TXT_TokenKind_Numeric;
} }
if(paren_nest != 0 && active_token_kind == TXT_TokenKind_Keyword)
{
active_token_kind = TXT_TokenKind_Identifier;
}
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;