aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorKan Liang <kan.liang@intel.com>2015-08-06 15:44:52 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-08-08 13:16:49 -0400
commit076a30c411ba2b91a18d44a5a01977035cdd7716 (patch)
tree535cb24f04445c9fd233ccefc0cbb60e2067f694 /tools/perf
parentd809560b36a7ed31fbaf3719fdf79ddcbd30950b (diff)
perf callchain: Move option parsing code to util.c
Move callchain option parse related code to util.c, to avoid dragging more object files into the python binding. Signed-off-by: Kan Liang <kan.liang@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Link: http://lkml.kernel.org/r/1438890294-33409-1-git-send-email-kan.liang@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/util/callchain.c89
-rw-r--r--tools/perf/util/callchain.h1
-rw-r--r--tools/perf/util/util.c90
-rw-r--r--tools/perf/util/util.h2
4 files changed, 94 insertions, 88 deletions
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 931cca8e6ae8..773fe13ce627 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -25,96 +25,9 @@
25 25
26__thread struct callchain_cursor callchain_cursor; 26__thread struct callchain_cursor callchain_cursor;
27 27
28#ifdef HAVE_DWARF_UNWIND_SUPPORT
29static int get_stack_size(const char *str, unsigned long *_size)
30{
31 char *endptr;
32 unsigned long size;
33 unsigned long max_size = round_down(USHRT_MAX, sizeof(u64));
34
35 size = strtoul(str, &endptr, 0);
36
37 do {
38 if (*endptr)
39 break;
40
41 size = round_up(size, sizeof(u64));
42 if (!size || size > max_size)
43 break;
44
45 *_size = size;
46 return 0;
47
48 } while (0);
49
50 pr_err("callchain: Incorrect stack dump size (max %ld): %s\n",
51 max_size, str);
52 return -1;
53}
54#endif /* HAVE_DWARF_UNWIND_SUPPORT */
55
56int parse_callchain_record_opt(const char *arg, struct callchain_param *param) 28int parse_callchain_record_opt(const char *arg, struct callchain_param *param)
57{ 29{
58 char *tok, *name, *saveptr = NULL; 30 return parse_callchain_record(arg, param);
59 char *buf;
60 int ret = -1;
61
62 /* We need buffer that we know we can write to. */
63 buf = malloc(strlen(arg) + 1);
64 if (!buf)
65 return -ENOMEM;
66
67 strcpy(buf, arg);
68
69 tok = strtok_r((char *)buf, ",", &saveptr);
70 name = tok ? : (char *)buf;
71
72 do {
73 /* Framepointer style */
74 if (!strncmp(name, "fp", sizeof("fp"))) {
75 if (!strtok_r(NULL, ",", &saveptr)) {
76 param->record_mode = CALLCHAIN_FP;
77 ret = 0;
78 } else
79 pr_err("callchain: No more arguments "
80 "needed for --call-graph fp\n");
81 break;
82
83#ifdef HAVE_DWARF_UNWIND_SUPPORT
84 /* Dwarf style */
85 } else if (!strncmp(name, "dwarf", sizeof("dwarf"))) {
86 const unsigned long default_stack_dump_size = 8192;
87
88 ret = 0;
89 param->record_mode = CALLCHAIN_DWARF;
90 param->dump_size = default_stack_dump_size;
91
92 tok = strtok_r(NULL, ",", &saveptr);
93 if (tok) {
94 unsigned long size = 0;
95
96 ret = get_stack_size(tok, &size);
97 param->dump_size = size;
98 }
99#endif /* HAVE_DWARF_UNWIND_SUPPORT */
100 } else if (!strncmp(name, "lbr", sizeof("lbr"))) {
101 if (!strtok_r(NULL, ",", &saveptr)) {
102 param->record_mode = CALLCHAIN_LBR;
103 ret = 0;
104 } else
105 pr_err("callchain: No more arguments "
106 "needed for --call-graph lbr\n");
107 break;
108 } else {
109 pr_err("callchain: Unknown --call-graph option "
110 "value: %s\n", arg);
111 break;
112 }
113
114 } while (0);
115
116 free(buf);
117 return ret;
118} 31}
119 32
120static int parse_callchain_mode(const char *value) 33static int parse_callchain_mode(const char *value)
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 68a32c2fe87a..acee2b3cd801 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -177,6 +177,7 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
177 bool hide_unresolved); 177 bool hide_unresolved);
178 178
179extern const char record_callchain_help[]; 179extern const char record_callchain_help[];
180extern int parse_callchain_record(const char *arg, struct callchain_param *param);
180int parse_callchain_record_opt(const char *arg, struct callchain_param *param); 181int parse_callchain_record_opt(const char *arg, struct callchain_param *param);
181int parse_callchain_report_opt(const char *arg); 182int parse_callchain_report_opt(const char *arg);
182int perf_callchain_config(const char *var, const char *value); 183int perf_callchain_config(const char *var, const char *value);
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index edc2d633b332..f7adf1203df1 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -566,6 +566,96 @@ unsigned long parse_tag_value(const char *str, struct parse_tag *tags)
566 return (unsigned long) -1; 566 return (unsigned long) -1;
567} 567}
568 568
569int get_stack_size(const char *str, unsigned long *_size)
570{
571 char *endptr;
572 unsigned long size;
573 unsigned long max_size = round_down(USHRT_MAX, sizeof(u64));
574
575 size = strtoul(str, &endptr, 0);
576
577 do {
578 if (*endptr)
579 break;
580
581 size = round_up(size, sizeof(u64));
582 if (!size || size > max_size)
583 break;
584
585 *_size = size;
586 return 0;
587
588 } while (0);
589
590 pr_err("callchain: Incorrect stack dump size (max %ld): %s\n",
591 max_size, str);
592 return -1;
593}
594
595int parse_callchain_record(const char *arg, struct callchain_param *param)
596{
597 char *tok, *name, *saveptr = NULL;
598 char *buf;
599 int ret = -1;
600
601 /* We need buffer that we know we can write to. */
602 buf = malloc(strlen(arg) + 1);
603 if (!buf)
604 return -ENOMEM;
605
606 strcpy(buf, arg);
607
608 tok = strtok_r((char *)buf, ",", &saveptr);
609 name = tok ? : (char *)buf;
610
611 do {
612 /* Framepointer style */
613 if (!strncmp(name, "fp", sizeof("fp"))) {
614 if (!strtok_r(NULL, ",", &saveptr)) {
615 param->record_mode = CALLCHAIN_FP;
616 ret = 0;
617 } else
618 pr_err("callchain: No more arguments "
619 "needed for --call-graph fp\n");
620 break;
621
622#ifdef HAVE_DWARF_UNWIND_SUPPORT
623 /* Dwarf style */
624 } else if (!strncmp(name, "dwarf", sizeof("dwarf"))) {
625 const unsigned long default_stack_dump_size = 8192;
626
627 ret = 0;
628 param->record_mode = CALLCHAIN_DWARF;
629 param->dump_size = default_stack_dump_size;
630
631 tok = strtok_r(NULL, ",", &saveptr);
632 if (tok) {
633 unsigned long size = 0;
634
635 ret = get_stack_size(tok, &size);
636 param->dump_size = size;
637 }
638#endif /* HAVE_DWARF_UNWIND_SUPPORT */
639 } else if (!strncmp(name, "lbr", sizeof("lbr"))) {
640 if (!strtok_r(NULL, ",", &saveptr)) {
641 param->record_mode = CALLCHAIN_LBR;
642 ret = 0;
643 } else
644 pr_err("callchain: No more arguments "
645 "needed for --call-graph lbr\n");
646 break;
647 } else {
648 pr_err("callchain: Unknown --call-graph option "
649 "value: %s\n", arg);
650 break;
651 }
652
653 } while (0);
654
655 free(buf);
656 return ret;
657}
658
569int filename__read_str(const char *filename, char **buf, size_t *sizep) 659int filename__read_str(const char *filename, char **buf, size_t *sizep)
570{ 660{
571 size_t size = 0, alloc_size = 0; 661 size_t size = 0, alloc_size = 0;
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 20d625a4cacf..81487037acf7 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -351,4 +351,6 @@ static inline char *asprintf_expr_not_in_ints(const char *var, size_t nints, int
351 return asprintf_expr_inout_ints(var, false, nints, ints); 351 return asprintf_expr_inout_ints(var, false, nints, ints);
352} 352}
353 353
354int get_stack_size(const char *str, unsigned long *_size);
355
354#endif /* GIT_COMPAT_UTIL_H */ 356#endif /* GIT_COMPAT_UTIL_H */