History

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.

Masami Hiramatsu committed 16 years ago

Commit 4046b8b1 parent f4bc6bb1 file · +17 −8Browse files

Unified · Split

tools/perf/util/probe-finder.c+17−8
@@ -160,26 +160,35 @@ static bool die_compare_name(Dwarf_Die *dw_die, const char *tname) · 159 unmodified lines
160160 return name ? (strcmp(tname, name) == 0) : false;
161161 }
162162
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+
163175 /* Get type die, but skip qualifiers and typedef */
164176 static Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem)
165177 {
166− Dwarf_Attribute attr;
167178 int tag;
168179
169180 do {
170− if (dwarf_attr(vr_die, DW_AT_type, &attr) == NULL ||
171− dwarf_formref_die(&attr, die_mem) == NULL)
172− return NULL;
173−
174− tag = dwarf_tag(die_mem);
175− vr_die = die_mem;
181+ vr_die = die_get_type(vr_die, die_mem);
182+ if (!vr_die)
183+ break;
184+ tag = dwarf_tag(vr_die);
176185 } while (tag == DW_TAG_const_type ||
177186 tag == DW_TAG_restrict_type ||
178187 tag == DW_TAG_volatile_type ||
179188 tag == DW_TAG_shared_type ||
180189 tag == DW_TAG_typedef);
181190
182− return die_mem;
191+ return vr_die;
183192 }
184193
185194 static bool die_is_signed_type(Dwarf_Die *tp_die)