diff options
-rw-r--r-- | tools/perf/util/callchain.c | 95 |
1 files changed, 38 insertions, 57 deletions
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 437ee09727e6..08f0fbf5527c 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c | |||
@@ -28,74 +28,55 @@ __thread struct callchain_cursor callchain_cursor; | |||
28 | int | 28 | int |
29 | parse_callchain_report_opt(const char *arg) | 29 | parse_callchain_report_opt(const char *arg) |
30 | { | 30 | { |
31 | char *tok, *tok2; | 31 | char *tok; |
32 | char *endptr; | 32 | char *endptr; |
33 | bool minpcnt_set = false; | ||
33 | 34 | ||
34 | symbol_conf.use_callchain = true; | 35 | symbol_conf.use_callchain = true; |
35 | 36 | ||
36 | if (!arg) | 37 | if (!arg) |
37 | return 0; | 38 | return 0; |
38 | 39 | ||
39 | tok = strtok((char *)arg, ","); | 40 | while ((tok = strtok((char *)arg, ",")) != NULL) { |
40 | if (!tok) | 41 | if (!strncmp(tok, "none", strlen(tok))) { |
41 | return -1; | 42 | callchain_param.mode = CHAIN_NONE; |
42 | 43 | symbol_conf.use_callchain = false; | |
43 | /* get the output mode */ | 44 | return 0; |
44 | if (!strncmp(tok, "graph", strlen(arg))) { | 45 | } |
45 | callchain_param.mode = CHAIN_GRAPH_ABS; | ||
46 | |||
47 | } else if (!strncmp(tok, "flat", strlen(arg))) { | ||
48 | callchain_param.mode = CHAIN_FLAT; | ||
49 | } else if (!strncmp(tok, "fractal", strlen(arg))) { | ||
50 | callchain_param.mode = CHAIN_GRAPH_REL; | ||
51 | } else if (!strncmp(tok, "none", strlen(arg))) { | ||
52 | callchain_param.mode = CHAIN_NONE; | ||
53 | symbol_conf.use_callchain = false; | ||
54 | return 0; | ||
55 | } else { | ||
56 | return -1; | ||
57 | } | ||
58 | |||
59 | /* get the min percentage */ | ||
60 | tok = strtok(NULL, ","); | ||
61 | if (!tok) | ||
62 | goto setup; | ||
63 | |||
64 | callchain_param.min_percent = strtod(tok, &endptr); | ||
65 | if (tok == endptr) | ||
66 | return -1; | ||
67 | 46 | ||
68 | /* get the print limit */ | 47 | /* try to get the output mode */ |
69 | tok2 = strtok(NULL, ","); | 48 | if (!strncmp(tok, "graph", strlen(tok))) |
70 | if (!tok2) | 49 | callchain_param.mode = CHAIN_GRAPH_ABS; |
71 | goto setup; | 50 | else if (!strncmp(tok, "flat", strlen(tok))) |
51 | callchain_param.mode = CHAIN_FLAT; | ||
52 | else if (!strncmp(tok, "fractal", strlen(tok))) | ||
53 | callchain_param.mode = CHAIN_GRAPH_REL; | ||
54 | /* try to get the call chain order */ | ||
55 | else if (!strncmp(tok, "caller", strlen(tok))) | ||
56 | callchain_param.order = ORDER_CALLER; | ||
57 | else if (!strncmp(tok, "callee", strlen(tok))) | ||
58 | callchain_param.order = ORDER_CALLEE; | ||
59 | /* try to get the sort key */ | ||
60 | else if (!strncmp(tok, "function", strlen(tok))) | ||
61 | callchain_param.key = CCKEY_FUNCTION; | ||
62 | else if (!strncmp(tok, "address", strlen(tok))) | ||
63 | callchain_param.key = CCKEY_ADDRESS; | ||
64 | /* try to get the min percent */ | ||
65 | else if (!minpcnt_set) { | ||
66 | callchain_param.min_percent = strtod(tok, &endptr); | ||
67 | if (tok == endptr) | ||
68 | return -1; | ||
69 | minpcnt_set = true; | ||
70 | } else { | ||
71 | /* try print limit at last */ | ||
72 | callchain_param.print_limit = strtoul(tok, &endptr, 0); | ||
73 | if (tok == endptr) | ||
74 | return -1; | ||
75 | } | ||
72 | 76 | ||
73 | if (tok2[0] != 'c') { | 77 | arg = NULL; |
74 | callchain_param.print_limit = strtoul(tok2, &endptr, 0); | ||
75 | tok2 = strtok(NULL, ","); | ||
76 | if (!tok2) | ||
77 | goto setup; | ||
78 | } | 78 | } |
79 | 79 | ||
80 | /* get the call chain order */ | ||
81 | if (!strncmp(tok2, "caller", strlen("caller"))) | ||
82 | callchain_param.order = ORDER_CALLER; | ||
83 | else if (!strncmp(tok2, "callee", strlen("callee"))) | ||
84 | callchain_param.order = ORDER_CALLEE; | ||
85 | else | ||
86 | return -1; | ||
87 | |||
88 | /* Get the sort key */ | ||
89 | tok2 = strtok(NULL, ","); | ||
90 | if (!tok2) | ||
91 | goto setup; | ||
92 | if (!strncmp(tok2, "function", strlen("function"))) | ||
93 | callchain_param.key = CCKEY_FUNCTION; | ||
94 | else if (!strncmp(tok2, "address", strlen("address"))) | ||
95 | callchain_param.key = CCKEY_ADDRESS; | ||
96 | else | ||
97 | return -1; | ||
98 | setup: | ||
99 | if (callchain_register_param(&callchain_param) < 0) { | 80 | if (callchain_register_param(&callchain_param) < 0) { |
100 | pr_err("Can't register callchain params\n"); | 81 | pr_err("Can't register callchain params\n"); |
101 | return -1; | 82 | return -1; |