Re: [PATCH] tools lib traceevent: Add '~' operation within arg_num_eval()

From: Arnaldo Carvalho de Melo
Date: Fri Feb 26 2016 - 18:39:22 EST


Em Fri, Feb 26, 2016 at 06:13:28PM -0500, Steven Rostedt escreveu:
> When evaluating values for print flags, if the value included a '~'
> operator, the parsing would fail. This broke kmalloc's parsing of:
>
> __print_flags(REC->gfp_flags, "|", {(unsigned
> long)((((((( gfp_t)(0x400000u|0x2000000u)) | (( gfp_t)0x40u) |
> (( gfp_t)0x80u) | (( gfp_t)0x20000u)) | (( gfp_t)0x02u)) |
> (( gfp_t)0x08u)) | (( gfp_t)0x4000u) | (( gfp_t)0x10000u) |
> (( gfp_t)0x1000u) | (( gfp_t)0x200u)) & ~(( gfp_t)0x2000000u))
> ^
> |
> here

Thanks, I'll test this later.

- Arnaldo
>
> Signed-off-by: Steven Rostedt <rostedt@xxxxxxxxxxx>
> ---
> diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
> index c3bd294a63d1..557d8edf07f3 100644
> --- a/tools/lib/traceevent/event-parse.c
> +++ b/tools/lib/traceevent/event-parse.c
> @@ -2397,6 +2397,12 @@ static int arg_num_eval(struct print_arg *arg, long long *val)
> break;
> *val = left + right;
> break;
> + case '~':
> + ret = arg_num_eval(arg->op.right, &right);
> + if (!ret)
> + break;
> + *val = ~right;
> + break;
> default:
> do_warning("unknown op '%s'", arg->op.op);
> ret = 0;