perf parse-events: Improve error message for bad numbers
Use the error handler from the parse_state to give a more informative error message. Before: $ perf stat -e 'cycles/period=99999999999999999999/' true event syntax error: 'cycles/period=99999999999999999999/' \___ parser error Run 'perf list' for a list of valid events Usage: perf stat [<options>] [<command>] -e, --event <event> event selector. use 'perf list' to list available events After: $ perf stat -e 'cycles/period=99999999999999999999/' true event syntax error: 'cycles/period=99999999999999999999/' \___ parser error event syntax error: '..les/period=99999999999999999999/' \___ Bad base 10 number "99999999999999999999" Run 'perf list' for a list of valid events Usage: perf stat [<options>] [<command>] -e, --event <event> event selector. use 'perf list' to list available events Signed-off-by: Ian Rogers <irogers@google.com> Reviewed-by: Kan Liang <kan.liang@linux.intel.com> Tested-by: Atish Patra <atishp@rivosinc.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Beeman Strong <beeman@rivosinc.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/r/20240416061533.921723-12-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
4e5484b4bf
commit
ba5c371edf
@ -18,26 +18,34 @@
|
||||
|
||||
char *parse_events_get_text(yyscan_t yyscanner);
|
||||
YYSTYPE *parse_events_get_lval(yyscan_t yyscanner);
|
||||
int parse_events_get_column(yyscan_t yyscanner);
|
||||
int parse_events_get_leng(yyscan_t yyscanner);
|
||||
|
||||
static int __value(YYSTYPE *yylval, char *str, int base, int token)
|
||||
static int get_column(yyscan_t scanner)
|
||||
{
|
||||
u64 num;
|
||||
|
||||
errno = 0;
|
||||
num = strtoull(str, NULL, base);
|
||||
if (errno)
|
||||
return PE_ERROR;
|
||||
|
||||
yylval->num = num;
|
||||
return token;
|
||||
return parse_events_get_column(scanner) - parse_events_get_leng(scanner);
|
||||
}
|
||||
|
||||
static int value(yyscan_t scanner, int base)
|
||||
static int value(struct parse_events_state *parse_state, yyscan_t scanner, int base)
|
||||
{
|
||||
YYSTYPE *yylval = parse_events_get_lval(scanner);
|
||||
char *text = parse_events_get_text(scanner);
|
||||
u64 num;
|
||||
|
||||
return __value(yylval, text, base, PE_VALUE);
|
||||
errno = 0;
|
||||
num = strtoull(text, NULL, base);
|
||||
if (errno) {
|
||||
struct parse_events_error *error = parse_state->error;
|
||||
char *help = NULL;
|
||||
|
||||
if (asprintf(&help, "Bad base %d number \"%s\"", base, text) > 0)
|
||||
parse_events_error__handle(error, get_column(scanner), help , NULL);
|
||||
|
||||
return PE_ERROR;
|
||||
}
|
||||
|
||||
yylval->num = num;
|
||||
return PE_VALUE;
|
||||
}
|
||||
|
||||
static int str(yyscan_t scanner, int token)
|
||||
@ -283,8 +291,8 @@ r0x{num_raw_hex} { return str(yyscanner, PE_RAW); }
|
||||
*/
|
||||
"/"/{digit} { return PE_BP_SLASH; }
|
||||
"/"/{non_digit} { BEGIN(config); return '/'; }
|
||||
{num_dec} { return value(yyscanner, 10); }
|
||||
{num_hex} { return value(yyscanner, 16); }
|
||||
{num_dec} { return value(_parse_state, yyscanner, 10); }
|
||||
{num_hex} { return value(_parse_state, yyscanner, 16); }
|
||||
/*
|
||||
* We need to separate 'mem:' scanner part, in order to get specific
|
||||
* modifier bits parsed out. Otherwise we would need to handle PE_NAME
|
||||
@ -330,8 +338,8 @@ cgroup-switches { return sym(yyscanner, PERF_COUNT_SW_CGROUP_SWITCHES); }
|
||||
{lc_type}-{lc_op_result}-{lc_op_result} { return str(yyscanner, PE_LEGACY_CACHE); }
|
||||
mem: { BEGIN(mem); return PE_PREFIX_MEM; }
|
||||
r{num_raw_hex} { return str(yyscanner, PE_RAW); }
|
||||
{num_dec} { return value(yyscanner, 10); }
|
||||
{num_hex} { return value(yyscanner, 16); }
|
||||
{num_dec} { return value(_parse_state, yyscanner, 10); }
|
||||
{num_hex} { return value(_parse_state, yyscanner, 16); }
|
||||
|
||||
{modifier_event} { return str(yyscanner, PE_MODIFIER_EVENT); }
|
||||
{name} { return str(yyscanner, PE_NAME); }
|
||||
|
Loading…
x
Reference in New Issue
Block a user