aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/callchain.c95
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;
28int 28int
29parse_callchain_report_opt(const char *arg) 29parse_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;
98setup:
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;