|
@@ -423,20 +423,20 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
|
|
|
pr_warning("Failed to get the type of %s.\n", varname);
|
|
|
return -ENOENT;
|
|
|
}
|
|
|
- pr_debug2("Var real type: (%x)\n", (unsigned)dwarf_dieoffset(&type));
|
|
|
+ pr_debug2("Var real type: %s (%x)\n", dwarf_diename(&type),
|
|
|
+ (unsigned)dwarf_dieoffset(&type));
|
|
|
tag = dwarf_tag(&type);
|
|
|
|
|
|
if (field->name[0] == '[' &&
|
|
|
(tag == DW_TAG_array_type || tag == DW_TAG_pointer_type)) {
|
|
|
- if (field->next)
|
|
|
- /* Save original type for next field */
|
|
|
- memcpy(die_mem, &type, sizeof(*die_mem));
|
|
|
+ /* Save original type for next field or type */
|
|
|
+ memcpy(die_mem, &type, sizeof(*die_mem));
|
|
|
/* Get the type of this array */
|
|
|
if (die_get_real_type(&type, &type) == NULL) {
|
|
|
pr_warning("Failed to get the type of %s.\n", varname);
|
|
|
return -ENOENT;
|
|
|
}
|
|
|
- pr_debug2("Array real type: (%x)\n",
|
|
|
+ pr_debug2("Array real type: %s (%x)\n", dwarf_diename(&type),
|
|
|
(unsigned)dwarf_dieoffset(&type));
|
|
|
if (tag == DW_TAG_pointer_type) {
|
|
|
ref = zalloc(sizeof(struct probe_trace_arg_ref));
|
|
@@ -448,9 +448,6 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
|
|
|
*ref_ptr = ref;
|
|
|
}
|
|
|
ref->offset += dwarf_bytesize(&type) * field->index;
|
|
|
- if (!field->next)
|
|
|
- /* Save vr_die for converting types */
|
|
|
- memcpy(die_mem, vr_die, sizeof(*die_mem));
|
|
|
goto next;
|
|
|
} else if (tag == DW_TAG_pointer_type) {
|
|
|
/* Check the pointer and dereference */
|