From deeed7e493fc04a570efcd2836db1a92ce93b56d Mon Sep 17 00:00:00 2001 From: Arceveti Date: Sat, 11 May 2024 18:26:33 -0700 Subject: [PATCH] Improve pseudo C comments --- src/crash_screen/pages/page_disasm.c | 11 ++++++++++- src/crash_screen/pages/page_summary.c | 9 ++++++++- src/crash_screen/util/insn_disasm.c | 15 +++++---------- src/crash_screen/util/insn_disasm.h | 2 +- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/crash_screen/pages/page_disasm.c b/src/crash_screen/pages/page_disasm.c index 3e69b4048..477d2de8f 100644 --- a/src/crash_screen/pages/page_disasm.c +++ b/src/crash_screen/pages/page_disasm.c @@ -358,7 +358,16 @@ void disasm_draw_asm_entries(CSTextCoord_u32 line, CSTextCoord_u32 numLines, Add }; if (asPseudoC) { - cs_print_scroll(x, y, CRASH_SCREEN_NUM_CHARS_X, "%s", cs_insn_to_pseudo_c(insn)); + const char* comment = NULL; + const char* pseudoC = cs_insn_to_pseudo_c(insn, &comment); + size_t commentSize = 0; + if (comment != NULL) { + commentSize = (1 + STRLEN("// ") + strlen(comment)); + } + size_t charX = cs_print_scroll(x, y, (CRASH_SCREEN_NUM_CHARS_X - commentSize), "%s", pseudoC); + if (comment != NULL) { + cs_print((x + TEXT_WIDTH(charX + 1)), y, STR_COLOR_PREFIX"// %s", COLOR_RGBA32_VSC_COMMENT, comment); + } } else { format_and_print_insn(x, y, addr, data); } diff --git a/src/crash_screen/pages/page_summary.c b/src/crash_screen/pages/page_summary.c index 73298bd2a..49d03baf5 100644 --- a/src/crash_screen/pages/page_summary.c +++ b/src/crash_screen/pages/page_summary.c @@ -316,7 +316,14 @@ void page_summary_draw(void) { line++; cs_print(TEXT_X(x), TEXT_Y(line++), STR_COLOR_PREFIX"PSEUDO:", COLOR_RGBA32_CRASH_HEADER); - cs_print_scroll(TEXT_X(x), TEXT_Y(line++), (CRASH_SCREEN_NUM_CHARS_X - 2), "%s", cs_insn_to_pseudo_c((InsnData)data)); + const char* comment = NULL; + const char* pseudoC = cs_insn_to_pseudo_c((InsnData)data, &comment); + if (pseudoC != NULL) { + cs_print_scroll(TEXT_X(x), TEXT_Y(line++), (CRASH_SCREEN_NUM_CHARS_X - 2), "%s", pseudoC); + } + if (comment != NULL) { + cs_print_scroll(TEXT_X(x), TEXT_Y(line++), (CRASH_SCREEN_NUM_CHARS_X - 2), STR_COLOR_PREFIX"// %s", COLOR_RGBA32_VSC_COMMENT, comment); + } } } } diff --git a/src/crash_screen/util/insn_disasm.c b/src/crash_screen/util/insn_disasm.c index 54b6d3bd1..e002adb5d 100644 --- a/src/crash_screen/util/insn_disasm.c +++ b/src/crash_screen/util/insn_disasm.c @@ -821,7 +821,7 @@ void add_reg_str(char** c, RegisterSources src, int idx, _Bool isBase) { #define INSN_RAW_JR_RA 0x03E00008 #define INSN_RAW_TEQ_R0_R0 0x00000034 -char* cs_insn_to_pseudo_c(InsnData insn) { +char* cs_insn_to_pseudo_c(InsnData insn, const char** comment) { _Bool decImmediates = (cs_get_setting_val(CS_OPT_GROUP_PAGE_DISASM, CS_OPT_DISASM_IMM_FMT) == PRINT_NUM_FMT_DEC); char* strp = &insn_as_string[0]; // Pointer to a location inside the string. bzero(insn_as_string, sizeof(insn_as_string)); @@ -835,18 +835,17 @@ char* cs_insn_to_pseudo_c(InsnData insn) { u8 pseudoC = info->pseudoC; const char* formatStr = pseudo_c_code_formats[pseudoC]; - const char* comment = NULL; if (cs_get_setting_val(CS_OPT_GROUP_PAGE_DISASM, CS_OPT_DISASM_PSEUDOINSNS)) { if (insn.raw == INSN_RAW_JR_RA) { // jr $ra -> "return;" formatStr = "r"; - comment = "goto RA"; + *comment = "goto RA"; } else if (insn.raw == INSN_RAW_TEQ_R0_R0) { // teq $r0,$r0 -> "trap();" formatStr = "X(e)"; - // comment = "if (0==0)"; + // *comment = "if (0==0)"; } else if (formatStr[0] == PSC_RA) { // "and link" formatStr += STRLEN(CLINK); - comment = "RA=PC+2"; + *comment = "RA=PC+2"; } } @@ -930,7 +929,7 @@ char* cs_insn_to_pseudo_c(InsnData insn) { u16 eA = insn.codeA; u16 eB = insn.codeB; strp += sprintf(strp, (decImmediates ? "%d, %d" : STR_HEX_PREFIX"%X, "STR_HEX_PREFIX"%X"), eA, eB); - comment = get_name_from_null_terminated_id_list(eA, insn_break_codes); + *comment = get_name_from_null_terminated_id_list(eA, insn_break_codes); } else { strp += sprintf(strp, immFmt, insn.codeAB); } @@ -948,9 +947,5 @@ char* cs_insn_to_pseudo_c(InsnData insn) { *strp++ = ';'; - if (comment != NULL) { - strp += sprintf(strp, STR_COLOR_PREFIX" // %s", COLOR_RGBA32_VSC_COMMENT, comment); - } - return insn_as_string; } diff --git a/src/crash_screen/util/insn_disasm.h b/src/crash_screen/util/insn_disasm.h index f156fc048..7ccfc9799 100644 --- a/src/crash_screen/util/insn_disasm.h +++ b/src/crash_screen/util/insn_disasm.h @@ -650,4 +650,4 @@ s16 insn_check_for_branch_offset(InsnData insn); Address get_insn_branch_target_from_addr(Address addr); char* cs_insn_to_string(Address addr, InsnData insn, const char** fname, _Bool formatting); -char* cs_insn_to_pseudo_c(InsnData insn); +char* cs_insn_to_pseudo_c(InsnData insn, const char** comment);