From: Arnaldo Carvalho de Melo on
Em Mon, May 10, 2010 at 01:12:07PM -0400, Masami Hiramatsu escreveu:
> Check elfutils version, and if it is old don't compile
> CFI analysis code. This allows to compile perf with
> old elfutils.

_ELFUTILS_PREREQ was introduced in:

commit fbc7245df72ce0142f0a21fa0f4f88c97278bf60
Author: Roland McGrath <roland(a)redhat.com>
Date: Tue Dec 16 17:03:03 2008 -0800

Which was released in elfutils 0.138, guess this is coverage enough?
Richard, which version is in your machine?

- Arnaldo

> Signed-off-by: Masami Hiramatsu <mhiramat(a)redhat.com>
> Reported-by: Robert Richter <robert.richter(a)amd.com>
> Cc: Arnaldo Carvalho de Melo <acme(a)redhat.com>
> Cc: Ingo Molnar <mingo(a)elte.hu>
> ---
>
> tools/perf/util/probe-finder.c | 4 ++++
> tools/perf/util/probe-finder.h | 3 +++
> 2 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 562b144..93583eb 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -668,6 +668,7 @@ static int convert_probe_point(Dwarf_Die *sp_die, struct probe_finder *pf)
> ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1);
> if (ret <= 0 || nops == 0) {
> pf->fb_ops = NULL;
> +#if _ELFUTILS_PREREQ(0, 142)
> } else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa &&
> pf->cfi != NULL) {
> Dwarf_Frame *frame;
> @@ -677,6 +678,7 @@ static int convert_probe_point(Dwarf_Die *sp_die, struct probe_finder *pf)
> (uintmax_t)pf->addr);
> return -ENOENT;
> }
> +#endif
> }
>
> /* Find each argument */
> @@ -956,8 +958,10 @@ int find_kprobe_trace_events(int fd, struct perf_probe_event *pev,
> return -EBADF;
> }
>
> +#if _ELFUTILS_PREREQ(0, 142)
> /* Get the call frame information from this dwarf */
> pf.cfi = dwarf_getcfi(dbg);
> +#endif
>
> off = 0;
> line_list__init(&pf.lcache);
> diff --git a/tools/perf/util/probe-finder.h b/tools/perf/util/probe-finder.h
> index 66f1980..e1f61dc 100644
> --- a/tools/perf/util/probe-finder.h
> +++ b/tools/perf/util/probe-finder.h
> @@ -29,6 +29,7 @@ extern int find_line_range(int fd, struct line_range *lr);
>
> #include <dwarf.h>
> #include <libdw.h>
> +#include <version.h>
>
> struct probe_finder {
> struct perf_probe_event *pev; /* Target probe event */
> @@ -44,7 +45,9 @@ struct probe_finder {
> struct list_head lcache; /* Line cache for lazy match */
>
> /* For variable searching */
> +#if _ELFUTILS_PREREQ(0, 142)
> Dwarf_CFI *cfi; /* Call Frame Information */
> +#endif
> Dwarf_Op *fb_ops; /* Frame base attribute */
> struct perf_probe_arg *pvar; /* Current target variable */
> struct kprobe_trace_arg *tvar; /* Current result variable */
>
>
> --
> Masami Hiramatsu
> e-mail: mhiramat(a)redhat.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: acme on
Em Tue, May 18, 2010 at 11:39:58AM +0200, Stephane Eranian escreveu:
> On Tue, May 18, 2010 at 11:35 AM, Robert Richter <robert.richter(a)amd.com> wrote:
> > On 17.05.10 21:57:38, tip-bot for Masami Hiramatsu wrote:
> >> Commit-ID: �7752f1b096e13991f20b59fd11ba73da3809d93c
> >> Gitweb: � � http://git.kernel.org/tip/7752f1b096e13991f20b59fd11ba73da3809d93c
> >> Author: � � Masami Hiramatsu <mhiramat(a)redhat.com>
> >> AuthorDate: Mon, 10 May 2010 13:12:07 -0400
> >> Committer: �Arnaldo Carvalho de Melo <acme(a)redhat.com>
> >> CommitDate: Mon, 17 May 2010 22:13:51 -0300

> >> perf probe: Don't compile CFI related code if elfutils is old
> >> Check elfutils version, and if it is old don't compile CFI analysis code. This
> >> allows to compile perf with old elfutils.

> >> Signed-off-by: Masami Hiramatsu <mhiramat(a)redhat.com>
> >> Tested-by: Stephane Eranian <eranian(a)google.com>
> >> Reported-by: Robert Richter <robert.richter(a)amd.com>
> >> Cc: Ingo Molnar <mingo(a)elte.hu>
> >> LKML-Reference: <20100510171207.26029.97604.stgit(a)localhost6.localdomain6>
> >> Signed-off-by: Arnaldo Carvalho de Melo <acme(a)redhat.com>

> > I think this patch is not needed as we came up with an alternative
> > solution with commit:

> > �6b3c4ef perf probe: Check older elfutils and set NO_DWARF

Yeah, that was confusing, my understanding was that 6b3c4ef superseeded
7752f1b, but it was needed in addition to it, as can be seen by
Stephane's report.

6b3c4ef worked for you because it used the heavy hammer, by not noticing
the _ELFUTILS_PREREQ macro it decided that the elfutils version
installed was way too old, so disable everything related to it, i.e.
perf probe will work just with /proc/kallsyms. I.e. your version of
elfutils was <= 0.138, that is when the PREREQ macro was introduced.

But Stephanes is > 0.138 _but_ < 0.142, that is when Dwarf_CFI appeared,
so he can use the PREREQ macro to build only removing the code that
depends on Dwarf_CFI being available.

> But I am compiling tip, so this patch is in and I still got the problem.
> It is because the test program does not check for Dwarf_CFI so it
> assumes you have the right version of libdw.
>
> If I understand Masami's patch, you can still compile dwarf support
> in despite the lack of Dwarf_CFI.

Right.

- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/