• Masami Hiramatsu's avatar
    perf probe: Fix perf probe to find correct variable DIE · 082f96a9
    Masami Hiramatsu authored
    Fix perf probe to find correct variable DIE which has location or
    external instance by tracking down the lexical blocks.
    
    Current die_find_variable() expects that the all variable DIEs
    which has DW_TAG_variable have a location. However, since recent
    dwarf information may have declaration variable DIEs at the
    entry of function (subprogram), die_find_variable() returns it.
    
    To solve this problem, it must track down the DIE tree to find
    a DIE which has an actual location or a reference for external
    instance.
    
    e.g. finding a DIE which origin is <0xdc73>;
    
     <1><11496>: Abbrev Number: 95 (DW_TAG_subprogram)
        <11497>   DW_AT_abstract_origin: <0xdc42>
        <1149b>   DW_AT_low_pc      : 0x1850
    [...]
     <2><114cc>: Abbrev Number: 119 (DW_TAG_variable) <- this is a declaration
        <114cd>   DW_AT_abstract_origin: <0xdc73>
     <2><114d1>: Abbrev Number: 119 (DW_TAG_variable)
    [...]
     <3><115a7>: Abbrev Number: 105 (DW_TAG_lexical_block)
        <115a8>   DW_AT_ranges      : 0xaa0
     <4><115ac>: Abbrev Number: 96 (DW_TAG_variable) <- this has a location
        <115ad>   DW_AT_abstract_origin: <0xdc73>
        <115b1>   DW_AT_location    : 0x486c        (location list)
    Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@kernel.org>
    Acked-by: default avatarArnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: http://lkml.kernel.org/r/20140529121930.30879.87092.stgit@ltc230.yrl.intra.hitachi.co.jpSigned-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    082f96a9
dwarf-aux.c 23.2 KB