Commit 58d3a4ce authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

perf parse-events: Name the two term enums

Name the enums used by 'struct parse_events_term' to
parse_events__term_val_type and parse_events__term_type.

This allows greater compile time error checking.

Fix -Wswitch related issues by explicitly listing all enum values prior
to default.

Add config_term_name to safely look up a parse_events__term_type name,
bounds checking the array access first.

Add documentation to 'struct parse_events_terms' and reorder to save
space.
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarKan Liang <kan.liang@linux.intel.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.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>
Cc: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20230831071421.2201358-3-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 478c3f5d
This diff is collapsed.
......@@ -48,12 +48,12 @@ int parse_events_terms(struct list_head *terms, const char *str, FILE *input);
int parse_filter(const struct option *opt, const char *str, int unset);
int exclude_perf(const struct option *opt, const char *arg, int unset);
enum {
enum parse_events__term_val_type {
PARSE_EVENTS__TERM_TYPE_NUM,
PARSE_EVENTS__TERM_TYPE_STR,
};
enum {
enum parse_events__term_type {
PARSE_EVENTS__TERM_TYPE_USER,
PARSE_EVENTS__TERM_TYPE_CONFIG,
PARSE_EVENTS__TERM_TYPE_CONFIG1,
......@@ -80,27 +80,54 @@ enum {
PARSE_EVENTS__TERM_TYPE_RAW,
PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
PARSE_EVENTS__TERM_TYPE_HARDWARE,
__PARSE_EVENTS__TERM_TYPE_NR,
#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_HARDWARE + 1)
};
struct parse_events_term {
/** @list: The term list the term is a part of. */
struct list_head list;
/**
* @config: The left-hand side of a term assignment, so the term
* "event=8" would have the config be "event"
*/
const char *config;
/**
* @val: The right-hand side of a term assignment that can either be a
* string or a number depending on type_val.
*/
union {
char *str;
u64 num;
} val;
int type_val;
int type_term;
struct list_head list;
bool used;
bool no_value;
/* error string indexes for within parsed string */
/** @type_val: The union variable in val to be used for the term. */
enum parse_events__term_val_type type_val;
/**
* @type_term: A predefined term type or PARSE_EVENTS__TERM_TYPE_USER
* when not inbuilt.
*/
enum parse_events__term_type type_term;
/**
* @err_term: The column index of the term from parsing, used during
* error output.
*/
int err_term;
/**
* @err_val: The column index of the val from parsing, used during error
* output.
*/
int err_val;
/* Coming from implicit alias */
/** @used: Was the term used during parameterized-eval. */
bool used;
/**
* @weak: A term from the sysfs or json encoding of an event that
* shouldn't override terms coming from the command line.
*/
bool weak;
/**
* @no_value: Is there no value. TODO: this should really be part of
* type_val.
*/
bool no_value;
};
struct parse_events_error {
......@@ -139,14 +166,17 @@ bool parse_events__filter_pmu(const struct parse_events_state *parse_state,
void parse_events__shrink_config_terms(void);
int parse_events__is_hardcoded_term(struct parse_events_term *term);
int parse_events_term__num(struct parse_events_term **term,
int type_term, const char *config, u64 num,
enum parse_events__term_type type_term,
const char *config, u64 num,
bool novalue,
void *loc_term, void *loc_val);
int parse_events_term__str(struct parse_events_term **term,
int type_term, char *config, char *str,
enum parse_events__term_type type_term,
char *config, char *str,
void *loc_term, void *loc_val);
int parse_events_term__term(struct parse_events_term **term,
int term_lhs, int term_rhs,
enum parse_events__term_type term_lhs,
enum parse_events__term_type term_rhs,
void *loc_term, void *loc_val);
int parse_events_term__clone(struct parse_events_term **new,
struct parse_events_term *term);
......
......@@ -116,7 +116,7 @@ static int tool(yyscan_t scanner, enum perf_tool_event event)
return PE_VALUE_SYM_TOOL;
}
static int term(yyscan_t scanner, int type)
static int term(yyscan_t scanner, enum parse_events__term_type type)
{
YYSTYPE *yylval = parse_events_get_lval(scanner);
......
......@@ -777,7 +777,8 @@ PE_TERM_HW
PE_TERM '=' name_or_legacy
{
struct parse_events_term *term;
int err = parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3);
int err = parse_events_term__str(&term, (enum parse_events__term_type)$1,
/*config=*/NULL, $3, &@1, &@3);
if (err) {
free($3);
......@@ -789,7 +790,8 @@ PE_TERM '=' name_or_legacy
PE_TERM '=' PE_TERM_HW
{
struct parse_events_term *term;
int err = parse_events_term__str(&term, (int)$1, NULL, $3.str, &@1, &@3);
int err = parse_events_term__str(&term, (enum parse_events__term_type)$1,
/*config=*/NULL, $3.str, &@1, &@3);
if (err) {
free($3.str);
......@@ -801,7 +803,10 @@ PE_TERM '=' PE_TERM_HW
PE_TERM '=' PE_TERM
{
struct parse_events_term *term;
int err = parse_events_term__term(&term, (int)$1, (int)$3, &@1, &@3);
int err = parse_events_term__term(&term,
(enum parse_events__term_type)$1,
(enum parse_events__term_type)$3,
&@1, &@3);
if (err)
PE_ABORT(err);
......@@ -812,7 +817,8 @@ PE_TERM '=' PE_TERM
PE_TERM '=' PE_VALUE
{
struct parse_events_term *term;
int err = parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3);
int err = parse_events_term__num(&term, (enum parse_events__term_type)$1,
/*config=*/NULL, $3, /*novalue=*/false, &@1, &@3);
if (err)
PE_ABORT(err);
......@@ -823,7 +829,9 @@ PE_TERM '=' PE_VALUE
PE_TERM
{
struct parse_events_term *term;
int err = parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL);
int err = parse_events_term__num(&term, (enum parse_events__term_type)$1,
/*config=*/NULL, /*num=*/1, /*novalue=*/true,
&@1, /*loc_val=*/NULL);
if (err)
PE_ABORT(err);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment