diff options
Diffstat (limited to 'tools/perf/ui/browsers/annotate.c')
| -rw-r--r-- | tools/perf/ui/browsers/annotate.c | 33 | 
1 files changed, 17 insertions, 16 deletions
| diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c index 5dab3ca96980..7dca1555c610 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c @@ -182,6 +182,16 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int  		ab->selection = dl;  } +static bool disasm_line__is_valid_jump(struct disasm_line *dl, struct symbol *sym) +{ +	if (!dl || !dl->ins || !ins__is_jump(dl->ins) +	    || !disasm_line__has_offset(dl) +	    || dl->ops.target.offset >= symbol__size(sym)) +		return false; + +	return true; +} +  static void annotate_browser__draw_current_jump(struct ui_browser *browser)  {  	struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); @@ -195,8 +205,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)  	if (strstr(sym->name, "@plt"))  		return; -	if (!cursor || !cursor->ins || !ins__is_jump(cursor->ins) || -	    !disasm_line__has_offset(cursor)) +	if (!disasm_line__is_valid_jump(cursor, sym))  		return;  	target = ab->offsets[cursor->ops.target.offset]; @@ -788,17 +797,9 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browser  		struct disasm_line *dl = browser->offsets[offset], *dlt;  		struct browser_disasm_line *bdlt; -		if (!dl || !dl->ins || !ins__is_jump(dl->ins) || -		    !disasm_line__has_offset(dl)) +		if (!disasm_line__is_valid_jump(dl, sym))  			continue; -		if (dl->ops.target.offset >= size) { -			ui__error("jump to after symbol!\n" -				  "size: %zx, jump target: %" PRIx64, -				  size, dl->ops.target.offset); -			continue; -		} -  		dlt = browser->offsets[dl->ops.target.offset];  		/*   		 * FIXME: Oops, no jump target? Buggy disassembler? Or do we @@ -921,11 +922,11 @@ out_free_offsets:  #define ANNOTATE_CFG(n) \  	{ .name = #n, .value = &annotate_browser__opts.n, } -	 +  /*   * Keep the entries sorted, they are bsearch'ed   */ -static struct annotate__config { +static struct annotate_config {  	const char *name;  	bool *value;  } annotate__configs[] = { @@ -939,7 +940,7 @@ static struct annotate__config {  static int annotate_config__cmp(const void *name, const void *cfgp)  { -	const struct annotate__config *cfg = cfgp; +	const struct annotate_config *cfg = cfgp;  	return strcmp(name, cfg->name);  } @@ -947,7 +948,7 @@ static int annotate_config__cmp(const void *name, const void *cfgp)  static int annotate__config(const char *var, const char *value,  			    void *data __maybe_unused)  { -	struct annotate__config *cfg; +	struct annotate_config *cfg;  	const char *name;  	if (prefixcmp(var, "annotate.") != 0) @@ -955,7 +956,7 @@ static int annotate__config(const char *var, const char *value,  	name = var + 9;  	cfg = bsearch(name, annotate__configs, ARRAY_SIZE(annotate__configs), -		      sizeof(struct annotate__config), annotate_config__cmp); +		      sizeof(struct annotate_config), annotate_config__cmp);  	if (cfg == NULL)  		return -1; |