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 /tools | |
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>
Diffstat (limited to 'tools')
-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) |