mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-12 16:19:53 +00:00
perf probe: Add union member access support
Union members can be accessed with '.' or '->' like data structure member access Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/CANFS6baeuSBxPGQ8SUZWZErJ2bWs-Nojg+FSo138E1QK8bJJig@mail.gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
26f45274af
commit
7b0295b3db
@ -525,8 +525,10 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
|
||||
return -ENOENT;
|
||||
}
|
||||
/* Verify it is a data structure */
|
||||
if (dwarf_tag(&type) != DW_TAG_structure_type) {
|
||||
pr_warning("%s is not a data structure.\n", varname);
|
||||
tag = dwarf_tag(&type);
|
||||
if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) {
|
||||
pr_warning("%s is not a data structure nor an union.\n",
|
||||
varname);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -539,8 +541,9 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
|
||||
*ref_ptr = ref;
|
||||
} else {
|
||||
/* Verify it is a data structure */
|
||||
if (tag != DW_TAG_structure_type) {
|
||||
pr_warning("%s is not a data structure.\n", varname);
|
||||
if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) {
|
||||
pr_warning("%s is not a data structure nor an union.\n",
|
||||
varname);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (field->name[0] == '[') {
|
||||
@ -567,10 +570,15 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
|
||||
}
|
||||
|
||||
/* Get the offset of the field */
|
||||
ret = die_get_data_member_location(die_mem, &offs);
|
||||
if (ret < 0) {
|
||||
pr_warning("Failed to get the offset of %s.\n", field->name);
|
||||
return ret;
|
||||
if (tag == DW_TAG_union_type) {
|
||||
offs = 0;
|
||||
} else {
|
||||
ret = die_get_data_member_location(die_mem, &offs);
|
||||
if (ret < 0) {
|
||||
pr_warning("Failed to get the offset of %s.\n",
|
||||
field->name);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
ref->offset += (long)offs;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user