|
@@ -2252,6 +2252,34 @@ static int setup_sort_order(struct perf_evlist *evlist)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Adds 'pre,' prefix into 'str' is 'pre' is
|
|
|
|
+ * not already part of 'str'.
|
|
|
|
+ */
|
|
|
|
+static char *prefix_if_not_in(const char *pre, char *str)
|
|
|
|
+{
|
|
|
|
+ char *n;
|
|
|
|
+
|
|
|
|
+ if (!str || strstr(str, pre))
|
|
|
|
+ return str;
|
|
|
|
+
|
|
|
|
+ if (asprintf(&n, "%s,%s", pre, str) < 0)
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ free(str);
|
|
|
|
+ return n;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static char *setup_overhead(char *keys)
|
|
|
|
+{
|
|
|
|
+ keys = prefix_if_not_in("overhead", keys);
|
|
|
|
+
|
|
|
|
+ if (symbol_conf.cumulate_callchain)
|
|
|
|
+ keys = prefix_if_not_in("overhead_children", keys);
|
|
|
|
+
|
|
|
|
+ return keys;
|
|
|
|
+}
|
|
|
|
+
|
|
static int __setup_sorting(struct perf_evlist *evlist)
|
|
static int __setup_sorting(struct perf_evlist *evlist)
|
|
{
|
|
{
|
|
char *tmp, *tok, *str;
|
|
char *tmp, *tok, *str;
|
|
@@ -2281,6 +2309,17 @@ static int __setup_sorting(struct perf_evlist *evlist)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Prepend overhead fields for backward compatibility.
|
|
|
|
+ */
|
|
|
|
+ if (!is_strict_order(field_order)) {
|
|
|
|
+ str = setup_overhead(str);
|
|
|
|
+ if (str == NULL) {
|
|
|
|
+ error("Not enough memory to setup overhead keys");
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
for (tok = strtok_r(str, ", ", &tmp);
|
|
for (tok = strtok_r(str, ", ", &tmp);
|
|
tok; tok = strtok_r(NULL, ", ", &tmp)) {
|
|
tok; tok = strtok_r(NULL, ", ", &tmp)) {
|
|
ret = sort_dimension__add(tok, evlist);
|
|
ret = sort_dimension__add(tok, evlist);
|