perf tools: Move branch option parsing to own file
.. to allow sharing between builtin-record and builtin-top later. No code changes, just moved code. Signed-off-by: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1432749114-904-9-git-send-email-andi@firstfloor.org [ Rename too generic branch.[ch] name to parse-branch-options.[ch] ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								83be34a7a9
							
						
					
				
			
			
				commit
				
					
						f00898f4e2
					
				
			
		
					 4 changed files with 100 additions and 88 deletions
				
			
		|  | @ -28,6 +28,7 @@ | |||
| #include "util/thread_map.h" | ||||
| #include "util/data.h" | ||||
| #include "util/auxtrace.h" | ||||
| #include "util/parse-branch-options.h" | ||||
| 
 | ||||
| #include <unistd.h> | ||||
| #include <sched.h> | ||||
|  | @ -751,94 +752,6 @@ out_delete_session: | |||
| 	return status; | ||||
| } | ||||
| 
 | ||||
| #define BRANCH_OPT(n, m) \ | ||||
| 	{ .name = n, .mode = (m) } | ||||
| 
 | ||||
| #define BRANCH_END { .name = NULL } | ||||
| 
 | ||||
| struct branch_mode { | ||||
| 	const char *name; | ||||
| 	int mode; | ||||
| }; | ||||
| 
 | ||||
| static const struct branch_mode branch_modes[] = { | ||||
| 	BRANCH_OPT("u", PERF_SAMPLE_BRANCH_USER), | ||||
| 	BRANCH_OPT("k", PERF_SAMPLE_BRANCH_KERNEL), | ||||
| 	BRANCH_OPT("hv", PERF_SAMPLE_BRANCH_HV), | ||||
| 	BRANCH_OPT("any", PERF_SAMPLE_BRANCH_ANY), | ||||
| 	BRANCH_OPT("any_call", PERF_SAMPLE_BRANCH_ANY_CALL), | ||||
| 	BRANCH_OPT("any_ret", PERF_SAMPLE_BRANCH_ANY_RETURN), | ||||
| 	BRANCH_OPT("ind_call", PERF_SAMPLE_BRANCH_IND_CALL), | ||||
| 	BRANCH_OPT("abort_tx", PERF_SAMPLE_BRANCH_ABORT_TX), | ||||
| 	BRANCH_OPT("in_tx", PERF_SAMPLE_BRANCH_IN_TX), | ||||
| 	BRANCH_OPT("no_tx", PERF_SAMPLE_BRANCH_NO_TX), | ||||
| 	BRANCH_OPT("cond", PERF_SAMPLE_BRANCH_COND), | ||||
| 	BRANCH_END | ||||
| }; | ||||
| 
 | ||||
