diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-05-29 20:24:05 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-05-29 20:24:05 -0400 |
| commit | e9823b21bab7ff0c39e14a7a970a40fad74ce778 (patch) | |
| tree | 98687e9352b0975bac871654e2846a2eb3921ca7 /tools/perf | |
| parent | a44b45f236dd1c1a8caccf9a078adf2941a20267 (diff) | |
perf annotate browser: Make feature toggles global
So that when navigating to another function from a call site or when
going to another annotation browser thru the main report/top browser the
options (hide source code, jump arrows, jumpy lines, etc) remains the
last ones selected.
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-0h0tah1zj59p01581snjufne@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/ui/browsers/annotate.c | 101 |
1 files changed, 66 insertions, 35 deletions
diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c index aaf36ce0b6fe..02afa036dfa9 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c | |||
| @@ -19,6 +19,16 @@ struct browser_disasm_line { | |||
| 19 | int jump_sources; | 19 | int jump_sources; |
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | static struct annotate_browser_opt { | ||
| 23 | bool hide_src_code, | ||
| 24 | use_offset, | ||
| 25 | jump_arrows, | ||
| 26 | show_nr_jumps; | ||
| 27 | } annotate_browser__opts = { | ||
| 28 | .use_offset = true, | ||
| 29 | .jump_arrows = true, | ||
| 30 | }; | ||
| 31 | |||
| 22 | struct annotate_browser { | 32 | struct annotate_browser { |
| 23 | struct ui_browser b; | 33 | struct ui_browser b; |
| 24 | struct rb_root entries; | 34 | struct rb_root entries; |
| @@ -30,10 +40,6 @@ struct annotate_browser { | |||
| 30 | int nr_entries; | 40 | int nr_entries; |
| 31 | int max_jump_sources; | 41 | int max_jump_sources; |
| 32 | int nr_jumps; | 42 | int nr_jumps; |
| 33 | bool hide_src_code; | ||
| 34 | bool use_offset; | ||
| 35 | bool jump_arrows; | ||
| 36 | bool show_nr_jumps; | ||
| 37 | bool searching_backwards; | 43 | bool searching_backwards; |
| 38 | u8 addr_width; | 44 | u8 addr_width; |
| 39 | u8 jumps_width; | 45 | u8 jumps_width; |
| @@ -48,11 +54,9 @@ static inline struct browser_disasm_line *disasm_line__browser(struct disasm_lin | |||
| 48 | return (struct browser_disasm_line *)(dl + 1); | 54 | return (struct browser_disasm_line *)(dl + 1); |
| 49 | } | 55 | } |
| 50 | 56 | ||
| 51 | static bool disasm_line__filter(struct ui_browser *browser, void *entry) | 57 | static bool disasm_line__filter(struct ui_browser *browser __used, void *entry) |
| 52 | { | 58 | { |
| 53 | struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); | 59 | if (annotate_browser__opts.hide_src_code) { |
| 54 | |||
| 55 | if (ab->hide_src_code) { | ||
| 56 | struct disasm_line *dl = list_entry(entry, struct disasm_line, node); | 60 | struct disasm_line *dl = list_entry(entry, struct disasm_line, node); |
| 57 | return dl->offset == -1; | 61 | return dl->offset == -1; |
| 58 | } | 62 | } |
| @@ -85,7 +89,7 @@ static void annotate_browser__write(struct ui_browser *self, void *entry, int ro | |||
| 85 | struct disasm_line *dl = list_entry(entry, struct disasm_line, node); | 89 | struct disasm_line *dl = list_entry(entry, struct disasm_line, node); |
| 86 | struct browser_disasm_line *bdl = disasm_line__browser(dl); | 90 | struct browser_disasm_line *bdl = disasm_line__browser(dl); |
| 87 | bool current_entry = ui_browser__is_current_entry(self, row); | 91 | bool current_entry = ui_browser__is_current_entry(self, row); |
| 88 | bool change_color = (!ab->hide_src_code && | 92 | bool change_color = (!annotate_browser__opts.hide_src_code && |
| 89 | (!current_entry || (self->use_navkeypressed && | 93 | (!current_entry || (self->use_navkeypressed && |
| 90 | !self->navkeypressed))); | 94 | !self->navkeypressed))); |
| 91 | int width = self->width, printed; | 95 | int width = self->width, printed; |
| @@ -116,14 +120,14 @@ static void annotate_browser__write(struct ui_browser *self, void *entry, int ro | |||
| 116 | u64 addr = dl->offset; | 120 | u64 addr = dl->offset; |
| 117 | int color = -1; | 121 | int color = -1; |
| 118 | 122 | ||
| 119 | if (!ab->use_offset) | 123 | if (!annotate_browser__opts.use_offset) |
| 120 | addr += ab->start; | 124 | addr += ab->start; |
| 121 | 125 | ||
| 122 | if (!ab->use_offset) { | 126 | if (!annotate_browser__opts.use_offset) { |
| 123 | printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr); | 127 | printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr); |
| 124 | } else { | 128 | } else { |
| 125 | if (bdl->jump_sources) { | 129 | if (bdl->jump_sources) { |
| 126 | if (ab->show_nr_jumps) { | 130 | if (annotate_browser__opts.show_nr_jumps) { |
| 127 | int prev; | 131 | int prev; |
| 128 | printed = scnprintf(bf, sizeof(bf), "%*d ", | 132 | printed = scnprintf(bf, sizeof(bf), "%*d ", |
| 129 | ab->jumps_width, | 133 | ab->jumps_width, |
| @@ -169,7 +173,7 @@ static void annotate_browser__write(struct ui_browser *self, void *entry, int ro | |||
| 169 | } | 173 | } |
| 170 | } | 174 | } |
| 171 | 175 | ||
| 172 | disasm_line__scnprintf(dl, bf, sizeof(bf), !ab->use_offset); | 176 | disasm_line__scnprintf(dl, bf, sizeof(bf), !annotate_browser__opts.use_offset); |
| 173 | slsmg_write_nstring(bf, width - 10 - printed); | 177 | slsmg_write_nstring(bf, width - 10 - printed); |
| 174 | } | 178 | } |
| 175 | 179 | ||
| @@ -184,7 +188,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) | |||
| 184 | struct browser_disasm_line *btarget, *bcursor; | 188 | struct browser_disasm_line *btarget, *bcursor; |
| 185 | unsigned int from, to; | 189 | unsigned int from, to; |
| 186 | 190 | ||
| 187 | if (!cursor->ins || !ins__is_jump(cursor->ins) || | 191 | if (!cursor || !cursor->ins || !ins__is_jump(cursor->ins) || |
| 188 | !disasm_line__has_offset(cursor)) | 192 | !disasm_line__has_offset(cursor)) |
| 189 | return; | 193 | return; |
| 190 | 194 | ||
| @@ -195,7 +199,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) | |||
| 195 | bcursor = disasm_line__browser(cursor); | 199 | bcursor = disasm_line__browser(cursor); |
| 196 | btarget = disasm_line__browser(target); | 200 | btarget = disasm_line__browser(target); |
| 197 | 201 | ||
| 198 | if (ab->hide_src_code) { | 202 | if (annotate_browser__opts.hide_src_code) { |
| 199 | from = bcursor->idx_asm; | 203 | from = bcursor->idx_asm; |
| 200 | to = btarget->idx_asm; | 204 | to = btarget->idx_asm; |
| 201 | } else { | 205 | } else { |
| @@ -209,10 +213,9 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) | |||
| 209 | 213 | ||
| 210 | static unsigned int annotate_browser__refresh(struct ui_browser *browser) | 214 | static unsigned int annotate_browser__refresh(struct ui_browser *browser) |
| 211 | { | 215 | { |
| 212 | struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); | ||
| 213 | int ret = ui_browser__list_head_refresh(browser); | 216 | int ret = ui_browser__list_head_refresh(browser); |
| 214 | 217 | ||
| 215 | if (ab->jump_arrows) | 218 | if (annotate_browser__opts.jump_arrows) |
| 216 | annotate_browser__draw_current_jump(browser); | 219 | annotate_browser__draw_current_jump(browser); |
| 217 | 220 | ||
| 218 | ui_browser__set_color(browser, HE_COLORSET_NORMAL); | 221 | ui_browser__set_color(browser, HE_COLORSET_NORMAL); |
| @@ -305,7 +308,7 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser, | |||
| 305 | bpos = rb_entry(nd, struct browser_disasm_line, rb_node); | 308 | bpos = rb_entry(nd, struct browser_disasm_line, rb_node); |
| 306 | pos = ((struct disasm_line *)bpos) - 1; | 309 | pos = ((struct disasm_line *)bpos) - 1; |
| 307 | idx = bpos->idx; | 310 | idx = bpos->idx; |
| 308 | if (browser->hide_src_code) | 311 | if (annotate_browser__opts.hide_src_code) |
| 309 | idx = bpos->idx_asm; | 312 | idx = bpos->idx_asm; |
| 310 | annotate_browser__set_top(browser, pos, idx); | 313 | annotate_browser__set_top(browser, pos, idx); |
| 311 | browser->curr_hot = nd; | 314 | browser->curr_hot = nd; |
| @@ -347,12 +350,12 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser) | |||
| 347 | dl = list_entry(browser->b.top, struct disasm_line, node); | 350 | dl = list_entry(browser->b.top, struct disasm_line, node); |
| 348 | bdl = disasm_line__browser(dl); | 351 | bdl = disasm_line__browser(dl); |
| 349 | 352 | ||
| 350 | if (browser->hide_src_code) { | 353 | if (annotate_browser__opts.hide_src_code) { |
| 351 | if (bdl->idx_asm < offset) | 354 | if (bdl->idx_asm < offset) |
| 352 | offset = bdl->idx; | 355 | offset = bdl->idx; |
| 353 | 356 | ||
| 354 | browser->b.nr_entries = browser->nr_entries; | 357 | browser->b.nr_entries = browser->nr_entries; |
| 355 | browser->hide_src_code = false; | 358 | annotate_browser__opts.hide_src_code = false; |
| 356 | browser->b.seek(&browser->b, -offset, SEEK_CUR); | 359 | browser->b.seek(&browser->b, -offset, SEEK_CUR); |
| 357 | browser->b.top_idx = bdl->idx - offset; | 360 | browser->b.top_idx = bdl->idx - offset; |
| 358 | browser->b.index = bdl->idx; | 361 | browser->b.index = bdl->idx; |
| @@ -367,7 +370,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser) | |||
| 367 | offset = bdl->idx_asm; | 370 | offset = bdl->idx_asm; |
| 368 | 371 | ||
| 369 | browser->b.nr_entries = browser->nr_asm_entries; | 372 | browser->b.nr_entries = browser->nr_asm_entries; |
| 370 | browser->hide_src_code = true; | 373 | annotate_browser__opts.hide_src_code = true; |
| 371 | browser->b.seek(&browser->b, -offset, SEEK_CUR); | 374 | browser->b.seek(&browser->b, -offset, SEEK_CUR); |
| 372 | browser->b.top_idx = bdl->idx_asm - offset; | 375 | browser->b.top_idx = bdl->idx_asm - offset; |
| 373 | browser->b.index = bdl->idx_asm; | 376 | browser->b.index = bdl->idx_asm; |
| @@ -376,6 +379,12 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser) | |||
| 376 | return true; | 379 | return true; |
| 377 | } | 380 | } |
| 378 | 381 | ||
| 382 | static void annotate_browser__init_asm_mode(struct annotate_browser *browser) | ||
| 383 | { | ||
| 384 | ui_browser__reset_index(&browser->b); | ||
| 385 | browser->b.nr_entries = browser->nr_asm_entries; | ||
| 386 | } | ||
| 387 | |||
| 379 | static bool annotate_browser__callq(struct annotate_browser *browser, | 388 | static bool annotate_browser__callq(struct annotate_browser *browser, |
| 380 | int evidx, void (*timer)(void *arg), | 389 | int evidx, void (*timer)(void *arg), |
| 381 | void *arg, int delay_secs) | 390 | void *arg, int delay_secs) |
| @@ -578,6 +587,19 @@ bool annotate_browser__continue_search_reverse(struct annotate_browser *browser, | |||
| 578 | return __annotate_browser__search_reverse(browser); | 587 | return __annotate_browser__search_reverse(browser); |
| 579 | } | 588 | } |
| 580 | 589 | ||
| 590 | static void annotate_browser__update_addr_width(struct annotate_browser *browser) | ||
| 591 | { | ||
| 592 | if (annotate_browser__opts.use_offset) | ||
| 593 | browser->target_width = browser->min_addr_width; | ||
| 594 | else | ||
| 595 | browser->target_width = browser->max_addr_width; | ||
| 596 | |||
| 597 | browser->addr_width = browser->target_width; | ||
| 598 | |||
| 599 | if (annotate_browser__opts.show_nr_jumps) | ||
| 600 | browser->addr_width += browser->jumps_width + 1; | ||
| 601 | } | ||
| 602 | |||
| 581 | static int annotate_browser__run(struct annotate_browser *self, int evidx, | 603 | static int annotate_browser__run(struct annotate_browser *self, int evidx, |
| 582 | void(*timer)(void *arg), | 604 | void(*timer)(void *arg), |
| 583 | void *arg, int delay_secs) | 605 | void *arg, int delay_secs) |
| @@ -663,22 +685,16 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx, | |||
| 663 | ui_helpline__puts(help); | 685 | ui_helpline__puts(help); |
| 664 | continue; | 686 | continue; |
| 665 | case 'o': | 687 | case 'o': |
| 666 | self->use_offset = !self->use_offset; | 688 | annotate_browser__opts.use_offset = !annotate_browser__opts.use_offset; |
| 667 | if (self->use_offset) | 689 | annotate_browser__update_addr_width(self); |
| 668 | self->target_width = self->min_addr_width; | ||
| 669 | else | ||
| 670 | self->target_width = self->max_addr_width; | ||
| 671 | update_addr_width: | ||
| 672 | self->addr_width = self->target_width; | ||
| 673 | if (self->show_nr_jumps) | ||
| 674 | self->addr_width += self->jumps_width + 1; | ||
| 675 | continue; | 690 | continue; |
| 676 | case 'j': | 691 | case 'j': |
| 677 | self->jump_arrows = !self->jump_arrows; | 692 | annotate_browser__opts.jump_arrows = !annotate_browser__opts.jump_arrows; |
| 678 | continue; | 693 | continue; |
| 679 | case 'J': | 694 | case 'J': |
| 680 | self->show_nr_jumps = !self->show_nr_jumps; | 695 | annotate_browser__opts.show_nr_jumps = !annotate_browser__opts.show_nr_jumps; |
| 681 | goto update_addr_width; | 696 | annotate_browser__update_addr_width(self); |
| 697 | continue; | ||
| 682 | case '/': | 698 | case '/': |
| 683 | if (annotate_browser__search(self, delay_secs)) { | 699 | if (annotate_browser__search(self, delay_secs)) { |
| 684 | show_help: | 700 | show_help: |
| @@ -695,6 +711,17 @@ show_help: | |||
| 695 | if (annotate_browser__search_reverse(self, delay_secs)) | 711 | if (annotate_browser__search_reverse(self, delay_secs)) |
| 696 | goto show_help; | 712 | goto show_help; |
| 697 | continue; | 713 | continue; |
| 714 | case 'D': { | ||
| 715 | static int seq; | ||
| 716 | ui_helpline__pop(); | ||
| 717 | ui_helpline__fpush("%d: nr_ent=%d, height=%d, idx=%d, top_idx=%d, nr_asm_entries=%d", | ||
| 718 | seq++, self->b.nr_entries, | ||
| 719 | self->b.height, | ||
| 720 | self->b.index, | ||
| 721 | self->b.top_idx, | ||
| 722 | self->nr_asm_entries); | ||
| 723 | } | ||
| 724 | continue; | ||
| 698 | case K_ENTER: | 725 | case K_ENTER: |
| 699 | case K_RIGHT: | 726 | case K_RIGHT: |
| 700 | if (self->selection == NULL) | 727 | if (self->selection == NULL) |
| @@ -801,8 +828,6 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx, | |||
| 801 | .priv = &ms, | 828 | .priv = &ms, |
| 802 | .use_navkeypressed = true, | 829 | .use_navkeypressed = true, |
| 803 | }, | 830 | }, |
| 804 | .use_offset = true, | ||
| 805 | .jump_arrows = true, | ||
| 806 | }; | 831 | }; |
| 807 | int ret = -1; | 832 | int ret = -1; |
| 808 | 833 | ||
| @@ -859,6 +884,12 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx, | |||
| 859 | browser.b.nr_entries = browser.nr_entries; | 884 | browser.b.nr_entries = browser.nr_entries; |
| 860 | browser.b.entries = ¬es->src->source, | 885 | browser.b.entries = ¬es->src->source, |
| 861 | browser.b.width += 18; /* Percentage */ | 886 | browser.b.width += 18; /* Percentage */ |
| 887 | |||
| 888 | if (annotate_browser__opts.hide_src_code) | ||
| 889 | annotate_browser__init_asm_mode(&browser); | ||
| 890 | |||
| 891 | annotate_browser__update_addr_width(&browser); | ||
| 892 | |||
| 862 | ret = annotate_browser__run(&browser, evidx, timer, arg, delay_secs); | 893 | ret = annotate_browser__run(&browser, evidx, timer, arg, delay_secs); |
| 863 | list_for_each_entry_safe(pos, n, ¬es->src->source, node) { | 894 | list_for_each_entry_safe(pos, n, ¬es->src->source, node) { |
| 864 | list_del(&pos->node); | 895 | list_del(&pos->node); |
