Commit a5433b3e authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf annotate browser: Add disasm_line__write function

Factor disasm_line__write function from annotate_browser__write, which
now keeps only generic display code.
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20171011150158.11895-35-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ec03a77d
...@@ -118,11 +118,37 @@ static int annotate_browser__cycles_width(struct annotate_browser *ab) ...@@ -118,11 +118,37 @@ static int annotate_browser__cycles_width(struct annotate_browser *ab)
return ab->have_cycles ? IPC_WIDTH + CYCLES_WIDTH : 0; return ab->have_cycles ? IPC_WIDTH + CYCLES_WIDTH : 0;
} }
static void disasm_line__write(struct disasm_line *dl, struct ui_browser *browser,
char *bf, size_t size)
{
if (dl->ins.ops && dl->ins.ops->scnprintf) {
if (ins__is_jump(&dl->ins)) {
bool fwd = dl->ops.target.offset > dl->al.offset;
ui_browser__write_graph(browser, fwd ? SLSMG_DARROW_CHAR :
SLSMG_UARROW_CHAR);
SLsmg_write_char(' ');
} else if (ins__is_call(&dl->ins)) {
ui_browser__write_graph(browser, SLSMG_RARROW_CHAR);
SLsmg_write_char(' ');
} else if (ins__is_ret(&dl->ins)) {
ui_browser__write_graph(browser, SLSMG_LARROW_CHAR);
SLsmg_write_char(' ');
} else {
ui_browser__write_nstring(browser, " ", 2);
}
} else {
ui_browser__write_nstring(browser, " ", 2);
}
disasm_line__scnprintf(dl, bf, size, !annotate_browser__opts.use_offset);
}
static void annotate_browser__write(struct ui_browser *browser, void *entry, int row) static void annotate_browser__write(struct ui_browser *browser, void *entry, int row)
{ {
struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); struct annotation_line *al = list_entry(entry, struct annotation_line, node);
struct browser_line *bdl = browser_line(&dl->al); struct browser_line *bl = browser_line(al);
bool current_entry = ui_browser__is_current_entry(browser, row); bool current_entry = ui_browser__is_current_entry(browser, row);
bool change_color = (!annotate_browser__opts.hide_src_code && bool change_color = (!annotate_browser__opts.hide_src_code &&
(!current_entry || (browser->use_navkeypressed && (!current_entry || (browser->use_navkeypressed &&
...@@ -135,32 +161,32 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int ...@@ -135,32 +161,32 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
bool show_title = false; bool show_title = false;
for (i = 0; i < ab->nr_events; i++) { for (i = 0; i < ab->nr_events; i++) {
if (dl->al.samples[i].percent > percent_max) if (al->samples[i].percent > percent_max)
percent_max = dl->al.samples[i].percent; percent_max = al->samples[i].percent;
} }
if ((row == 0) && (dl->al.offset == -1 || percent_max == 0.0)) { if ((row == 0) && (al->offset == -1 || percent_max == 0.0)) {
if (ab->have_cycles) { if (ab->have_cycles) {
if (dl->al.ipc == 0.0 && dl->al.cycles == 0) if (al->ipc == 0.0 && al->cycles == 0)
show_title = true; show_title = true;
} else } else
show_title = true; show_title = true;
} }
if (dl->al.offset != -1 && percent_max != 0.0) { if (al->offset != -1 && percent_max != 0.0) {
for (i = 0; i < ab->nr_events; i++) { for (i = 0; i < ab->nr_events; i++) {
ui_browser__set_percent_color(browser, ui_browser__set_percent_color(browser,
dl->al.samples[i].percent, al->samples[i].percent,
current_entry); current_entry);
if (annotate_browser__opts.show_total_period) { if (annotate_browser__opts.show_total_period) {
ui_browser__printf(browser, "%11" PRIu64 " ", ui_browser__printf(browser, "%11" PRIu64 " ",
dl->al.samples[i].he.period); al->samples[i].he.period);
} else if (annotate_browser__opts.show_nr_samples) { } else if (annotate_browser__opts.show_nr_samples) {
ui_browser__printf(browser, "%6" PRIu64 " ", ui_browser__printf(browser, "%6" PRIu64 " ",
dl->al.samples[i].he.nr_samples); al->samples[i].he.nr_samples);
} else { } else {
ui_browser__printf(browser, "%6.2f ", ui_browser__printf(browser, "%6.2f ",
dl->al.samples[i].percent); al->samples[i].percent);
} }
} }
} else { } else {
...@@ -175,16 +201,16 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int ...@@ -175,16 +201,16 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
} }
} }
if (ab->have_cycles) { if (ab->have_cycles) {
if (dl->al.ipc) if (al->ipc)
ui_browser__printf(browser, "%*.2f ", IPC_WIDTH - 1, dl->al.ipc); ui_browser__printf(browser, "%*.2f ", IPC_WIDTH - 1, al->ipc);
else if (!show_title) else if (!show_title)
ui_browser__write_nstring(browser, " ", IPC_WIDTH); ui_browser__write_nstring(browser, " ", IPC_WIDTH);
else else
ui_browser__printf(browser, "%*s ", IPC_WIDTH - 1, "IPC"); ui_browser__printf(browser, "%*s ", IPC_WIDTH - 1, "IPC");
if (dl->al.cycles) if (al->cycles)
ui_browser__printf(browser, "%*" PRIu64 " ", ui_browser__printf(browser, "%*" PRIu64 " ",
CYCLES_WIDTH - 1, dl->al.cycles); CYCLES_WIDTH - 1, al->cycles);
else if (!show_title) else if (!show_title)
ui_browser__write_nstring(browser, " ", CYCLES_WIDTH); ui_browser__write_nstring(browser, " ", CYCLES_WIDTH);
else else
...@@ -197,19 +223,19 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int ...@@ -197,19 +223,19 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
if (!browser->navkeypressed) if (!browser->navkeypressed)
width += 1; width += 1;
if (!*dl->al.line) if (!*al->line)
ui_browser__write_nstring(browser, " ", width - pcnt_width - cycles_width); ui_browser__write_nstring(browser, " ", width - pcnt_width - cycles_width);
else if (dl->al.offset == -1) { else if (al->offset == -1) {
if (dl->al.line_nr && annotate_browser__opts.show_linenr) if (al->line_nr && annotate_browser__opts.show_linenr)
printed = scnprintf(bf, sizeof(bf), "%-*d ", printed = scnprintf(bf, sizeof(bf), "%-*d ",
ab->addr_width + 1, dl->al.line_nr); ab->addr_width + 1, al->line_nr);
else else
printed = scnprintf(bf, sizeof(bf), "%*s ", printed = scnprintf(bf, sizeof(bf), "%*s ",
ab->addr_width, " "); ab->addr_width, " ");
ui_browser__write_nstring(browser, bf, printed); ui_browser__write_nstring(browser, bf, printed);
ui_browser__write_nstring(browser, dl->al.line, width - printed - pcnt_width - cycles_width + 1); ui_browser__write_nstring(browser, al->line, width - printed - pcnt_width - cycles_width + 1);
} else { } else {
u64 addr = dl->al.offset; u64 addr = al->offset;
int color = -1; int color = -1;
if (!annotate_browser__opts.use_offset) if (!annotate_browser__opts.use_offset)
...@@ -218,13 +244,13 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int ...@@ -218,13 +244,13 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
if (!annotate_browser__opts.use_offset) { if (!annotate_browser__opts.use_offset) {
printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr); printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr);
} else { } else {
if (bdl->jump_sources) { if (bl->jump_sources) {
if (annotate_browser__opts.show_nr_jumps) { if (annotate_browser__opts.show_nr_jumps) {
int prev; int prev;
printed = scnprintf(bf, sizeof(bf), "%*d ", printed = scnprintf(bf, sizeof(bf), "%*d ",
ab->jumps_width, ab->jumps_width,
bdl->jump_sources); bl->jump_sources);
prev = annotate_browser__set_jumps_percent_color(ab, bdl->jump_sources, prev = annotate_browser__set_jumps_percent_color(ab, bl->jump_sources,
current_entry); current_entry);
ui_browser__write_nstring(browser, bf, printed); ui_browser__write_nstring(browser, bf, printed);
ui_browser__set_color(browser, prev); ui_browser__set_color(browser, prev);
...@@ -243,32 +269,14 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int ...@@ -243,32 +269,14 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
ui_browser__write_nstring(browser, bf, printed); ui_browser__write_nstring(browser, bf, printed);
if (change_color) if (change_color)
ui_browser__set_color(browser, color); ui_browser__set_color(browser, color);
if (dl->ins.ops && dl->ins.ops->scnprintf) {
if (ins__is_jump(&dl->ins)) {
bool fwd = dl->ops.target.offset > dl->al.offset;
ui_browser__write_graph(browser, fwd ? SLSMG_DARROW_CHAR : disasm_line__write(disasm_line(al), browser, bf, sizeof(bf));
SLSMG_UARROW_CHAR);
SLsmg_write_char(' ');
} else if (ins__is_call(&dl->ins)) {
ui_browser__write_graph(browser, SLSMG_RARROW_CHAR);
SLsmg_write_char(' ');
} else if (ins__is_ret(&dl->ins)) {
ui_browser__write_graph(browser, SLSMG_LARROW_CHAR);
SLsmg_write_char(' ');
} else {
ui_browser__write_nstring(browser, " ", 2);
}
} else {
ui_browser__write_nstring(browser, " ", 2);
}
disasm_line__scnprintf(dl, bf, sizeof(bf), !annotate_browser__opts.use_offset);
ui_browser__write_nstring(browser, bf, width - pcnt_width - cycles_width - 3 - printed); ui_browser__write_nstring(browser, bf, width - pcnt_width - cycles_width - 3 - printed);
} }
if (current_entry) if (current_entry)
ab->selection = &dl->al; ab->selection = al;
} }
static bool disasm_line__is_valid_jump(struct disasm_line *dl, struct symbol *sym) static bool disasm_line__is_valid_jump(struct disasm_line *dl, struct symbol *sym)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment