From c3eaf0be0684e399802cefd2d2b3bb06fadf6416 Mon Sep 17 00:00:00 2001 From: cyanpencil Date: Wed, 11 Jul 2018 14:39:06 +0200 Subject: [PATCH 1/3] Compacting XREFS onto single line if from same function --- libr/core/disasm.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/libr/core/disasm.c b/libr/core/disasm.c index b560588775291..e7a9f28068ba8 100644 --- a/libr/core/disasm.c +++ b/libr/core/disasm.c @@ -1133,11 +1133,12 @@ static void ds_show_refs(RDisasmState *ds) { static void ds_show_xrefs(RDisasmState *ds) { RAnalRef *refi; - RListIter *iter; + RListIter *iter, *it; RCore *core = ds->core; bool demangle = r_config_get_i (core->config, "bin.demangle"); const char *lang = demangle ? r_config_get (core->config, "bin.lang") : NULL; char *name, *tmp; + ut64 addr; int count = 0; if (!ds->show_xrefs || !ds->show_comments) { return; @@ -1182,11 +1183,21 @@ static void ds_show_xrefs(RDisasmState *ds) { return; } + RList *addrs = r_list_new (); + RAnalFunction *fun, *next_fun; r_list_foreach (xrefs, iter, refi) { if (refi->at == ds->at) { - RAnalFunction *fun = fcnIn (ds, refi->addr, -1); //r_anal_get_fcn_in (core->anal, refi->addr, -1); + fun = fcnIn (ds, refi->addr, -1); //r_anal_get_fcn_in (core->anal, refi->addr, -1); if (fun) { name = strdup (fun->name); + if (iter != xrefs->tail) { + ut64 next_addr = ((RAnalRef *)(iter->n->data))->addr; + next_fun = r_anal_get_fcn_in (core->anal, next_addr, -1); //r_anal_get_fcn_in (core->anal, refi->addr, -1); + if (next_fun && next_fun->addr == fun->addr) { + r_list_append (addrs, refi->addr); + continue; + } + } } else { RFlagItem *f = r_flag_get_at (core->flags, refi->addr, true); if (f) { @@ -1202,12 +1213,18 @@ static void ds_show_xrefs(RDisasmState *ds) { name = tmp; } } + r_list_append (addrs, refi->addr); ds_begin_json_line (ds); ds_pre_xrefs (ds, false); - ds_comment (ds, false, "%s; %s XREF from 0x%08"PFMT64x" (%s)%s", - COLOR (ds, pal_comment), r_anal_xrefs_type_tostring (refi->type), - refi->addr, name, COLOR_RESET (ds)); + ds_comment (ds, false, "%s; %s XREF from %s (", + COLOR (ds, pal_comment), r_anal_xrefs_type_tostring (refi->type), name); + r_list_foreach (addrs, it, addr) { + ds_comment (ds, false, "%s0x%"PFMT64x, it == addrs->head ? "" : ", ", addr); + } + ds_comment (ds, false, ")%s", COLOR_RESET (ds)); ds_newline (ds); + + r_list_purge (addrs); R_FREE (name); } else { eprintf ("Corrupted database?\n"); From 00fce4b80e929c73134e81cd1b55674a06a86671 Mon Sep 17 00:00:00 2001 From: cyanpencil Date: Thu, 12 Jul 2018 14:51:59 +0200 Subject: [PATCH 2/3] Compacting XREFS in single line if with same closest flag --- libr/core/disasm.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/libr/core/disasm.c b/libr/core/disasm.c index e7a9f28068ba8..4650520af6e89 100644 --- a/libr/core/disasm.c +++ b/libr/core/disasm.c @@ -1185,23 +1185,34 @@ static void ds_show_xrefs(RDisasmState *ds) { RList *addrs = r_list_new (); RAnalFunction *fun, *next_fun; + RFlagItem *f, *next_f; r_list_foreach (xrefs, iter, refi) { if (refi->at == ds->at) { - fun = fcnIn (ds, refi->addr, -1); //r_anal_get_fcn_in (core->anal, refi->addr, -1); + fun = fcnIn (ds, refi->addr, -1); if (fun) { name = strdup (fun->name); if (iter != xrefs->tail) { ut64 next_addr = ((RAnalRef *)(iter->n->data))->addr; - next_fun = r_anal_get_fcn_in (core->anal, next_addr, -1); //r_anal_get_fcn_in (core->anal, refi->addr, -1); + next_fun = r_anal_get_fcn_in (core->anal, next_addr, -1); if (next_fun && next_fun->addr == fun->addr) { r_list_append (addrs, refi->addr); continue; } } + r_list_append (addrs, refi->addr); } else { - RFlagItem *f = r_flag_get_at (core->flags, refi->addr, true); + f = r_flag_get_at (core->flags, refi->addr, true); if (f) { - name = r_str_newf ("%s + %d", f->name, refi->addr - f->offset); + name = strdup (f->name); + if (iter != xrefs->tail) { + ut64 next_addr = ((RAnalRef *)(iter->n->data))->addr; + next_f = r_flag_get_at (core->flags, next_addr, true); + if (next_f && f->offset == next_f->offset) { + r_list_append (addrs, refi->addr - f->offset); + continue; + } + } + r_list_append (addrs, refi->addr - f->offset); } else { name = strdup ("unk"); } @@ -1213,17 +1224,17 @@ static void ds_show_xrefs(RDisasmState *ds) { name = tmp; } } - r_list_append (addrs, refi->addr); ds_begin_json_line (ds); ds_pre_xrefs (ds, false); - ds_comment (ds, false, "%s; %s XREF from %s (", - COLOR (ds, pal_comment), r_anal_xrefs_type_tostring (refi->type), name); + char* plural = r_list_length (addrs) > 1 ? "S" : ""; + char* plus = fun ? "" : "+"; + ds_comment (ds, false, "%s; %s XREF%s from %s (", + COLOR (ds, pal_comment), r_anal_xrefs_type_tostring (refi->type), plural, name); r_list_foreach (addrs, it, addr) { - ds_comment (ds, false, "%s0x%"PFMT64x, it == addrs->head ? "" : ", ", addr); + ds_comment (ds, false, "%s%s0x%"PFMT64x, it == addrs->head ? "" : ", ", plus, addr); } ds_comment (ds, false, ")%s", COLOR_RESET (ds)); ds_newline (ds); - r_list_purge (addrs); R_FREE (name); } else { From 62f7be5f273500fc25031faa21044b0a746285d5 Mon Sep 17 00:00:00 2001 From: cyanpencil Date: Fri, 13 Jul 2018 17:31:53 +0200 Subject: [PATCH 3/3] fix string name not freed --- libr/core/disasm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libr/core/disasm.c b/libr/core/disasm.c index 4650520af6e89..e8aef1fdf5e2d 100644 --- a/libr/core/disasm.c +++ b/libr/core/disasm.c @@ -1190,7 +1190,6 @@ static void ds_show_xrefs(RDisasmState *ds) { if (refi->at == ds->at) { fun = fcnIn (ds, refi->addr, -1); if (fun) { - name = strdup (fun->name); if (iter != xrefs->tail) { ut64 next_addr = ((RAnalRef *)(iter->n->data))->addr; next_fun = r_anal_get_fcn_in (core->anal, next_addr, -1); @@ -1199,11 +1198,11 @@ static void ds_show_xrefs(RDisasmState *ds) { continue; } } + name = strdup (fun->name); r_list_append (addrs, refi->addr); } else { f = r_flag_get_at (core->flags, refi->addr, true); if (f) { - name = strdup (f->name); if (iter != xrefs->tail) { ut64 next_addr = ((RAnalRef *)(iter->n->data))->addr; next_f = r_flag_get_at (core->flags, next_addr, true); @@ -1212,6 +1211,7 @@ static void ds_show_xrefs(RDisasmState *ds) { continue; } } + name = strdup (f->name); r_list_append (addrs, refi->addr - f->offset); } else { name = strdup ("unk");