lkml.org 
[lkml]   [2011]   [Apr]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/urgent] perf probe: Fix to find recursively inlined function
    Commit-ID:  1d878083c253fb2e2471b39e825447aca66fc05c
    Gitweb: http://git.kernel.org/tip/1d878083c253fb2e2471b39e825447aca66fc05c
    Author: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    AuthorDate: Wed, 30 Mar 2011 18:25:59 +0900
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Tue, 5 Apr 2011 15:36:47 -0300

    perf probe: Fix to find recursively inlined function

    Fix die_find_inlinefunc() to return correct innermost inlined function
    at given address. Without this fix, it returns the outermost inlined
    function.

    Cc: 2nddept-manager@sdl.hitachi.co.jp
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Lin Ming <ming.m.lin@intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    LKML-Reference: <20110330092559.2132.78634.stgit@ltc236.sdl.hitachi.co.jp>
    Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/probe-finder.c | 15 ++++++++++++++-
    1 files changed, 14 insertions(+), 1 deletions(-)

    diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
    index 5473f11..689ab46 100644
    --- a/tools/perf/util/probe-finder.c
    +++ b/tools/perf/util/probe-finder.c
    @@ -497,7 +497,20 @@ static int __die_find_inline_cb(Dwarf_Die *die_mem, void *data)
    static Dwarf_Die *die_find_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr,
    Dwarf_Die *die_mem)
    {
    - return die_find_child(sp_die, __die_find_inline_cb, &addr, die_mem);
    + Dwarf_Die tmp_die;
    +
    + sp_die = die_find_child(sp_die, __die_find_inline_cb, &addr, &tmp_die);
    + if (!sp_die)
    + return NULL;
    +
    + /* Inlined function could be recursive. Trace it until fail */
    + while (sp_die) {
    + memcpy(die_mem, sp_die, sizeof(Dwarf_Die));
    + sp_die = die_find_child(sp_die, __die_find_inline_cb, &addr,
    + &tmp_die);
    + }
    +
    + return die_mem;
    }

    /* Walker on lines (Note: line number will not be sorted) */

    \
     
     \ /
      Last update: 2011-04-06 13:17    [W:0.029 / U:88.844 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site