Improve pseudo C comments

This commit is contained in:
Arceveti
2024-05-11 18:26:33 -07:00
parent 583b2ce455
commit deeed7e493
4 changed files with 24 additions and 13 deletions

View File

@@ -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);
}

View File

@@ -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);
}
}
}
}

View File

@@ -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;
}

View File

@@ -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);