diff options
author | Kan Liang <kan.liang@intel.com> | 2015-08-06 15:44:52 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-08-08 13:16:49 -0400 |
commit | 076a30c411ba2b91a18d44a5a01977035cdd7716 (patch) | |
tree | 535cb24f04445c9fd233ccefc0cbb60e2067f694 /tools/perf | |
parent | d809560b36a7ed31fbaf3719fdf79ddcbd30950b (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.c | 89 | ||||
-rw-r--r-- | tools/perf/util/callchain.h | 1 | ||||
-rw-r--r-- | tools/perf/util/util.c | 90 | ||||
-rw-r--r-- | tools/perf/util/util.h | 2 |
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 | ||
29 | static 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 | |||
56 | int parse_callchain_record_opt(const char *arg, struct callchain_param *param) | 28 | int 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 | ||
120 | static int parse_callchain_mode(const char *value) | 33 | static 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 | ||
179 | extern const char record_callchain_help[]; | 179 | extern const char record_callchain_help[]; |
180 | extern int parse_callchain_record(const char *arg, struct callchain_param *param); | ||
180 | int parse_callchain_record_opt(const char *arg, struct callchain_param *param); | 181 | int parse_callchain_record_opt(const char *arg, struct callchain_param *param); |
181 | int parse_callchain_report_opt(const char *arg); | 182 | int parse_callchain_report_opt(const char *arg); |
182 | int perf_callchain_config(const char *var, const char *value); | 183 | int 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 | ||
569 | int 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 | |||
595 | int 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 | |||
569 | int filename__read_str(const char *filename, char **buf, size_t *sizep) | 659 | int 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 | ||
354 | int get_stack_size(const char *str, unsigned long *_size); | ||
355 | |||
354 | #endif /* GIT_COMPAT_UTIL_H */ | 356 | #endif /* GIT_COMPAT_UTIL_H */ |