aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>2010-10-21 06:13:02 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2010-10-21 13:57:08 -0400
commit4046b8bb5ffae9ee916e504cdadee804f10e0c56 (patch)
tree67f8991a7dfad249176999eec0e064d385f2cd9d /tools
parentf4bc6bb2d562703eafc895c37e7be20906de139d (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.c25
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 */
164static 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 */
164static Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) 176static 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
185static bool die_is_signed_type(Dwarf_Die *tp_die) 194static bool die_is_signed_type(Dwarf_Die *tp_die)