summaryrefslogtreecommitdiff
path: root/tools/perf/util/symbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/symbol.c')
-rw-r--r--tools/perf/util/symbol.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 8662001e1e25..bd811b2b7890 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -66,6 +66,7 @@ struct symbol_conf symbol_conf = {
.time_quantum = 100 * NSEC_PER_MSEC, /* 100ms */
.show_hist_headers = true,
.symfs = "",
+ .symfs_layout_flat = false,
.event_group = true,
.inline_name = true,
.res_sample = 0,
@@ -2491,16 +2492,42 @@ int symbol__config_symfs(const struct option *opt __maybe_unused,
const char *dir, int unset __maybe_unused)
{
char *bf = NULL;
+ char *layout_str;
+ char *dir_copy;
int ret;
- symbol_conf.symfs = strdup(dir);
- if (symbol_conf.symfs == NULL)
- return -ENOMEM;
+ layout_str = strrchr(dir, ',');
+ if (layout_str) {
+ size_t dir_len = layout_str - dir;
+
+ dir_copy = strndup(dir, dir_len);
+ if (dir_copy == NULL)
+ return -ENOMEM;
+
+ symbol_conf.symfs = dir_copy;
+
+ layout_str++;
+ if (!strcmp(layout_str, "flat"))
+ symbol_conf.symfs_layout_flat = true;
+ else if (!strcmp(layout_str, "hierarchy"))
+ symbol_conf.symfs_layout_flat = false;
+ else {
+ pr_err("Invalid layout: '%s', use 'hierarchy' or 'flat'\n",
+ layout_str);
+ free(dir_copy);
+ return -EINVAL;
+ }
+ } else {
+ symbol_conf.symfs = strdup(dir);
+ if (symbol_conf.symfs == NULL)
+ return -ENOMEM;
+ symbol_conf.symfs_layout_flat = false;
+ }
/* skip the locally configured cache if a symfs is given, and
* config buildid dir to symfs/.debug
*/
- ret = asprintf(&bf, "%s/%s", dir, ".debug");
+ ret = asprintf(&bf, "%s/%s", symbol_conf.symfs, ".debug");
if (ret < 0)
return -ENOMEM;