From 68c09065705bedbae46f310cea8fd65399a8940b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 19 Oct 2024 20:37:47 -0700 Subject: [PATCH] print register name --- src/lib_rdi_format/rdi_format.h | 166 ++++++++++++++++++++++++++++++++ src/rdi_dump/rdi_dump.c | 66 +++++++++++-- src/rdi_dump/rdi_dump.h | 9 +- src/rdi_dump/rdi_dump_main.c | 4 +- src/rdi_format/rdi_format.mdesk | 10 ++ 5 files changed, 245 insertions(+), 10 deletions(-) diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index 3d7b32d3..f440f03c 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -589,6 +589,172 @@ X(NULL)\ X(X86)\ X(X64)\ +#define RDI_RegCodeX86_XList \ +X(nil, 0)\ +X(eax, 1)\ +X(ecx, 2)\ +X(edx, 3)\ +X(ebx, 4)\ +X(esp, 5)\ +X(ebp, 6)\ +X(esi, 7)\ +X(edi, 8)\ +X(fsbase, 9)\ +X(gsbase, 10)\ +X(eflags, 11)\ +X(eip, 12)\ +X(dr0, 13)\ +X(dr1, 14)\ +X(dr2, 15)\ +X(dr3, 16)\ +X(dr4, 17)\ +X(dr5, 18)\ +X(dr6, 19)\ +X(dr7, 20)\ +X(fpr0, 21)\ +X(fpr1, 22)\ +X(fpr2, 23)\ +X(fpr3, 24)\ +X(fpr4, 25)\ +X(fpr5, 26)\ +X(fpr6, 27)\ +X(fpr7, 28)\ +X(st0, 29)\ +X(st1, 30)\ +X(st2, 31)\ +X(st3, 32)\ +X(st4, 33)\ +X(st5, 34)\ +X(st6, 35)\ +X(st7, 36)\ +X(fcw, 37)\ +X(fsw, 38)\ +X(ftw, 39)\ +X(fop, 40)\ +X(fcs, 41)\ +X(fds, 42)\ +X(fip, 43)\ +X(fdp, 44)\ +X(mxcsr, 45)\ +X(mxcsr_mask, 46)\ +X(ss, 47)\ +X(cs, 48)\ +X(ds, 49)\ +X(es, 50)\ +X(fs, 51)\ +X(gs, 52)\ +X(ymm0, 53)\ +X(ymm1, 54)\ +X(ymm2, 55)\ +X(ymm3, 56)\ +X(ymm4, 57)\ +X(ymm5, 58)\ +X(ymm6, 59)\ +X(ymm7, 60)\ + +#define RDI_RegCodeX64_XList \ +X(nil, 0)\ +X(rax, 1)\ +X(rcx, 2)\ +X(rdx, 3)\ +X(rbx, 4)\ +X(rsp, 5)\ +X(rbp, 6)\ +X(rsi, 7)\ +X(rdi, 8)\ +X(r8, 9)\ +X(r9, 10)\ +X(r10, 11)\ +X(r11, 12)\ +X(r12, 13)\ +X(r13, 14)\ +X(r14, 15)\ +X(r15, 16)\ +X(es, 17)\ +X(cs, 18)\ +X(ss, 19)\ +X(ds, 20)\ +X(fs, 21)\ +X(gs, 22)\ +X(rip, 23)\ +X(rflags, 24)\ +X(dr0, 25)\ +X(dr1, 26)\ +X(dr2, 27)\ +X(dr3, 28)\ +X(dr4, 29)\ +X(dr5, 30)\ +X(dr6, 31)\ +X(dr7, 32)\ +X(st0, 33)\ +X(st1, 34)\ +X(st2, 35)\ +X(st3, 36)\ +X(st4, 37)\ +X(st5, 38)\ +X(st6, 39)\ +X(st7, 40)\ +X(fpr0, 41)\ +X(fpr1, 42)\ +X(fpr2, 43)\ +X(fpr3, 44)\ +X(fpr4, 45)\ +X(fpr5, 46)\ +X(fpr6, 47)\ +X(fpr7, 48)\ +X(zmm0, 49)\ +X(zmm1, 50)\ +X(zmm2, 51)\ +X(zmm3, 52)\ +X(zmm4, 53)\ +X(zmm5, 54)\ +X(zmm6, 55)\ +X(zmm7, 56)\ +X(zmm8, 57)\ +X(zmm9, 58)\ +X(zmm10, 59)\ +X(zmm11, 60)\ +X(zmm12, 61)\ +X(zmm13, 62)\ +X(zmm14, 63)\ +X(zmm15, 64)\ +X(zmm16, 65)\ +X(zmm17, 66)\ +X(zmm18, 67)\ +X(zmm19, 68)\ +X(zmm20, 69)\ +X(zmm21, 70)\ +X(zmm22, 71)\ +X(zmm23, 72)\ +X(zmm24, 73)\ +X(zmm25, 74)\ +X(zmm26, 75)\ +X(zmm27, 76)\ +X(zmm28, 77)\ +X(zmm29, 78)\ +X(zmm30, 79)\ +X(zmm31, 80)\ +X(k0, 81)\ +X(k1, 82)\ +X(k2, 83)\ +X(k3, 84)\ +X(k4, 85)\ +X(k5, 86)\ +X(k6, 87)\ +X(k7, 88)\ +X(mxcsr, 89)\ +X(fsbase, 90)\ +X(gsbase, 91)\ +X(fcw, 92)\ +X(fsw, 93)\ +X(ftw, 94)\ +X(fop, 95)\ +X(fcs, 96)\ +X(fds, 97)\ +X(fip, 98)\ +X(fdp, 99)\ +X(mxcsr_mask, 100)\ + #define RDI_TopLevelInfo_XList \ X(RDI_Arch, arch)\ X(RDI_U32, exe_name_string_idx)\ diff --git a/src/rdi_dump/rdi_dump.c b/src/rdi_dump/rdi_dump.c index 5b7f9bf5..8cfd3d59 100644 --- a/src/rdi_dump/rdi_dump.c +++ b/src/rdi_dump/rdi_dump.c @@ -4,6 +4,40 @@ //////////////////////////////// //~ rjf: RDI Enum -> String Functions +internal String8 +rdi_string_from_reg_code_x86(U64 reg_code) +{ +#define X(name, value) case RDI_RegCodeX86_##name: return str8_lit(#name); + switch (reg_code) { + RDI_RegCodeX86_XList + } +#undef X + return str8_lit(""); +} + +internal String8 +rdi_string_from_reg_code_x64(U64 reg_code) +{ +#define X(name, value) case RDI_RegCodeX64_##name: return str8_lit(#name); + switch (reg_code) { + RDI_RegCodeX64_XList + } +#undef X + return str8_lit(""); +} + +internal String8 +rdi_string_from_reg_code(RDI_Arch arch, U64 reg_code) +{ + switch (arch) { + case RDI_Arch_NULL: break; + case RDI_Arch_X86: return rdi_string_from_reg_code_x86(reg_code); + case RDI_Arch_X64: return rdi_string_from_reg_code_x64(reg_code); + default: InvalidPath; + } + return str8_lit(""); +} + internal String8 rdi_string_from_data_section_kind(RDI_SectionKind v) { @@ -128,6 +162,21 @@ rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags) #undef X } +//////////////////////////////// + +internal String8 +rdi_format_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code) +{ + String8 result = {0}; + String8 reg_name = rdi_string_from_reg_code(arch, reg_code); + if (reg_name.size) { + result = push_str8f(arena, "%S", reg_name, reg_code); + } else { + result = push_str8f(arena, "??? (%llu)", reg_code); + } + return result; +} + //////////////////////////////// //~ rjf: RADDBG Compound Stringize Functions @@ -585,9 +634,10 @@ rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *rdi, } internal void -rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, +rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Arch arch, RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level) { + Temp scratch = scratch_begin(&arena, 1); U32 this_idx = (U32)(scope - bundle->scopes); @@ -720,8 +770,8 @@ rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, } else{ RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; - str8_list_pushf(arena, out, "AddrRegPlusU16(reg: %u, off: %u)\n", - loc->reg_code, loc->offset); + str8_list_pushf(arena, out, "AddrRegPlusU16(reg: %S, off: %u)\n", + rdi_format_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); } }break; @@ -732,8 +782,8 @@ rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, } else{ RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; - str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %u, off: %u)\n", - loc->reg_code, loc->offset); + str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %S, off: %u)\n", + rdi_format_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); } }break; @@ -744,7 +794,7 @@ rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, } else{ RDI_LocationReg *loc = (RDI_LocationReg*)loc_base_ptr; - str8_list_pushf(arena, out, "ValReg(reg: %u)\n", loc->reg_code); + str8_list_pushf(arena, out, "ValReg(reg: %S)\n", rdi_format_reg_code(scratch.arena, arch, loc->reg_code)); } }break; } @@ -769,7 +819,7 @@ rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, } // stringize child - rdi_stringize_scope(arena, out, rdi, bundle, child_scope, indent_level + 1); + rdi_stringize_scope(arena, out, rdi, arch, bundle, child_scope, indent_level + 1); // increment iterator child = child_scope->next_sibling_scope_idx; @@ -777,6 +827,8 @@ rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, str8_list_pushf(arena, out, "%.*s[/%u]\n", indent_level, rdi_stringize_spaces, this_idx); + + scratch_end(scratch); } internal void diff --git a/src/rdi_dump/rdi_dump.h b/src/rdi_dump/rdi_dump.h index 73610c35..1c99092c 100644 --- a/src/rdi_dump/rdi_dump.h +++ b/src/rdi_dump/rdi_dump.h @@ -41,6 +41,9 @@ struct RDI_ScopeBundle //////////////////////////////// //~ rjf: RDI Enum -> String Functions +internal String8 rdi_string_from_reg_code_x86(U64 reg_code); +internal String8 rdi_string_from_reg_code_x64(U64 reg_code); +internal String8 rdi_string_from_reg_code(RDI_Arch arch, U64 reg_code); internal String8 rdi_string_from_data_section_kind(RDI_SectionKind v); internal String8 rdi_string_from_arch(RDI_Arch v); internal String8 rdi_string_from_language(RDI_Language v); @@ -56,6 +59,10 @@ internal void rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, internal void rdi_stringize_udt_flags(Arena *arena, String8List *out, RDI_UDTFlags flags); internal void rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags); +//////////////////////////////// + +internal String8 rdi_format_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code); + //////////////////////////////// //~ rjf: RDI Compound Stringize Functions @@ -72,7 +79,7 @@ internal void rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *rdi, internal void rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_GlobalVariable *global_variable, U32 indent_level); internal void rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_ThreadVariable *thread_var, U32 indent_level); internal void rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Procedure *proc, U32 indent_level); -internal void rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level); +internal void rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Arch arch, RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level); internal void rdi_stringize_inline_site(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_InlineSite *inline_site, U32 indent_level); #endif // RDI_DUMP_H diff --git a/src/rdi_dump/rdi_dump_main.c b/src/rdi_dump/rdi_dump_main.c index 1c89fa9e..4bfcedf2 100644 --- a/src/rdi_dump/rdi_dump_main.c +++ b/src/rdi_dump/rdi_dump_main.c @@ -174,10 +174,10 @@ entry_point(CmdLine *cmd_line) } //- rjf: TOP LEVEL INFO + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); if(dump_flags & DumpFlag_TopLevelInfo) { str8_list_pushf(arena, &dump, "# TOP LEVEL INFO:\n"); - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); rdi_stringize_top_level_info(arena, &dump, rdi, tli, 1); str8_list_push(arena, &dump, str8_lit("\n")); } @@ -407,7 +407,7 @@ entry_point(CmdLine *cmd_line) { if(scopes[idx].parent_scope_idx == 0) { - rdi_stringize_scope(arena, &dump, rdi, &scope_bundle, &scopes[idx], 1); + rdi_stringize_scope(arena, &dump, rdi, tli->arch, &scope_bundle, &scopes[idx], 1); } } str8_list_push(arena, &dump, str8_lit("\n")); diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index bc3768ec..2a515898 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -459,6 +459,16 @@ RDI_RegCodeX64Table: @expand(RDI_RegCodeX64Table a) `$(a.name .. =>10) = $(a.value)` } +@xlist RDI_RegCodeX86_XList: +{ + @expand(RDI_RegCodeX86Table a) `$(a.name), $(a.value)` +} + +@xlist RDI_RegCodeX64_XList: +{ + @expand(RDI_RegCodeX64Table a) `$(a.name), $(a.value)` +} + //////////////////////////////// //~ rjf: Top-Level Info Type Tables