|
@@ -624,90 +624,6 @@ error:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-#ifdef HAVE_DWARF_UNWIND_SUPPORT
|
|
|
-static int get_stack_size(char *str, unsigned long *_size)
|
|
|
-{
|
|
|
- char *endptr;
|
|
|
- unsigned long size;
|
|
|
- unsigned long max_size = round_down(USHRT_MAX, sizeof(u64));
|
|
|
-
|
|
|
- size = strtoul(str, &endptr, 0);
|
|
|
-
|
|
|
- do {
|
|
|
- if (*endptr)
|
|
|
- break;
|
|
|
-
|
|
|
- size = round_up(size, sizeof(u64));
|
|
|
- if (!size || size > max_size)
|
|
|
- break;
|
|
|
-
|
|
|
- *_size = size;
|
|
|
- return 0;
|
|
|
-
|
|
|
- } while (0);
|
|
|
-
|
|
|
- pr_err("callchain: Incorrect stack dump size (max %ld): %s\n",
|
|
|
- max_size, str);
|
|
|
- return -1;
|
|
|
-}
|
|
|
-#endif /* HAVE_DWARF_UNWIND_SUPPORT */
|
|
|
-
|
|
|
-int record_parse_callchain(const char *arg)
|
|
|
-{
|
|
|
- char *tok, *name, *saveptr = NULL;
|
|
|
- char *buf;
|
|
|
- int ret = -1;
|
|
|
-
|
|
|
- /* We need buffer that we know we can write to. */
|
|
|
- buf = malloc(strlen(arg) + 1);
|
|
|
- if (!buf)
|
|
|
- return -ENOMEM;
|
|
|
-
|
|
|
- strcpy(buf, arg);
|
|
|
-
|
|
|
- tok = strtok_r((char *)buf, ",", &saveptr);
|
|
|
- name = tok ? : (char *)buf;
|
|
|
-
|
|
|
- do {
|
|
|
- /* Framepointer style */
|
|
|
- if (!strncmp(name, "fp", sizeof("fp"))) {
|
|
|
- if (!strtok_r(NULL, ",", &saveptr)) {
|
|
|
- callchain_param.record_mode = CALLCHAIN_FP;
|
|
|
- ret = 0;
|
|
|
- } else
|
|
|
- pr_err("callchain: No more arguments "
|
|
|
- "needed for -g fp\n");
|
|
|
- break;
|
|
|
-
|
|
|
-#ifdef HAVE_DWARF_UNWIND_SUPPORT
|
|
|
- /* Dwarf style */
|
|
|
- } else if (!strncmp(name, "dwarf", sizeof("dwarf"))) {
|
|
|
- const unsigned long default_stack_dump_size = 8192;
|
|
|
-
|
|
|
- ret = 0;
|
|
|
- callchain_param.record_mode = CALLCHAIN_DWARF;
|
|
|
- callchain_param.dump_size = default_stack_dump_size;
|
|
|
-
|
|
|
- tok = strtok_r(NULL, ",", &saveptr);
|
|
|
- if (tok) {
|
|
|
- unsigned long size = 0;
|
|
|
-
|
|
|
- ret = get_stack_size(tok, &size);
|
|
|
- callchain_param.dump_size = size;
|
|
|
- }
|
|
|
-#endif /* HAVE_DWARF_UNWIND_SUPPORT */
|
|
|
- } else {
|
|
|
- pr_err("callchain: Unknown --call-graph option "
|
|
|
- "value: %s\n", arg);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- } while (0);
|
|
|
-
|
|
|
- free(buf);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
static void callchain_debug(void)
|
|
|
{
|
|
|
static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF" };
|
|
@@ -734,7 +650,7 @@ int record_parse_callchain_opt(const struct option *opt __maybe_unused,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- ret = record_parse_callchain(arg);
|
|
|
+ ret = parse_callchain_record_opt(arg);
|
|
|
if (!ret)
|
|
|
callchain_debug();
|
|
|
|
|
@@ -757,7 +673,7 @@ int record_callchain_opt(const struct option *opt __maybe_unused,
|
|
|
static int perf_record_config(const char *var, const char *value, void *cb)
|
|
|
{
|
|
|
if (!strcmp(var, "record.call-graph"))
|
|
|
- return record_parse_callchain(value);
|
|
|
+ return parse_callchain_record_opt(value);
|
|
|
|
|
|
return perf_default_config(var, value, cb);
|
|
|
}
|