| static int | ||||
| parse_branch_stack(const struct option *opt, const char *str, int unset) | ||||
| { | ||||
| #define ONLY_PLM \ | ||||
| 	(PERF_SAMPLE_BRANCH_USER	|\ | ||||
| 	 PERF_SAMPLE_BRANCH_KERNEL	|\ | ||||
| 	 PERF_SAMPLE_BRANCH_HV) | ||||
| 
 | ||||
| 	uint64_t *mode = (uint64_t *)opt->value; | ||||
| 	const struct branch_mode *br; | ||||
| 	char *s, *os = NULL, *p; | ||||
| 	int ret = -1; | ||||
| 
 | ||||
| 	if (unset) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * cannot set it twice, -b + --branch-filter for instance | ||||
| 	 */ | ||||
| 	if (*mode) | ||||
| 		return -1; | ||||
| 
 | ||||
| 	/* str may be NULL in case no arg is passed to -b */ | ||||
| 	if (str) { | ||||
| 		/* because str is read-only */ | ||||
| 		s = os = strdup(str); | ||||
| 		if (!s) | ||||
| 			return -1; | ||||
| 
 | ||||
| 		for (;;) { | ||||
| 			p = strchr(s, ','); | ||||
| 			if (p) | ||||
| 				*p = '\0'; | ||||
| 
 | ||||
| 			for (br = branch_modes; br->name; br++) { | ||||
| 				if (!strcasecmp(s, br->name)) | ||||
| 					break; | ||||
| 			} | ||||
| 			if (!br->name) { | ||||
| 				ui__warning("unknown branch filter %s," | ||||
| 					    " check man page\n", s); | ||||
| 				goto error; | ||||
| 			} | ||||
| 
 | ||||
| 			*mode |= br->mode; | ||||
| 
 | ||||
| 			if (!p) | ||||
| 				break; | ||||
| 
 | ||||
| 			s = p + 1; | ||||
| 		} | ||||
| 	} | ||||
| 	ret = 0; | ||||
| 
 | ||||
| 	/* default to any branch */ | ||||
| 	if ((*mode & ~ONLY_PLM) == 0) { | ||||
| 		*mode = PERF_SAMPLE_BRANCH_ANY; | ||||
| 	} | ||||
| error: | ||||
| 	free(os); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static void callchain_debug(void) | ||||
| { | ||||
| 	static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" }; | ||||
|  |  | |||
|  | @ -75,6 +75,7 @@ libperf-$(CONFIG_X86) += tsc.o | |||
| libperf-y += cloexec.o | ||||
| libperf-y += thread-stack.o | ||||
| libperf-$(CONFIG_AUXTRACE) += auxtrace.o | ||||
| libperf-y += parse-branch-options.o | ||||
| 
 | ||||
| libperf-$(CONFIG_LIBELF) += symbol-elf.o | ||||
| libperf-$(CONFIG_LIBELF) += probe-event.o | ||||
|  |  | |||
							
								
								
									
										93
									
								
								tools/perf/util/parse-branch-options.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								tools/perf/util/parse-branch-options.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,93 @@ | |||
| #include "perf.h" | ||||
| #include "util/util.h" | ||||
| #include "util/debug.h" | ||||
| #include "util/parse-options.h" | ||||
| #include "util/parse-branch-options.h" | ||||
| 
 | ||||
| #define BRANCH_OPT(n, m) \ | ||||
| 	{ .name = n, .mode = (m) } | ||||
| 
 | ||||
| #define BRANCH_END { .name = NULL } | ||||
| 
 | ||||
| struct branch_mode { | ||||
| 	const char *name; | ||||
| 	int mode; | ||||
| }; | ||||
| 
 | ||||
| static const struct branch_mode branch_modes[] = { | ||||
| 	BRANCH_OPT("u", PERF_SAMPLE_BRANCH_USER), | ||||
| 	BRANCH_OPT("k", PERF_SAMPLE_BRANCH_KERNEL), | ||||
| 	BRANCH_OPT("hv", PERF_SAMPLE_BRANCH_HV), | ||||
| 	BRANCH_OPT("any", PERF_SAMPLE_BRANCH_ANY), | ||||
| 	BRANCH_OPT("any_call", PERF_SAMPLE_BRANCH_ANY_CALL), | ||||
| 	BRANCH_OPT("any_ret", PERF_SAMPLE_BRANCH_ANY_RETURN), | ||||
| 	BRANCH_OPT("ind_call", PERF_SAMPLE_BRANCH_IND_CALL), | ||||
| 	BRANCH_OPT("abort_tx", PERF_SAMPLE_BRANCH_ABORT_TX), | ||||
| 	BRANCH_OPT("in_tx", PERF_SAMPLE_BRANCH_IN_TX), | ||||
| 	BRANCH_OPT("no_tx", PERF_SAMPLE_BRANCH_NO_TX), | ||||
| 	BRANCH_OPT("cond", PERF_SAMPLE_BRANCH_COND), | ||||
| 	BRANCH_END | ||||
| }; | ||||
| 
 | ||||
| int | ||||
| parse_branch_stack(const struct option *opt, const char *str, int unset) | ||||
| { | ||||
| #define ONLY_PLM \ | ||||
| 	(PERF_SAMPLE_BRANCH_USER	|\ | ||||
| 	 PERF_SAMPLE_BRANCH_KERNEL	|\ | ||||
| 	 PERF_SAMPLE_BRANCH_HV) | ||||
| 
 | ||||
| 	uint64_t *mode = (uint64_t *)opt->value; | ||||
| 	const struct branch_mode *br; | ||||
| 	char *s, *os = NULL, *p; | ||||
| 	int ret = -1; | ||||
| 
 | ||||
| 	if (unset) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * cannot set it twice, -b + --branch-filter for instance | ||||
| 	 */ | ||||
| 	if (*mode) | ||||
| 		return -1; | ||||
| 
 | ||||
| 	/* str may be NULL in case no arg is passed to -b */ | ||||
| 	if (str) { | ||||
| 		/* because str is read-only */ | ||||
| 		s = os = strdup(str); | ||||
| 		if (!s) | ||||
| 			return -1; | ||||
| 
 | ||||
| 		for (;;) { | ||||
| 			p = strchr(s, ','); | ||||
| 			if (p) | ||||
| 				*p = '\0'; | ||||
| 
 | ||||
| 			for (br = branch_modes; br->name; br++) { | ||||
| 				if (!strcasecmp(s, br->name)) | ||||
| 					break; | ||||
| 			} | ||||
| 			if (!br->name) { | ||||
| 				ui__warning("unknown branch filter %s," | ||||
| 					    " check man page\n", s); | ||||
| 				goto error; | ||||
| 			} | ||||
| 
 | ||||
| 			*mode |= br->mode; | ||||
| 
 | ||||
| 			if (!p) | ||||
| 				break; | ||||
| 
 | ||||
| 			s = p + 1; | ||||
| 		} | ||||
| 	} | ||||
| 	ret = 0; | ||||
| 
 | ||||
| 	/* default to any branch */ | ||||
| 	if ((*mode & ~ONLY_PLM) == 0) { | ||||
| 		*mode = PERF_SAMPLE_BRANCH_ANY; | ||||
| 	} | ||||
| error: | ||||
| 	free(os); | ||||
| 	return ret; | ||||
| } | ||||
							
								
								
									
										5
									
								
								tools/perf/util/parse-branch-options.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tools/perf/util/parse-branch-options.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| #ifndef _PERF_PARSE_BRANCH_OPTIONS_H | ||||
| #define _PERF_PARSE_BRANCH_OPTIONS_H 1 | ||||
| struct option; | ||||
| int parse_branch_stack(const struct option *opt, const char *str, int unset); | ||||
| #endif /* _PERF_PARSE_BRANCH_OPTIONS_H */ | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andi Kleen
				Andi Kleen