perf tools: Expose 'addr' functions so they can be reused
Move some functions and functionality related to the use of 'addr' out of builtin-script so they can be reused. The moved functions are: is_bts_event() and sample_addr_correlates_sym() and a new function perf_event__preprocess_sample_addr() is created from bits of print_sample_addr(). perf_event__preprocess_sample_addr() is the equivalent of perf_event__preprocess_sample() but for 'addr' instead of 'ip'. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1406035081-14301-31-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									f1dd1460a4
								
							
						
					
					
						commit
						9b0d2d875d
					
				| @ -358,27 +358,6 @@ static void print_sample_start(struct perf_sample *sample, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static bool is_bts_event(struct perf_event_attr *attr) | ||||
| { | ||||
| 	return ((attr->type == PERF_TYPE_HARDWARE) && | ||||
| 		(attr->config & PERF_COUNT_HW_BRANCH_INSTRUCTIONS) && | ||||
| 		(attr->sample_period == 1)); | ||||
| } | ||||
| 
 | ||||
| static bool sample_addr_correlates_sym(struct perf_event_attr *attr) | ||||
| { | ||||
| 	if ((attr->type == PERF_TYPE_SOFTWARE) && | ||||
| 	    ((attr->config == PERF_COUNT_SW_PAGE_FAULTS) || | ||||
| 	     (attr->config == PERF_COUNT_SW_PAGE_FAULTS_MIN) || | ||||
| 	     (attr->config == PERF_COUNT_SW_PAGE_FAULTS_MAJ))) | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (is_bts_event(attr)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| static void print_sample_addr(union perf_event *event, | ||||
| 			  struct perf_sample *sample, | ||||
| 			  struct machine *machine, | ||||
| @ -386,24 +365,13 @@ static void print_sample_addr(union perf_event *event, | ||||
| 			  struct perf_event_attr *attr) | ||||
| { | ||||
| 	struct addr_location al; | ||||
| 	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; | ||||
| 
 | ||||
| 	printf("%16" PRIx64, sample->addr); | ||||
| 
 | ||||
| 	if (!sample_addr_correlates_sym(attr)) | ||||
| 		return; | ||||
| 
 | ||||
| 	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION, | ||||
| 			      sample->addr, &al); | ||||
| 	if (!al.map) | ||||
| 		thread__find_addr_map(thread, machine, cpumode, MAP__VARIABLE, | ||||
| 				      sample->addr, &al); | ||||
| 
 | ||||
| 	al.cpu = sample->cpu; | ||||
| 	al.sym = NULL; | ||||
| 
 | ||||
| 	if (al.map) | ||||
| 		al.sym = map__find_symbol(al.map, al.addr, NULL); | ||||
| 	perf_event__preprocess_sample_addr(event, sample, machine, thread, &al); | ||||
| 
 | ||||
| 	if (PRINT_FIELD(SYM)) { | ||||
| 		printf(" "); | ||||
|  | ||||
| @ -874,3 +874,45 @@ int perf_event__preprocess_sample(const union perf_event *event, | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| bool is_bts_event(struct perf_event_attr *attr) | ||||
| { | ||||
| 	return attr->type == PERF_TYPE_HARDWARE && | ||||
| 	       (attr->config & PERF_COUNT_HW_BRANCH_INSTRUCTIONS) && | ||||
| 	       attr->sample_period == 1; | ||||
| } | ||||
| 
 | ||||
| bool sample_addr_correlates_sym(struct perf_event_attr *attr) | ||||
| { | ||||
| 	if (attr->type == PERF_TYPE_SOFTWARE && | ||||
| 	    (attr->config == PERF_COUNT_SW_PAGE_FAULTS || | ||||
| 	     attr->config == PERF_COUNT_SW_PAGE_FAULTS_MIN || | ||||
| 	     attr->config == PERF_COUNT_SW_PAGE_FAULTS_MAJ)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (is_bts_event(attr)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| void perf_event__preprocess_sample_addr(union perf_event *event, | ||||
| 					struct perf_sample *sample, | ||||
| 					struct machine *machine, | ||||
| 					struct thread *thread, | ||||
| 					struct addr_location *al) | ||||
| { | ||||
| 	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; | ||||
| 
 | ||||
| 	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION, | ||||
| 			      sample->addr, al); | ||||
| 	if (!al->map) | ||||
| 		thread__find_addr_map(thread, machine, cpumode, MAP__VARIABLE, | ||||
| 				      sample->addr, al); | ||||
| 
 | ||||
| 	al->cpu = sample->cpu; | ||||
| 	al->sym = NULL; | ||||
| 
 | ||||
| 	if (al->map) | ||||
| 		al->sym = map__find_symbol(al->map, al->addr, NULL); | ||||
| } | ||||
|  | ||||
| @ -288,6 +288,16 @@ int perf_event__preprocess_sample(const union perf_event *event, | ||||
| 				  struct addr_location *al, | ||||
| 				  struct perf_sample *sample); | ||||
| 
 | ||||
| struct thread; | ||||
| 
 | ||||
| bool is_bts_event(struct perf_event_attr *attr); | ||||
| bool sample_addr_correlates_sym(struct perf_event_attr *attr); | ||||
| void perf_event__preprocess_sample_addr(union perf_event *event, | ||||
| 					struct perf_sample *sample, | ||||
| 					struct machine *machine, | ||||
| 					struct thread *thread, | ||||
| 					struct addr_location *al); | ||||
| 
 | ||||
| const char *perf_event__name(unsigned int id); | ||||
| 
 | ||||
| size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user