diff options
Diffstat (limited to 'tools/perf/util/parse-events.h')
| -rw-r--r-- | tools/perf/util/parse-events.h | 104 | 
1 files changed, 61 insertions, 43 deletions
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index b0eb95f93e9c..594e5d2dc67f 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -9,6 +9,7 @@  #include <stdbool.h>  #include <linux/types.h>  #include <linux/perf_event.h> +#include <stdio.h>  #include <string.h>  struct evsel; @@ -17,6 +18,7 @@ struct parse_events_error;  struct option;  struct perf_pmu; +struct strbuf;  const char *event_type(int type); @@ -42,16 +44,16 @@ static inline int parse_events(struct evlist *evlist, const char *str,  int parse_event(struct evlist *evlist, const char *str); -int parse_events_terms(struct list_head *terms, const char *str); +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, @@ -78,36 +80,54 @@ enum {  	PARSE_EVENTS__TERM_TYPE_RAW,  	PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,  	PARSE_EVENTS__TERM_TYPE_HARDWARE, -	__PARSE_EVENTS__TERM_TYPE_NR, -}; - -struct parse_events_array { -	size_t nr_ranges; -	struct { -		unsigned int start; -		size_t length; -	} *ranges; +#define	__PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_HARDWARE + 1)  };  struct parse_events_term { -	char *config; -	struct parse_events_array array; +	/** @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. If a numeric term has no value then the +	 * value is assumed to be 1. An event name also has no value. +	 */ +	bool no_value;  };  struct parse_events_error { @@ -121,17 +141,23 @@ struct parse_events_error {  };  struct parse_events_state { +	/* The list parsed events are placed on. */  	struct list_head	   list; +	/* The updated index used by entries as they are added. */  	int			   idx; +	/* Error information. */  	struct parse_events_error *error; -	struct evlist		  *evlist; +	/* Holds returned terms for term parsing. */  	struct list_head	  *terms; +	/* Start token. */  	int			   stoken; +	/* Special fake PMU marker for testing. */  	struct perf_pmu		  *fake_pmu;  	/* If non-null, when wildcard matching only match the given PMU. */  	const char		  *pmu_filter;  	/* Should PE_LEGACY_NAME tokens be generated for config terms? */  	bool			   match_legacy_cache_terms; +	/* Were multiple PMUs scanned to find events? */  	bool			   wild_card_pmus;  }; @@ -140,39 +166,31 @@ 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, 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);  void parse_events_term__delete(struct parse_events_term *term);  void parse_events_terms__delete(struct list_head *terms);  void parse_events_terms__purge(struct list_head *terms); -void parse_events__clear_array(struct parse_events_array *a); +int parse_events_term__to_strbuf(struct list_head *term_list, struct strbuf *sb);  int parse_events__modifier_event(struct list_head *list, char *str, bool add);  int parse_events__modifier_group(struct list_head *list, char *event_mod);  int parse_events_name(struct list_head *list, const char *name);  int parse_events_add_tracepoint(struct list_head *list, int *idx,  				const char *sys, const char *event,  				struct parse_events_error *error, -				struct list_head *head_config); -int parse_events_load_bpf(struct parse_events_state *parse_state, -			  struct list_head *list, -			  char *bpf_file_name, -			  bool source, -			  struct list_head *head_config); -/* Provide this function for perf test */ -struct bpf_object; -int parse_events_load_bpf_obj(struct parse_events_state *parse_state, -			      struct list_head *list, -			      struct bpf_object *obj, -			      struct list_head *head_config); +				struct list_head *head_config, void *loc);  int parse_events_add_numeric(struct parse_events_state *parse_state,  			     struct list_head *list,  			     u32 type, u64 config, @@ -190,9 +208,9 @@ int parse_events_add_breakpoint(struct parse_events_state *parse_state,  				u64 addr, char *type, u64 len,  				struct list_head *head_config);  int parse_events_add_pmu(struct parse_events_state *parse_state, -			 struct list_head *list, char *name, +			 struct list_head *list, const char *name,  			 struct list_head *head_config, -			 bool auto_merge_stats); +			bool auto_merge_stats, void *loc);  struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,  				      const char *name, const char *metric_id, @@ -201,7 +219,7 @@ struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,  int parse_events_multi_pmu_add(struct parse_events_state *parse_state,  			       char *str,  			       struct list_head *head_config, -			       struct list_head **listp); +			       struct list_head **listp, void *loc);  int parse_events_copy_term_list(struct list_head *old,  				 struct list_head **new);  |