Message ID | 20241005195541.380070-18-irogers@google.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | Libdw/dwarf build clean up | expand |
Context | Check | Description |
---|---|---|
conchuod/vmtest-fixes-PR | fail | merge-conflict |
On Sat, 5 Oct 2024 12:55:27 -0700 Ian Rogers <irogers@google.com> wrote: > Pass a flags value as architectures like csky need the flags to > determine the ABI variant. > Same here. I need some examples of this chaneg. Thank you, > Signed-off-by: Ian Rogers <irogers@google.com> > --- > tools/perf/util/dwarf-regs.c | 3 ++- > tools/perf/util/include/dwarf-regs.h | 11 ++++++----- > tools/perf/util/probe-finder.c | 13 +++++++------ > tools/perf/util/probe-finder.h | 3 ++- > 4 files changed, 17 insertions(+), 13 deletions(-) > > diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c > index 1321387f6948..86b3ef638fbb 100644 > --- a/tools/perf/util/dwarf-regs.c > +++ b/tools/perf/util/dwarf-regs.c > @@ -29,7 +29,8 @@ > #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] : NULL) > > /* Return architecture dependent register string (for kprobe-tracer) */ > -const char *get_dwarf_regstr(unsigned int n, unsigned int machine) > +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, > + unsigned int flags __maybe_unused) > { > switch (machine) { > case EM_NONE: /* Generic arch - use host arch */ > diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h > index ee0a734564c7..925525405e2d 100644 > --- a/tools/perf/util/include/dwarf-regs.h > +++ b/tools/perf/util/include/dwarf-regs.h > @@ -80,12 +80,13 @@ > > #ifdef HAVE_LIBDW_SUPPORT > const char *get_arch_regstr(unsigned int n); > -/* > - * get_dwarf_regstr - Returns ftrace register string from DWARF regnum > - * n: DWARF register number > - * machine: ELF machine signature (EM_*) > +/** > + * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum. > + * @n: DWARF register number. > + * @machine: ELF machine signature (EM_*). > + * @flags: ELF flags for things like ABI differences. > */ > -const char *get_dwarf_regstr(unsigned int n, unsigned int machine); > +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags); > > int get_arch_regnum(const char *name); > /* > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c > index 8019d232f515..29eaa9beca86 100644 > --- a/tools/perf/util/probe-finder.c > +++ b/tools/perf/util/probe-finder.c > @@ -56,7 +56,7 @@ static struct probe_trace_arg_ref *alloc_trace_arg_ref(long offs) > */ > static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr, > Dwarf_Op *fb_ops, Dwarf_Die *sp_die, > - unsigned int machine, > + const struct probe_finder *pf, > struct probe_trace_arg *tvar) > { > Dwarf_Attribute attr; > @@ -166,7 +166,7 @@ static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr, > if (!tvar) > return ret2; > > - regs = get_dwarf_regstr(regn, machine); > + regs = get_dwarf_regstr(regn, pf->e_machine, pf->e_flags); > if (!regs) { > /* This should be a bug in DWARF or this tool */ > pr_warning("Mapping for the register number %u " > @@ -451,7 +451,7 @@ static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf) > dwarf_diename(vr_die)); > > ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops, > - &pf->sp_die, pf->machine, pf->tvar); > + &pf->sp_die, pf, pf->tvar); > if (ret == -ENOENT && pf->skip_empty_arg) > /* This can be found in other place. skip it */ > return 0; > @@ -1134,7 +1134,8 @@ static int debuginfo__find_probes(struct debuginfo *dbg, > if (gelf_getehdr(elf, &ehdr) == NULL) > return -EINVAL; > > - pf->machine = ehdr.e_machine; > + pf->e_machine = ehdr.e_machine; > + pf->e_flags = ehdr.e_flags; > > do { > GElf_Shdr shdr; > @@ -1171,7 +1172,7 @@ static int copy_variables_cb(Dwarf_Die *die_mem, void *data) > (tag == DW_TAG_variable && vf->vars)) { > if (convert_variable_location(die_mem, vf->pf->addr, > vf->pf->fb_ops, &pf->sp_die, > - pf->machine, NULL) == 0) { > + pf, /*tvar=*/NULL) == 0) { > vf->args[vf->nargs].var = (char *)dwarf_diename(die_mem); > if (vf->args[vf->nargs].var == NULL) { > vf->ret = -ENOMEM; > @@ -1403,7 +1404,7 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data) > tag == DW_TAG_variable) { > ret = convert_variable_location(die_mem, af->pf.addr, > af->pf.fb_ops, &af->pf.sp_die, > - af->pf.machine, NULL); > + &af->pf, /*tvar=*/NULL); > if (ret == 0 || ret == -ERANGE) { > int ret2; > bool externs = !af->child; > diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h > index b9a5afca4cc1..71e21cb4492a 100644 > --- a/tools/perf/util/probe-finder.h > +++ b/tools/perf/util/probe-finder.h > @@ -68,7 +68,8 @@ struct probe_finder { > /* Call Frame Information from .debug_frame */ > Dwarf_CFI *cfi_dbg; > Dwarf_Op *fb_ops; /* Frame base attribute */ > - unsigned int machine; /* Target machine arch */ > + unsigned int e_machine; /* ELF target machine arch */ > + unsigned int e_flags; /* ELF target machine flags */ > struct perf_probe_arg *pvar; /* Current target variable */ > struct probe_trace_arg *tvar; /* Current result variable */ > bool skip_empty_arg; /* Skip non-exist args */ > -- > 2.47.0.rc0.187.ge670bccf7e-goog >
On Mon, Oct 7, 2024 at 1:09 AM Masami Hiramatsu <mhiramat@kernel.org> wrote: > > On Sat, 5 Oct 2024 12:55:27 -0700 > Ian Rogers <irogers@google.com> wrote: > > > Pass a flags value as architectures like csky need the flags to > > determine the ABI variant. > > > > Same here. I need some examples of this chaneg. The code here was already using the ELF machine, so dwarf-regs.c functions would already support cross building. There is the addition of ELF flags as on csky the registers change depending on the ABI version in the ELF flags. Thanks, Ian > > Signed-off-by: Ian Rogers <irogers@google.com> > > --- > > tools/perf/util/dwarf-regs.c | 3 ++- > > tools/perf/util/include/dwarf-regs.h | 11 ++++++----- > > tools/perf/util/probe-finder.c | 13 +++++++------ > > tools/perf/util/probe-finder.h | 3 ++- > > 4 files changed, 17 insertions(+), 13 deletions(-) > > > > diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c > > index 1321387f6948..86b3ef638fbb 100644 > > --- a/tools/perf/util/dwarf-regs.c > > +++ b/tools/perf/util/dwarf-regs.c > > @@ -29,7 +29,8 @@ > > #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] : NULL) > > > > /* Return architecture dependent register string (for kprobe-tracer) */ > > -const char *get_dwarf_regstr(unsigned int n, unsigned int machine) > > +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, > > + unsigned int flags __maybe_unused) > > { > > switch (machine) { > > case EM_NONE: /* Generic arch - use host arch */ > > diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h > > index ee0a734564c7..925525405e2d 100644 > > --- a/tools/perf/util/include/dwarf-regs.h > > +++ b/tools/perf/util/include/dwarf-regs.h > > @@ -80,12 +80,13 @@ > > > > #ifdef HAVE_LIBDW_SUPPORT > > const char *get_arch_regstr(unsigned int n); > > -/* > > - * get_dwarf_regstr - Returns ftrace register string from DWARF regnum > > - * n: DWARF register number > > - * machine: ELF machine signature (EM_*) > > +/** > > + * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum. > > + * @n: DWARF register number. > > + * @machine: ELF machine signature (EM_*). > > + * @flags: ELF flags for things like ABI differences. > > */ > > -const char *get_dwarf_regstr(unsigned int n, unsigned int machine); > > +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags); > > > > int get_arch_regnum(const char *name); > > /* > > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c > > index 8019d232f515..29eaa9beca86 100644 > > --- a/tools/perf/util/probe-finder.c > > +++ b/tools/perf/util/probe-finder.c > > @@ -56,7 +56,7 @@ static struct probe_trace_arg_ref *alloc_trace_arg_ref(long offs) > > */ > > static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr, > > Dwarf_Op *fb_ops, Dwarf_Die *sp_die, > > - unsigned int machine, > > + const struct probe_finder *pf, > > struct probe_trace_arg *tvar) > > { > > Dwarf_Attribute attr; > > @@ -166,7 +166,7 @@ static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr, > > if (!tvar) > > return ret2; > > > > - regs = get_dwarf_regstr(regn, machine); > > + regs = get_dwarf_regstr(regn, pf->e_machine, pf->e_flags); > > if (!regs) { > > /* This should be a bug in DWARF or this tool */ > > pr_warning("Mapping for the register number %u " > > @@ -451,7 +451,7 @@ static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf) > > dwarf_diename(vr_die)); > > > > ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops, > > - &pf->sp_die, pf->machine, pf->tvar); > > + &pf->sp_die, pf, pf->tvar); > > if (ret == -ENOENT && pf->skip_empty_arg) > > /* This can be found in other place. skip it */ > > return 0; > > @@ -1134,7 +1134,8 @@ static int debuginfo__find_probes(struct debuginfo *dbg, > > if (gelf_getehdr(elf, &ehdr) == NULL) > > return -EINVAL; > > > > - pf->machine = ehdr.e_machine; > > + pf->e_machine = ehdr.e_machine; > > + pf->e_flags = ehdr.e_flags; > > > > do { > > GElf_Shdr shdr; > > @@ -1171,7 +1172,7 @@ static int copy_variables_cb(Dwarf_Die *die_mem, void *data) > > (tag == DW_TAG_variable && vf->vars)) { > > if (convert_variable_location(die_mem, vf->pf->addr, > > vf->pf->fb_ops, &pf->sp_die, > > - pf->machine, NULL) == 0) { > > + pf, /*tvar=*/NULL) == 0) { > > vf->args[vf->nargs].var = (char *)dwarf_diename(die_mem); > > if (vf->args[vf->nargs].var == NULL) { > > vf->ret = -ENOMEM; > > @@ -1403,7 +1404,7 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data) > > tag == DW_TAG_variable) { > > ret = convert_variable_location(die_mem, af->pf.addr, > > af->pf.fb_ops, &af->pf.sp_die, > > - af->pf.machine, NULL); > > + &af->pf, /*tvar=*/NULL); > > if (ret == 0 || ret == -ERANGE) { > > int ret2; > > bool externs = !af->child; > > diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h > > index b9a5afca4cc1..71e21cb4492a 100644 > > --- a/tools/perf/util/probe-finder.h > > +++ b/tools/perf/util/probe-finder.h > > @@ -68,7 +68,8 @@ struct probe_finder { > > /* Call Frame Information from .debug_frame */ > > Dwarf_CFI *cfi_dbg; > > Dwarf_Op *fb_ops; /* Frame base attribute */ > > - unsigned int machine; /* Target machine arch */ > > + unsigned int e_machine; /* ELF target machine arch */ > > + unsigned int e_flags; /* ELF target machine flags */ > > struct perf_probe_arg *pvar; /* Current target variable */ > > struct probe_trace_arg *tvar; /* Current result variable */ > > bool skip_empty_arg; /* Skip non-exist args */ > > -- > > 2.47.0.rc0.187.ge670bccf7e-goog > > > > > -- > Masami Hiramatsu (Google) <mhiramat@kernel.org>
diff --git a/tools/perf/util/dwarf-regs.c b/tools/perf/util/dwarf-regs.c index 1321387f6948..86b3ef638fbb 100644 --- a/tools/perf/util/dwarf-regs.c +++ b/tools/perf/util/dwarf-regs.c @@ -29,7 +29,8 @@ #define __get_dwarf_regstr(tbl, n) (((n) < ARRAY_SIZE(tbl)) ? (tbl)[(n)] : NULL) /* Return architecture dependent register string (for kprobe-tracer) */ -const char *get_dwarf_regstr(unsigned int n, unsigned int machine) +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, + unsigned int flags __maybe_unused) { switch (machine) { case EM_NONE: /* Generic arch - use host arch */ diff --git a/tools/perf/util/include/dwarf-regs.h b/tools/perf/util/include/dwarf-regs.h index ee0a734564c7..925525405e2d 100644 --- a/tools/perf/util/include/dwarf-regs.h +++ b/tools/perf/util/include/dwarf-regs.h @@ -80,12 +80,13 @@ #ifdef HAVE_LIBDW_SUPPORT const char *get_arch_regstr(unsigned int n); -/* - * get_dwarf_regstr - Returns ftrace register string from DWARF regnum - * n: DWARF register number - * machine: ELF machine signature (EM_*) +/** + * get_dwarf_regstr() - Returns ftrace register string from DWARF regnum. + * @n: DWARF register number. + * @machine: ELF machine signature (EM_*). + * @flags: ELF flags for things like ABI differences. */ -const char *get_dwarf_regstr(unsigned int n, unsigned int machine); +const char *get_dwarf_regstr(unsigned int n, unsigned int machine, unsigned int flags); int get_arch_regnum(const char *name); /* diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 8019d232f515..29eaa9beca86 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -56,7 +56,7 @@ static struct probe_trace_arg_ref *alloc_trace_arg_ref(long offs) */ static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr, Dwarf_Op *fb_ops, Dwarf_Die *sp_die, - unsigned int machine, + const struct probe_finder *pf, struct probe_trace_arg *tvar) { Dwarf_Attribute attr; @@ -166,7 +166,7 @@ static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr, if (!tvar) return ret2; - regs = get_dwarf_regstr(regn, machine); + regs = get_dwarf_regstr(regn, pf->e_machine, pf->e_flags); if (!regs) { /* This should be a bug in DWARF or this tool */ pr_warning("Mapping for the register number %u " @@ -451,7 +451,7 @@ static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf) dwarf_diename(vr_die)); ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops, - &pf->sp_die, pf->machine, pf->tvar); + &pf->sp_die, pf, pf->tvar); if (ret == -ENOENT && pf->skip_empty_arg) /* This can be found in other place. skip it */ return 0; @@ -1134,7 +1134,8 @@ static int debuginfo__find_probes(struct debuginfo *dbg, if (gelf_getehdr(elf, &ehdr) == NULL) return -EINVAL; - pf->machine = ehdr.e_machine; + pf->e_machine = ehdr.e_machine; + pf->e_flags = ehdr.e_flags; do { GElf_Shdr shdr; @@ -1171,7 +1172,7 @@ static int copy_variables_cb(Dwarf_Die *die_mem, void *data) (tag == DW_TAG_variable && vf->vars)) { if (convert_variable_location(die_mem, vf->pf->addr, vf->pf->fb_ops, &pf->sp_die, - pf->machine, NULL) == 0) { + pf, /*tvar=*/NULL) == 0) { vf->args[vf->nargs].var = (char *)dwarf_diename(die_mem); if (vf->args[vf->nargs].var == NULL) { vf->ret = -ENOMEM; @@ -1403,7 +1404,7 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data) tag == DW_TAG_variable) { ret = convert_variable_location(die_mem, af->pf.addr, af->pf.fb_ops, &af->pf.sp_die, - af->pf.machine, NULL); + &af->pf, /*tvar=*/NULL); if (ret == 0 || ret == -ERANGE) { int ret2; bool externs = !af->child; diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h index b9a5afca4cc1..71e21cb4492a 100644 --- a/tools/perf/util/probe-finder.h +++ b/tools/perf/util/probe-finder.h @@ -68,7 +68,8 @@ struct probe_finder { /* Call Frame Information from .debug_frame */ Dwarf_CFI *cfi_dbg; Dwarf_Op *fb_ops; /* Frame base attribute */ - unsigned int machine; /* Target machine arch */ + unsigned int e_machine; /* ELF target machine arch */ + unsigned int e_flags; /* ELF target machine flags */ struct perf_probe_arg *pvar; /* Current target variable */ struct probe_trace_arg *tvar; /* Current result variable */ bool skip_empty_arg; /* Skip non-exist args */
Pass a flags value as architectures like csky need the flags to determine the ABI variant. Signed-off-by: Ian Rogers <irogers@google.com> --- tools/perf/util/dwarf-regs.c | 3 ++- tools/perf/util/include/dwarf-regs.h | 11 ++++++----- tools/perf/util/probe-finder.c | 13 +++++++------ tools/perf/util/probe-finder.h | 3 ++- 4 files changed, 17 insertions(+), 13 deletions(-)