diff options
Diffstat (limited to 'tools/perf/util/hist.c')
| -rw-r--r-- | tools/perf/util/hist.c | 29 | 
1 files changed, 22 insertions, 7 deletions
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 07f89b66b31..784ee0bdda7 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -631,9 +631,14 @@ int hist_entry__fprintf(struct hist_entry *self, struct hists *pair_hists,  			u64 session_total)  {  	char bf[512]; -	hist_entry__snprintf(self, bf, sizeof(bf), pair_hists, -			     show_displacement, displacement, -			     true, session_total); +	int ret; + +	ret = hist_entry__snprintf(self, bf, sizeof(bf), pair_hists, +				   show_displacement, displacement, +				   true, session_total); +	if (!ret) +		return 0; +  	return fprintf(fp, "%s\n", bf);  } @@ -762,6 +767,7 @@ size_t hists__fprintf(struct hists *self, struct hists *pair,  print_entries:  	for (nd = rb_first(&self->entries); nd; nd = rb_next(nd)) {  		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); +		int cnt;  		if (show_displacement) {  			if (h->pair != NULL) @@ -771,8 +777,13 @@ print_entries:  				displacement = 0;  			++position;  		} -		ret += hist_entry__fprintf(h, pair, show_displacement, -					   displacement, fp, self->stats.total_period); +		cnt = hist_entry__fprintf(h, pair, show_displacement, +					  displacement, fp, self->stats.total_period); +		/* Ignore those that didn't match the parent filter */ +		if (!cnt) +			continue; + +		ret += cnt;  		if (symbol_conf.use_callchain)  			ret += hist_entry__fprintf_callchain(h, fp, self->stats.total_period); @@ -965,13 +976,17 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,  		 * Parse hexa addresses followed by ':'  		 */  		line_ip = strtoull(tmp, &tmp2, 16); -		if (*tmp2 != ':' || tmp == tmp2) +		if (*tmp2 != ':' || tmp == tmp2 || tmp2[1] == '\0')  			line_ip = -1;  	}  	if (line_ip != -1) { -		u64 start = map__rip_2objdump(self->ms.map, sym->start); +		u64 start = map__rip_2objdump(self->ms.map, sym->start), +		    end = map__rip_2objdump(self->ms.map, sym->end); +  		offset = line_ip - start; +		if (offset < 0 || (u64)line_ip > end) +			offset = -1;  	}  	objdump_line = objdump_line__new(offset, line);  |