Browse Source

perf annotate: Stop using a global config struct

For the TUI, that is interactive, its interesting to have a
configuration that one can go on changing and then when moving from one
symbol annotation to another symbol, the options set while browsing the
first symbol to be kept.

But since we're trying to make this code reusable by a --stdio
formatter, we better have a pointer in struct annotation and in the TUI
case set it to the global, but use something else for other cases, such
as --stdio2.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-kv1ngr159jfu5h9ddgiuwcvg@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Arnaldo Carvalho de Melo 7 years ago
parent
commit
16932d7705
2 changed files with 51 additions and 34 deletions
  1. 50 34
      tools/perf/ui/browsers/annotate.c
  2. 1 0
      tools/perf/util/annotate.h

+ 50 - 34
tools/perf/ui/browsers/annotate.c

@@ -63,10 +63,12 @@ static inline struct browser_line *browser_line(struct annotation_line *al)
 	return ptr - sizeof(struct browser_line);
 	return ptr - sizeof(struct browser_line);
 }
 }
 
 
-static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
-				void *entry)
+static bool disasm_line__filter(struct ui_browser *browser, void *entry)
 {
 {
-	if (annotate_browser__opts.hide_src_code) {
+	struct map_symbol *ms = browser->priv;
+	struct annotation *notes = symbol__annotation(ms->sym);
+
+	if (notes->options->hide_src_code) {
 		struct annotation_line *al = list_entry(entry, struct annotation_line, node);
 		struct annotation_line *al = list_entry(entry, struct annotation_line, node);
 
 
 		return al->offset == -1;
 		return al->offset == -1;
@@ -98,12 +100,15 @@ static int annotate_browser__pcnt_width(struct annotate_browser *ab)
 {
 {
 	struct map_symbol *ms = ab->b.priv;
 	struct map_symbol *ms = ab->b.priv;
 	struct annotation *notes = symbol__annotation(ms->sym);
 	struct annotation *notes = symbol__annotation(ms->sym);
-	return (annotate_browser__opts.show_total_period ? 12 : 7) * notes->nr_events;
+	return (notes->options->show_total_period ? 12 : 7) * notes->nr_events;
 }
 }
 
 
 static void disasm_line__write(struct disasm_line *dl, struct ui_browser *browser,
 static void disasm_line__write(struct disasm_line *dl, struct ui_browser *browser,
 			       char *bf, size_t size)
 			       char *bf, size_t size)
 {
 {
+	struct map_symbol *ms = browser->priv;
+	struct annotation *notes = symbol__annotation(ms->sym);
+
 	if (dl->ins.ops && dl->ins.ops->scnprintf) {
 	if (dl->ins.ops && dl->ins.ops->scnprintf) {
 		if (ins__is_jump(&dl->ins)) {
 		if (ins__is_jump(&dl->ins)) {
 			bool fwd = dl->ops.target.offset > dl->al.offset;
 			bool fwd = dl->ops.target.offset > dl->al.offset;
@@ -124,7 +129,7 @@ static void disasm_line__write(struct disasm_line *dl, struct ui_browser *browse
 		ui_browser__write_nstring(browser, " ", 2);
 		ui_browser__write_nstring(browser, " ", 2);
 	}
 	}
 
 
-	disasm_line__scnprintf(dl, bf, size, !annotate_browser__opts.use_offset);
+	disasm_line__scnprintf(dl, bf, size, !notes->options->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)
@@ -136,7 +141,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
 	struct annotation_line *al = list_entry(entry, struct annotation_line, node);
 	struct annotation_line *al = list_entry(entry, struct annotation_line, node);
 	struct browser_line *bl = browser_line(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 = (!notes->options->hide_src_code &&
 			     (!current_entry || (browser->use_navkeypressed &&
 			     (!current_entry || (browser->use_navkeypressed &&
 					         !browser->navkeypressed)));
 					         !browser->navkeypressed)));
 	int width = browser->width, printed;
 	int width = browser->width, printed;
@@ -164,10 +169,10 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
 			ui_browser__set_percent_color(browser,
 			ui_browser__set_percent_color(browser,
 						al->samples[i].percent,
 						al->samples[i].percent,
 						current_entry);
 						current_entry);
-			if (annotate_browser__opts.show_total_period) {
+			if (notes->options->show_total_period) {
 				ui_browser__printf(browser, "%11" PRIu64 " ",
 				ui_browser__printf(browser, "%11" PRIu64 " ",
 						   al->samples[i].he.period);
 						   al->samples[i].he.period);
-			} else if (annotate_browser__opts.show_nr_samples) {
+			} else if (notes->options->show_nr_samples) {
 				ui_browser__printf(browser, "%6" PRIu64 " ",
 				ui_browser__printf(browser, "%6" PRIu64 " ",
 						   al->samples[i].he.nr_samples);
 						   al->samples[i].he.nr_samples);
 			} else {
 			} else {
@@ -182,8 +187,8 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
 			ui_browser__write_nstring(browser, " ", pcnt_width);
 			ui_browser__write_nstring(browser, " ", pcnt_width);
 		else {
 		else {
 			ui_browser__printf(browser, "%*s", pcnt_width,
 			ui_browser__printf(browser, "%*s", pcnt_width,
-					   annotate_browser__opts.show_total_period ? "Period" :
-					   annotate_browser__opts.show_nr_samples ? "Samples" : "Percent");
+					   notes->options->show_total_period ? "Period" :
+					   notes->options->show_nr_samples ? "Samples" : "Percent");
 		}
 		}
 	}
 	}
 	if (notes->have_cycles) {
 	if (notes->have_cycles) {
@@ -212,7 +217,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
 	if (!*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 (al->offset == -1) {
 	else if (al->offset == -1) {
-		if (al->line_nr && annotate_browser__opts.show_linenr)
+		if (al->line_nr && notes->options->show_linenr)
 			printed = scnprintf(bf, sizeof(bf), "%-*d ",
 			printed = scnprintf(bf, sizeof(bf), "%-*d ",
 					ab->addr_width + 1, al->line_nr);
 					ab->addr_width + 1, al->line_nr);
 		else
 		else
@@ -224,14 +229,14 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
 		u64 addr = al->offset;
 		u64 addr = al->offset;
 		int color = -1;
 		int color = -1;
 
 
-		if (!annotate_browser__opts.use_offset)
+		if (!notes->options->use_offset)
 			addr += ab->start;
 			addr += ab->start;
 
 
-		if (!annotate_browser__opts.use_offset) {
+		if (!notes->options->use_offset) {
 			printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr);
 			printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr);
 		} else {
 		} else {
 			if (bl->jump_sources) {
 			if (bl->jump_sources) {
-				if (annotate_browser__opts.show_nr_jumps) {
+				if (notes->options->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,
@@ -345,7 +350,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
 	bcursor = browser_line(&cursor->al);
 	bcursor = browser_line(&cursor->al);
 	btarget = browser_line(target);
 	btarget = browser_line(target);
 
 
-	if (annotate_browser__opts.hide_src_code) {
+	if (notes->options->hide_src_code) {
 		from = bcursor->idx_asm;
 		from = bcursor->idx_asm;
 		to = btarget->idx_asm;
 		to = btarget->idx_asm;
 	} else {
 	} else {
@@ -371,10 +376,12 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
 static unsigned int annotate_browser__refresh(struct ui_browser *browser)
 static unsigned int annotate_browser__refresh(struct ui_browser *browser)
 {
 {
 	struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
 	struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
+	struct map_symbol *ms = browser->priv;
+	struct annotation *notes = symbol__annotation(ms->sym);
 	int ret = ui_browser__list_head_refresh(browser);
 	int ret = ui_browser__list_head_refresh(browser);
 	int pcnt_width = annotate_browser__pcnt_width(ab);
 	int pcnt_width = annotate_browser__pcnt_width(ab);
 
 
-	if (annotate_browser__opts.jump_arrows)
+	if (notes->options->jump_arrows)
 		annotate_browser__draw_current_jump(browser);
 		annotate_browser__draw_current_jump(browser);
 
 
 	ui_browser__set_color(browser, HE_COLORSET_NORMAL);
 	ui_browser__set_color(browser, HE_COLORSET_NORMAL);
@@ -439,6 +446,8 @@ static void annotate_browser__set_top(struct annotate_browser *browser,
 static void annotate_browser__set_rb_top(struct annotate_browser *browser,
 static void annotate_browser__set_rb_top(struct annotate_browser *browser,
 					 struct rb_node *nd)
 					 struct rb_node *nd)
 {
 {
+	struct map_symbol *ms = browser->b.priv;
+	struct annotation *notes = symbol__annotation(ms->sym);
 	struct browser_line *bpos;
 	struct browser_line *bpos;
 	struct annotation_line *pos;
 	struct annotation_line *pos;
 	u32 idx;
 	u32 idx;
@@ -447,7 +456,7 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,
 	bpos = browser_line(pos);
 	bpos = browser_line(pos);
 
 
 	idx = bpos->idx;
 	idx = bpos->idx;
-	if (annotate_browser__opts.hide_src_code)
+	if (notes->options->hide_src_code)
 		idx = bpos->idx_asm;
 		idx = bpos->idx_asm;
 	annotate_browser__set_top(browser, pos, idx);
 	annotate_browser__set_top(browser, pos, idx);
 	browser->curr_hot = nd;
 	browser->curr_hot = nd;
@@ -496,6 +505,8 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,
 
 
 static bool annotate_browser__toggle_source(struct annotate_browser *browser)
 static bool annotate_browser__toggle_source(struct annotate_browser *browser)
 {
 {
+	struct map_symbol *ms = browser->b.priv;
+	struct annotation *notes = symbol__annotation(ms->sym);
 	struct annotation_line *al;
 	struct annotation_line *al;
 	struct browser_line *bl;
 	struct browser_line *bl;
 	off_t offset = browser->b.index - browser->b.top_idx;
 	off_t offset = browser->b.index - browser->b.top_idx;
@@ -504,12 +515,12 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser)
 	al = list_entry(browser->b.top, struct annotation_line, node);
 	al = list_entry(browser->b.top, struct annotation_line, node);
 	bl = browser_line(al);
 	bl = browser_line(al);
 
 
-	if (annotate_browser__opts.hide_src_code) {
+	if (notes->options->hide_src_code) {
 		if (bl->idx_asm < offset)
 		if (bl->idx_asm < offset)
 			offset = bl->idx;
 			offset = bl->idx;
 
 
 		browser->b.nr_entries = browser->nr_entries;
 		browser->b.nr_entries = browser->nr_entries;
-		annotate_browser__opts.hide_src_code = false;
+		notes->options->hide_src_code = false;
 		browser->b.seek(&browser->b, -offset, SEEK_CUR);
 		browser->b.seek(&browser->b, -offset, SEEK_CUR);
 		browser->b.top_idx = bl->idx - offset;
 		browser->b.top_idx = bl->idx - offset;
 		browser->b.index = bl->idx;
 		browser->b.index = bl->idx;
@@ -524,7 +535,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser)
 			offset = bl->idx_asm;
 			offset = bl->idx_asm;
 
 
 		browser->b.nr_entries = browser->nr_asm_entries;
 		browser->b.nr_entries = browser->nr_asm_entries;
-		annotate_browser__opts.hide_src_code = true;
+		notes->options->hide_src_code = true;
 		browser->b.seek(&browser->b, -offset, SEEK_CUR);
 		browser->b.seek(&browser->b, -offset, SEEK_CUR);
 		browser->b.top_idx = bl->idx_asm - offset;
 		browser->b.top_idx = bl->idx_asm - offset;
 		browser->b.index = bl->idx_asm;
 		browser->b.index = bl->idx_asm;
@@ -750,14 +761,17 @@ bool annotate_browser__continue_search_reverse(struct annotate_browser *browser,
 
 
 static void annotate_browser__update_addr_width(struct annotate_browser *browser)
 static void annotate_browser__update_addr_width(struct annotate_browser *browser)
 {
 {
-	if (annotate_browser__opts.use_offset)
+	struct map_symbol *ms = browser->b.priv;
+	struct annotation *notes = symbol__annotation(ms->sym);
+
+	if (notes->options->use_offset)
 		browser->target_width = browser->min_addr_width;
 		browser->target_width = browser->min_addr_width;
 	else
 	else
 		browser->target_width = browser->max_addr_width;
 		browser->target_width = browser->max_addr_width;
 
 
 	browser->addr_width = browser->target_width;
 	browser->addr_width = browser->target_width;
 
 
-	if (annotate_browser__opts.show_nr_jumps)
+	if (notes->options->show_nr_jumps)
 		browser->addr_width += browser->jumps_width + 1;
 		browser->addr_width += browser->jumps_width + 1;
 }
 }
 
 
@@ -768,6 +782,7 @@ static int annotate_browser__run(struct annotate_browser *browser,
 	struct rb_node *nd = NULL;
 	struct rb_node *nd = NULL;
 	struct map_symbol *ms = browser->b.priv;
 	struct map_symbol *ms = browser->b.priv;
 	struct symbol *sym = ms->sym;
 	struct symbol *sym = ms->sym;
+	struct annotation *notes = symbol__annotation(ms->sym);
 	const char *help = "Press 'h' for help on key bindings";
 	const char *help = "Press 'h' for help on key bindings";
 	int delay_secs = hbt ? hbt->refresh : 0;
 	int delay_secs = hbt ? hbt->refresh : 0;
 	int key;
 	int key;
@@ -851,8 +866,7 @@ static int annotate_browser__run(struct annotate_browser *browser,
 				continue;
 				continue;
 			}
 			}
 		case 'k':
 		case 'k':
-			annotate_browser__opts.show_linenr =
-				!annotate_browser__opts.show_linenr;
+			notes->options->show_linenr = !notes->options->show_linenr;
 			break;
 			break;
 		case 'H':
 		case 'H':
 			nd = browser->curr_hot;
 			nd = browser->curr_hot;
@@ -862,14 +876,14 @@ static int annotate_browser__run(struct annotate_browser *browser,
 				ui_helpline__puts(help);
 				ui_helpline__puts(help);
 			continue;
 			continue;
 		case 'o':
 		case 'o':
-			annotate_browser__opts.use_offset = !annotate_browser__opts.use_offset;
+			notes->options->use_offset = !notes->options->use_offset;
 			annotate_browser__update_addr_width(browser);
 			annotate_browser__update_addr_width(browser);
 			continue;
 			continue;
 		case 'j':
 		case 'j':
-			annotate_browser__opts.jump_arrows = !annotate_browser__opts.jump_arrows;
+			notes->options->jump_arrows = !notes->options->jump_arrows;
 			continue;
 			continue;
 		case 'J':
 		case 'J':
-			annotate_browser__opts.show_nr_jumps = !annotate_browser__opts.show_nr_jumps;
+			notes->options->show_nr_jumps = !notes->options->show_nr_jumps;
 			annotate_browser__update_addr_width(browser);
 			annotate_browser__update_addr_width(browser);
 			continue;
 			continue;
 		case '/':
 		case '/':
@@ -920,13 +934,13 @@ show_sup_ins:
 			continue;
 			continue;
 		}
 		}
 		case 't':
 		case 't':
-			if (annotate_browser__opts.show_total_period) {
-				annotate_browser__opts.show_total_period = false;
-				annotate_browser__opts.show_nr_samples = true;
-			} else if (annotate_browser__opts.show_nr_samples)
-				annotate_browser__opts.show_nr_samples = false;
+			if (notes->options->show_total_period) {
+				notes->options->show_total_period = false;
+				notes->options->show_nr_samples = true;
+			} else if (notes->options->show_nr_samples)
+				notes->options->show_nr_samples = false;
 			else
 			else
-				annotate_browser__opts.show_total_period = true;
+				notes->options->show_total_period = true;
 			annotate_browser__update_addr_width(browser);
 			annotate_browser__update_addr_width(browser);
 			continue;
 			continue;
 		case K_LEFT:
 		case K_LEFT:
@@ -1048,6 +1062,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,
 	if (map->dso->annotate_warned)
 	if (map->dso->annotate_warned)
 		return -1;
 		return -1;
 
 
+	notes->options = &annotate_browser__opts;
+
 	notes->offsets = zalloc(size * sizeof(struct annotation_line *));
 	notes->offsets = zalloc(size * sizeof(struct annotation_line *));
 	if (notes->offsets == NULL) {
 	if (notes->offsets == NULL) {
 		ui__error("Not enough memory!");
 		ui__error("Not enough memory!");
@@ -1105,7 +1121,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,
 	browser.b.entries = &notes->src->source,
 	browser.b.entries = &notes->src->source,
 	browser.b.width += 18; /* Percentage */
 	browser.b.width += 18; /* Percentage */
 
 
-	if (annotate_browser__opts.hide_src_code)
+	if (notes->options->hide_src_code)
 		annotate_browser__init_asm_mode(&browser);
 		annotate_browser__init_asm_mode(&browser);
 
 
 	annotate_browser__update_addr_width(&browser);
 	annotate_browser__update_addr_width(&browser);

+ 1 - 0
tools/perf/util/annotate.h

@@ -164,6 +164,7 @@ struct annotated_source {
 struct annotation {
 struct annotation {
 	pthread_mutex_t		lock;
 	pthread_mutex_t		lock;
 	u64			max_coverage;
 	u64			max_coverage;
+	struct annotation_options *options;
 	struct annotation_line	**offsets;
 	struct annotation_line	**offsets;
 	int			nr_events;
 	int			nr_events;
 	bool			have_cycles;
 	bool			have_cycles;