Skip to content

Commit

Permalink
perf expr: Add literal values starting with #
Browse files Browse the repository at this point in the history
It is useful to have literal values for constants relating to
topologies, SMT, etc. Make the parsing of literals shared code and add a
lookup function. Move #smt_on to this function.

Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: John Garry <john.garry@huawei.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul A . Clarke <pc@us.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Song Liu <song@kernel.org>
Cc: Wan Jiabing <wanjiabing@vivo.com>
Cc: Yury Norov <yury.norov@gmail.com>
Link: https://lore.kernel.org/r/20211111002109.194172-6-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Ian Rogers authored and Arnaldo Carvalho de Melo committed Nov 13, 2021
1 parent 0b6b84c commit 3613f6c
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 6 deletions.
11 changes: 11 additions & 0 deletions tools/perf/util/expr.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
#include "expr.h"
#include "expr-bison.h"
#include "expr-flex.h"
#include "smt.h"
#include <linux/kernel.h>
#include <linux/zalloc.h>
#include <ctype.h>
#include <math.h>

#ifdef PARSER_DEBUG
extern int expr_debug;
Expand Down Expand Up @@ -370,3 +372,12 @@ double expr_id_data__value(const struct expr_id_data *data)
assert(data->kind == EXPR_ID_DATA__REF_VALUE);
return data->ref.val;
}

double expr__get_literal(const char *literal)
{
if (!strcmp("#smt_on", literal))
return smt_on() > 0 ? 1.0 : 0.0;

pr_err("Unrecognized literal '%s'", literal);
return NAN;
}
1 change: 1 addition & 0 deletions tools/perf/util/expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,6 @@ int expr__find_ids(const char *expr, const char *one,
struct expr_parse_ctx *ids);

double expr_id_data__value(const struct expr_id_data *data);
double expr__get_literal(const char *literal);

#endif
15 changes: 14 additions & 1 deletion tools/perf/util/expr.l
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <linux/compiler.h>
#include "expr.h"
#include "expr-bison.h"
#include <math.h>

char *expr_get_text(yyscan_t yyscanner);
YYSTYPE *expr_get_lval(yyscan_t yyscanner);
Expand Down Expand Up @@ -77,6 +78,17 @@ static int str(yyscan_t scanner, int token, int runtime)
yylval->str = normalize(yylval->str, runtime);
return token;
}

static int literal(yyscan_t scanner)
{
YYSTYPE *yylval = expr_get_lval(scanner);

yylval->num = expr__get_literal(expr_get_text(scanner));
if (isnan(yylval->num))
return EXPR_ERROR;

return LITERAL;
}
%}

number ([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)
Expand All @@ -85,6 +97,7 @@ sch [-,=]
spec \\{sch}
sym [0-9a-zA-Z_\.:@?]+
symbol ({spec}|{sym})+
literal #[0-9a-zA-Z_\.\-]+

%%
struct expr_scanner_ctx *sctx = expr_get_extra(yyscanner);
Expand All @@ -94,7 +107,7 @@ max { return MAX; }
min { return MIN; }
if { return IF; }
else { return ELSE; }
#smt_on { return SMT_ON; }
{literal} { return literal(yyscanner); }
{number} { return value(yyscanner); }
{symbol} { return str(yyscanner, ID, sctx->runtime); }
"|" { return '|'; }
Expand Down
9 changes: 4 additions & 5 deletions tools/perf/util/expr.y
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include <assert.h>
#include <math.h>
#include "util/debug.h"
#include "smt.h"
#define IN_EXPR_Y 1
#include "expr.h"
%}
Expand Down Expand Up @@ -37,7 +36,7 @@
} ids;
}

%token ID NUMBER MIN MAX IF ELSE SMT_ON D_RATIO EXPR_ERROR
%token ID NUMBER MIN MAX IF ELSE LITERAL D_RATIO EXPR_ERROR
%left MIN MAX IF
%left '|'
%left '^'
Expand All @@ -46,7 +45,7 @@
%left '-' '+'
%left '*' '/' '%'
%left NEG NOT
%type <num> NUMBER
%type <num> NUMBER LITERAL
%type <str> ID
%destructor { free ($$); } <str>
%type <ids> expr if_expr
Expand Down Expand Up @@ -280,9 +279,9 @@ expr: NUMBER
$$ = union_expr($3, $5);
}
}
| SMT_ON
| LITERAL
{
$$.val = smt_on() > 0 ? 1.0 : 0.0;
$$.val = $1;
$$.ids = NULL;
}
;
Expand Down

0 comments on commit 3613f6c

Please sign in to comment.