lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20171107141047.GF3216@kernel.org>
Date:   Tue, 7 Nov 2017 11:10:47 -0300
From:   Arnaldo Carvalho de Melo <acme@...nel.org>
To:     Jiri Olsa <jolsa@...nel.org>
Cc:     lkml <linux-kernel@...r.kernel.org>,
        Ingo Molnar <mingo@...nel.org>,
        Namhyung Kim <namhyung@...nel.org>,
        David Ahern <dsahern@...il.com>,
        Peter Zijlstra <a.p.zijlstra@...llo.nl>,
        Andi Kleen <andi@...stfloor.org>
Subject: Re: [PATCH 35/35] perf annotate: Align source and offset lines

Em Wed, Oct 11, 2017 at 05:01:58PM +0200, Jiri Olsa escreveu:
> Aligning source with offset lines, which are more advanced,
> because of the address column.
> 
>   Before:
>          :      static void *worker_thread(void *__tdata)
>          :      {
>     0.00 :        48a971:       push   %rbp
>     0.00 :        48a972:       mov    %rsp,%rbp
>     0.00 :        48a975:       sub    $0x30,%rsp
>     0.00 :        48a979:       mov    %rdi,-0x28(%rbp)
>     0.00 :        48a97d:       mov    %fs:0x28,%rax
>     0.00 :        48a986:       mov    %rax,-0x8(%rbp)
>     0.00 :        48a98a:       xor    %eax,%eax
>          :              struct thread_data *td = __tdata;
>     0.00 :        48a98c:       mov    -0x28(%rbp),%rax
>     0.00 :        48a990:       mov    %rax,-0x10(%rbp)
>          :              int m = 0, i;
>     0.00 :        48a994:       movl   $0x0,-0x1c(%rbp)
>          :              int ret;
>          :
>          :              for (i = 0; i < loops; i++) {
>     0.00 :        48a99b:       movl   $0x0,-0x18(%rbp)
> 
>   After:
>          :              static void *worker_thread(void *__tdata)
>          :              {
>     0.00 :       48a971:       push   %rbp
>     0.00 :       48a972:       mov    %rsp,%rbp
>     0.00 :       48a975:       sub    $0x30,%rsp
>     0.00 :       48a979:       mov    %rdi,-0x28(%rbp)
>     0.00 :       48a97d:       mov    %fs:0x28,%rax
>     0.00 :       48a986:       mov    %rax,-0x8(%rbp)
>     0.00 :       48a98a:       xor    %eax,%eax
>          :                      struct thread_data *td = __tdata;
>     0.00 :       48a98c:       mov    -0x28(%rbp),%rax
>     0.00 :       48a990:       mov    %rax,-0x10(%rbp)
>          :                      int m = 0, i;
>     0.00 :       48a994:       movl   $0x0,-0x1c(%rbp)
>          :                      int ret;
>          :
>          :                      for (i = 0; i < loops; i++) {
>     0.00 :       48a99b:       movl   $0x0,-0x18(%rbp)
> 
> It makes bigger different when displaying script sources,
> where the comment lines looks oddly shifted from the lines
> which actually hold code. I'll send script support separately.
> 
> Link: http://lkml.kernel.org/n/tip-uamk3iiewlii40o4mlog2cpp@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@...nel.org>
> ---
>  tools/perf/util/annotate.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
> index 2516e53104be..530961a343fc 100644
> --- a/tools/perf/util/annotate.c
> +++ b/tools/perf/util/annotate.c
> @@ -1082,6 +1082,7 @@ static void annotate__branch_printf(struct block_range *br, u64 addr)
>  	}
>  }
>  
> +#define ADDR_LEN 10

This doesn't align kernel addresses well, as they will take more
columns, so I'm trying the patch below, on top of yours, ok?

I will combine both to elliminate unnecessary churn, ok?

- Arnaldo

diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index e17e5d6252bc..54321b947de8 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1092,16 +1092,14 @@ static void annotate__branch_printf(struct block_range *br, u64 addr)
 	}
 }
 
