diff options
| author | Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> | 2010-10-21 06:13:02 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-10-21 13:57:08 -0400 |
| commit | 4046b8bb5ffae9ee916e504cdadee804f10e0c56 (patch) | |
| tree | 67f8991a7dfad249176999eec0e064d385f2cd9d | |
| parent | f4bc6bb2d562703eafc895c37e7be20906de139d (diff) | |
perf probe: Fix type searching
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>
| -rw-r--r-- | 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 32b81f707ff5..a2d1f790d937 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) | |||
| 160 | return name ? (strcmp(tname, name) == 0) : false; | 160 | return name ? (strcmp(tname, name) == 0) : false; |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | /* Get type die */ | ||
| 164 | static Dwarf_Die *die_get_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) | ||
| 165 | { | ||
| 166 | Dwarf_Attribute attr; | ||
| 167 | |||
| 168 | if (dwarf_attr_integrate(vr_die, DW_AT_type, &attr) && | ||
| 169 | dwarf_formref_die(&attr, die_mem)) | ||
| 170 | return die_mem; | ||
| 171 | else | ||
| 172 | return NULL; | ||
| 173 | } | ||
| 174 | |||
| 163 | /* Get type die, but skip qualifiers and typedef */ | 175 | /* Get type die, but skip qualifiers and typedef */ |
| 164 | static Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) | 176 | static Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) |
| 165 | { | 177 | { |
| 166 | Dwarf_Attribute attr; | ||
| 167 | int tag; | 178 | int tag; |
| 168 | 179 | ||
| 169 | do { | 180 | do { |
| 170 | if (dwarf_attr(vr_die, DW_AT_type, &attr) == NULL || | 181 | vr_die = die_get_type(vr_die, die_mem); |
| 171 | dwarf_formref_die(&attr, die_mem) == NULL) | 182 | if (!vr_die) |
| 172 | return NULL; | 183 | break; |
| 173 | 184 | tag = dwarf_tag(vr_die); | |
| 174 | tag = dwarf_tag(die_mem); | ||
| 175 | vr_die = die_mem; | ||
| 176 | } while (tag == DW_TAG_const_type || | 185 | } while (tag == DW_TAG_const_type || |
| 177 | tag == DW_TAG_restrict_type || | 186 | tag == DW_TAG_restrict_type || |
| 178 | tag == DW_TAG_volatile_type || | 187 | tag == DW_TAG_volatile_type || |
| 179 | tag == DW_TAG_shared_type || | 188 | tag == DW_TAG_shared_type || |
| 180 | tag == DW_TAG_typedef); | 189 | tag == DW_TAG_typedef); |
| 181 | 190 | ||
| 182 | return die_mem; | 191 | return vr_die; |
| 183 | } | 192 | } |
| 184 | 193 | ||
| 185 | static bool die_is_signed_type(Dwarf_Die *tp_die) | 194 | static bool die_is_signed_type(Dwarf_Die *tp_die) |
