aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2016-04-15 15:37:17 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-04-15 15:37:17 -0400
commit0883e820a0ac18e04f036dbebc3580351d7fd6cf (patch)
treec03348f9b88046bfcdd7d0a656e6fe06df3c51c2
parent5cf9c84e21067ec7a44648aedbc38c197d707258 (diff)
perf record: Export record_opts based callchain parsing helper
To be able to call it outside option parsing, like when setting a default --call-graph parameter in 'perf trace' when just --min-stack is used. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-xay69plylwibpb3l4isrpl1k@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/builtin-record.c35
-rw-r--r--tools/perf/util/callchain.h6
2 files changed, 26 insertions, 15 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 3239a6ec9d23..5b4758a08a49 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -930,45 +930,50 @@ out_delete_session:
930 return status; 930 return status;
931} 931}
932 932
933static void callchain_debug(void) 933static void callchain_debug(struct callchain_param *callchain)
934{ 934{
935 static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" }; 935 static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" };
936 936
937 pr_debug("callchain: type %s\n", str[callchain_param.record_mode]); 937 pr_debug("callchain: type %s\n", str[callchain->record_mode]);
938 938
939 if (callchain_param.record_mode == CALLCHAIN_DWARF) 939 if (callchain->record_mode == CALLCHAIN_DWARF)
940 pr_debug("callchain: stack dump size %d\n", 940 pr_debug("callchain: stack dump size %d\n",
941 callchain_param.dump_size); 941 callchain->dump_size);
942} 942}
943 943
944int record_parse_callchain_opt(const struct option *opt, 944int record_opts__parse_callchain(struct record_opts *record,
945 const char *arg, 945 struct callchain_param *callchain,
946 int unset) 946 const char *arg, bool unset)
947{ 947{
948 int ret; 948 int ret;
949 struct record_opts *record = (struct record_opts *)opt->value;
950
951 record->callgraph_set = true; 949 record->callgraph_set = true;
952 callchain_param.enabled = !unset; 950 callchain->enabled = !unset;
953 951
954 /* --no-call-graph */ 952 /* --no-call-graph */
955 if (unset) { 953 if (unset) {
956 callchain_param.record_mode = CALLCHAIN_NONE; 954 callchain->record_mode = CALLCHAIN_NONE;
957 pr_debug("callchain: disabled\n"); 955 pr_debug("callchain: disabled\n");
958 return 0; 956 return 0;
959 } 957 }
960 958
961 ret = parse_callchain_record_opt(arg, &callchain_param); 959 ret = parse_callchain_record_opt(arg, callchain);
962 if (!ret) { 960 if (!ret) {
963 /* Enable data address sampling for DWARF unwind. */ 961 /* Enable data address sampling for DWARF unwind. */
964 if (callchain_param.record_mode == CALLCHAIN_DWARF) 962 if (callchain->record_mode == CALLCHAIN_DWARF)
965 record->sample_address = true; 963 record->sample_address = true;
966 callchain_debug(); 964 callchain_debug(callchain);
967 } 965 }
968 966
969 return ret; 967 return ret;
970} 968}
971 969
970int record_parse_callchain_opt(const struct option *opt,
971 const char *arg,
972 int unset)
973{
974 return record_opts__parse_callchain(opt->value, &callchain_param, arg, unset);
975}
976
972int record_callchain_opt(const struct option *opt, 977int record_callchain_opt(const struct option *opt,
973 const char *arg __maybe_unused, 978 const char *arg __maybe_unused,
974 int unset __maybe_unused) 979 int unset __maybe_unused)
@@ -981,7 +986,7 @@ int record_callchain_opt(const struct option *opt,
981 if (callchain_param.record_mode == CALLCHAIN_NONE) 986 if (callchain_param.record_mode == CALLCHAIN_NONE)
982 callchain_param.record_mode = CALLCHAIN_FP; 987 callchain_param.record_mode = CALLCHAIN_FP;
983 988
984 callchain_debug(); 989 callchain_debug(&callchain_param);
985 return 0; 990 return 0;
986} 991}
987 992
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index cae5a7b1f5c8..65e2a4f7cb4e 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -212,6 +212,12 @@ struct hist_entry;
212int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset); 212int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset);
213int record_callchain_opt(const struct option *opt, const char *arg, int unset); 213int record_callchain_opt(const struct option *opt, const char *arg, int unset);
214 214
215struct record_opts;
216
217int record_opts__parse_callchain(struct record_opts *record,
218 struct callchain_param *callchain,
219 const char *arg, bool unset);
220
215int sample__resolve_callchain(struct perf_sample *sample, 221int sample__resolve_callchain(struct perf_sample *sample,
216 struct callchain_cursor *cursor, struct symbol **parent, 222 struct callchain_cursor *cursor, struct symbol **parent,
217 struct perf_evsel *evsel, struct addr_location *al, 223 struct perf_evsel *evsel, struct addr_location *al,