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.
Unified · Split
| @@ -160,26 +160,35 @@ static bool die_compare_name(Dwarf_Die *dw_die, const char *tname) · 159 unmodified lines | ||
| 160 | 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 | 175 | /* Get type die, but skip qualifiers and typedef */ |
| 164 | 176 | static Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) |
| 165 | 177 | { |
| 166 | − Dwarf_Attribute attr; | |
| 167 | 178 | int tag; |
| 168 | 179 | |
| 169 | 180 | 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); | |
| 176 | 185 | } while (tag == DW_TAG_const_type || |
| 177 | 186 | tag == DW_TAG_restrict_type || |
| 178 | 187 | tag == DW_TAG_volatile_type || |
| 179 | 188 | tag == DW_TAG_shared_type || |
| 180 | 189 | tag == DW_TAG_typedef); |
| 181 | 190 | |
| 182 | − return die_mem; | |
| 191 | + return vr_die; | |
| 183 | 192 | } |
| 184 | 193 | |
| 185 | 194 | static bool die_is_signed_type(Dwarf_Die *tp_die) |