-#define ADDR_LEN 10
-
-static int disasm_line__print(struct disasm_line *dl, u64 start)
+static int disasm_line__print(struct disasm_line *dl, u64 start, int addr_fmt_width)
 {
 	s64 offset = dl->al.offset;
 	const u64 addr = start + offset;
 	struct block_range *br;
 
 	br = block_range__find(addr);
-	color_fprintf(stdout, annotate__address_color(br), "  %*" PRIx64 ":", ADDR_LEN, addr);
+	color_fprintf(stdout, annotate__address_color(br), "  %*" PRIx64 ":", addr_fmt_width, addr);
 	color_fprintf(stdout, annotate__asm_color(br), "%s", dl->al.line);
 	annotate__branch_printf(br, addr);
 	return 0;
@@ -1110,7 +1108,7 @@ static int disasm_line__print(struct disasm_line *dl, u64 start)
 static int
 annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 start,
 		       struct perf_evsel *evsel, u64 len, int min_pcnt, int printed,
-		       int max_lines, struct annotation_line *queue)
+		       int max_lines, struct annotation_line *queue, int addr_fmt_width)
 {
 	struct disasm_line *dl = container_of(al, struct disasm_line, al);
 	static const char *prev_line;
@@ -1140,7 +1138,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 start
 				if (queue == al)
 					break;
 				annotation_line__print(queue, sym, start, evsel, len,
-						       0, 0, 1, NULL);
+						       0, 0, 1, NULL, addr_fmt_width);
 			}
 		}
 
@@ -1177,7 +1175,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 start
 
 		printf(" : ");
 
-		disasm_line__print(dl, start);
+		disasm_line__print(dl, start, addr_fmt_width);
 		printf("\n");
 	} else if (max_lines && printed >= max_lines)
 		return 1;
@@ -1193,7 +1191,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 start
 		if (!*al->line)
 			printf(" %*s:\n", width, " ");
 		else
-			printf(" %*s:     %*s %s\n", width, " ", ADDR_LEN, " ", al->line);
+			printf(" %*s:     %*s %s\n", width, " ", addr_fmt_width, " ", al->line);
 	}
 
 	return 0;
@@ -1800,6 +1798,19 @@ static void symbol__annotate_hits(struct symbol *sym, struct perf_evsel *evsel)
 	printf("%*s: %" PRIu64 "\n", BITS_PER_LONG / 2, "h->nr_samples", h->nr_samples);
 }
 
+static int annotated_source__addr_fmt_width(struct list_head *lines, u64 start)
+{
+	char bf[32];
+	struct annotation_line *line;
+
+	list_for_each_entry_reverse(line, lines, node) {
+		if (line->offset != -1)
+			return scnprintf(bf, sizeof(bf), "%" PRIx64, start + line->offset);
+	}
+
+	return 0;
+}
+
 int symbol__annotate_printf(struct symbol *sym, struct map *map,
 			    struct perf_evsel *evsel, bool full_paths,
 			    int min_pcnt, int max_lines, int context)
@@ -1812,7 +1823,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,
 	struct sym_hist *h = annotation__histogram(notes, evsel->idx);
 	struct annotation_line *pos, *queue = NULL;
 	u64 start = map__rip_2objdump(map, sym->start);
-	int printed = 2, queue_len = 0;
+	int printed = 2, queue_len = 0, addr_fmt_width;
 	int more = 0;
 	u64 len;
 	int width = symbol_conf.show_total_period ? 12 : 8;
@@ -1843,6 +1854,8 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,
 	if (verbose > 0)
 		symbol__annotate_hits(sym, evsel);
 
+	addr_fmt_width = annotated_source__addr_fmt_width(&notes->src->source, start);
+
 	list_for_each_entry(pos, &notes->src->source, node) {
 		int err;
 
@@ -1853,7 +1866,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,
 
 		err = annotation_line__print(pos, sym, start, evsel, len,
 					     min_pcnt, printed, max_lines,
-					     queue);
+					     queue, addr_fmt_width);
 
 		switch (err) {
 		case 0:

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