mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-10 00:02:39 +00:00
Fold cases of switch in the same address
This commit is contained in:
parent
f18a01fb6a
commit
af956d26e8
@ -443,7 +443,7 @@ static void queue_case(RAnal *anal, ut64 switch_addr, ut64 case_addr, ut64 id, u
|
||||
// id, case_addr);
|
||||
anal->cmdtail = r_str_appendf (anal->cmdtail,
|
||||
"f case.%d.0x%"PFMT64x " 1 @ 0x%08"PFMT64x "\n",
|
||||
id, case_addr, case_addr);
|
||||
id, switch_addr, case_addr);
|
||||
}
|
||||
|
||||
static int try_walkthrough_jmptbl(RAnal *anal, RAnalFunction *fcn, int depth, ut64 ip, ut64 jmptbl_loc, ut64 jmptbl_off, ut64 sz, ut64 jmptbl_size, ut64 default_case, int ret0) {
|
||||
|
@ -1848,6 +1848,9 @@ static void ds_show_flags(RDisasmState *ds) {
|
||||
}
|
||||
RCore *core = ds->core;
|
||||
// f = r_anal_get_fcn_in (core->anal, ds->at, R_ANAL_FCN_TYPE_NULL);
|
||||
char addr[64];
|
||||
ut64 switch_addr;
|
||||
int case_start = -1, case_prev = 0, case_current = 0;
|
||||
f = fcnIn (ds, ds->at, R_ANAL_FCN_TYPE_NULL);
|
||||
flaglist = r_flag_get_list (core->flags, ds->at);
|
||||
RList *uniqlist = r_list_uniq (flaglist, flagCmp);
|
||||
@ -1856,6 +1859,20 @@ static void ds_show_flags(RDisasmState *ds) {
|
||||
// do not show flags that have the same name as the function
|
||||
continue;
|
||||
}
|
||||
if (!strncmp (flag->name, "case.", 5)) {
|
||||
sscanf (flag->name + 5, "%d.%s", &case_current, addr);
|
||||
ut64 saddr = r_num_math (core->num, addr);
|
||||
if (case_start == -1) {
|
||||
switch_addr = saddr;
|
||||
case_prev = case_current;
|
||||
case_start = case_current;
|
||||
continue;
|
||||
}
|
||||
if (case_current == case_prev + 1 && switch_addr == saddr) {
|
||||
case_prev = case_current;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
ds_begin_json_line (ds);
|
||||
if (ds->show_flgoff) {
|
||||
ds_beginline (ds);
|
||||
@ -1881,10 +1898,24 @@ static void ds_show_flags(RDisasmState *ds) {
|
||||
}
|
||||
}
|
||||
if (ds->asm_demangle && flag->realname) {
|
||||
const char *lang = r_config_get (core->config, "bin.lang");
|
||||
char *name = r_bin_demangle (core->bin->cur, lang, flag->realname, flag->offset);
|
||||
r_cons_printf ("%s:", name? name: flag->realname);
|
||||
R_FREE (name);
|
||||
if (!strncmp (flag->name, "case.", 5)) {
|
||||
if (case_prev != case_start) {
|
||||
r_cons_printf ("cases %d...%d (%s):", case_start, case_prev, addr);
|
||||
if (iter != uniqlist->head) {
|
||||
iter = iter->p;
|
||||
}
|
||||
case_start = case_current;
|
||||
} else {
|
||||
r_cons_printf ("case %d (%s):", case_prev, addr);
|
||||
case_start = -1;
|
||||
}
|
||||
case_prev = case_current;
|
||||
} else {
|
||||
const char *lang = r_config_get (core->config, "bin.lang");
|
||||
char *name = r_bin_demangle (core->bin->cur, lang, flag->realname, flag->offset);
|
||||
r_cons_printf ("%s:", name? name: flag->realname);
|
||||
R_FREE (name);
|
||||
}
|
||||
} else {
|
||||
r_cons_printf ("%s:", flag->name);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user