perf tools: Expression parser enhancements for metrics
authorAndi Kleen <ak@linux.intel.com>
Fri, 11 Aug 2017 23:26:23 +0000 (16:26 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 22 Aug 2017 15:15:53 +0000 (12:15 -0300)
commitd73bad06851b8d5745c11dd4ab789464f6c71b39
tree4148380beeb025c81539867a1e7bf137219aa641
parentde5077c4e38f2a51f50d28bdd5e4a0f14b3d16ff
perf tools: Expression parser enhancements for metrics

Enhance the expression parser for more complex metric formulas.

- Support python style IF ELSE operators
- Add an #SMT_On magic variable for formulas that depend on the SMT
status.

Example: 4 *( CPU_CLK_UNHALTED.THREAD_ANY / 2 ) if #SMT_on else cycles

- Support MIN/MAX operations

Example: min(1 , IDQ.MITE_UOPS / ( UPI * 16 * ( ICACHE.HIT + ICACHE.MISSES ) / 4.0 ) )

This is useful to fix up problems caused by multiplexing.

- Support | & ^ operators
- Minor cleanups and fixes
- Support an \ escape for operators. This allows to specify event names
like c2-residency
- Support @ as an alternative for / to be able to specify pmus without
conflicts with operators (like msr/tsc/ as msr@tsc@)

Example: (cstate_core@c3\\-residency@ / msr@tsc@) * 100

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20170811232634.30465-8-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/expr.c
tools/perf/util/expr.y