lkml.org 
[lkml]   [2010]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/7] perf probe: Fix type searching
    Date
    From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

    Fix to get the actual type die of variables by using dwarf_attr_integrate()
    which gets attribute from die even if the type die is connected by
    DW_AT_abstract_origin.

    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    LKML-Reference: <20101021101302.3542.38549.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 | 25 +++++++++++++++++--------
    1 files changed, 17 insertions(+), 8 deletions(-)

    diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
    index 32b81f7..a2d1f79 100644
    --- a/tools/perf/util/probe-finder.c
    +++ b/tools/perf/util/probe-finder.c
    @@ -160,26 +160,35 @@ static bool die_compare_name(Dwarf_Die *dw_die, const char *tname)
    return name ? (strcmp(tname, name) == 0) : false;
    }

    +/* Get type die */
    +static Dwarf_Die *die_get_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem)
    +{
    + Dwarf_Attribute attr;
    +
    + if (dwarf_attr_integrate(vr_die, DW_AT_type, &attr) &&
    + dwarf_formref_die(&attr, die_mem))
    + return die_mem;
    + else
    + return NULL;
    +}
    +
    /* Get type die, but skip qualifiers and typedef */
    static Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem)
    {
    - Dwarf_Attribute attr;
    int tag;

    do {
    - if (dwarf_attr(vr_die, DW_AT_type, &attr) == NULL ||
    - dwarf_formref_die(&attr, die_mem) == NULL)
    - return NULL;
    -
    - tag = dwarf_tag(die_mem);
    - vr_die = die_mem;
    + vr_die = die_get_type(vr_die, die_mem);
    + if (!vr_die)
    + break;
    + tag = dwarf_tag(vr_die);
    } while (tag == DW_TAG_const_type ||
    tag == DW_TAG_restrict_type ||
    tag == DW_TAG_volatile_type ||
    tag == DW_TAG_shared_type ||
    tag == DW_TAG_typedef);

    - return die_mem;
    + return vr_die;
    }

    static bool die_is_signed_type(Dwarf_Die *tp_die)
    --
    1.6.2.5


    \
     
     \ /
      Last update: 2010-10-22 03:59    [W:0.027 / U:61.436 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site