aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/ui/stdio/hist.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/ui/stdio/hist.c')
-rw-r--r--tools/perf/ui/stdio/hist.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index 5733d6c196be..6d06fbb365b6 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -418,6 +418,7 @@ static int hist_entry__hierarchy_fprintf(struct hist_entry *he,
const char *sep = symbol_conf.field_sep;
struct perf_hpp_fmt *fmt;
char *buf = hpp->buf;
+ size_t size = hpp->size;
int ret, printed = 0;
bool first = true;
@@ -457,6 +458,11 @@ static int hist_entry__hierarchy_fprintf(struct hist_entry *he,
(nr_sort_key - 1) * HIERARCHY_INDENT + 2, "");
advance_hpp(hpp, ret);
+ printed += fprintf(fp, "%s", buf);
+
+ hpp->buf = buf;
+ hpp->size = size;
+
/*
* No need to call hist_entry__snprintf_alignment() since this
* fmt is always the last column in the hierarchy mode.
@@ -467,7 +473,11 @@ static int hist_entry__hierarchy_fprintf(struct hist_entry *he,
else
fmt->entry(fmt, hpp, he);
- printed += fprintf(fp, "%s\n", buf);
+ /*
+ * dynamic entries are right-aligned but we want left-aligned
+ * in the hierarchy mode
+ */
+ printed += fprintf(fp, "%s\n", ltrim(buf));
if (symbol_conf.use_callchain && he->leaf) {
u64 total = hists__total_period(hists);
@@ -525,6 +535,7 @@ static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp,
{
bool first = true;
int nr_sort;
+ int depth;
unsigned width = 0;
unsigned header_width = 0;
struct perf_hpp_fmt *fmt;
@@ -558,19 +569,16 @@ static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp,
if (!first)
header_width += fprintf(fp, " / ");
else {
- header_width += fprintf(fp, "%s", sep ?: " ");
+ fprintf(fp, "%s", sep ?: " ");
first = false;
}
fmt->header(fmt, hpp, hists_to_evsel(hists));
rtrim(hpp->buf);
- header_width += fprintf(fp, "%s", hpp->buf);
+ header_width += fprintf(fp, "%s", ltrim(hpp->buf));
}
- /* preserve max indent depth for combined sort headers */
- print_hierarchy_indent(sep, nr_sort, spaces, fp);
-
fprintf(fp, "\n# ");
/* preserve max indent depth for initial dots */
@@ -590,6 +598,7 @@ static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp,
fprintf(fp, "%.*s", width, dots);
}
+ depth = 0;
hists__for_each_format(hists, fmt) {
if (!perf_hpp__is_sort_entry(fmt) && !perf_hpp__is_dynamic_entry(fmt))
continue;
@@ -597,15 +606,16 @@ static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp,
continue;
width = fmt->width(fmt, hpp, hists_to_evsel(hists));
+ width += depth * HIERARCHY_INDENT;
+
if (width > header_width)
header_width = width;
+
+ depth++;
}
fprintf(fp, "%s%-.*s", sep ?: " ", header_width, dots);
- /* preserve max indent depth for dots under sort headers */
- print_hierarchy_indent(sep, nr_sort, dots, fp);
-
fprintf(fp, "\n#\n");
return 2;