diff options
Diffstat (limited to 'tools/perf/util/session.c')
| -rw-r--r-- | tools/perf/util/session.c | 68 | 
1 files changed, 44 insertions, 24 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index f5a8fbdd3f7..558bcf99694 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -247,9 +247,14 @@ int perf_session__resolve_callchain(struct perf_session *self,  	callchain_cursor_reset(&self->callchain_cursor);  	for (i = 0; i < chain->nr; i++) { -		u64 ip = chain->ips[i]; +		u64 ip;  		struct addr_location al; +		if (callchain_param.order == ORDER_CALLEE) +			ip = chain->ips[i]; +		else +			ip = chain->ips[chain->nr - i - 1]; +  		if (ip >= PERF_CONTEXT_MAX) {  			switch (ip) {  			case PERF_CONTEXT_HV: @@ -708,9 +713,9 @@ static void dump_sample(struct perf_session *session, union perf_event *event,  	if (!dump_trace)  		return; -	printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 "\n", +	printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 " addr: %#" PRIx64 "\n",  	       event->header.misc, sample->pid, sample->tid, sample->ip, -	       sample->period); +	       sample->period, sample->addr);  	if (session->sample_type & PERF_SAMPLE_CALLCHAIN)  		callchain__printf(sample); @@ -1202,9 +1207,10 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,  	return NULL;  } -void perf_session__print_symbols(union perf_event *event, -				struct perf_sample *sample, -				struct perf_session *session) +void perf_session__print_ip(union perf_event *event, +			    struct perf_sample *sample, +			    struct perf_session *session, +			    int print_sym, int print_dso)  {  	struct addr_location al;  	const char *symname, *dsoname; @@ -1233,32 +1239,46 @@ void perf_session__print_symbols(union perf_event *event,  			if (!node)  				break; -			if (node->sym && node->sym->name) -				symname = node->sym->name; -			else -				symname = ""; +			printf("\t%16" PRIx64, node->ip); +			if (print_sym) { +				if (node->sym && node->sym->name) +					symname = node->sym->name; +				else +					symname = ""; -			if (node->map && node->map->dso && node->map->dso->name) -				dsoname = node->map->dso->name; -			else -				dsoname = ""; +				printf(" %s", symname); +			} +			if (print_dso) { +				if (node->map && node->map->dso && node->map->dso->name) +					dsoname = node->map->dso->name; +				else +					dsoname = ""; -			printf("\t%16" PRIx64 " %s (%s)\n", node->ip, symname, dsoname); +				printf(" (%s)", dsoname); +			} +			printf("\n");  			callchain_cursor_advance(cursor);  		}  	} else { -		if (al.sym && al.sym->name) -			symname = al.sym->name; -		else -			symname = ""; +		printf("%16" PRIx64, al.addr); +		if (print_sym) { +			if (al.sym && al.sym->name) +				symname = al.sym->name; +			else +				symname = ""; -		if (al.map && al.map->dso && al.map->dso->name) -			dsoname = al.map->dso->name; -		else -			dsoname = ""; +			printf(" %s", symname); +		} -		printf("%16" PRIx64 " %s (%s)", al.addr, symname, dsoname); +		if (print_dso) { +			if (al.map && al.map->dso && al.map->dso->name) +				dsoname = al.map->dso->name; +			else +				dsoname = ""; + +			printf(" (%s)", dsoname); +		}  	}  }  |