Messages in this thread | | | From | Namhyung Kim <> | Subject | Re: [PATCH -tip/perf/core] perf probe: Add union member access support | Date | Wed, 12 Sep 2012 17:35:59 +0900 |
| |
Hi Hyeoncheol,
It seems you don't use git send-email which adds people on Cc: lines of changelog into actual CC list automatically. Or did you send the email to Masami and Srikar privately?
Thanks, Namhyung
On Wed, 12 Sep 2012 16:57:45 +0900, Hyeoncheol Lee wrote: > Union members can be accessed with '.' or '->' like data structure > member access > > Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> > Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com> > --- > tools/perf/util/probe-finder.c | 24 ++++++++++++++++-------- > 1 file changed, 16 insertions(+), 8 deletions(-) > > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c > index 94a00de..cc2b856 100644 > --- a/tools/perf/util/probe-finder.c > +++ b/tools/perf/util/probe-finder.c > @@ -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;
| |