Commit d8f69fb6 authored by Leo Yan's avatar Leo Yan Committed by Arnaldo Carvalho de Melo

perf unwind: Use perf_arch_reg_{ip|sp}() to substitute macros

We use perf_arch_reg_ip() and perf_arch_reg_sp() to substitute macros
for obtaining the register numbers of SP and IP.  This modification
enables cross analysis in the unwinding, therefore, the unwinding is
not restricted to the predefined values by the macros.

Consequently, the macros LIBUNWIND__ARCH_REG_{IP|SP} are removed since
they are no longer used.

Committer notes:

Add missing "util/env.h" header to make sure we have the definition for
perf_env__arch(), that when built with NO_LIBUNWIND=1 isn't available,
i.e. it was being included by sheer luck.
Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
Acked-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Eric Lin <eric.lin@sifive.com>
Cc: Fangrui Song <maskray@google.com>
Cc: Guo Ren <guoren@kernel.org>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Ivan Babrou <ivan@cloudflare.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Ming Wang <wangming01@loongson.cn>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sandipan Das <sandipan.das@amd.com>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-csky@vger.kernel.org
Cc: linux-riscv@lists.infradead.org
Link: https://lore.kernel.org/r/20230606014559.21783-4-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 34af56af
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
* defined before including "unwind.h" * defined before including "unwind.h"
*/ */
#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arm64_reg_id(regnum) #define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arm64_reg_id(regnum)
#define LIBUNWIND__ARCH_REG_IP PERF_REG_ARM64_PC
#define LIBUNWIND__ARCH_REG_SP PERF_REG_ARM64_SP
#include "unwind.h" #include "unwind.h"
#include "libunwind-aarch64.h" #include "libunwind-aarch64.h"
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
* defined before including "unwind.h" * defined before including "unwind.h"
*/ */
#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__x86_reg_id(regnum) #define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__x86_reg_id(regnum)
#define LIBUNWIND__ARCH_REG_IP PERF_REG_X86_IP
#define LIBUNWIND__ARCH_REG_SP PERF_REG_X86_SP
#include "unwind.h" #include "unwind.h"
#include "libunwind-x86.h" #include "libunwind-x86.h"
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "event.h" #include "event.h"
#include "perf_regs.h" #include "perf_regs.h"
#include "callchain.h" #include "callchain.h"
#include "util/env.h"
static char *debuginfo_path; static char *debuginfo_path;
...@@ -170,12 +171,14 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwarf_Addr addr, Dwarf_Word * ...@@ -170,12 +171,14 @@ static bool memory_read(Dwfl *dwfl __maybe_unused, Dwarf_Addr addr, Dwarf_Word *
void *arg) void *arg)
{ {
struct unwind_info *ui = arg; struct unwind_info *ui = arg;
const char *arch = perf_env__arch(ui->machine->env);
struct stack_dump *stack = &ui->sample->user_stack; struct stack_dump *stack = &ui->sample->user_stack;
u64 start, end; u64 start, end;
int offset; int offset;
int ret; int ret;
ret = perf_reg_value(&start, &ui->sample->user_regs, PERF_REG_SP); ret = perf_reg_value(&start, &ui->sample->user_regs,
perf_arch_reg_sp(arch));
if (ret) if (ret)
return false; return false;
...@@ -253,6 +256,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, ...@@ -253,6 +256,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
.max_stack = max_stack, .max_stack = max_stack,
.best_effort = best_effort .best_effort = best_effort
}; };
const char *arch = perf_env__arch(ui_buf.machine->env);
Dwarf_Word ip; Dwarf_Word ip;
int err = -EINVAL, i; int err = -EINVAL, i;
...@@ -269,7 +273,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, ...@@ -269,7 +273,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
if (!ui->dwfl) if (!ui->dwfl)
goto out; goto out;
err = perf_reg_value(&ip, &data->user_regs, PERF_REG_IP); err = perf_reg_value(&ip, &data->user_regs, perf_arch_reg_ip(arch));
if (err) if (err)
goto out; goto out;
......
...@@ -553,6 +553,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as, ...@@ -553,6 +553,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as,
int __write, void *arg) int __write, void *arg)
{ {
struct unwind_info *ui = arg; struct unwind_info *ui = arg;
const char *arch = perf_env__arch(ui->machine->env);
struct stack_dump *stack = &ui->sample->user_stack; struct stack_dump *stack = &ui->sample->user_stack;
u64 start, end; u64 start, end;
int offset; int offset;
...@@ -565,7 +566,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as, ...@@ -565,7 +566,7 @@ static int access_mem(unw_addr_space_t __maybe_unused as,
} }
ret = perf_reg_value(&start, &ui->sample->user_regs, ret = perf_reg_value(&start, &ui->sample->user_regs,
LIBUNWIND__ARCH_REG_SP); perf_arch_reg_sp(arch));
if (ret) if (ret)
return ret; return ret;
...@@ -714,6 +715,7 @@ static void _unwind__finish_access(struct maps *maps) ...@@ -714,6 +715,7 @@ static void _unwind__finish_access(struct maps *maps)
static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
void *arg, int max_stack) void *arg, int max_stack)
{ {
const char *arch = perf_env__arch(ui->machine->env);
u64 val; u64 val;
unw_word_t ips[max_stack]; unw_word_t ips[max_stack];
unw_addr_space_t addr_space; unw_addr_space_t addr_space;
...@@ -721,7 +723,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, ...@@ -721,7 +723,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
int ret, i = 0; int ret, i = 0;
ret = perf_reg_value(&val, &ui->sample->user_regs, ret = perf_reg_value(&val, &ui->sample->user_regs,
LIBUNWIND__ARCH_REG_IP); perf_arch_reg_ip(arch));
if (ret) if (ret)
return ret; return ret;
......
...@@ -42,14 +42,6 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg, ...@@ -42,14 +42,6 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arch_reg_id(regnum) #define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arch_reg_id(regnum)
#endif #endif
#ifndef LIBUNWIND__ARCH_REG_SP
#define LIBUNWIND__ARCH_REG_SP PERF_REG_SP
#endif
#ifndef LIBUNWIND__ARCH_REG_IP
#define LIBUNWIND__ARCH_REG_IP PERF_REG_IP
#endif
int LIBUNWIND__ARCH_REG_ID(int regnum); int LIBUNWIND__ARCH_REG_ID(int regnum);
int unwind__prepare_access(struct maps *maps, struct map *map, bool *initialized); int unwind__prepare_access(struct maps *maps, struct map *map, bool *initialized);
void unwind__flush_access(struct maps *maps); void unwind__flush_access(struct maps *maps);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment