|
@@ -15,6 +15,7 @@
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/string.h>
|
|
|
#include <sys/ttydefaults.h>
|
|
|
+#include <asm/bug.h>
|
|
|
|
|
|
struct disasm_line_samples {
|
|
|
double percent;
|
|
@@ -383,9 +384,10 @@ static void ui_browser__init_asm_mode(struct ui_browser *browser)
|
|
|
#define SYM_TITLE_MAX_SIZE (PATH_MAX + 64)
|
|
|
|
|
|
static int sym_title(struct symbol *sym, struct map *map, char *title,
|
|
|
- size_t sz)
|
|
|
+ size_t sz, int percent_type)
|
|
|
{
|
|
|
- return snprintf(title, sz, "%s %s", sym->name, map->dso->long_name);
|
|
|
+ return snprintf(title, sz, "%s %s [Percent: %s]", sym->name, map->dso->long_name,
|
|
|
+ percent_type_str(percent_type));
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -423,7 +425,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser,
|
|
|
|
|
|
pthread_mutex_unlock(¬es->lock);
|
|
|
symbol__tui_annotate(dl->ops.target.sym, ms->map, evsel, hbt, browser->opts);
|
|
|
- sym_title(ms->sym, ms->map, title, sizeof(title));
|
|
|
+ sym_title(ms->sym, ms->map, title, sizeof(title), browser->opts->percent_type);
|
|
|
ui_browser__show_title(&browser->b, title);
|
|
|
return true;
|
|
|
}
|
|
@@ -598,6 +600,7 @@ bool annotate_browser__continue_search_reverse(struct annotate_browser *browser,
|
|
|
|
|
|
static int annotate_browser__show(struct ui_browser *browser, char *title, const char *help)
|
|
|
{
|
|
|
+ struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
|
|
|
struct map_symbol *ms = browser->priv;
|
|
|
struct symbol *sym = ms->sym;
|
|
|
char symbol_dso[SYM_TITLE_MAX_SIZE];
|
|
@@ -605,7 +608,7 @@ static int annotate_browser__show(struct ui_browser *browser, char *title, const
|
|
|
if (ui_browser__show(browser, title, help) < 0)
|
|
|
return -1;
|
|
|
|
|
|
- sym_title(sym, ms->map, symbol_dso, sizeof(symbol_dso));
|
|
|
+ sym_title(sym, ms->map, symbol_dso, sizeof(symbol_dso), ab->opts->percent_type);
|
|
|
|
|
|
ui_browser__gotorc_title(browser, 0, 0);
|
|
|
ui_browser__set_color(browser, HE_COLORSET_ROOT);
|
|
@@ -613,6 +616,39 @@ static int annotate_browser__show(struct ui_browser *browser, char *title, const
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+switch_percent_type(struct annotation_options *opts, bool base)
|
|
|
+{
|
|
|
+ switch (opts->percent_type) {
|
|
|
+ case PERCENT_HITS_LOCAL:
|
|
|
+ if (base)
|
|
|
+ opts->percent_type = PERCENT_PERIOD_LOCAL;
|
|
|
+ else
|
|
|
+ opts->percent_type = PERCENT_HITS_GLOBAL;
|
|
|
+ break;
|
|
|
+ case PERCENT_HITS_GLOBAL:
|
|
|
+ if (base)
|
|
|
+ opts->percent_type = PERCENT_PERIOD_GLOBAL;
|
|
|
+ else
|
|
|
+ opts->percent_type = PERCENT_HITS_LOCAL;
|
|
|
+ break;
|
|
|
+ case PERCENT_PERIOD_LOCAL:
|
|
|
+ if (base)
|
|
|
+ opts->percent_type = PERCENT_HITS_LOCAL;
|
|
|
+ else
|
|
|
+ opts->percent_type = PERCENT_PERIOD_GLOBAL;
|
|
|
+ break;
|
|
|
+ case PERCENT_PERIOD_GLOBAL:
|
|
|
+ if (base)
|
|
|
+ opts->percent_type = PERCENT_HITS_GLOBAL;
|
|
|
+ else
|
|
|
+ opts->percent_type = PERCENT_PERIOD_LOCAL;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ WARN_ON(1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int annotate_browser__run(struct annotate_browser *browser,
|
|
|
struct perf_evsel *evsel,
|
|
|
struct hist_browser_timer *hbt)
|
|
@@ -703,6 +739,8 @@ static int annotate_browser__run(struct annotate_browser *browser,
|
|
|
"k Toggle line numbers\n"
|
|
|
"P Print to [symbol_name].annotation file.\n"
|
|
|
"r Run available scripts\n"
|
|
|
+ "p Toggle percent type [local/global]\n"
|
|
|
+ "b Toggle percent base [period/hits]\n"
|
|
|
"? Search string backwards\n");
|
|
|
continue;
|
|
|
case 'r':
|
|
@@ -802,6 +840,12 @@ show_sup_ins:
|
|
|
notes->options->show_minmax_cycle = true;
|
|
|
annotation__update_column_widths(notes);
|
|
|
continue;
|
|
|
+ case 'p':
|
|
|
+ case 'b':
|
|
|
+ switch_percent_type(browser->opts, key == 'b');
|
|
|
+ hists__scnprintf_title(hists, title, sizeof(title));
|
|
|
+ annotate_browser__show(&browser->b, title, help);
|
|
|
+ continue;
|
|
|
case K_LEFT:
|
|
|
case K_ESC:
|
|
|
case 'q':
|