diff options
| -rw-r--r-- | tools/perf/util/dwarf-aux.c | 14 | ||||
| -rw-r--r-- | tools/perf/util/probe-finder.c | 8 | 
2 files changed, 17 insertions, 5 deletions
| diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c index 780b2bc11128..c34e024020c7 100644 --- a/tools/perf/util/dwarf-aux.c +++ b/tools/perf/util/dwarf-aux.c @@ -801,10 +801,16 @@ static int __die_find_member_cb(Dwarf_Die *die_mem, void *data)  {  	const char *name = data; -	if ((dwarf_tag(die_mem) == DW_TAG_member) && -	    die_compare_name(die_mem, name)) -		return DIE_FIND_CB_END; - +	if (dwarf_tag(die_mem) == DW_TAG_member) { +		if (die_compare_name(die_mem, name)) +			return DIE_FIND_CB_END; +		else if (!dwarf_diename(die_mem)) {	/* Unnamed structure */ +			Dwarf_Die type_die, tmp_die; +			if (die_get_type(die_mem, &type_die) && +			    die_find_member(&type_die, name, &tmp_die)) +				return DIE_FIND_CB_END; +		} +	}  	return DIE_FIND_CB_SIBLING;  } diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 46f009aa486c..7831e2d93949 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -460,7 +460,8 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,  			       " nor array.\n", varname);  			return -EINVAL;  		} -		if (field->ref) { +		/* While prcessing unnamed field, we don't care about this */ +		if (field->ref && dwarf_diename(vr_die)) {  			pr_err("Semantic error: %s must be referred by '.'\n",  			       field->name);  			return -EINVAL; @@ -491,6 +492,11 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,  	}  	ref->offset += (long)offs; +	/* If this member is unnamed, we need to reuse this field */ +	if (!dwarf_diename(die_mem)) +		return convert_variable_fields(die_mem, varname, field, +						&ref, die_mem); +  next:  	/* Converting next field */  	if (field->next) | 
