]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
perf libunwind: Fixup conversion perf_sample->user_regs to a pointer
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 13 Mar 2025 03:31:21 +0000 (20:31 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Sat, 15 Mar 2025 01:12:33 +0000 (18:12 -0700)
The dc6d2bc2d893a878 ("perf sample: Make user_regs and intr_regs optional") misses
the changes to a file, resulting in this problem:

  $ make LIBUNWIND=1 -C tools/perf O=/tmp/build/perf-tools-next install-bin
  <SNIP>
    CC      /tmp/build/perf-tools-next/util/unwind-libunwind-local.o
    CC      /tmp/build/perf-tools-next/util/unwind-libunwind.o
  <SNIP>
  util/unwind-libunwind-local.c: In function ‘access_mem’:
  util/unwind-libunwind-local.c:582:56: error: ‘ui->sample->user_regs’ is a pointer; did you mean to use ‘->’?
    582 |         if (__write || !stack || !ui->sample->user_regs.regs) {
        |                                                        ^
        |                                                        ->
  util/unwind-libunwind-local.c:587:38: error: passing argument 2 of ‘perf_reg_value’ from incompatible pointer type [-Wincompatible-pointer-types]
    587 |         ret = perf_reg_value(&start, &ui->sample->user_regs,
        |                                      ^~~~~~~~~~~~~~~~~~~~~~
        |                                      |
        |                                      struct regs_dump **
<SNIP>
  ⬢ [acme@toolbox perf-tools-next]$ git bisect bad
  dc6d2bc2d893a878e7b58578ff01b4738708deb4 is the first bad commit
  commit dc6d2bc2d893a878e7b58578ff01b4738708deb4 (HEAD)
  Author: Ian Rogers <irogers@google.com>
  Date:   Mon Jan 13 11:43:45 2025 -0800

      perf sample: Make user_regs and intr_regs optional

Detected using:

  make -C tools/perf build-test

Fixes: dc6d2bc2d893a878 ("perf sample: Make user_regs and intr_regs optional")
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250313033121.758978-1-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/unwind-libunwind-local.c

index 16c2b03831f39afc4be414eae25e0db918b6f6d8..5f4387e2423af511fd0954b7745e73b62f255eda 100644 (file)
@@ -579,12 +579,12 @@ static int access_mem(unw_addr_space_t __maybe_unused as,
        int ret;
 
        /* Don't support write, probably not needed. */
-       if (__write || !stack || !ui->sample->user_regs.regs) {
+       if (__write || !stack || !ui->sample->user_regs || !ui->sample->user_regs->regs) {
                *valp = 0;
                return 0;
        }
 
-       ret = perf_reg_value(&start, &ui->sample->user_regs,
+       ret = perf_reg_value(&start, perf_sample__user_regs(ui->sample),
                             perf_arch_reg_sp(arch));
        if (ret)
                return ret;
@@ -628,7 +628,7 @@ static int access_reg(unw_addr_space_t __maybe_unused as,
                return 0;
        }
 
-       if (!ui->sample->user_regs.regs) {
+       if (!ui->sample->user_regs || !ui->sample->user_regs->regs) {
                *valp = 0;
                return 0;
        }
@@ -637,7 +637,7 @@ static int access_reg(unw_addr_space_t __maybe_unused as,
        if (id < 0)
                return -EINVAL;
 
-       ret = perf_reg_value(&val, &ui->sample->user_regs, id);
+       ret = perf_reg_value(&val, perf_sample__user_regs(ui->sample), id);
        if (ret) {
                if (!ui->best_effort)
                        pr_err("unwind: can't read reg %d\n", regnum);
@@ -741,7 +741,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
        unw_cursor_t c;
        int ret, i = 0;
 
-       ret = perf_reg_value(&val, &ui->sample->user_regs,
+       ret = perf_reg_value(&val, perf_sample__user_regs(ui->sample),
                             perf_arch_reg_ip(arch));
        if (ret)
                return ret;
@@ -808,7 +808,7 @@ static int _unwind__get_entries(unwind_entry_cb_t cb, void *arg,
                .best_effort  = best_effort
        };
 
-       if (!data->user_regs.regs)
+       if (!data->user_regs || !data->user_regs->regs)
                return -EINVAL;
 
        if (max_stack <= 0)