[PATCH] Subject: perf jit: Fix incorrect file name in DWARF line table

elisabeth posted 1 patch 2 years, 8 months ago
There is a newer version of this series
tools/perf/util/genelf_debug.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[PATCH] Subject: perf jit: Fix incorrect file name in DWARF line table
Posted by elisabeth 2 years, 8 months ago
Fix an issue where an incorrect file name was added in the DWARF line table
due to not checking the filename against the repeated name marker (/xff/0).
This can be seen with `objdump --dwarf=line` on the ELF file after perf inject.

Signed-off-by: elisabeth <paniii94@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/genelf_debug.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/genelf_debug.c b/tools/perf/util/genelf_debug.c
index aa5dcc56b2ac..2928b59bb9a5 100644
--- a/tools/perf/util/genelf_debug.c
+++ b/tools/perf/util/genelf_debug.c
@@ -349,6 +349,7 @@ static void emit_lineno_info(struct buffer_ext *be,
 	 */
 
 	/* start state of the state machine we take care of */
+	char const repeated_name_marker[] = {'\xff', '\0'};
 	unsigned long last_vma = 0;
 	char const  *cur_filename = NULL;
 	unsigned long cur_file_idx = 0;
@@ -363,7 +364,8 @@ static void emit_lineno_info(struct buffer_ext *be,
 		/*
 		 * check if filename changed, if so add it
 		 */
-		if (!cur_filename || strcmp(cur_filename, ent->name)) {
+		if ((!cur_filename || strcmp(cur_filename, ent->name)) &&
+			memcmp(repeated_name_marker, ent->name, sizeof(repeated_name_marker)) != 0) {
 			emit_lne_define_filename(be, ent->name);
 			cur_filename = ent->name;
 			emit_set_file(be, ++cur_file_idx);
-- 
2.34.1
Re: [PATCH] Subject: perf jit: Fix incorrect file name in DWARF line table
Posted by Namhyung Kim 2 years, 8 months ago
On Wed, May 31, 2023 at 7:35 AM elisabeth <paniii94@gmail.com> wrote:
>
> Fix an issue where an incorrect file name was added in the DWARF line table
> due to not checking the filename against the repeated name marker (/xff/0).
> This can be seen with `objdump --dwarf=line` on the ELF file after perf inject.
>
> Signed-off-by: elisabeth <paniii94@gmail.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/util/genelf_debug.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/genelf_debug.c b/tools/perf/util/genelf_debug.c
> index aa5dcc56b2ac..2928b59bb9a5 100644
> --- a/tools/perf/util/genelf_debug.c
> +++ b/tools/perf/util/genelf_debug.c
> @@ -349,6 +349,7 @@ static void emit_lineno_info(struct buffer_ext *be,
>          */
>
>         /* start state of the state machine we take care of */
> +       char const repeated_name_marker[] = {'\xff', '\0'};

Can you please mention that it's from the jitdump format
either by renaming or adding a comment?


>         unsigned long last_vma = 0;
>         char const  *cur_filename = NULL;
>         unsigned long cur_file_idx = 0;
> @@ -363,7 +364,8 @@ static void emit_lineno_info(struct buffer_ext *be,
>                 /*
>                  * check if filename changed, if so add it
>                  */
> -               if (!cur_filename || strcmp(cur_filename, ent->name)) {
> +               if ((!cur_filename || strcmp(cur_filename, ent->name)) &&
> +                       memcmp(repeated_name_marker, ent->name, sizeof(repeated_name_marker)) != 0) {

I think you can just use strcmp().

Thanks,
Namhyung


>                         emit_lne_define_filename(be, ent->name);
>                         cur_filename = ent->name;
>                         emit_set_file(be, ++cur_file_idx);
> --
> 2.34.1
>