On Fri, 5 Aug 2016 14:33:53 +0900 Naohiro Aota <naohiro.a...@hgst.com> wrote:
> Perf-probe detects a variable's type and use the detected type to add new > probe. Then, kprobes prints its variable in hexadecimal format if the > variable is unsigned and prints in decimal if it is signed. > > We sometimes want to see unsigned variable in decimal format (e.g. > sector_t or size_t). In that case, we need to investigate variable's > size manually to specify just signedness. > > This patch add signedness casting support. By specifying "s" or "u" as a > type, perf-probe will investigate variable size as usual and use > the specified signedness. OK, I could understand what the patch does from code. Please add an example, and update tools/perf/Documentation/perf-probe.txt too. Thank you, > > Signed-off-by: Naohiro Aota <naohiro.a...@hgst.com> > --- > tools/perf/util/probe-finder.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c > index f2d9ff0..5c290c6 100644 > --- a/tools/perf/util/probe-finder.c > +++ b/tools/perf/util/probe-finder.c > @@ -297,10 +297,13 @@ static int convert_variable_type(Dwarf_Die *vr_die, > char sbuf[STRERR_BUFSIZE]; > int bsize, boffs, total; > int ret; > + char sign; > > /* TODO: check all types */ > - if (cast && strcmp(cast, "string") != 0) { > + if (cast && strcmp(cast, "string") != 0 && > + strcmp(cast, "s") != 0 && strcmp(cast, "u") != 0) { > /* Non string type is OK */ > + /* and respect signedness cast */ > tvar->type = strdup(cast); > return (tvar->type == NULL) ? -ENOMEM : 0; > } > @@ -361,6 +364,13 @@ static int convert_variable_type(Dwarf_Die *vr_die, > return (tvar->type == NULL) ? -ENOMEM : 0; > } > > + if (cast && (strcmp(cast, "u") == 0)) > + sign = 'u'; > + else if (cast && (strcmp(cast, "s") == 0)) > + sign = 's'; > + else > + sign = die_is_signed_type(&type) ? 's' : 'u'; > + > ret = dwarf_bytesize(&type); > if (ret <= 0) > /* No size ... try to use default type */ > @@ -373,8 +383,7 @@ static int convert_variable_type(Dwarf_Die *vr_die, > dwarf_diename(&type), MAX_BASIC_TYPE_BITS); > ret = MAX_BASIC_TYPE_BITS; > } > - ret = snprintf(buf, 16, "%c%d", > - die_is_signed_type(&type) ? 's' : 'u', ret); > + ret = snprintf(buf, 16, "%c%d", sign, ret); > > formatted: > if (ret < 0 || ret >= 16) { > -- > 2.7.3 > -- Masami Hiramatsu <mhira...@kernel.org>