From 89812fc81f8d62d70433a8ff63d26819f372e8ec Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Thu, 15 Mar 2012 20:09:15 +0100 Subject: perf tools: Add parser generator for events parsing Changing event parsing to use flex/bison parse generator. The event syntax stays as it was. grammar description: events: events ',' event | event event: event_def PE_MODIFIER_EVENT | event_def event_def: event_legacy_symbol sep_dc | event_legacy_cache sep_dc | event_legacy_breakpoint sep_dc | event_legacy_tracepoint sep_dc | event_legacy_numeric sep_dc | event_legacy_raw sep_dc event_legacy_symbol: PE_NAME_SYM event_legacy_cache: PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT | PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT | PE_NAME_CACHE_TYPE event_legacy_raw: PE_SEP_RAW PE_VALUE event_legacy_numeric: PE_VALUE ':' PE_VALUE event_legacy_breakpoint: PE_SEP_BP ':' PE_VALUE ':' PE_MODIFIER_BP event_breakpoint_type: PE_MODIFIER_BPTYPE | empty PE_NAME_SYM: cpu-cycles|cycles | stalled-cycles-frontend|idle-cycles-frontend | stalled-cycles-backend|idle-cycles-backend | instructions | cache-references | cache-misses | branch-instructions|branches | branch-misses | bus-cycles | cpu-clock | task-clock | page-faults|faults | minor-faults | major-faults | context-switches|cs | cpu-migrations|migrations | alignment-faults | emulation-faults PE_NAME_CACHE_TYPE: L1-dcache|l1-d|l1d|L1-data | L1-icache|l1-i|l1i|L1-instruction | LLC|L2 | dTLB|d-tlb|Data-TLB | iTLB|i-tlb|Instruction-TLB | branch|branches|bpu|btb|bpc | node PE_NAME_CACHE_OP_RESULT: load|loads|read | store|stores|write | prefetch|prefetches | speculative-read|speculative-load | refs|Reference|ops|access | misses|miss PE_MODIFIER_EVENT: [ukhp]{0,5} PE_MODIFIER_BP: [rwx] PE_SEP_BP: 'mem' PE_SEP_RAW: 'r' sep_dc: ':' | Added flex/bison files for event grammar parsing. The generated parser is part of the patch. Added makefile rule 'event-parser' to generate the parser code out of the bison/flex sources. Acked-by: Peter Zijlstra Signed-off-by: Jiri Olsa Link: http://lkml.kernel.org/n/tip-u4pfig5waq3ll2bfcdex8fgi@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/parse-events.c | 486 +++++++++++++---------------------------- 1 file changed, 148 insertions(+), 338 deletions(-) (limited to 'tools/perf/util/parse-events.c') diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index b029296d20d9..6e50b914cad4 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -11,6 +11,9 @@ #include "cache.h" #include "header.h" #include "debugfs.h" +#include "parse-events-flex.h" + +#define MAX_NAME_LEN 100 struct event_symbol { u8 type; @@ -19,11 +22,7 @@ struct event_symbol { const char *alias; }; -enum event_result { - EVT_FAILED, - EVT_HANDLED, - EVT_HANDLED_ALL -}; +int parse_events_parse(struct list_head *list, int *idx); #define CHW(x) .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_##x #define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x @@ -354,7 +353,24 @@ const char *__event_name(int type, u64 config) return "unknown"; } -static int parse_aliases(const char **str, const char *names[][MAX_ALIASES], int size) +static int add_event(struct list_head *list, int *idx, + struct perf_event_attr *attr, char *name) +{ + struct perf_evsel *evsel; + + event_attr_init(attr); + + evsel = perf_evsel__new(attr, (*idx)++); + if (!evsel) + return -ENOMEM; + + list_add_tail(&evsel->node, list); + + evsel->name = strdup(name); + return 0; +} + +static int parse_aliases(char *str, const char *names[][MAX_ALIASES], int size) { int i, j; int n, longest = -1; @@ -362,58 +378,57 @@ static int parse_aliases(const char **str, const char *names[][MAX_ALIASES], int for (i = 0; i < size; i++) { for (j = 0; j < MAX_ALIASES && names[i][j]; j++) { n = strlen(names[i][j]); - if (n > longest && !strncasecmp(*str, names[i][j], n)) + if (n > longest && !strncasecmp(str, names[i][j], n)) longest = n; } - if (longest > 0) { - *str += longest; + if (longest > 0) return i; - } } return -1; } -static enum event_result -parse_generic_hw_event(const char **str, struct perf_event_attr *attr) +int parse_events_add_cache(struct list_head *list, int *idx, + char *type, char *op_result1, char *op_result2) { - const char *s = *str; + struct perf_event_attr attr; + char name[MAX_NAME_LEN]; int cache_type = -1, cache_op = -1, cache_result = -1; + char *op_result[2] = { op_result1, op_result2 }; + int i, n; - cache_type = parse_aliases(&s, hw_cache, PERF_COUNT_HW_CACHE_MAX); /* * No fallback - if we cannot get a clear cache type * then bail out: */ + cache_type = parse_aliases(type, hw_cache, + PERF_COUNT_HW_CACHE_MAX); if (cache_type == -1) - return EVT_FAILED; + return -EINVAL; + + n = snprintf(name, MAX_NAME_LEN, "%s", type); - while ((cache_op == -1 || cache_result == -1) && *s == '-') { - ++s; + for (i = 0; (i < 2) && (op_result[i]); i++) { + char *str = op_result[i]; + + snprintf(name + n, MAX_NAME_LEN - n, "-%s\n", str); if (cache_op == -1) { - cache_op = parse_aliases(&s, hw_cache_op, - PERF_COUNT_HW_CACHE_OP_MAX); + cache_op = parse_aliases(str, hw_cache_op, + PERF_COUNT_HW_CACHE_OP_MAX); if (cache_op >= 0) { if (!is_cache_op_valid(cache_type, cache_op)) - return EVT_FAILED; + return -EINVAL; continue; } } if (cache_result == -1) { - cache_result = parse_aliases(&s, hw_cache_result, + cache_result = parse_aliases(str, hw_cache_result, PERF_COUNT_HW_CACHE_RESULT_MAX); if (cache_result >= 0) continue; } - - /* - * Can't parse this as a cache op or result, so back up - * to the '-'. - */ - --s; - break; } /* @@ -428,20 +443,17 @@ parse_generic_hw_event(const char **str, struct perf_event_attr *attr) if (cache_result == -1) cache_result = PERF_COUNT_HW_CACHE_RESULT_ACCESS; - attr->config = cache_type | (cache_op << 8) | (cache_result << 16); - attr->type = PERF_TYPE_HW_CACHE; - - *str = s; - return EVT_HANDLED; + memset(&attr, 0, sizeof(attr)); + attr.config = cache_type | (cache_op << 8) | (cache_result << 16); + attr.type = PERF_TYPE_HW_CACHE; + return add_event(list, idx, &attr, name); } -static enum event_result -parse_single_tracepoint_event(char *sys_name, - const char *evt_name, - unsigned int evt_length, - struct perf_event_attr *attr, - const char **strp) +static int add_tracepoint(struct list_head *list, int *idx, + char *sys_name, char *evt_name) { + struct perf_event_attr attr; + char name[MAX_NAME_LEN]; char evt_path[MAXPATHLEN]; char id_buf[4]; u64 id; @@ -452,130 +464,80 @@ parse_single_tracepoint_event(char *sys_name, fd = open(evt_path, O_RDONLY); if (fd < 0) - return EVT_FAILED; + return -1; if (read(fd, id_buf, sizeof(id_buf)) < 0) { close(fd); - return EVT_FAILED; + return -1; } close(fd); id = atoll(id_buf); - attr->config = id; - attr->type = PERF_TYPE_TRACEPOINT; - *strp += strlen(sys_name) + evt_length + 1; /* + 1 for the ':' */ - attr->sample_type |= PERF_SAMPLE_RAW; - attr->sample_type |= PERF_SAMPLE_TIME; - attr->sample_type |= PERF_SAMPLE_CPU; + memset(&attr, 0, sizeof(attr)); + attr.config = id; + attr.type = PERF_TYPE_TRACEPOINT; + attr.sample_type |= PERF_SAMPLE_RAW; + attr.sample_type |= PERF_SAMPLE_TIME; + attr.sample_type |= PERF_SAMPLE_CPU; + attr.sample_period = 1; - attr->sample_period = 1; - - - return EVT_HANDLED; + snprintf(name, MAX_NAME_LEN, "%s:%s", sys_name, evt_name); + return add_event(list, idx, &attr, name); } -/* sys + ':' + event + ':' + flags*/ -#define MAX_EVOPT_LEN (MAX_EVENT_LENGTH * 2 + 2 + 128) -static enum event_result -parse_multiple_tracepoint_event(struct perf_evlist *evlist, char *sys_name, - const char *evt_exp, char *flags) +static int add_tracepoint_multi(struct list_head *list, int *idx, + char *sys_name, char *evt_name) { char evt_path[MAXPATHLEN]; struct dirent *evt_ent; DIR *evt_dir; + int ret = 0; snprintf(evt_path, MAXPATHLEN, "%s/%s", tracing_events_path, sys_name); evt_dir = opendir(evt_path); - if (!evt_dir) { perror("Can't open event dir"); - return EVT_FAILED; + return -1; } - while ((evt_ent = readdir(evt_dir))) { - char event_opt[MAX_EVOPT_LEN + 1]; - int len; - + while (!ret && (evt_ent = readdir(evt_dir))) { if (!strcmp(evt_ent->d_name, ".") || !strcmp(evt_ent->d_name, "..") || !strcmp(evt_ent->d_name, "enable") || !strcmp(evt_ent->d_name, "filter")) continue; - if (!strglobmatch(evt_ent->d_name, evt_exp)) + if (!strglobmatch(evt_ent->d_name, evt_name)) continue; - len = snprintf(event_opt, MAX_EVOPT_LEN, "%s:%s%s%s", sys_name, - evt_ent->d_name, flags ? ":" : "", - flags ?: ""); - if (len < 0) - return EVT_FAILED; - - if (parse_events(evlist, event_opt, 0)) - return EVT_FAILED; + ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name); } - return EVT_HANDLED_ALL; + return ret; } -static enum event_result -parse_tracepoint_event(struct perf_evlist *evlist, const char **strp, - struct perf_event_attr *attr) +int parse_events_add_tracepoint(struct list_head *list, int *idx, + char *sys, char *event) { - const char *evt_name; - char *flags = NULL, *comma_loc; - char sys_name[MAX_EVENT_LENGTH]; - unsigned int sys_length, evt_length; - - if (debugfs_valid_mountpoint(tracing_events_path)) - return 0; + int ret; - evt_name = strchr(*strp, ':'); - if (!evt_name) - return EVT_FAILED; + ret = debugfs_valid_mountpoint(tracing_events_path); + if (ret) + return ret; - sys_length = evt_name - *strp; - if (sys_length >= MAX_EVENT_LENGTH) - return 0; - - strncpy(sys_name, *strp, sys_length); - sys_name[sys_length] = '\0'; - evt_name = evt_name + 1; - - comma_loc = strchr(evt_name, ','); - if (comma_loc) { - /* take the event name up to the comma */ - evt_name = strndup(evt_name, comma_loc - evt_name); - } - flags = strchr(evt_name, ':'); - if (flags) { - /* split it out: */ - evt_name = strndup(evt_name, flags - evt_name); - flags++; - } - - evt_length = strlen(evt_name); - if (evt_length >= MAX_EVENT_LENGTH) - return EVT_FAILED; - if (strpbrk(evt_name, "*?")) { - *strp += strlen(sys_name) + evt_length + 1; /* 1 == the ':' */ - return parse_multiple_tracepoint_event(evlist, sys_name, - evt_name, flags); - } else { - return parse_single_tracepoint_event(sys_name, evt_name, - evt_length, attr, strp); - } + return strpbrk(event, "*?") ? + add_tracepoint_multi(list, idx, sys, event) : + add_tracepoint(list, idx, sys, event); } -static enum event_result -parse_breakpoint_type(const char *type, const char **strp, - struct perf_event_attr *attr) +static int +parse_breakpoint_type(const char *type, struct perf_event_attr *attr) { int i; for (i = 0; i < 3; i++) { - if (!type[i]) + if (!type || !type[i]) break; switch (type[i]) { @@ -589,164 +551,65 @@ parse_breakpoint_type(const char *type, const char **strp, attr->bp_type |= HW_BREAKPOINT_X; break; default: - return EVT_FAILED; + return -EINVAL; } } + if (!attr->bp_type) /* Default */ attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; - *strp = type + i; - - return EVT_HANDLED; + return 0; } -static enum event_result -parse_breakpoint_event(const char **strp, struct perf_event_attr *attr) +int parse_events_add_breakpoint(struct list_head *list, int *idx, + void *ptr, char *type) { - const char *target; - const char *type; - char *endaddr; - u64 addr; - enum event_result err; - - target = strchr(*strp, ':'); - if (!target) - return EVT_FAILED; - - if (strncmp(*strp, "mem", target - *strp) != 0) - return EVT_FAILED; - - target++; - - addr = strtoull(target, &endaddr, 0); - if (target == endaddr) - return EVT_FAILED; - - attr->bp_addr = addr; - *strp = endaddr; + struct perf_event_attr attr; + char name[MAX_NAME_LEN]; - type = strchr(target, ':'); + memset(&attr, 0, sizeof(attr)); + attr.bp_addr = (u64) ptr; - /* If no type is defined, just rw as default */ - if (!type) { - attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; - } else { - err = parse_breakpoint_type(++type, strp, attr); - if (err == EVT_FAILED) - return EVT_FAILED; - } + if (parse_breakpoint_type(type, &attr)) + return -EINVAL; /* * We should find a nice way to override the access length * Provide some defaults for now */ - if (attr->bp_type == HW_BREAKPOINT_X) - attr->bp_len = sizeof(long); + if (attr.bp_type == HW_BREAKPOINT_X) + attr.bp_len = sizeof(long); else - attr->bp_len = HW_BREAKPOINT_LEN_4; - - attr->type = PERF_TYPE_BREAKPOINT; - - return EVT_HANDLED; -} - -static int check_events(const char *str, unsigned int i) -{ - int n; - - n = strlen(event_symbols[i].symbol); - if (!strncasecmp(str, event_symbols[i].symbol, n)) - return n; + attr.bp_len = HW_BREAKPOINT_LEN_4; - n = strlen(event_symbols[i].alias); - if (n) { - if (!strncasecmp(str, event_symbols[i].alias, n)) - return n; - } + attr.type = PERF_TYPE_BREAKPOINT; - return 0; + snprintf(name, MAX_NAME_LEN, "mem:%p:%s", ptr, type ? type : "rw"); + return add_event(list, idx, &attr, name); } -static enum event_result -parse_symbolic_event(const char **strp, struct perf_event_attr *attr) +int +parse_events_add_numeric(struct list_head *list, int *idx, + unsigned long type, unsigned long config) { - const char *str = *strp; - unsigned int i; - int n; - - for (i = 0; i < ARRAY_SIZE(event_symbols); i++) { - n = check_events(str, i); - if (n > 0) { - attr->type = event_symbols[i].type; - attr->config = event_symbols[i].config; - *strp = str + n; - return EVT_HANDLED; - } - } - return EVT_FAILED; -} + struct perf_event_attr attr; -static enum event_result -parse_raw_event(const char **strp, struct perf_event_attr *attr) -{ - const char *str = *strp; - u64 config; - int n; - - if (*str != 'r') - return EVT_FAILED; - n = hex2u64(str + 1, &config); - if (n > 0) { - const char *end = str + n + 1; - if (*end != '\0' && *end != ',' && *end != ':') - return EVT_FAILED; - - *strp = end; - attr->type = PERF_TYPE_RAW; - attr->config = config; - return EVT_HANDLED; - } - return EVT_FAILED; + memset(&attr, 0, sizeof(attr)); + attr.type = type; + attr.config = config; + return add_event(list, idx, &attr, + (char *) __event_name(type, config)); } -static enum event_result -parse_numeric_event(const char **strp, struct perf_event_attr *attr) +int parse_events_modifier(struct list_head *list, char *str) { - const char *str = *strp; - char *endp; - unsigned long type; - u64 config; - - type = strtoul(str, &endp, 0); - if (endp > str && type < PERF_TYPE_MAX && *endp == ':') { - str = endp + 1; - config = strtoul(str, &endp, 0); - if (endp > str) { - attr->type = type; - attr->config = config; - *strp = endp; - return EVT_HANDLED; - } - } - return EVT_FAILED; -} - -static int -parse_event_modifier(const char **strp, struct perf_event_attr *attr) -{ - const char *str = *strp; + struct perf_evsel *evsel; int exclude = 0, exclude_GH = 0; int eu = 0, ek = 0, eh = 0, eH = 0, eG = 0, precise = 0; - if (!*str) + if (str == NULL) return 0; - if (*str == ',') - return 0; - - if (*str++ != ':') - return -1; - while (*str) { if (*str == 'u') { if (!exclude) @@ -775,111 +638,60 @@ parse_event_modifier(const char **strp, struct perf_event_attr *attr) ++str; } - if (str < *strp + 2) - return -1; - *strp = str; + /* + * precise ip: + * + * 0 - SAMPLE_IP can have arbitrary skid + * 1 - SAMPLE_IP must have constant skid + * 2 - SAMPLE_IP requested to have 0 skid + * 3 - SAMPLE_IP must have 0 skid + * + * See also PERF_RECORD_MISC_EXACT_IP + */ + if (precise > 3) + return -EINVAL; - attr->exclude_user = eu; - attr->exclude_kernel = ek; - attr->exclude_hv = eh; - attr->precise_ip = precise; - attr->exclude_host = eH; - attr->exclude_guest = eG; + list_for_each_entry(evsel, list, node) { + evsel->attr.exclude_user = eu; + evsel->attr.exclude_kernel = ek; + evsel->attr.exclude_hv = eh; + evsel->attr.precise_ip = precise; + evsel->attr.exclude_host = eH; + evsel->attr.exclude_guest = eG; + } return 0; } -/* - * Each event can have multiple symbolic names. - * Symbolic names are (almost) exactly matched. - */ -static enum event_result -parse_event_symbols(struct perf_evlist *evlist, const char **str, - struct perf_event_attr *attr) +int parse_events(struct perf_evlist *evlist, const char *str, int unset __used) { - enum event_result ret; - - ret = parse_tracepoint_event(evlist, str, attr); - if (ret != EVT_FAILED) - goto modifier; + struct perf_evsel *evsel, *h; + LIST_HEAD(list); + YY_BUFFER_STATE buffer; + int ret, idx = evlist->nr_entries; - ret = parse_raw_event(str, attr); - if (ret != EVT_FAILED) - goto modifier; + buffer = parse_events__scan_string(str); - ret = parse_numeric_event(str, attr); - if (ret != EVT_FAILED) - goto modifier; + ret = parse_events_parse(&list, &idx); - ret = parse_symbolic_event(str, attr); - if (ret != EVT_FAILED) - goto modifier; + parse_events__flush_buffer(buffer); + parse_events__delete_buffer(buffer); - ret = parse_generic_hw_event(str, attr); - if (ret != EVT_FAILED) - goto modifier; + if (!ret) { + int entries = idx - evlist->nr_entries; + perf_evlist__splice_list_tail(evlist, &list, entries); + return 0; + } - ret = parse_breakpoint_event(str, attr); - if (ret != EVT_FAILED) - goto modifier; + list_for_each_entry_safe(evsel, h, &list, node) + perf_evsel__delete(evsel); - fprintf(stderr, "invalid or unsupported event: '%s'\n", *str); + fprintf(stderr, "invalid or unsupported event: '%s'\n", str); fprintf(stderr, "Run 'perf list' for a list of valid events\n"); - return EVT_FAILED; - -modifier: - if (parse_event_modifier(str, attr) < 0) { - fprintf(stderr, "invalid event modifier: '%s'\n", *str); - fprintf(stderr, "Run 'perf list' for a list of valid events and modifiers\n"); - - return EVT_FAILED; - } - return ret; } -int parse_events(struct perf_evlist *evlist , const char *str, int unset __used) -{ - struct perf_event_attr attr; - enum event_result ret; - const char *ostr; - - for (;;) { - ostr = str; - memset(&attr, 0, sizeof(attr)); - event_attr_init(&attr); - ret = parse_event_symbols(evlist, &str, &attr); - if (ret == EVT_FAILED) - return -1; - - if (!(*str == 0 || *str == ',' || isspace(*str))) - return -1; - - if (ret != EVT_HANDLED_ALL) { - struct perf_evsel *evsel; - evsel = perf_evsel__new(&attr, evlist->nr_entries); - if (evsel == NULL) - return -1; - perf_evlist__add(evlist, evsel); - - evsel->name = calloc(str - ostr + 1, 1); - if (!evsel->name) - return -1; - strncpy(evsel->name, ostr, str - ostr); - } - - if (*str == 0) - break; - if (*str == ',') - ++str; - while (isspace(*str)) - ++str; - } - - return 0; -} - int parse_events_option(const struct option *opt, const char *str, int unset __used) { @@ -1052,8 +864,6 @@ int print_hwcache_events(const char *event_glob) return printed; } -#define MAX_NAME_LEN 100 - /* * Print the help text for the event symbols: */ -- cgit v1.2.3 From 8f707d843c2f4023490a873dbc182f632a3a5906 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Thu, 15 Mar 2012 20:09:16 +0100 Subject: perf tools: Add config options support for event parsing Adding a new rule to the event grammar to be able to specify values of additional attributes of symbolic event. The new syntax for event symbolic definition is: event_legacy_symbol: PE_NAME_SYM '/' event_config '/' | PE_NAME_SYM sep_slash_dc event_config: event_config ',' event_term | event_term event_term: PE_NAME '=' PE_NAME | PE_NAME '=' PE_VALUE PE_NAME sep_slash_dc: '/' | ':' | At the moment the config options are hardcoded to be used for legacy symbol events to define several perf_event_attr fields. It is: 'config' to define perf_event_attr::config 'config1' to define perf_event_attr::config1 'config2' to define perf_event_attr::config2 'period' to define perf_event_attr::sample_period Legacy events could be now specified as: cycles/period=100000/ If term is specified without the value assignment, then 1 is assigned by default. Acked-by: Peter Zijlstra Signed-off-by: Jiri Olsa Link: http://lkml.kernel.org/n/tip-mgkavww9790jbt2jdkooyv4q@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-test.c | 22 ++ tools/perf/util/parse-events-bison.c | 310 ++++++++++----- tools/perf/util/parse-events-bison.h | 23 +- tools/perf/util/parse-events-flex.c | 713 +++++++++++++++++++---------------- tools/perf/util/parse-events-flex.h | 2 +- tools/perf/util/parse-events.c | 99 ++++- tools/perf/util/parse-events.h | 31 +- tools/perf/util/parse-events.l | 19 + tools/perf/util/parse-events.y | 94 ++++- 9 files changed, 866 insertions(+), 447 deletions(-) (limited to 'tools/perf/util/parse-events.c') diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index 844c53a49a5a..8b5359506505 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c @@ -677,6 +677,24 @@ static int test__checkevent_symbolic_name(struct perf_evlist *evlist) return 0; } +static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", + PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config); + TEST_ASSERT_VAL("wrong period", + 100000 == evsel->attr.sample_period); + TEST_ASSERT_VAL("wrong config1", + 0 == evsel->attr.config1); + TEST_ASSERT_VAL("wrong config2", + 1 == evsel->attr.config2); + return 0; +} + static int test__checkevent_symbolic_alias(struct perf_evlist *evlist) { struct perf_evsel *evsel = list_entry(evlist->entries.next, @@ -883,6 +901,10 @@ static struct test__event_st { .name = "instructions", .check = test__checkevent_symbolic_name, }, + { + .name = "cycles/period=100000,config2/", + .check = test__checkevent_symbolic_name_config, + }, { .name = "faults", .check = test__checkevent_symbolic_alias, diff --git a/tools/perf/util/parse-events-bison.c b/tools/perf/util/parse-events-bison.c index 20fca2635664..ace593a25182 100644 --- a/tools/perf/util/parse-events-bison.c +++ b/tools/perf/util/parse-events-bison.c @@ -127,14 +127,15 @@ do { \ PE_VALUE = 258, PE_VALUE_SYM = 259, PE_RAW = 260, - PE_NAME = 261, - PE_MODIFIER_EVENT = 262, - PE_MODIFIER_BP = 263, - PE_NAME_CACHE_TYPE = 264, - PE_NAME_CACHE_OP_RESULT = 265, - PE_PREFIX_MEM = 266, - PE_PREFIX_RAW = 267, - PE_ERROR = 268 + PE_TERM = 261, + PE_NAME = 262, + PE_MODIFIER_EVENT = 263, + PE_MODIFIER_BP = 264, + PE_NAME_CACHE_TYPE = 265, + PE_NAME_CACHE_OP_RESULT = 266, + PE_PREFIX_MEM = 267, + PE_PREFIX_RAW = 268, + PE_ERROR = 269 }; #endif @@ -145,15 +146,17 @@ typedef union YYSTYPE { /* Line 214 of yacc.c */ -#line 42 "util/parse-events.y" +#line 45 "util/parse-events.y" char *str; unsigned long num; + struct list_head *head; + struct parse_events__term *term; /* Line 214 of yacc.c */ -#line 157 "util/parse-events-bison.c" +#line 160 "util/parse-events-bison.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -165,7 +168,7 @@ typedef union YYSTYPE /* Line 264 of yacc.c */ -#line 169 "util/parse-events-bison.c" +#line 172 "util/parse-events-bison.c" #ifdef short # undef short @@ -378,22 +381,22 @@ union yyalloc #endif /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 20 +#define YYFINAL 23 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 27 +#define YYLAST 38 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 17 +#define YYNTOKENS 20 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 11 +#define YYNNTS 14 /* YYNRULES -- Number of rules. */ -#define YYNRULES 22 +#define YYNRULES 33 /* YYNRULES -- Number of states. */ -#define YYNSTATES 39 +#define YYNSTATES 53 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 268 +#define YYMAXUTOK 269 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -405,9 +408,9 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 14, 15, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 16, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 15, 17, 2, 16, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 18, 2, + 2, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -427,7 +430,7 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13 + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; #if YYDEBUG @@ -435,29 +438,34 @@ static const yytype_uint8 yytranslate[] = YYRHS. */ static const yytype_uint8 yyprhs[] = { - 0, 0, 3, 7, 9, 12, 14, 17, 20, 22, - 25, 28, 31, 33, 39, 43, 45, 51, 55, 59, - 63, 65, 67 + 0, 0, 3, 7, 9, 12, 14, 16, 19, 21, + 24, 27, 30, 35, 38, 44, 48, 50, 56, 60, + 64, 68, 70, 74, 76, 80, 84, 86, 90, 92, + 94, 95, 97, 99 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { - 18, 0, -1, 18, 14, 19, -1, 19, -1, 20, - 7, -1, 20, -1, 21, 27, -1, 22, 27, -1, - 23, -1, 24, 27, -1, 25, 27, -1, 26, 27, - -1, 4, -1, 9, 15, 10, 15, 10, -1, 9, - 15, 10, -1, 9, -1, 11, 3, 16, 8, 27, - -1, 11, 3, 27, -1, 6, 16, 6, -1, 3, - 16, 3, -1, 5, -1, 16, -1, -1 + 21, 0, -1, 21, 15, 22, -1, 22, -1, 23, + 8, -1, 23, -1, 24, -1, 25, 32, -1, 26, + -1, 27, 32, -1, 28, 32, -1, 29, 32, -1, + 4, 16, 30, 16, -1, 4, 33, -1, 10, 17, + 11, 17, 11, -1, 10, 17, 11, -1, 10, -1, + 12, 3, 18, 9, 32, -1, 12, 3, 32, -1, + 7, 18, 7, -1, 3, 18, 3, -1, 5, -1, + 30, 15, 31, -1, 31, -1, 7, 19, 7, -1, + 7, 19, 3, -1, 7, -1, 6, 19, 3, -1, + 6, -1, 18, -1, -1, 16, -1, 18, -1, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 49, 49, 49, 52, 57, 59, 60, 61, 62, - 63, 64, 67, 76, 81, 86, 92, 97, 103, 109, - 115, 120, 120 + 0, 54, 54, 54, 57, 62, 64, 65, 66, 67, + 68, 69, 72, 81, 90, 95, 100, 106, 111, 117, + 123, 129, 135, 145, 157, 166, 175, 184, 192, 200, + 200, 202, 202, 202 }; #endif @@ -467,12 +475,13 @@ static const yytype_uint8 yyrline[] = static const char *const yytname[] = { "$end", "error", "$undefined", "PE_VALUE", "PE_VALUE_SYM", "PE_RAW", - "PE_NAME", "PE_MODIFIER_EVENT", "PE_MODIFIER_BP", "PE_NAME_CACHE_TYPE", - "PE_NAME_CACHE_OP_RESULT", "PE_PREFIX_MEM", "PE_PREFIX_RAW", "PE_ERROR", - "','", "'-'", "':'", "$accept", "events", "event", "event_def", - "event_legacy_symbol", "event_legacy_cache", "event_legacy_mem", - "event_legacy_tracepoint", "event_legacy_numeric", "event_legacy_raw", - "sep_dc", 0 + "PE_TERM", "PE_NAME", "PE_MODIFIER_EVENT", "PE_MODIFIER_BP", + "PE_NAME_CACHE_TYPE", "PE_NAME_CACHE_OP_RESULT", "PE_PREFIX_MEM", + "PE_PREFIX_RAW", "PE_ERROR", "','", "'/'", "'-'", "':'", "'='", + "$accept", "events", "event", "event_def", "event_legacy_symbol", + "event_legacy_cache", "event_legacy_mem", "event_legacy_tracepoint", + "event_legacy_numeric", "event_legacy_raw", "event_config", "event_term", + "sep_dc", "sep_slash_dc", 0 }; #endif @@ -482,24 +491,26 @@ static const char *const yytname[] = static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 44, 45, 58 + 265, 266, 267, 268, 269, 44, 47, 45, 58, 61 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 17, 18, 18, 19, 19, 20, 20, 20, 20, - 20, 20, 21, 22, 22, 22, 23, 23, 24, 25, - 26, 27, 27 + 0, 20, 21, 21, 22, 22, 23, 23, 23, 23, + 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, + 28, 29, 30, 30, 31, 31, 31, 31, 31, 32, + 32, 33, 33, 33 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { - 0, 2, 3, 1, 2, 1, 2, 2, 1, 2, - 2, 2, 1, 5, 3, 1, 5, 3, 3, 3, - 1, 1, 0 + 0, 2, 3, 1, 2, 1, 1, 2, 1, 2, + 2, 2, 4, 2, 5, 3, 1, 5, 3, 3, + 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, + 0, 1, 1, 0 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -507,35 +518,39 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 0, 12, 20, 0, 15, 0, 0, 3, 5, - 22, 22, 8, 22, 22, 22, 0, 0, 0, 22, - 1, 0, 4, 21, 6, 7, 9, 10, 11, 19, - 18, 14, 21, 17, 2, 0, 22, 13, 16 + 0, 0, 33, 21, 0, 16, 0, 0, 3, 5, + 6, 30, 8, 30, 30, 30, 0, 31, 32, 13, + 0, 0, 30, 1, 0, 4, 29, 7, 9, 10, + 11, 20, 28, 26, 0, 23, 19, 15, 29, 18, + 2, 0, 0, 0, 12, 0, 30, 27, 25, 24, + 22, 14, 17 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 24 + 34, 35, 27, 19 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -12 +#define YYPACT_NINF -14 static const yytype_int8 yypact[] = { - 7, -10, -12, -12, -9, -6, 2, 1, -12, 10, - -2, -2, -12, -2, -2, -2, 16, 14, 11, 6, - -12, 7, -12, -12, -12, -12, -12, -12, -12, -12, - -12, 8, 18, -12, -12, 17, -2, -12, -12 + 1, -11, -1, -14, -6, 8, 20, 3, -14, 16, + -14, -2, -14, -2, -2, -2, 23, 13, -14, -14, + 21, 18, 9, -14, 1, -14, -14, -14, -14, -14, + -14, -14, 11, 12, 6, -14, -14, 15, 25, -14, + -14, 32, 7, 13, -14, 26, -2, -14, -14, -14, + -14, -14, -14 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -12, -12, 3, -12, -12, -12, -12, -12, -12, -12, - -11 + -14, -14, 14, -14, -14, -14, -14, -14, -14, -14, + -14, -7, -13, -14 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -545,26 +560,30 @@ static const yytype_int8 yypgoto[] = #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { - 25, 20, 26, 27, 28, 19, 16, 17, 33, 18, - 1, 2, 3, 4, 23, 21, 5, 22, 6, 29, - 30, 31, 32, 35, 34, 38, 36, 37 + 28, 29, 30, 23, 1, 2, 3, 16, 4, 39, + 48, 5, 20, 6, 49, 17, 26, 18, 24, 32, + 33, 43, 44, 22, 25, 21, 31, 38, 36, 37, + 41, 42, 45, 52, 46, 47, 50, 51, 40 }; static const yytype_uint8 yycheck[] = { - 11, 0, 13, 14, 15, 3, 16, 16, 19, 15, - 3, 4, 5, 6, 16, 14, 9, 7, 11, 3, - 6, 10, 16, 15, 21, 36, 8, 10 + 13, 14, 15, 0, 3, 4, 5, 18, 7, 22, + 3, 10, 18, 12, 7, 16, 18, 18, 15, 6, + 7, 15, 16, 3, 8, 17, 3, 18, 7, 11, + 19, 19, 17, 46, 9, 3, 43, 11, 24 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 3, 4, 5, 6, 9, 11, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 16, 16, 15, 3, - 0, 14, 7, 16, 27, 27, 27, 27, 27, 3, - 6, 10, 16, 27, 19, 15, 8, 10, 27 + 0, 3, 4, 5, 7, 10, 12, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 18, 16, 18, 33, + 18, 17, 3, 0, 15, 8, 18, 32, 32, 32, + 32, 3, 6, 7, 30, 31, 7, 11, 18, 32, + 22, 19, 19, 15, 16, 17, 9, 3, 3, 7, + 31, 11, 32 }; #define yyerrok (yyerrstatus = 0) @@ -1400,7 +1419,7 @@ yyreduce: case 4: /* Line 1464 of yacc.c */ -#line 53 "util/parse-events.y" +#line 58 "util/parse-events.y" { ABORT_ON(parse_events_modifier(list, (yyvsp[(2) - (2)].str))); ;} @@ -1409,91 +1428,196 @@ yyreduce: case 12: /* Line 1464 of yacc.c */ -#line 68 "util/parse-events.y" +#line 73 "util/parse-events.y" { - int type = (yyvsp[(1) - (1)].num) >> 16; - int config = (yyvsp[(1) - (1)].num) & 255; + int type = (yyvsp[(1) - (4)].num) >> 16; + int config = (yyvsp[(1) - (4)].num) & 255; - ABORT_ON(parse_events_add_numeric(list, idx, type, config)); + ABORT_ON(parse_events_add_numeric(list, idx, type, config, (yyvsp[(3) - (4)].head))); + parse_events__free_terms((yyvsp[(3) - (4)].head)); ;} break; case 13: /* Line 1464 of yacc.c */ -#line 77 "util/parse-events.y" +#line 82 "util/parse-events.y" { - ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str))); + int type = (yyvsp[(1) - (2)].num) >> 16; + int config = (yyvsp[(1) - (2)].num) & 255; + + ABORT_ON(parse_events_add_numeric(list, idx, type, config, NULL)); ;} break; case 14: /* Line 1464 of yacc.c */ -#line 82 "util/parse-events.y" +#line 91 "util/parse-events.y" { - ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL)); + ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str))); ;} break; case 15: /* Line 1464 of yacc.c */ -#line 87 "util/parse-events.y" +#line 96 "util/parse-events.y" { - ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (1)].str), NULL, NULL)); + ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL)); ;} break; case 16: /* Line 1464 of yacc.c */ -#line 93 "util/parse-events.y" +#line 101 "util/parse-events.y" { - ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str))); + ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (1)].str), NULL, NULL)); ;} break; case 17: /* Line 1464 of yacc.c */ -#line 98 "util/parse-events.y" +#line 107 "util/parse-events.y" { - ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (3)].num), NULL)); + ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str))); ;} break; case 18: /* Line 1464 of yacc.c */ -#line 104 "util/parse-events.y" +#line 112 "util/parse-events.y" { - ABORT_ON(parse_events_add_tracepoint(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); + ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (3)].num), NULL)); ;} break; case 19: /* Line 1464 of yacc.c */ -#line 110 "util/parse-events.y" +#line 118 "util/parse-events.y" { - ABORT_ON(parse_events_add_numeric(list, idx, (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num))); + ABORT_ON(parse_events_add_tracepoint(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); ;} break; case 20: /* Line 1464 of yacc.c */ -#line 116 "util/parse-events.y" +#line 124 "util/parse-events.y" + { + ABORT_ON(parse_events_add_numeric(list, idx, (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num), NULL)); +;} + break; + + case 21: + +/* Line 1464 of yacc.c */ +#line 130 "util/parse-events.y" + { + ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, (yyvsp[(1) - (1)].num), NULL)); +;} + break; + + case 22: + +/* Line 1464 of yacc.c */ +#line 136 "util/parse-events.y" { - ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, (yyvsp[(1) - (1)].num))); + struct list_head *head = (yyvsp[(1) - (3)].head); + struct parse_events__term *term = (yyvsp[(3) - (3)].term); + + ABORT_ON(!head); + list_add_tail(&term->list, head); + (yyval.head) = (yyvsp[(1) - (3)].head); +;} + break; + + case 23: + +/* Line 1464 of yacc.c */ +#line 146 "util/parse-events.y" + { + struct list_head *head = malloc(sizeof(*head)); + struct parse_events__term *term = (yyvsp[(1) - (1)].term); + + ABORT_ON(!head); + INIT_LIST_HEAD(head); + list_add_tail(&term->list, head); + (yyval.head) = head; +;} + break; + + case 24: + +/* Line 1464 of yacc.c */ +#line 158 "util/parse-events.y" + { + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_STR, + (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), 0)); + (yyval.term) = term; +;} + break; + + case 25: + +/* Line 1464 of yacc.c */ +#line 167 "util/parse-events.y" + { + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM, + (yyvsp[(1) - (3)].str), NULL, (yyvsp[(3) - (3)].num))); + (yyval.term) = term; +;} + break; + + case 26: + +/* Line 1464 of yacc.c */ +#line 176 "util/parse-events.y" + { + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM, + (yyvsp[(1) - (1)].str), NULL, 1)); + (yyval.term) = term; +;} + break; + + case 27: + +/* Line 1464 of yacc.c */ +#line 185 "util/parse-events.y" + { + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, (yyvsp[(1) - (3)].num), NULL, NULL, (yyvsp[(3) - (3)].num))); + (yyval.term) = term; +;} + break; + + case 28: + +/* Line 1464 of yacc.c */ +#line 193 "util/parse-events.y" + { + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, (yyvsp[(1) - (1)].num), NULL, NULL, 1)); + (yyval.term) = term; ;} break; /* Line 1464 of yacc.c */ -#line 1497 "util/parse-events-bison.c" +#line 1621 "util/parse-events-bison.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -1705,7 +1829,7 @@ yyreturn: /* Line 1684 of yacc.c */ -#line 122 "util/parse-events.y" +#line 204 "util/parse-events.y" void parse_events_error(struct list_head *list __used, int *idx __used, diff --git a/tools/perf/util/parse-events-bison.h b/tools/perf/util/parse-events-bison.h index 097a6323e6a9..c58b76584f92 100644 --- a/tools/perf/util/parse-events-bison.h +++ b/tools/perf/util/parse-events-bison.h @@ -41,14 +41,15 @@ PE_VALUE = 258, PE_VALUE_SYM = 259, PE_RAW = 260, - PE_NAME = 261, - PE_MODIFIER_EVENT = 262, - PE_MODIFIER_BP = 263, - PE_NAME_CACHE_TYPE = 264, - PE_NAME_CACHE_OP_RESULT = 265, - PE_PREFIX_MEM = 266, - PE_PREFIX_RAW = 267, - PE_ERROR = 268 + PE_TERM = 261, + PE_NAME = 262, + PE_MODIFIER_EVENT = 263, + PE_MODIFIER_BP = 264, + PE_NAME_CACHE_TYPE = 265, + PE_NAME_CACHE_OP_RESULT = 266, + PE_PREFIX_MEM = 267, + PE_PREFIX_RAW = 268, + PE_ERROR = 269 }; #endif @@ -59,15 +60,17 @@ typedef union YYSTYPE { /* Line 1685 of yacc.c */ -#line 42 "util/parse-events.y" +#line 45 "util/parse-events.y" char *str; unsigned long num; + struct list_head *head; + struct parse_events__term *term; /* Line 1685 of yacc.c */ -#line 71 "util/parse-events-bison.h" +#line 74 "util/parse-events-bison.h" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/tools/perf/util/parse-events-flex.c b/tools/perf/util/parse-events-flex.c index 9e77ed6a0ecf..34cfc85c4f79 100644 --- a/tools/perf/util/parse-events-flex.c +++ b/tools/perf/util/parse-events-flex.c @@ -378,8 +378,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 44 -#define YY_END_OF_BUFFER 45 +#define YY_NUM_RULES 49 +#define YY_END_OF_BUFFER 50 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -387,55 +387,56 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[425] = +static yyconst flex_int16_t yy_accept[440] = { 0, - 0, 0, 45, 44, 38, 41, 40, 39, 34, 34, - 42, 43, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 36, 38, 38, 38, 38, 38, 36, 37, - 38, 38, 37, 37, 38, 34, 0, 38, 38, 38, - 21, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 15, 38, 0, 38, 38, 38, 36, 0, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 33, 33, 38, 38, 38, 38, 35, 38, - 38, 0, 38, 38, 38, 24, 38, 38, 38, 38, - 38, 38, 0, 38, 38, 38, 36, 0, 38, 38, - - 38, 0, 19, 20, 38, 38, 38, 38, 38, 38, - 38, 30, 38, 38, 33, 33, 38, 38, 38, 38, - 38, 38, 38, 0, 0, 38, 38, 38, 38, 0, - 38, 38, 0, 38, 0, 22, 38, 38, 36, 0, - 23, 38, 38, 19, 20, 26, 38, 32, 38, 38, - 31, 25, 38, 38, 26, 38, 38, 38, 38, 38, - 0, 38, 0, 0, 0, 0, 38, 38, 38, 38, - 0, 38, 38, 0, 0, 38, 22, 38, 38, 36, - 23, 0, 38, 26, 38, 38, 38, 38, 0, 38, - 38, 38, 27, 0, 27, 0, 38, 0, 0, 0, - - 0, 38, 38, 24, 0, 0, 38, 0, 0, 0, - 1, 38, 12, 0, 38, 0, 38, 0, 31, 0, - 38, 38, 38, 0, 0, 38, 0, 0, 0, 38, - 38, 0, 38, 0, 0, 0, 38, 0, 0, 0, - 38, 0, 38, 0, 38, 0, 0, 38, 38, 38, - 0, 38, 0, 0, 0, 38, 38, 0, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 38, 0, 38, - 0, 38, 0, 0, 28, 38, 0, 0, 38, 0, - 38, 0, 0, 0, 0, 0, 0, 10, 0, 0, - 38, 0, 38, 0, 38, 0, 0, 38, 38, 0, - - 0, 38, 0, 0, 0, 0, 9, 0, 0, 0, - 1, 0, 0, 0, 38, 0, 16, 0, 0, 28, - 38, 0, 11, 38, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 38, 0, 0, 12, 38, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 0, 4, 14, 13, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 50, 49, 43, 46, 45, 44, 39, 39, + 47, 48, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 41, 43, 43, 43, 43, 43, 41, 42, + 43, 43, 42, 42, 43, 39, 0, 43, 43, 43, + 21, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 15, 43, 0, 43, 43, 43, 41, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 38, 38, 43, 43, 43, 43, 40, + 43, 43, 0, 43, 43, 43, 24, 43, 43, 43, + 43, 43, 43, 0, 43, 43, 43, 41, 0, 43, + + 43, 43, 0, 19, 20, 43, 43, 43, 43, 43, + 43, 43, 30, 43, 43, 43, 38, 38, 43, 43, + 43, 43, 43, 43, 43, 0, 0, 43, 43, 43, + 43, 0, 43, 43, 43, 0, 43, 0, 22, 43, + 43, 41, 0, 23, 43, 43, 19, 20, 26, 43, + 37, 43, 43, 31, 25, 43, 43, 43, 26, 43, + 43, 43, 43, 43, 0, 43, 0, 0, 0, 0, + 43, 43, 43, 43, 0, 43, 43, 43, 0, 0, + 43, 22, 43, 43, 41, 23, 0, 43, 26, 43, + 43, 43, 43, 0, 43, 43, 43, 43, 27, 0, + + 27, 0, 43, 0, 0, 0, 0, 43, 43, 24, + 0, 0, 32, 43, 0, 0, 0, 1, 43, 12, + 0, 43, 0, 43, 0, 31, 0, 35, 43, 43, + 43, 0, 0, 43, 0, 0, 0, 43, 43, 0, + 43, 43, 0, 0, 0, 33, 34, 43, 0, 0, + 0, 43, 0, 43, 0, 43, 0, 0, 43, 43, + 43, 0, 43, 0, 0, 0, 43, 43, 0, 0, + 43, 7, 0, 0, 0, 0, 0, 0, 0, 43, + 0, 43, 0, 43, 0, 0, 28, 43, 0, 0, + 43, 0, 43, 0, 0, 43, 0, 0, 0, 0, + + 10, 0, 0, 43, 0, 43, 0, 43, 0, 0, + 43, 43, 0, 0, 43, 0, 0, 0, 0, 43, + 9, 0, 0, 0, 1, 0, 0, 0, 43, 0, + 16, 0, 0, 28, 43, 0, 11, 43, 0, 0, + 0, 0, 36, 0, 0, 0, 0, 0, 0, 43, + 0, 0, 12, 43, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 4, 14, 13, 0, + 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 5, 15, 18, 0, 0, 29, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 3, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 17, 0, 5, + 15, 18, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 3, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -449,11 +450,11 @@ static yyconst flex_int32_t yy_ec[256] = 11, 1, 2, 1, 12, 13, 14, 15, 12, 12, 2, 2, 16, 2, 2, 17, 2, 2, 2, 2, 2, 18, 2, 19, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 2, 1, 20, 21, 22, 23, + 1, 1, 1, 1, 20, 1, 21, 22, 23, 24, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 2, 36, 37, 38, 39, 40, 41, 42, - 43, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 2, 37, 38, 39, 40, 41, 42, 43, + 44, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -470,241 +471,249 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[44] = +static yyconst flex_int32_t yy_meta[45] = { 0, 1, 2, 1, 1, 1, 3, 3, 3, 3, 1, - 1, 3, 3, 3, 3, 2, 2, 2, 2, 3, - 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, + 1, 3, 3, 3, 3, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2 + 2, 2, 2, 2 } ; -static yyconst flex_int16_t yy_base[427] = +static yyconst flex_int16_t yy_base[442] = { 0, - 0, 0, 494, 495, 0, 495, 495, 495, 38, 42, - 495, 495, 473, 459, 45, 467, 32, 20, 40, 53, - 458, 469, 34, 62, 58, 58, 454, 452, 64, 98, - 32, 466, 449, 0, 0, 81, 0, 446, 446, 478, - 0, 467, 455, 457, 450, 54, 457, 455, 438, 452, - 440, 433, 0, 449, 432, 452, 429, 428, 97, 428, - 448, 433, 426, 105, 442, 432, 428, 104, 436, 421, - 431, 432, 431, 77, 430, 95, 416, 424, 0, 431, - 412, 103, 425, 424, 421, 0, 413, 441, 417, 405, - 438, 410, 409, 426, 407, 406, 108, 405, 422, 410, - - 395, 111, 0, 0, 409, 397, 420, 393, 394, 390, - 402, 0, 401, 399, 93, 116, 401, 391, 385, 390, - 381, 414, 381, 76, 46, 380, 378, 381, 391, 390, - 387, 386, 120, 385, 387, 0, 387, 368, 119, 384, - 0, 400, 367, 495, 495, 365, 365, 495, 380, 363, - 374, 0, 393, 372, 371, 355, 362, 368, 387, 366, - 370, 349, 349, 366, 365, 347, 359, 345, 349, 353, - 336, 374, 335, 113, 348, 338, 495, 336, 336, 0, - 495, 350, 332, 0, 366, 331, 364, 330, 341, 327, - 333, 339, 325, 339, 0, 343, 337, 338, 335, 334, - - 317, 321, 329, 121, 330, 119, 313, 316, 327, 322, - 0, 319, 0, 303, 323, 319, 315, 317, 0, 321, - 318, 319, 315, 306, 323, 297, 307, 306, 296, 309, - 297, 129, 292, 297, 299, 302, 321, 302, 292, 286, - 287, 298, 281, 298, 283, 296, 276, 287, 275, 308, - 277, 282, 285, 284, 268, 282, 267, 271, 275, 0, - 278, 264, 275, 262, 268, 273, 276, 262, 263, 265, - 253, 258, 251, 258, 264, 259, 264, 263, 250, 261, - 278, 244, 243, 242, 241, 253, 235, 495, 238, 236, - 269, 248, 237, 239, 232, 237, 229, 229, 225, 221, - - 233, 229, 223, 235, 221, 221, 495, 233, 220, 227, - 495, 226, 228, 215, 218, 212, 0, 211, 211, 0, - 223, 224, 495, 241, 216, 223, 206, 217, 203, 215, - 200, 203, 216, 231, 197, 196, 195, 495, 227, 199, - 210, 194, 188, 187, 188, 495, 191, 201, 189, 182, - 138, 0, 495, 495, 129, 196, 202, 185, 186, 194, - 495, 193, 187, 176, 181, 191, 174, 175, 184, 170, - 193, 167, 166, 179, 178, 495, 163, 178, 165, 178, - 177, 192, 158, 166, 156, 155, 154, 160, 156, 165, - 164, 141, 495, 152, 495, 495, 495, 161, 146, 495, - - 163, 146, 148, 147, 155, 156, 143, 139, 152, 141, - 143, 139, 495, 495, 148, 146, 131, 495, 131, 126, - 125, 81, 85, 495, 165, 68 + 0, 0, 510, 511, 0, 511, 511, 511, 39, 43, + 511, 511, 488, 474, 46, 482, 32, 20, 37, 57, + 473, 484, 34, 64, 59, 64, 469, 467, 78, 113, + 41, 481, 464, 0, 0, 104, 0, 461, 461, 494, + 0, 483, 470, 472, 465, 44, 472, 470, 453, 467, + 455, 448, 0, 464, 447, 468, 444, 443, 64, 443, + 464, 448, 441, 67, 457, 447, 443, 52, 451, 436, + 446, 435, 446, 445, 76, 444, 95, 430, 438, 0, + 445, 426, 100, 439, 438, 435, 0, 427, 456, 431, + 105, 454, 425, 424, 442, 422, 421, 112, 420, 438, + + 425, 410, 117, 0, 0, 424, 412, 436, 408, 409, + 405, 417, 0, 416, 411, 413, 83, 107, 415, 405, + 399, 404, 395, 429, 395, 126, 119, 394, 392, 395, + 405, 404, 401, 396, 399, 100, 398, 400, 0, 400, + 381, 123, 397, 0, 414, 380, 511, 511, 378, 378, + 511, 393, 376, 387, 0, 407, 375, 384, 383, 367, + 374, 380, 400, 378, 383, 361, 361, 378, 377, 359, + 371, 357, 361, 365, 348, 387, 363, 346, 73, 359, + 349, 511, 347, 347, 0, 511, 361, 343, 0, 378, + 342, 376, 341, 352, 353, 337, 343, 349, 335, 349, + + 0, 354, 347, 348, 345, 344, 327, 331, 339, 146, + 340, 123, 150, 323, 326, 337, 332, 0, 329, 0, + 313, 333, 329, 325, 327, 0, 331, 0, 328, 329, + 325, 316, 334, 307, 317, 316, 306, 319, 307, 132, + 301, 301, 306, 308, 311, 0, 0, 331, 311, 301, + 295, 296, 307, 290, 307, 292, 305, 285, 296, 284, + 318, 286, 291, 294, 293, 277, 291, 276, 280, 284, + 268, 0, 286, 272, 283, 270, 276, 281, 284, 270, + 271, 273, 261, 266, 259, 266, 272, 267, 272, 271, + 258, 269, 287, 252, 251, 252, 249, 248, 260, 242, + + 511, 245, 243, 277, 255, 244, 246, 239, 244, 236, + 236, 232, 228, 240, 236, 230, 242, 228, 228, 240, + 511, 239, 226, 233, 511, 232, 234, 221, 224, 218, + 0, 217, 217, 0, 229, 230, 511, 248, 222, 229, + 212, 223, 0, 209, 221, 206, 209, 222, 238, 203, + 202, 201, 511, 234, 205, 217, 200, 194, 193, 194, + 511, 197, 207, 195, 188, 142, 0, 511, 511, 130, + 202, 209, 191, 192, 200, 511, 199, 193, 182, 187, + 197, 180, 181, 190, 176, 200, 173, 172, 185, 184, + 511, 169, 184, 171, 184, 183, 199, 164, 172, 162, + + 161, 160, 166, 162, 171, 170, 147, 511, 158, 511, + 511, 511, 167, 152, 511, 169, 152, 154, 153, 161, + 162, 149, 145, 158, 147, 149, 145, 511, 511, 154, + 152, 137, 511, 138, 145, 131, 53, 54, 511, 172, + 66 } ; -static yyconst flex_int16_t yy_def[427] = +static yyconst flex_int16_t yy_def[442] = { 0, - 424, 1, 424, 424, 425, 424, 424, 424, 424, 424, - 424, 424, 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 425, 425, 424, 426, 425, 425, 425, - 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 425, 424, 425, 425, 425, 425, 424, - 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 30, 30, 425, 425, 425, 425, 426, 425, - 425, 424, 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 424, 425, 425, 425, 425, 424, 425, 425, - - 425, 424, 425, 425, 425, 425, 425, 425, 425, 425, - 425, 425, 425, 425, 30, 30, 425, 425, 425, 425, - 425, 425, 425, 424, 424, 425, 425, 425, 425, 424, - 425, 425, 424, 425, 424, 425, 425, 425, 425, 424, - 425, 425, 425, 424, 424, 425, 425, 424, 425, 425, - 425, 425, 425, 425, 30, 425, 425, 425, 425, 425, - 424, 425, 424, 424, 424, 424, 425, 425, 425, 425, - 424, 425, 425, 424, 424, 425, 424, 425, 425, 425, - 424, 424, 425, 425, 425, 425, 425, 425, 424, 425, - 425, 425, 425, 424, 425, 424, 425, 424, 424, 424, - - 424, 425, 425, 425, 424, 424, 425, 424, 424, 424, - 425, 425, 425, 424, 425, 424, 425, 424, 425, 424, - 425, 425, 425, 424, 424, 425, 424, 424, 424, 425, - 425, 424, 425, 424, 424, 424, 425, 424, 424, 424, - 425, 424, 425, 424, 425, 424, 424, 425, 425, 425, - 424, 425, 424, 424, 424, 425, 425, 424, 424, 425, - 424, 424, 424, 424, 424, 424, 424, 425, 424, 425, - 424, 425, 424, 424, 425, 425, 424, 424, 425, 424, - 425, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 425, 424, 425, 424, 425, 424, 424, 425, 425, 424, - - 424, 425, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 425, 424, 425, 424, 424, 425, - 425, 424, 424, 425, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 425, 424, 424, 424, 425, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 425, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 0, 424, 424 + 439, 1, 439, 439, 440, 439, 439, 439, 439, 439, + 439, 439, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 439, 441, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 439, 440, 440, 440, 440, 439, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 30, 30, 440, 440, 440, 440, 441, + 440, 440, 439, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 439, 440, 440, 440, 440, 439, 440, + + 440, 440, 439, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 30, 30, 440, 440, + 440, 440, 440, 440, 440, 439, 439, 440, 440, 440, + 440, 439, 440, 440, 440, 439, 440, 439, 440, 440, + 440, 440, 439, 440, 440, 440, 439, 439, 440, 440, + 439, 440, 440, 440, 440, 440, 440, 440, 30, 440, + 440, 440, 440, 440, 439, 440, 439, 439, 439, 439, + 440, 440, 440, 440, 439, 440, 440, 440, 439, 439, + 440, 439, 440, 440, 440, 439, 439, 440, 440, 440, + 440, 440, 440, 439, 440, 440, 440, 440, 440, 439, + + 440, 439, 440, 439, 439, 439, 439, 440, 440, 440, + 439, 439, 440, 440, 439, 439, 439, 440, 440, 440, + 439, 440, 439, 440, 439, 440, 439, 440, 440, 440, + 440, 439, 439, 440, 439, 439, 439, 440, 440, 439, + 440, 440, 439, 439, 439, 440, 440, 440, 439, 439, + 439, 440, 439, 440, 439, 440, 439, 439, 440, 440, + 440, 439, 440, 439, 439, 439, 440, 440, 439, 439, + 440, 440, 439, 439, 439, 439, 439, 439, 439, 440, + 439, 440, 439, 440, 439, 439, 440, 440, 439, 439, + 440, 439, 440, 439, 439, 440, 439, 439, 439, 439, + + 439, 439, 439, 440, 439, 440, 439, 440, 439, 439, + 440, 440, 439, 439, 440, 439, 439, 439, 439, 440, + 439, 439, 439, 439, 439, 439, 439, 439, 440, 439, + 440, 439, 439, 440, 440, 439, 439, 440, 439, 439, + 439, 439, 440, 439, 439, 439, 439, 439, 439, 440, + 439, 439, 439, 440, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 440, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 0, 439, + 439 } ; -static yyconst flex_int16_t yy_nxt[539] = +static yyconst flex_int16_t yy_nxt[556] = { 0, 4, 5, 6, 7, 8, 9, 10, 10, 10, 11, - 12, 5, 5, 5, 13, 14, 15, 16, 5, 17, - 18, 19, 20, 21, 22, 5, 23, 24, 5, 23, - 25, 26, 27, 28, 29, 30, 31, 32, 23, 5, - 33, 34, 5, 36, 36, 36, 36, 36, 36, 36, - 36, 40, 41, 44, 46, 47, 55, 48, 49, 50, - 59, 42, 45, 59, 64, 60, 75, 165, 59, 76, - 79, 56, 59, 51, 52, 86, 53, 66, 166, 37, - 61, 67, 54, 71, 62, 68, 36, 36, 36, 36, - 59, 65, 86, 59, 63, 163, 115, 164, 59, 72, - - 73, 116, 59, 73, 73, 73, 73, 418, 102, 73, - 73, 73, 73, 423, 118, 155, 73, 73, 73, 73, - 73, 74, 73, 97, 232, 124, 97, 103, 119, 108, - 125, 97, 104, 144, 139, 97, 109, 139, 145, 73, - 110, 174, 139, 208, 233, 180, 139, 414, 180, 422, - 235, 175, 112, 180, 236, 209, 258, 180, 366, 368, - 259, 401, 367, 421, 369, 402, 35, 35, 420, 419, - 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, - 408, 407, 406, 405, 404, 403, 400, 400, 399, 398, - 397, 396, 395, 394, 393, 392, 391, 390, 389, 388, - - 387, 386, 385, 384, 383, 181, 382, 381, 380, 379, - 378, 377, 376, 375, 374, 373, 372, 145, 371, 370, - 365, 364, 363, 362, 361, 360, 359, 358, 357, 356, - 355, 354, 353, 352, 351, 350, 349, 348, 347, 346, - 345, 344, 343, 342, 341, 340, 339, 338, 337, 336, - 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, - 325, 324, 323, 322, 321, 320, 319, 318, 317, 316, - 315, 314, 313, 312, 311, 310, 309, 308, 307, 306, - 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, - 295, 294, 293, 292, 291, 290, 289, 288, 287, 286, - - 285, 284, 283, 282, 281, 112, 280, 145, 144, 279, - 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, - 268, 267, 266, 265, 264, 263, 262, 261, 260, 257, - 256, 255, 254, 253, 252, 177, 251, 250, 249, 248, - 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, - 237, 234, 231, 230, 229, 228, 227, 144, 226, 225, - 224, 195, 223, 222, 221, 220, 219, 218, 217, 216, - 215, 214, 213, 212, 211, 210, 207, 206, 205, 204, - 203, 112, 202, 201, 200, 199, 198, 197, 196, 195, - 194, 193, 192, 191, 73, 190, 189, 188, 187, 186, - - 185, 184, 183, 182, 181, 179, 178, 177, 176, 173, - 172, 171, 170, 169, 168, 167, 162, 161, 160, 159, - 158, 157, 156, 154, 153, 152, 151, 150, 149, 148, - 147, 146, 143, 142, 141, 140, 138, 137, 136, 135, - 134, 133, 132, 131, 130, 129, 128, 127, 126, 123, - 122, 121, 120, 117, 73, 114, 113, 112, 111, 107, - 106, 105, 101, 100, 99, 98, 96, 95, 94, 93, - 92, 91, 90, 89, 88, 86, 87, 85, 84, 83, - 41, 82, 81, 80, 78, 77, 70, 69, 58, 57, - 43, 39, 38, 424, 3, 424, 424, 424, 424, 424, - - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424 + 12, 5, 5, 5, 13, 14, 15, 16, 5, 5, + 17, 18, 19, 20, 21, 22, 5, 23, 24, 5, + 23, 25, 26, 27, 28, 29, 30, 31, 32, 23, + 5, 33, 34, 5, 36, 36, 36, 36, 36, 36, + 36, 36, 40, 41, 44, 46, 47, 50, 48, 49, + 55, 59, 42, 45, 59, 64, 87, 60, 80, 59, + 103, 51, 52, 59, 53, 56, 76, 433, 109, 77, + 54, 37, 61, 87, 66, 110, 438, 62, 67, 111, + 104, 98, 68, 65, 98, 105, 117, 63, 71, 98, + + 74, 118, 72, 98, 215, 59, 159, 74, 59, 36, + 36, 36, 36, 59, 73, 120, 216, 59, 74, 74, + 74, 74, 179, 126, 74, 74, 74, 74, 127, 121, + 134, 74, 180, 74, 74, 74, 74, 75, 74, 142, + 147, 169, 142, 135, 113, 148, 167, 142, 168, 240, + 185, 142, 170, 185, 429, 244, 246, 247, 185, 245, + 269, 383, 185, 381, 270, 241, 384, 382, 416, 437, + 242, 436, 417, 35, 35, 435, 434, 433, 432, 431, + 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, + 420, 419, 418, 415, 415, 414, 413, 412, 411, 410, + + 409, 408, 407, 406, 405, 404, 403, 402, 401, 400, + 399, 398, 186, 397, 396, 395, 394, 393, 392, 391, + 390, 389, 388, 387, 148, 386, 385, 380, 379, 378, + 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, + 367, 366, 365, 364, 363, 362, 361, 360, 359, 358, + 357, 356, 355, 354, 353, 352, 351, 350, 349, 348, + 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, + 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, + 327, 326, 325, 324, 323, 322, 321, 320, 319, 318, + 317, 316, 315, 314, 313, 312, 311, 310, 309, 308, + + 307, 306, 305, 304, 303, 302, 301, 300, 299, 298, + 297, 296, 295, 294, 293, 113, 292, 148, 147, 291, + 290, 289, 288, 287, 286, 285, 284, 283, 282, 281, + 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, + 268, 267, 266, 265, 264, 263, 182, 262, 261, 260, + 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, + 249, 248, 243, 239, 238, 237, 236, 235, 147, 234, + 233, 232, 201, 231, 230, 229, 228, 227, 226, 225, + 224, 223, 222, 221, 220, 219, 218, 217, 214, 213, + 212, 211, 210, 209, 113, 208, 207, 206, 205, 204, + + 203, 202, 201, 200, 199, 198, 197, 74, 196, 195, + 194, 193, 192, 191, 190, 189, 188, 187, 186, 184, + 183, 182, 181, 178, 177, 176, 175, 174, 173, 172, + 171, 166, 165, 164, 163, 162, 161, 160, 158, 157, + 156, 155, 154, 153, 152, 151, 150, 149, 146, 145, + 144, 143, 141, 140, 139, 138, 137, 136, 133, 132, + 131, 130, 129, 128, 125, 124, 123, 122, 119, 74, + 116, 115, 114, 113, 112, 108, 107, 106, 102, 101, + 100, 99, 97, 96, 95, 94, 93, 92, 91, 90, + 89, 87, 88, 86, 85, 84, 41, 83, 82, 81, + + 79, 78, 70, 69, 58, 57, 43, 39, 38, 439, + 3, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439 } ; -static yyconst flex_int16_t yy_chk[539] = +static yyconst flex_int16_t yy_chk[556] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 9, 9, 9, 9, 10, 10, 10, - 10, 15, 15, 17, 18, 18, 20, 18, 18, 19, - 23, 15, 17, 23, 25, 24, 31, 125, 23, 31, - 426, 20, 23, 19, 19, 46, 19, 26, 125, 9, - 24, 26, 19, 29, 24, 26, 36, 36, 36, 36, - 29, 25, 46, 29, 24, 124, 74, 124, 29, 29, - - 74, 74, 29, 30, 30, 30, 30, 423, 64, 30, - 30, 30, 30, 422, 76, 115, 115, 30, 30, 30, - 30, 30, 30, 59, 204, 82, 59, 64, 76, 68, - 82, 59, 64, 102, 97, 59, 68, 97, 102, 116, - 68, 133, 97, 174, 204, 139, 97, 421, 139, 420, - 206, 133, 116, 139, 206, 174, 232, 139, 351, 355, - 232, 392, 351, 419, 355, 392, 425, 425, 417, 416, - 415, 412, 411, 410, 409, 408, 407, 406, 405, 404, - 403, 402, 401, 399, 398, 394, 391, 390, 389, 388, - 387, 386, 385, 384, 383, 382, 381, 380, 379, 378, - - 377, 375, 374, 373, 372, 371, 370, 369, 368, 367, - 366, 365, 364, 363, 362, 360, 359, 358, 357, 356, - 350, 349, 348, 347, 345, 344, 343, 342, 341, 340, - 339, 337, 336, 335, 334, 333, 332, 331, 330, 329, - 328, 327, 326, 325, 324, 322, 321, 319, 318, 316, - 315, 314, 313, 312, 310, 309, 308, 306, 305, 304, - 303, 302, 301, 300, 299, 298, 297, 296, 295, 294, - 293, 292, 291, 290, 289, 287, 286, 285, 284, 283, - 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, - 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, - - 262, 261, 259, 258, 257, 256, 255, 254, 253, 252, - 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, - 241, 240, 239, 238, 237, 236, 235, 234, 233, 231, - 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, - 220, 218, 217, 216, 215, 214, 212, 210, 209, 208, - 207, 205, 203, 202, 201, 200, 199, 198, 197, 196, - 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, - 183, 182, 179, 178, 176, 175, 173, 172, 171, 170, - 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, - 159, 158, 157, 156, 155, 154, 153, 151, 150, 149, - - 147, 146, 143, 142, 140, 138, 137, 135, 134, 132, - 131, 130, 129, 128, 127, 126, 123, 122, 121, 120, - 119, 118, 117, 114, 113, 111, 110, 109, 108, 107, - 106, 105, 101, 100, 99, 98, 96, 95, 94, 93, - 92, 91, 90, 89, 88, 87, 85, 84, 83, 81, - 80, 78, 77, 75, 73, 72, 71, 70, 69, 67, - 66, 65, 63, 62, 61, 60, 58, 57, 56, 55, - 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, - 42, 40, 39, 38, 33, 32, 28, 27, 22, 21, - 16, 14, 13, 3, 424, 424, 424, 424, 424, 424, - - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, - 424, 424, 424, 424, 424, 424, 424, 424 + 1, 1, 1, 1, 9, 9, 9, 9, 10, 10, + 10, 10, 15, 15, 17, 18, 18, 19, 18, 18, + 20, 23, 15, 17, 23, 25, 46, 24, 441, 23, + 64, 19, 19, 23, 19, 20, 31, 438, 68, 31, + 19, 9, 24, 46, 26, 68, 437, 24, 26, 68, + 64, 59, 26, 25, 59, 64, 75, 24, 29, 59, + + 75, 75, 29, 59, 179, 29, 117, 117, 29, 36, + 36, 36, 36, 29, 29, 77, 179, 29, 30, 30, + 30, 30, 136, 83, 30, 30, 30, 30, 83, 77, + 91, 118, 136, 30, 30, 30, 30, 30, 30, 98, + 103, 127, 98, 91, 118, 103, 126, 98, 126, 210, + 142, 98, 127, 142, 436, 212, 213, 213, 142, 212, + 240, 370, 142, 366, 240, 210, 370, 366, 407, 435, + 210, 434, 407, 440, 440, 432, 431, 430, 427, 426, + 425, 424, 423, 422, 421, 420, 419, 418, 417, 416, + 414, 413, 409, 406, 405, 404, 403, 402, 401, 400, + + 399, 398, 397, 396, 395, 394, 393, 392, 390, 389, + 388, 387, 386, 385, 384, 383, 382, 381, 380, 379, + 378, 377, 375, 374, 373, 372, 371, 365, 364, 363, + 362, 360, 359, 358, 357, 356, 355, 354, 352, 351, + 350, 349, 348, 347, 346, 345, 344, 342, 341, 340, + 339, 338, 336, 335, 333, 332, 330, 329, 328, 327, + 326, 324, 323, 322, 320, 319, 318, 317, 316, 315, + 314, 313, 312, 311, 310, 309, 308, 307, 306, 305, + 304, 303, 302, 300, 299, 298, 297, 296, 295, 294, + 293, 292, 291, 290, 289, 288, 287, 286, 285, 284, + + 283, 282, 281, 280, 279, 278, 277, 276, 275, 274, + 273, 271, 270, 269, 268, 267, 266, 265, 264, 263, + 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, + 252, 251, 250, 249, 248, 245, 244, 243, 242, 241, + 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, + 229, 227, 225, 224, 223, 222, 221, 219, 217, 216, + 215, 214, 211, 209, 208, 207, 206, 205, 204, 203, + 202, 200, 199, 198, 197, 196, 195, 194, 193, 192, + 191, 190, 188, 187, 184, 183, 181, 180, 178, 177, + 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, + + 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, + 156, 154, 153, 152, 150, 149, 146, 145, 143, 141, + 140, 138, 137, 135, 134, 133, 132, 131, 130, 129, + 128, 125, 124, 123, 122, 121, 120, 119, 116, 115, + 114, 112, 111, 110, 109, 108, 107, 106, 102, 101, + 100, 99, 97, 96, 95, 94, 93, 92, 90, 89, + 88, 86, 85, 84, 82, 81, 79, 78, 76, 74, + 73, 72, 71, 70, 69, 67, 66, 65, 63, 62, + 61, 60, 58, 57, 56, 55, 54, 52, 51, 50, + 49, 48, 47, 45, 44, 43, 42, 40, 39, 38, + + 33, 32, 28, 27, 22, 21, 16, 14, 13, 3, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, + 439, 439, 439, 439, 439 } ; static yy_state_type yy_last_accepting_state; @@ -726,6 +735,7 @@ char *parse_events_text; #include #include "../perf.h" #include "parse-events-bison.h" +#include "parse-events.h" static int __value(char *str, int base, int token) { @@ -762,7 +772,13 @@ static int sym(int type, int config) return PE_VALUE_SYM; } -#line 766 "" +static int term(int type) +{ + parse_events_lval.num = type; + return PE_TERM; +} + +#line 782 "" #define INITIAL 0 @@ -944,9 +960,9 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 53 "util/parse-events.l" +#line 60 "util/parse-events.l" -#line 950 "" +#line 966 "" if ( !(yy_init) ) { @@ -999,13 +1015,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 425 ) + if ( yy_current_state >= 440 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 495 ); + while ( yy_base[yy_current_state] != 511 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -1031,192 +1047,223 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 54 "util/parse-events.l" +#line 61 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); } YY_BREAK case 2: YY_RULE_SETUP -#line 55 "util/parse-events.l" +#line 62 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } YY_BREAK case 3: YY_RULE_SETUP -#line 56 "util/parse-events.l" +#line 63 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); } YY_BREAK case 4: YY_RULE_SETUP -#line 57 "util/parse-events.l" +#line 64 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); } YY_BREAK case 5: YY_RULE_SETUP -#line 58 "util/parse-events.l" +#line 65 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); } YY_BREAK case 6: YY_RULE_SETUP -#line 59 "util/parse-events.l" +#line 66 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); } YY_BREAK case 7: YY_RULE_SETUP -#line 60 "util/parse-events.l" +#line 67 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); } YY_BREAK case 8: YY_RULE_SETUP -#line 61 "util/parse-events.l" +#line 68 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); } YY_BREAK case 9: YY_RULE_SETUP -#line 62 "util/parse-events.l" +#line 69 "util/parse-events.l" { return sym(PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); } YY_BREAK case 10: YY_RULE_SETUP -#line 63 "util/parse-events.l" +#line 70 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); } YY_BREAK case 11: YY_RULE_SETUP -#line 64 "util/parse-events.l" +#line 71 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); } YY_BREAK case 12: YY_RULE_SETUP -#line 65 "util/parse-events.l" +#line 72 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); } YY_BREAK case 13: YY_RULE_SETUP -#line 66 "util/parse-events.l" +#line 73 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); } YY_BREAK case 14: YY_RULE_SETUP -#line 67 "util/parse-events.l" +#line 74 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); } YY_BREAK case 15: YY_RULE_SETUP -#line 68 "util/parse-events.l" +#line 75 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); } YY_BREAK case 16: YY_RULE_SETUP -#line 69 "util/parse-events.l" +#line 76 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); } YY_BREAK case 17: YY_RULE_SETUP -#line 70 "util/parse-events.l" +#line 77 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); } YY_BREAK case 18: YY_RULE_SETUP -#line 71 "util/parse-events.l" +#line 78 "util/parse-events.l" { return sym(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } YY_BREAK case 19: -#line 74 "util/parse-events.l" +#line 81 "util/parse-events.l" case 20: -#line 75 "util/parse-events.l" +#line 82 "util/parse-events.l" case 21: -#line 76 "util/parse-events.l" +#line 83 "util/parse-events.l" case 22: -#line 77 "util/parse-events.l" +#line 84 "util/parse-events.l" case 23: -#line 78 "util/parse-events.l" +#line 85 "util/parse-events.l" case 24: -#line 79 "util/parse-events.l" +#line 86 "util/parse-events.l" case 25: YY_RULE_SETUP -#line 79 "util/parse-events.l" +#line 86 "util/parse-events.l" { return str(PE_NAME_CACHE_TYPE); } YY_BREAK case 26: -#line 82 "util/parse-events.l" +#line 89 "util/parse-events.l" case 27: -#line 83 "util/parse-events.l" +#line 90 "util/parse-events.l" case 28: -#line 84 "util/parse-events.l" +#line 91 "util/parse-events.l" case 29: -#line 85 "util/parse-events.l" +#line 92 "util/parse-events.l" case 30: -#line 86 "util/parse-events.l" +#line 93 "util/parse-events.l" case 31: YY_RULE_SETUP -#line 86 "util/parse-events.l" +#line 93 "util/parse-events.l" { return str(PE_NAME_CACHE_OP_RESULT); } YY_BREAK +/* + * These are event config hardcoded term names to be specified + * within xxx/.../ syntax. So far we dont clash with other names, + * so we can put them here directly. In case the we have a conflict + * in future, this needs to go into '//' condition block. + */ case 32: YY_RULE_SETUP -#line 88 "util/parse-events.l" -{ return PE_PREFIX_MEM; } +#line 101 "util/parse-events.l" +{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG); } YY_BREAK case 33: YY_RULE_SETUP -#line 89 "util/parse-events.l" -{ return raw(); } +#line 102 "util/parse-events.l" +{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG1); } YY_BREAK case 34: YY_RULE_SETUP -#line 90 "util/parse-events.l" -{ return value(10); } +#line 103 "util/parse-events.l" +{ return term(PARSE_EVENTS__TERM_TYPE_CONFIG2); } YY_BREAK case 35: YY_RULE_SETUP -#line 91 "util/parse-events.l" -{ return value(16); } +#line 104 "util/parse-events.l" +{ return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } YY_BREAK case 36: YY_RULE_SETUP -#line 93 "util/parse-events.l" -{ return str(PE_MODIFIER_EVENT); } +#line 105 "util/parse-events.l" +{ return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } YY_BREAK case 37: YY_RULE_SETUP -#line 94 "util/parse-events.l" -{ return str(PE_MODIFIER_BP); } +#line 107 "util/parse-events.l" +{ return PE_PREFIX_MEM; } YY_BREAK case 38: YY_RULE_SETUP -#line 95 "util/parse-events.l" -{ return str(PE_NAME); } +#line 108 "util/parse-events.l" +{ return raw(); } YY_BREAK case 39: YY_RULE_SETUP -#line 96 "util/parse-events.l" -{ return '/'; } +#line 109 "util/parse-events.l" +{ return value(10); } YY_BREAK case 40: YY_RULE_SETUP -#line 97 "util/parse-events.l" -{ return '-'; } +#line 110 "util/parse-events.l" +{ return value(16); } YY_BREAK case 41: YY_RULE_SETUP -#line 98 "util/parse-events.l" -{ return ','; } +#line 112 "util/parse-events.l" +{ return str(PE_MODIFIER_EVENT); } YY_BREAK case 42: YY_RULE_SETUP -#line 99 "util/parse-events.l" -{ return ':'; } +#line 113 "util/parse-events.l" +{ return str(PE_MODIFIER_BP); } YY_BREAK case 43: YY_RULE_SETUP -#line 100 "util/parse-events.l" -{ return '='; } +#line 114 "util/parse-events.l" +{ return str(PE_NAME); } YY_BREAK case 44: YY_RULE_SETUP -#line 102 "util/parse-events.l" +#line 115 "util/parse-events.l" +{ return '/'; } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 116 "util/parse-events.l" +{ return '-'; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 117 "util/parse-events.l" +{ return ','; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 118 "util/parse-events.l" +{ return ':'; } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 119 "util/parse-events.l" +{ return '='; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 121 "util/parse-events.l" ECHO; YY_BREAK -#line 1220 "" +#line 1267 "" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1508,7 +1555,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 425 ) + if ( yy_current_state >= 440 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1536,11 +1583,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 425 ) + if ( yy_current_state >= 440 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 424); + yy_is_jam = (yy_current_state == 439); return yy_is_jam ? 0 : yy_current_state; } @@ -2214,7 +2261,7 @@ void parse_events_free (void * ptr ) #define YYTABLES_NAME "yytables" -#line 102 "util/parse-events.l" +#line 121 "util/parse-events.l" diff --git a/tools/perf/util/parse-events-flex.h b/tools/perf/util/parse-events-flex.h index b927f9a12c30..ceb9b20d732c 100644 --- a/tools/perf/util/parse-events-flex.h +++ b/tools/perf/util/parse-events-flex.h @@ -308,7 +308,7 @@ extern int parse_events_lex (void); #undef YY_DECL #endif -#line 102 "util/parse-events.l" +#line 121 "util/parse-events.l" #line 315 "util/parse-events-flex.h" diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 6e50b914cad4..59f5cf64ef70 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -588,15 +588,60 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx, return add_event(list, idx, &attr, name); } -int -parse_events_add_numeric(struct list_head *list, int *idx, - unsigned long type, unsigned long config) +static int config_term(struct perf_event_attr *attr, + struct parse_events__term *term) +{ + switch (term->type) { + case PARSE_EVENTS__TERM_TYPE_CONFIG: + attr->config = term->val.num; + break; + case PARSE_EVENTS__TERM_TYPE_CONFIG1: + attr->config1 = term->val.num; + break; + case PARSE_EVENTS__TERM_TYPE_CONFIG2: + attr->config2 = term->val.num; + break; + case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: + attr->sample_period = term->val.num; + break; + case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: + /* + * TODO uncomment when the field is available + * attr->branch_sample_type = term->val.num; + */ + break; + default: + return -EINVAL; + } + return 0; +} + +static int config_attr(struct perf_event_attr *attr, + struct list_head *head, int fail) +{ + struct parse_events__term *term; + + list_for_each_entry(term, head, list) + if (config_term(attr, term) && fail) + return -EINVAL; + + return 0; +} + +int parse_events_add_numeric(struct list_head *list, int *idx, + unsigned long type, unsigned long config, + struct list_head *head_config) { struct perf_event_attr attr; memset(&attr, 0, sizeof(attr)); attr.type = type; attr.config = config; + + if (head_config && + config_attr(&attr, head_config, 1)) + return -EINVAL; + return add_event(list, idx, &attr, (char *) __event_name(type, config)); } @@ -923,3 +968,51 @@ void print_events(const char *event_glob) print_tracepoint_events(NULL, NULL); } + +int parse_events__is_hardcoded_term(struct parse_events__term *term) +{ + return term->type <= PARSE_EVENTS__TERM_TYPE_HARDCODED_MAX; +} + +int parse_events__new_term(struct parse_events__term **_term, int type, + char *config, char *str, long num) +{ + struct parse_events__term *term; + + term = zalloc(sizeof(*term)); + if (!term) + return -ENOMEM; + + INIT_LIST_HEAD(&term->list); + term->type = type; + term->config = config; + + switch (type) { + case PARSE_EVENTS__TERM_TYPE_CONFIG: + case PARSE_EVENTS__TERM_TYPE_CONFIG1: + case PARSE_EVENTS__TERM_TYPE_CONFIG2: + case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: + case PARSE_EVENTS__TERM_TYPE_NUM: + term->val.num = num; + break; + case PARSE_EVENTS__TERM_TYPE_STR: + term->val.str = str; + break; + default: + return -EINVAL; + } + + *_term = term; + return 0; +} + +void parse_events__free_terms(struct list_head *terms) +{ + struct parse_events__term *term, *h; + + list_for_each_entry_safe(term, h, terms, list) + free(term); + + free(terms); +} diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 84d37714f3bc..37a270d91d39 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -33,6 +33,34 @@ extern int parse_filter(const struct option *opt, const char *str, int unset); #define EVENTS_HELP_MAX (128*1024) +enum { + PARSE_EVENTS__TERM_TYPE_CONFIG, + PARSE_EVENTS__TERM_TYPE_CONFIG1, + PARSE_EVENTS__TERM_TYPE_CONFIG2, + PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD, + PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE, + PARSE_EVENTS__TERM_TYPE_NUM, + PARSE_EVENTS__TERM_TYPE_STR, + + PARSE_EVENTS__TERM_TYPE_HARDCODED_MAX = + PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE, +}; + +struct parse_events__term { + char *config; + union { + char *str; + long num; + } val; + int type; + + struct list_head list; +}; + +int parse_events__is_hardcoded_term(struct parse_events__term *term); +int parse_events__new_term(struct parse_events__term **term, int type, + char *config, char *str, long num); +void parse_events__free_terms(struct list_head *terms); int parse_events_modifier(struct list_head *list __used, char *str __used); int parse_events_add_tracepoint(struct list_head *list, int *idx, char *sys, char *event); @@ -40,7 +68,8 @@ int parse_events_add_raw(struct perf_evlist *evlist, unsigned long config, unsigned long config1, unsigned long config2, char *mod); int parse_events_add_numeric(struct list_head *list, int *idx, - unsigned long type, unsigned long config); + unsigned long type, unsigned long config, + struct list_head *head_config); int parse_events_add_cache(struct list_head *list, int *idx, char *type, char *op_result1, char *op_result2); int parse_events_add_breakpoint(struct list_head *list, int *idx, diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 44dbc359f0ae..ab9eca120feb 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -5,6 +5,7 @@ #include #include "../perf.h" #include "parse-events-bison.h" +#include "parse-events.h" static int __value(char *str, int base, int token) { @@ -41,6 +42,12 @@ static int sym(int type, int config) return PE_VALUE_SYM; } +static int term(int type) +{ + parse_events_lval.num = type; + return PE_TERM; +} + %} num_dec [0-9]+ @@ -85,6 +92,18 @@ speculative-read|speculative-load | refs|Reference|ops|access | misses|miss { return str(PE_NAME_CACHE_OP_RESULT); } + /* + * These are event config hardcoded term names to be specified + * within xxx/.../ syntax. So far we dont clash with other names, + * so we can put them here directly. In case the we have a conflict + * in future, this needs to go into '//' condition block. + */ +config { return term(PARSE_EVENTS__TERM_TYPE_CONFIG); } +config1 { return term(PARSE_EVENTS__TERM_TYPE_CONFIG1); } +config2 { return term(PARSE_EVENTS__TERM_TYPE_CONFIG2); } +period { return term(PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } +branch_type { return term(PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } + mem: { return PE_PREFIX_MEM; } r{num_raw_hex} { return raw(); } {num_dec} { return value(10); } diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 4b4459e67a0a..c88c08e4e79d 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -23,7 +23,7 @@ do { \ %} -%token PE_VALUE PE_VALUE_SYM PE_RAW +%token PE_VALUE PE_VALUE_SYM PE_RAW PE_TERM %token PE_NAME %token PE_MODIFIER_EVENT PE_MODIFIER_BP %token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT @@ -32,16 +32,21 @@ do { \ %type PE_VALUE %type PE_VALUE_SYM %type PE_RAW +%type PE_TERM %type PE_NAME %type PE_NAME_CACHE_TYPE %type PE_NAME_CACHE_OP_RESULT %type PE_MODIFIER_EVENT %type PE_MODIFIER_BP +%type event_config +%type event_term %union { char *str; unsigned long num; + struct list_head *head; + struct parse_events__term *term; } %% @@ -56,7 +61,7 @@ event_def PE_MODIFIER_EVENT | event_def -event_def: event_legacy_symbol sep_dc | +event_def: event_legacy_symbol | event_legacy_cache sep_dc | event_legacy_mem | event_legacy_tracepoint sep_dc | @@ -64,12 +69,21 @@ event_def: event_legacy_symbol sep_dc | event_legacy_raw sep_dc event_legacy_symbol: -PE_VALUE_SYM +PE_VALUE_SYM '/' event_config '/' { int type = $1 >> 16; int config = $1 & 255; - ABORT_ON(parse_events_add_numeric(list, idx, type, config)); + ABORT_ON(parse_events_add_numeric(list, idx, type, config, $3)); + parse_events__free_terms($3); +} +| +PE_VALUE_SYM sep_slash_dc +{ + int type = $1 >> 16; + int config = $1 & 255; + + ABORT_ON(parse_events_add_numeric(list, idx, type, config, NULL)); } event_legacy_cache: @@ -108,17 +122,85 @@ PE_NAME ':' PE_NAME event_legacy_numeric: PE_VALUE ':' PE_VALUE { - ABORT_ON(parse_events_add_numeric(list, idx, $1, $3)); + ABORT_ON(parse_events_add_numeric(list, idx, $1, $3, NULL)); } event_legacy_raw: PE_RAW { - ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, $1)); + ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, $1, NULL)); +} + +event_config: +event_config ',' event_term +{ + struct list_head *head = $1; + struct parse_events__term *term = $3; + + ABORT_ON(!head); + list_add_tail(&term->list, head); + $$ = $1; +} +| +event_term +{ + struct list_head *head = malloc(sizeof(*head)); + struct parse_events__term *term = $1; + + ABORT_ON(!head); + INIT_LIST_HEAD(head); + list_add_tail(&term->list, head); + $$ = head; +} + +event_term: +PE_NAME '=' PE_NAME +{ + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_STR, + $1, $3, 0)); + $$ = term; +} +| +PE_NAME '=' PE_VALUE +{ + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM, + $1, NULL, $3)); + $$ = term; +} +| +PE_NAME +{ + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM, + $1, NULL, 1)); + $$ = term; +} +| +PE_TERM '=' PE_VALUE +{ + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, $1, NULL, NULL, $3)); + $$ = term; +} +| +PE_TERM +{ + struct parse_events__term *term; + + ABORT_ON(parse_events__new_term(&term, $1, NULL, NULL, 1)); + $$ = term; } sep_dc: ':' | +sep_slash_dc: '/' | ':' | + %% void parse_events_error(struct list_head *list __used, int *idx __used, -- cgit v1.2.3 From 5f537a26590e696466aae7f41e6b77e92c8486d1 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Thu, 15 Mar 2012 20:09:18 +0100 Subject: perf tools: Add support to specify pmu style event Added new event rule to the event definition grammar: event_def: event_pmu | ... event_pmu: PE_NAME '/' event_config '/' Using this rule, event could be now specified like: cpu/config=1,config1=2,config2=3/u where pmu name 'cpu' is looked up via following path: ${sysfs_mount}/bus/event_source/devices/${pmu} and config options are bound to the pmu's format definiton: ${sysfs_mount}/bus/event_source/devices/${pmu}/format The hardcoded config options still stays and have precedence over any format field defined with same name. Acked-by: Peter Zijlstra Signed-off-by: Jiri Olsa Link: http://lkml.kernel.org/n/tip-50d8nr94f8k4wkezutrxvthe@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-test.c | 20 ++++ tools/perf/util/parse-events-bison.c | 209 +++++++++++++++++++---------------- tools/perf/util/parse-events.c | 31 +++++- tools/perf/util/parse-events.h | 2 + tools/perf/util/parse-events.y | 10 +- 5 files changed, 172 insertions(+), 100 deletions(-) (limited to 'tools/perf/util/parse-events.c') diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index 58bfe8bde5ee..86874238a350 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c @@ -877,6 +877,22 @@ static int test__checkevent_genhw_modifier(struct perf_evlist *evlist) return test__checkevent_genhw(evlist); } +static int test__checkevent_pmu(struct perf_evlist *evlist) +{ + + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", 10 == evsel->attr.config); + TEST_ASSERT_VAL("wrong config1", 1 == evsel->attr.config1); + TEST_ASSERT_VAL("wrong config2", 3 == evsel->attr.config2); + TEST_ASSERT_VAL("wrong period", 1000 == evsel->attr.sample_period); + + return 0; +} + static struct test__event_st { const char *name; __u32 type; @@ -958,6 +974,10 @@ static struct test__event_st { .name = "L1-dcache-load-miss:kp", .check = test__checkevent_genhw_modifier, }, + { + .name = "cpu/config=10,config1,config2=3,period=1000/u", + .check = test__checkevent_pmu, + }, }; #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) diff --git a/tools/perf/util/parse-events-bison.c b/tools/perf/util/parse-events-bison.c index ace593a25182..4a0fd6d5cebf 100644 --- a/tools/perf/util/parse-events-bison.c +++ b/tools/perf/util/parse-events-bison.c @@ -381,18 +381,18 @@ union yyalloc #endif /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 23 +#define YYFINAL 25 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 38 +#define YYLAST 43 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 20 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 14 +#define YYNNTS 15 /* YYNRULES -- Number of rules. */ -#define YYNRULES 33 +#define YYNRULES 35 /* YYNRULES -- Number of states. */ -#define YYNSTATES 53 +#define YYNSTATES 57 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -438,34 +438,35 @@ static const yytype_uint8 yytranslate[] = YYRHS. */ static const yytype_uint8 yyprhs[] = { - 0, 0, 3, 7, 9, 12, 14, 16, 19, 21, - 24, 27, 30, 35, 38, 44, 48, 50, 56, 60, - 64, 68, 70, 74, 76, 80, 84, 86, 90, 92, - 94, 95, 97, 99 + 0, 0, 3, 7, 9, 12, 14, 16, 18, 21, + 23, 26, 29, 32, 37, 42, 45, 51, 55, 57, + 63, 67, 71, 75, 77, 81, 83, 87, 91, 93, + 97, 99, 101, 102, 104, 106 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 21, 0, -1, 21, 15, 22, -1, 22, -1, 23, - 8, -1, 23, -1, 24, -1, 25, 32, -1, 26, - -1, 27, 32, -1, 28, 32, -1, 29, 32, -1, - 4, 16, 30, 16, -1, 4, 33, -1, 10, 17, - 11, 17, 11, -1, 10, 17, 11, -1, 10, -1, - 12, 3, 18, 9, 32, -1, 12, 3, 32, -1, - 7, 18, 7, -1, 3, 18, 3, -1, 5, -1, - 30, 15, 31, -1, 31, -1, 7, 19, 7, -1, - 7, 19, 3, -1, 7, -1, 6, 19, 3, -1, - 6, -1, 18, -1, -1, 16, -1, 18, -1, -1 + 8, -1, 23, -1, 24, -1, 25, -1, 26, 33, + -1, 27, -1, 28, 33, -1, 29, 33, -1, 30, + 33, -1, 7, 16, 31, 16, -1, 4, 16, 31, + 16, -1, 4, 34, -1, 10, 17, 11, 17, 11, + -1, 10, 17, 11, -1, 10, -1, 12, 3, 18, + 9, 33, -1, 12, 3, 33, -1, 7, 18, 7, + -1, 3, 18, 3, -1, 5, -1, 31, 15, 32, + -1, 32, -1, 7, 19, 7, -1, 7, 19, 3, + -1, 7, -1, 6, 19, 3, -1, 6, -1, 18, + -1, -1, 16, -1, 18, -1, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 54, 54, 54, 57, 62, 64, 65, 66, 67, - 68, 69, 72, 81, 90, 95, 100, 106, 111, 117, - 123, 129, 135, 145, 157, 166, 175, 184, 192, 200, - 200, 202, 202, 202 + 68, 69, 70, 73, 80, 89, 98, 103, 108, 114, + 119, 125, 131, 137, 143, 153, 165, 174, 183, 192, + 200, 208, 208, 210, 210, 210 }; #endif @@ -478,10 +479,10 @@ static const char *const yytname[] = "PE_TERM", "PE_NAME", "PE_MODIFIER_EVENT", "PE_MODIFIER_BP", "PE_NAME_CACHE_TYPE", "PE_NAME_CACHE_OP_RESULT", "PE_PREFIX_MEM", "PE_PREFIX_RAW", "PE_ERROR", "','", "'/'", "'-'", "':'", "'='", - "$accept", "events", "event", "event_def", "event_legacy_symbol", - "event_legacy_cache", "event_legacy_mem", "event_legacy_tracepoint", - "event_legacy_numeric", "event_legacy_raw", "event_config", "event_term", - "sep_dc", "sep_slash_dc", 0 + "$accept", "events", "event", "event_def", "event_pmu", + "event_legacy_symbol", "event_legacy_cache", "event_legacy_mem", + "event_legacy_tracepoint", "event_legacy_numeric", "event_legacy_raw", + "event_config", "event_term", "sep_dc", "sep_slash_dc", 0 }; #endif @@ -499,18 +500,18 @@ static const yytype_uint16 yytoknum[] = static const yytype_uint8 yyr1[] = { 0, 20, 21, 21, 22, 22, 23, 23, 23, 23, - 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, - 28, 29, 30, 30, 31, 31, 31, 31, 31, 32, - 32, 33, 33, 33 + 23, 23, 23, 24, 25, 25, 26, 26, 26, 27, + 27, 28, 29, 30, 31, 31, 32, 32, 32, 32, + 32, 33, 33, 34, 34, 34 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { - 0, 2, 3, 1, 2, 1, 1, 2, 1, 2, - 2, 2, 4, 2, 5, 3, 1, 5, 3, 3, - 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, - 0, 1, 1, 0 + 0, 2, 3, 1, 2, 1, 1, 1, 2, 1, + 2, 2, 2, 4, 4, 2, 5, 3, 1, 5, + 3, 3, 3, 1, 3, 1, 3, 3, 1, 3, + 1, 1, 0, 1, 1, 0 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -518,39 +519,39 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 0, 33, 21, 0, 16, 0, 0, 3, 5, - 6, 30, 8, 30, 30, 30, 0, 31, 32, 13, - 0, 0, 30, 1, 0, 4, 29, 7, 9, 10, - 11, 20, 28, 26, 0, 23, 19, 15, 29, 18, - 2, 0, 0, 0, 12, 0, 30, 27, 25, 24, - 22, 14, 17 + 0, 0, 35, 23, 0, 18, 0, 0, 3, 5, + 6, 7, 32, 9, 32, 32, 32, 0, 33, 34, + 15, 0, 0, 0, 32, 1, 0, 4, 31, 8, + 10, 11, 12, 22, 30, 28, 0, 25, 0, 21, + 17, 31, 20, 2, 0, 0, 0, 14, 13, 0, + 32, 29, 27, 26, 24, 16, 19 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 34, 35, 27, 19 + 16, 36, 37, 29, 20 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -14 +#define YYPACT_NINF -15 static const yytype_int8 yypact[] = { - 1, -11, -1, -14, -6, 8, 20, 3, -14, 16, - -14, -2, -14, -2, -2, -2, 23, 13, -14, -14, - 21, 18, 9, -14, 1, -14, -14, -14, -14, -14, - -14, -14, 11, 12, 6, -14, -14, 15, 25, -14, - -14, 32, 7, 13, -14, 26, -2, -14, -14, -14, - -14, -14, -14 + 1, -4, -9, -15, -1, 10, 22, 3, -15, 18, + -15, -15, 11, -15, 11, 11, 11, 25, 13, -15, + -15, 13, 23, 20, 14, -15, 1, -15, -15, -15, + -15, -15, -15, -15, 15, 16, 6, -15, 8, -15, + 21, 24, -15, -15, 34, 9, 13, -15, -15, 28, + 11, -15, -15, -15, -15, -15, -15 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -14, -14, 14, -14, -14, -14, -14, -14, -14, -14, - -14, -7, -13, -14 + -15, -15, 17, -15, -15, -15, -15, -15, -15, -15, + -15, 19, -5, -14, -15 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -560,18 +561,20 @@ static const yytype_int8 yypgoto[] = #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { - 28, 29, 30, 23, 1, 2, 3, 16, 4, 39, - 48, 5, 20, 6, 49, 17, 26, 18, 24, 32, - 33, 43, 44, 22, 25, 21, 31, 38, 36, 37, - 41, 42, 45, 52, 46, 47, 50, 51, 40 + 30, 31, 32, 25, 1, 2, 3, 18, 4, 19, + 42, 5, 52, 6, 17, 21, 53, 22, 26, 34, + 35, 46, 47, 46, 48, 24, 27, 23, 33, 28, + 39, 40, 41, 50, 44, 45, 56, 51, 49, 55, + 38, 54, 0, 43 }; -static const yytype_uint8 yycheck[] = +static const yytype_int8 yycheck[] = { - 13, 14, 15, 0, 3, 4, 5, 18, 7, 22, - 3, 10, 18, 12, 7, 16, 18, 18, 15, 6, - 7, 15, 16, 3, 8, 17, 3, 18, 7, 11, - 19, 19, 17, 46, 9, 3, 43, 11, 24 + 14, 15, 16, 0, 3, 4, 5, 16, 7, 18, + 24, 10, 3, 12, 18, 16, 7, 18, 15, 6, + 7, 15, 16, 15, 16, 3, 8, 17, 3, 18, + 7, 11, 18, 9, 19, 19, 50, 3, 17, 11, + 21, 46, -1, 26 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -579,11 +582,11 @@ static const yytype_uint8 yycheck[] = static const yytype_uint8 yystos[] = { 0, 3, 4, 5, 7, 10, 12, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 18, 16, 18, 33, - 18, 17, 3, 0, 15, 8, 18, 32, 32, 32, - 32, 3, 6, 7, 30, 31, 7, 11, 18, 32, - 22, 19, 19, 15, 16, 17, 9, 3, 3, 7, - 31, 11, 32 + 24, 25, 26, 27, 28, 29, 30, 18, 16, 18, + 34, 16, 18, 17, 3, 0, 15, 8, 18, 33, + 33, 33, 33, 3, 6, 7, 31, 32, 31, 7, + 11, 18, 33, 22, 19, 19, 15, 16, 16, 17, + 9, 3, 3, 7, 32, 11, 33 }; #define yyerrok (yyerrstatus = 0) @@ -1425,10 +1428,20 @@ yyreduce: ;} break; - case 12: + case 13: /* Line 1464 of yacc.c */ -#line 73 "util/parse-events.y" +#line 74 "util/parse-events.y" + { + ABORT_ON(parse_events_add_pmu(list, idx, (yyvsp[(1) - (4)].str), (yyvsp[(3) - (4)].head))); + parse_events__free_terms((yyvsp[(3) - (4)].head)); +;} + break; + + case 14: + +/* Line 1464 of yacc.c */ +#line 81 "util/parse-events.y" { int type = (yyvsp[(1) - (4)].num) >> 16; int config = (yyvsp[(1) - (4)].num) & 255; @@ -1438,10 +1451,10 @@ yyreduce: ;} break; - case 13: + case 15: /* Line 1464 of yacc.c */ -#line 82 "util/parse-events.y" +#line 90 "util/parse-events.y" { int type = (yyvsp[(1) - (2)].num) >> 16; int config = (yyvsp[(1) - (2)].num) & 255; @@ -1450,82 +1463,82 @@ yyreduce: ;} break; - case 14: + case 16: /* Line 1464 of yacc.c */ -#line 91 "util/parse-events.y" +#line 99 "util/parse-events.y" { ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str))); ;} break; - case 15: + case 17: /* Line 1464 of yacc.c */ -#line 96 "util/parse-events.y" +#line 104 "util/parse-events.y" { ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL)); ;} break; - case 16: + case 18: /* Line 1464 of yacc.c */ -#line 101 "util/parse-events.y" +#line 109 "util/parse-events.y" { ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (1)].str), NULL, NULL)); ;} break; - case 17: + case 19: /* Line 1464 of yacc.c */ -#line 107 "util/parse-events.y" +#line 115 "util/parse-events.y" { ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str))); ;} break; - case 18: + case 20: /* Line 1464 of yacc.c */ -#line 112 "util/parse-events.y" +#line 120 "util/parse-events.y" { ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (3)].num), NULL)); ;} break; - case 19: + case 21: /* Line 1464 of yacc.c */ -#line 118 "util/parse-events.y" +#line 126 "util/parse-events.y" { ABORT_ON(parse_events_add_tracepoint(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); ;} break; - case 20: + case 22: /* Line 1464 of yacc.c */ -#line 124 "util/parse-events.y" +#line 132 "util/parse-events.y" { ABORT_ON(parse_events_add_numeric(list, idx, (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num), NULL)); ;} break; - case 21: + case 23: /* Line 1464 of yacc.c */ -#line 130 "util/parse-events.y" +#line 138 "util/parse-events.y" { ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, (yyvsp[(1) - (1)].num), NULL)); ;} break; - case 22: + case 24: /* Line 1464 of yacc.c */ -#line 136 "util/parse-events.y" +#line 144 "util/parse-events.y" { struct list_head *head = (yyvsp[(1) - (3)].head); struct parse_events__term *term = (yyvsp[(3) - (3)].term); @@ -1536,10 +1549,10 @@ yyreduce: ;} break; - case 23: + case 25: /* Line 1464 of yacc.c */ -#line 146 "util/parse-events.y" +#line 154 "util/parse-events.y" { struct list_head *head = malloc(sizeof(*head)); struct parse_events__term *term = (yyvsp[(1) - (1)].term); @@ -1551,10 +1564,10 @@ yyreduce: ;} break; - case 24: + case 26: /* Line 1464 of yacc.c */ -#line 158 "util/parse-events.y" +#line 166 "util/parse-events.y" { struct parse_events__term *term; @@ -1564,10 +1577,10 @@ yyreduce: ;} break; - case 25: + case 27: /* Line 1464 of yacc.c */ -#line 167 "util/parse-events.y" +#line 175 "util/parse-events.y" { struct parse_events__term *term; @@ -1577,10 +1590,10 @@ yyreduce: ;} break; - case 26: + case 28: /* Line 1464 of yacc.c */ -#line 176 "util/parse-events.y" +#line 184 "util/parse-events.y" { struct parse_events__term *term; @@ -1590,10 +1603,10 @@ yyreduce: ;} break; - case 27: + case 29: /* Line 1464 of yacc.c */ -#line 185 "util/parse-events.y" +#line 193 "util/parse-events.y" { struct parse_events__term *term; @@ -1602,10 +1615,10 @@ yyreduce: ;} break; - case 28: + case 30: /* Line 1464 of yacc.c */ -#line 193 "util/parse-events.y" +#line 201 "util/parse-events.y" { struct parse_events__term *term; @@ -1617,7 +1630,7 @@ yyreduce: /* Line 1464 of yacc.c */ -#line 1621 "util/parse-events-bison.c" +#line 1634 "util/parse-events-bison.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -1829,7 +1842,7 @@ yyreturn: /* Line 1684 of yacc.c */ -#line 204 "util/parse-events.y" +#line 212 "util/parse-events.y" void parse_events_error(struct list_head *list __used, int *idx __used, diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 59f5cf64ef70..bec1cc6a1f38 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -12,6 +12,7 @@ #include "header.h" #include "debugfs.h" #include "parse-events-flex.h" +#include "pmu.h" #define MAX_NAME_LEN 100 @@ -646,6 +647,30 @@ int parse_events_add_numeric(struct list_head *list, int *idx, (char *) __event_name(type, config)); } +int parse_events_add_pmu(struct list_head *list, int *idx, + char *name, struct list_head *head_config) +{ + struct perf_event_attr attr; + struct perf_pmu *pmu; + + pmu = perf_pmu__find(name); + if (!pmu) + return -EINVAL; + + memset(&attr, 0, sizeof(attr)); + + /* + * Configure hardcoded terms first, no need to check + * return value when called with fail == 0 ;) + */ + config_attr(&attr, head_config, 0); + + if (perf_pmu__config(pmu, &attr, head_config)) + return -EINVAL; + + return add_event(list, idx, &attr, (char *) "pmu"); +} + int parse_events_modifier(struct list_head *list, char *str) { struct perf_evsel *evsel; @@ -957,8 +982,12 @@ void print_events(const char *event_glob) printf("\n"); printf(" %-50s [%s]\n", - "rNNN (see 'perf list --help' on how to encode it)", + "rNNN", + event_type_descriptors[PERF_TYPE_RAW]); + printf(" %-50s [%s]\n", + "cpu/t1=v1[,t2=v2,t3 ...]/modifier", event_type_descriptors[PERF_TYPE_RAW]); + printf(" (see 'perf list --help' on how to encode it)\n"); printf("\n"); printf(" %-50s [%s]\n", diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 37a270d91d39..6d7c74b77c24 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -74,6 +74,8 @@ int parse_events_add_cache(struct list_head *list, int *idx, char *type, char *op_result1, char *op_result2); int parse_events_add_breakpoint(struct list_head *list, int *idx, void *ptr, char *type); +int parse_events_add_pmu(struct list_head *list, int *idx, + char *pmu , struct list_head *head_config); void parse_events_error(struct list_head *list, int *idx, char const *msg); diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index c88c08e4e79d..3a530193f5a8 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -61,13 +61,21 @@ event_def PE_MODIFIER_EVENT | event_def -event_def: event_legacy_symbol | +event_def: event_pmu | + event_legacy_symbol | event_legacy_cache sep_dc | event_legacy_mem | event_legacy_tracepoint sep_dc | event_legacy_numeric sep_dc | event_legacy_raw sep_dc +event_pmu: +PE_NAME '/' event_config '/' +{ + ABORT_ON(parse_events_add_pmu(list, idx, $1, $3)); + parse_events__free_terms($3); +} + event_legacy_symbol: PE_VALUE_SYM '/' event_config '/' { -- cgit v1.2.3 From 9fafd98f1bf14276f95b69f0186ad5675f1e1a18 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Tue, 20 Mar 2012 19:15:39 +0100 Subject: perf tools: Fix various casting issues for 32 bits - util/parse-events.c(parse_events_add_breakpoint) need to use unsigned long instead of u64, otherwise we get following gcc error on 32 bits: error: cast from pointer to integer of different size - util/header.c(print_event_desc) cannot retype to signed type, otherwise we get following gcc error on 32 bits: error: comparison between signed and unsigned integer expressions Signed-off-by: Jiri Olsa Cc: Corey Ashford Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1332267341-26338-2-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/header.c | 2 +- tools/perf/util/parse-events.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'tools/perf/util/parse-events.c') diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index fcd9cf3ea63e..4c7c2d73251f 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1177,7 +1177,7 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) goto error; msz = sizeof(attr); - if (sz < (ssize_t)msz) + if (sz < msz) msz = sz; for (i = 0 ; i < nre; i++) { diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 201b40f0ca0b..f542a631388b 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -569,7 +569,7 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx, char name[MAX_NAME_LEN]; memset(&attr, 0, sizeof(attr)); - attr.bp_addr = (u64) ptr; + attr.bp_addr = (unsigned long) ptr; if (parse_breakpoint_type(type, &attr)) return -EINVAL; -- cgit v1.2.3 From 5d7be90ed5cfb5dd3c9ab726d7daa91b86b81747 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Tue, 20 Mar 2012 19:15:40 +0100 Subject: perf tools: Fix modifier to be applied on correct events The event modifier needs to be applied only on the event definition it is attached to. The current state is that in case of multiple events definition (in single '-e' option, separated by ',') all will get modifier of the last one. Fixing this by adding separated list for each event definition, so the modifier is applied only to proper event(s). Added automated test to catch this, plus some other modifier tests. Signed-off-by: Jiri Olsa Cc: Corey Ashford Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1332267341-26338-3-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-test.c | 116 +++++- tools/perf/util/parse-events-bison.c | 675 +++++++++++++++++++---------------- tools/perf/util/parse-events-bison.h | 15 +- tools/perf/util/parse-events.c | 27 +- tools/perf/util/parse-events.h | 7 +- tools/perf/util/parse-events.y | 40 ++- 6 files changed, 543 insertions(+), 337 deletions(-) (limited to 'tools/perf/util/parse-events.c') diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index 86874238a350..1c5b9801ac61 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c @@ -877,6 +877,58 @@ static int test__checkevent_genhw_modifier(struct perf_evlist *evlist) return test__checkevent_genhw(evlist); } +static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); + + return test__checkevent_breakpoint(evlist); +} + +static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); + + return test__checkevent_breakpoint_x(evlist); +} + +static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + + return test__checkevent_breakpoint_r(evlist); +} + +static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + + return test__checkevent_breakpoint_w(evlist); +} + static int test__checkevent_pmu(struct perf_evlist *evlist) { @@ -893,6 +945,47 @@ static int test__checkevent_pmu(struct perf_evlist *evlist) return 0; } +static int test__checkevent_list(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel; + + TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries); + + /* r1 */ + evsel = list_entry(evlist->entries.next, struct perf_evsel, node); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); + TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1); + TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); + + /* syscalls:sys_enter_open:k */ + evsel = list_entry(evsel->node.next, struct perf_evsel, node); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type); + TEST_ASSERT_VAL("wrong sample_type", + (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU) == + evsel->attr.sample_type); + TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period); + TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); + + /* 1:1:hp */ + evsel = list_entry(evsel->node.next, struct perf_evsel, node); + TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); + TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + + return 0; +} + static struct test__event_st { const char *name; __u32 type; @@ -974,10 +1067,30 @@ static struct test__event_st { .name = "L1-dcache-load-miss:kp", .check = test__checkevent_genhw_modifier, }, + { + .name = "mem:0:u", + .check = test__checkevent_breakpoint_modifier, + }, + { + .name = "mem:0:x:k", + .check = test__checkevent_breakpoint_x_modifier, + }, + { + .name = "mem:0:r:hp", + .check = test__checkevent_breakpoint_r_modifier, + }, + { + .name = "mem:0:w:up", + .check = test__checkevent_breakpoint_w_modifier, + }, { .name = "cpu/config=10,config1,config2=3,period=1000/u", .check = test__checkevent_pmu, }, + { + .name = "r1,syscalls:sys_enter_open:k,1:1:hp", + .check = test__checkevent_list, + }, }; #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) @@ -1003,10 +1116,9 @@ static int test__parse_events(void) } ret = e->check(evlist); + perf_evlist__delete(evlist); if (ret) break; - - perf_evlist__delete(evlist); } return ret; diff --git a/tools/perf/util/parse-events-bison.c b/tools/perf/util/parse-events-bison.c index 4a0fd6d5cebf..4a4e02aff34e 100644 --- a/tools/perf/util/parse-events-bison.c +++ b/tools/perf/util/parse-events-bison.c @@ -1,9 +1,8 @@ -/* A Bison parser, made by GNU Bison 2.4.3. */ +/* A Bison parser, made by GNU Bison 2.5. */ -/* Skeleton implementation for Bison's Yacc-like parsers in C +/* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.4.3" +#define YYBISON_VERSION "2.5" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -74,8 +73,8 @@ /* Copy the first part of user declarations. */ -/* Line 189 of yacc.c */ -#line 6 "util/parse-events.y" +/* Line 268 of yacc.c */ +#line 7 "util/parse-events.y" #define YYDEBUG 1 @@ -96,8 +95,8 @@ do { \ -/* Line 189 of yacc.c */ -#line 101 "util/parse-events-bison.c" +/* Line 268 of yacc.c */ +#line 100 "util/parse-events-bison.c" /* Enabling traces. */ #ifndef YYDEBUG @@ -145,8 +144,8 @@ do { \ typedef union YYSTYPE { -/* Line 214 of yacc.c */ -#line 45 "util/parse-events.y" +/* Line 293 of yacc.c */ +#line 46 "util/parse-events.y" char *str; unsigned long num; @@ -155,8 +154,8 @@ typedef union YYSTYPE -/* Line 214 of yacc.c */ -#line 160 "util/parse-events-bison.c" +/* Line 293 of yacc.c */ +#line 159 "util/parse-events-bison.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -167,8 +166,8 @@ typedef union YYSTYPE /* Copy the second part of user declarations. */ -/* Line 264 of yacc.c */ -#line 172 "util/parse-events-bison.c" +/* Line 343 of yacc.c */ +#line 171 "util/parse-events-bison.c" #ifdef short # undef short @@ -271,11 +270,11 @@ YYID (yyi) # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # endif @@ -298,24 +297,24 @@ YYID (yyi) # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif -# if (defined __cplusplus && ! defined _STDLIB_H \ +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif @@ -344,23 +343,7 @@ union yyalloc ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif +# define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of @@ -380,6 +363,26 @@ union yyalloc #endif +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + /* YYFINAL -- State number of the termination state. */ #define YYFINAL 25 /* YYLAST -- Last index in YYTABLE. */ @@ -463,10 +466,10 @@ static const yytype_int8 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 54, 54, 54, 57, 62, 64, 65, 66, 67, - 68, 69, 70, 73, 80, 89, 98, 103, 108, 114, - 119, 125, 131, 137, 143, 153, 165, 174, 183, 192, - 200, 208, 208, 210, 210, 210 + 0, 55, 55, 55, 58, 69, 74, 75, 76, 77, + 78, 79, 80, 83, 90, 99, 108, 113, 118, 124, + 129, 135, 141, 147, 153, 163, 175, 184, 193, 202, + 210, 218, 218, 220, 220, 220 }; #endif @@ -514,8 +517,8 @@ static const yytype_uint8 yyr2[] = 1, 1, 0, 1, 1, 0 }; -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero +/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { @@ -556,8 +559,7 @@ static const yytype_int8 yypgoto[] = /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ + number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { @@ -568,6 +570,12 @@ static const yytype_uint8 yytable[] = 38, 54, 0, 43 }; +#define yypact_value_is_default(yystate) \ + ((yystate) == (-15)) + +#define yytable_value_is_error(yytable_value) \ + YYID (0) + static const yytype_int8 yycheck[] = { 14, 15, 16, 0, 3, 4, 5, 16, 7, 18, @@ -622,13 +630,12 @@ do \ { \ yychar = (Token); \ yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ - yyerror (list, idx, YY_("syntax error: cannot back up")); \ + yyerror (list_all, list_event, idx, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) @@ -664,19 +671,10 @@ while (YYID (0)) #endif -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ +/* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif @@ -708,7 +706,7 @@ do { \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ - Type, Value, list, idx); \ + Type, Value, list_all, list_event, idx); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) @@ -722,20 +720,22 @@ do { \ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *list, int *idx) +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *list_all, struct list_head *list_event, int *idx) #else static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep, list, idx) +yy_symbol_value_print (yyoutput, yytype, yyvaluep, list_all, list_event, idx) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; - struct list_head *list; + struct list_head *list_all; + struct list_head *list_event; int *idx; #endif { if (!yyvaluep) return; - YYUSE (list); + YYUSE (list_all); + YYUSE (list_event); YYUSE (idx); # ifdef YYPRINT if (yytype < YYNTOKENS) @@ -758,14 +758,15 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, list, idx) #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *list, int *idx) +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *list_all, struct list_head *list_event, int *idx) #else static void -yy_symbol_print (yyoutput, yytype, yyvaluep, list, idx) +yy_symbol_print (yyoutput, yytype, yyvaluep, list_all, list_event, idx) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; - struct list_head *list; + struct list_head *list_all; + struct list_head *list_event; int *idx; #endif { @@ -774,7 +775,7 @@ yy_symbol_print (yyoutput, yytype, yyvaluep, list, idx) else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - yy_symbol_value_print (yyoutput, yytype, yyvaluep, list, idx); + yy_symbol_value_print (yyoutput, yytype, yyvaluep, list_all, list_event, idx); YYFPRINTF (yyoutput, ")"); } @@ -817,13 +818,14 @@ do { \ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule, struct list_head *list, int *idx) +yy_reduce_print (YYSTYPE *yyvsp, int yyrule, struct list_head *list_all, struct list_head *list_event, int *idx) #else static void -yy_reduce_print (yyvsp, yyrule, list, idx) +yy_reduce_print (yyvsp, yyrule, list_all, list_event, idx) YYSTYPE *yyvsp; int yyrule; - struct list_head *list; + struct list_head *list_all; + struct list_head *list_event; int *idx; #endif { @@ -838,7 +840,7 @@ yy_reduce_print (yyvsp, yyrule, list, idx) YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) - , list, idx); + , list_all, list_event, idx); YYFPRINTF (stderr, "\n"); } } @@ -846,7 +848,7 @@ yy_reduce_print (yyvsp, yyrule, list, idx) # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ - yy_reduce_print (yyvsp, Rule, list, idx); \ + yy_reduce_print (yyvsp, Rule, list_all, list_event, idx); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that @@ -876,7 +878,6 @@ int yydebug; # define YYMAXDEPTH 10000 #endif - #if YYERROR_VERBOSE @@ -979,115 +980,142 @@ yytnamerr (char *yyres, const char *yystr) } # endif -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = 0; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. See + + for details. YYERROR is fine as it does not invoke this + function. + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } - if (yysize_overflow) - return YYSIZE_MAXIMUM; + yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; } #endif /* YYERROR_VERBOSE */ - /*-----------------------------------------------. | Release the memory associated to this symbol. | @@ -1097,19 +1125,21 @@ yysyntax_error (char *yyresult, int yystate, int yychar) #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct list_head *list, int *idx) +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct list_head *list_all, struct list_head *list_event, int *idx) #else static void -yydestruct (yymsg, yytype, yyvaluep, list, idx) +yydestruct (yymsg, yytype, yyvaluep, list_all, list_event, idx) const char *yymsg; int yytype; YYSTYPE *yyvaluep; - struct list_head *list; + struct list_head *list_all; + struct list_head *list_event; int *idx; #endif { YYUSE (yyvaluep); - YYUSE (list); + YYUSE (list_all); + YYUSE (list_event); YYUSE (idx); if (!yymsg) @@ -1124,6 +1154,7 @@ yydestruct (yymsg, yytype, yyvaluep, list, idx) } } + /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus @@ -1133,7 +1164,7 @@ int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus -int yyparse (struct list_head *list, int *idx); +int yyparse (struct list_head *list_all, struct list_head *list_event, int *idx); #else int yyparse (); #endif @@ -1150,10 +1181,9 @@ YYSTYPE yylval; int yynerrs; - -/*-------------------------. -| yyparse or yypush_parse. | -`-------------------------*/ +/*----------. +| yyparse. | +`----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ @@ -1169,17 +1199,16 @@ yyparse (YYPARSE_PARAM) #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int -yyparse (struct list_head *list, int *idx) +yyparse (struct list_head *list_all, struct list_head *list_event, int *idx) #else int -yyparse (list, idx) - struct list_head *list; +yyparse (list_all, list_event, idx) + struct list_head *list_all; + struct list_head *list_event; int *idx; #endif #endif { - - int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; @@ -1334,7 +1363,7 @@ yybackup: /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ @@ -1365,8 +1394,8 @@ yybackup: yyn = yytable[yyn]; if (yyn <= 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; + if (yytable_value_is_error (yyn)) + goto yyerrlab; yyn = -yyn; goto yyreduce; } @@ -1421,124 +1450,139 @@ yyreduce: { case 4: -/* Line 1464 of yacc.c */ -#line 58 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 59 "util/parse-events.y" { - ABORT_ON(parse_events_modifier(list, (yyvsp[(2) - (2)].str))); -;} + /* + * Apply modifier on all events added by single event definition + * (there could be more events added for multiple tracepoint + * definitions via '*?'. + */ + ABORT_ON(parse_events_modifier(list_event, (yyvsp[(2) - (2)].str))); + parse_events_update_lists(list_event, list_all); +} + break; + + case 5: + +/* Line 1806 of yacc.c */ +#line 70 "util/parse-events.y" + { + parse_events_update_lists(list_event, list_all); +} break; case 13: -/* Line 1464 of yacc.c */ -#line 74 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 84 "util/parse-events.y" { - ABORT_ON(parse_events_add_pmu(list, idx, (yyvsp[(1) - (4)].str), (yyvsp[(3) - (4)].head))); + ABORT_ON(parse_events_add_pmu(list_event, idx, (yyvsp[(1) - (4)].str), (yyvsp[(3) - (4)].head))); parse_events__free_terms((yyvsp[(3) - (4)].head)); -;} +} break; case 14: -/* Line 1464 of yacc.c */ -#line 81 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 91 "util/parse-events.y" { int type = (yyvsp[(1) - (4)].num) >> 16; int config = (yyvsp[(1) - (4)].num) & 255; - ABORT_ON(parse_events_add_numeric(list, idx, type, config, (yyvsp[(3) - (4)].head))); + ABORT_ON(parse_events_add_numeric(list_event, idx, type, config, (yyvsp[(3) - (4)].head))); parse_events__free_terms((yyvsp[(3) - (4)].head)); -;} +} break; case 15: -/* Line 1464 of yacc.c */ -#line 90 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 100 "util/parse-events.y" { int type = (yyvsp[(1) - (2)].num) >> 16; int config = (yyvsp[(1) - (2)].num) & 255; - ABORT_ON(parse_events_add_numeric(list, idx, type, config, NULL)); -;} + ABORT_ON(parse_events_add_numeric(list_event, idx, type, config, NULL)); +} break; case 16: -/* Line 1464 of yacc.c */ -#line 99 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 109 "util/parse-events.y" { - ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str))); -;} + ABORT_ON(parse_events_add_cache(list_event, idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str))); +} break; case 17: -/* Line 1464 of yacc.c */ -#line 104 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 114 "util/parse-events.y" { - ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL)); -;} + ABORT_ON(parse_events_add_cache(list_event, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL)); +} break; case 18: -/* Line 1464 of yacc.c */ -#line 109 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 119 "util/parse-events.y" { - ABORT_ON(parse_events_add_cache(list, idx, (yyvsp[(1) - (1)].str), NULL, NULL)); -;} + ABORT_ON(parse_events_add_cache(list_event, idx, (yyvsp[(1) - (1)].str), NULL, NULL)); +} break; case 19: -/* Line 1464 of yacc.c */ -#line 115 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 125 "util/parse-events.y" { - ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str))); -;} + ABORT_ON(parse_events_add_breakpoint(list_event, idx, (void *) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str))); +} break; case 20: -/* Line 1464 of yacc.c */ -#line 120 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 130 "util/parse-events.y" { - ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) (yyvsp[(2) - (3)].num), NULL)); -;} + ABORT_ON(parse_events_add_breakpoint(list_event, idx, (void *) (yyvsp[(2) - (3)].num), NULL)); +} break; case 21: -/* Line 1464 of yacc.c */ -#line 126 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 136 "util/parse-events.y" { - ABORT_ON(parse_events_add_tracepoint(list, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); -;} + ABORT_ON(parse_events_add_tracepoint(list_event, idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); +} break; case 22: -/* Line 1464 of yacc.c */ -#line 132 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 142 "util/parse-events.y" { - ABORT_ON(parse_events_add_numeric(list, idx, (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num), NULL)); -;} + ABORT_ON(parse_events_add_numeric(list_event, idx, (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num), NULL)); +} break; case 23: -/* Line 1464 of yacc.c */ -#line 138 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 148 "util/parse-events.y" { - ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, (yyvsp[(1) - (1)].num), NULL)); -;} + ABORT_ON(parse_events_add_numeric(list_event, idx, PERF_TYPE_RAW, (yyvsp[(1) - (1)].num), NULL)); +} break; case 24: -/* Line 1464 of yacc.c */ -#line 144 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 154 "util/parse-events.y" { struct list_head *head = (yyvsp[(1) - (3)].head); struct parse_events__term *term = (yyvsp[(3) - (3)].term); @@ -1546,13 +1590,13 @@ yyreduce: ABORT_ON(!head); list_add_tail(&term->list, head); (yyval.head) = (yyvsp[(1) - (3)].head); -;} +} break; case 25: -/* Line 1464 of yacc.c */ -#line 154 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 164 "util/parse-events.y" { struct list_head *head = malloc(sizeof(*head)); struct parse_events__term *term = (yyvsp[(1) - (1)].term); @@ -1561,78 +1605,89 @@ yyreduce: INIT_LIST_HEAD(head); list_add_tail(&term->list, head); (yyval.head) = head; -;} +} break; case 26: -/* Line 1464 of yacc.c */ -#line 166 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 176 "util/parse-events.y" { struct parse_events__term *term; ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_STR, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), 0)); (yyval.term) = term; -;} +} break; case 27: -/* Line 1464 of yacc.c */ -#line 175 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 185 "util/parse-events.y" { struct parse_events__term *term; ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM, (yyvsp[(1) - (3)].str), NULL, (yyvsp[(3) - (3)].num))); (yyval.term) = term; -;} +} break; case 28: -/* Line 1464 of yacc.c */ -#line 184 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 194 "util/parse-events.y" { struct parse_events__term *term; ABORT_ON(parse_events__new_term(&term, PARSE_EVENTS__TERM_TYPE_NUM, (yyvsp[(1) - (1)].str), NULL, 1)); (yyval.term) = term; -;} +} break; case 29: -/* Line 1464 of yacc.c */ -#line 193 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 203 "util/parse-events.y" { struct parse_events__term *term; ABORT_ON(parse_events__new_term(&term, (yyvsp[(1) - (3)].num), NULL, NULL, (yyvsp[(3) - (3)].num))); (yyval.term) = term; -;} +} break; case 30: -/* Line 1464 of yacc.c */ -#line 201 "util/parse-events.y" +/* Line 1806 of yacc.c */ +#line 211 "util/parse-events.y" { struct parse_events__term *term; ABORT_ON(parse_events__new_term(&term, (yyvsp[(1) - (1)].num), NULL, NULL, 1)); (yyval.term) = term; -;} +} break; -/* Line 1464 of yacc.c */ -#line 1634 "util/parse-events-bison.c" +/* Line 1806 of yacc.c */ +#line 1678 "util/parse-events-bison.c" default: break; } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); @@ -1660,44 +1715,47 @@ yyreduce: | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE - yyerror (list, idx, YY_("syntax error")); + yyerror (list_all, list_event, idx, YY_("syntax error")); #else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (list, idx, yymsg); - } - else - { - yyerror (list, idx, YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (list_all, list_event, idx, yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; } +# undef YYSYNTAX_ERROR #endif } @@ -1717,7 +1775,7 @@ yyerrlab: else { yydestruct ("Error: discarding", - yytoken, &yylval, list, idx); + yytoken, &yylval, list_all, list_event, idx); yychar = YYEMPTY; } } @@ -1756,7 +1814,7 @@ yyerrlab1: for (;;) { yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) + if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) @@ -1773,7 +1831,7 @@ yyerrlab1: yydestruct ("Error: popping", - yystos[yystate], yyvsp, list, idx); + yystos[yystate], yyvsp, list_all, list_event, idx); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -1808,15 +1866,20 @@ yyabortlab: | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: - yyerror (list, idx, YY_("memory exhausted")); + yyerror (list_all, list_event, idx, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, list, idx); + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, list_all, list_event, idx); + } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); @@ -1824,7 +1887,7 @@ yyreturn: while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp, list, idx); + yystos[*yyssp], yyvsp, list_all, list_event, idx); YYPOPSTACK (1); } #ifndef yyoverflow @@ -1841,11 +1904,13 @@ yyreturn: -/* Line 1684 of yacc.c */ -#line 212 "util/parse-events.y" +/* Line 2067 of yacc.c */ +#line 222 "util/parse-events.y" -void parse_events_error(struct list_head *list __used, int *idx __used, +void parse_events_error(struct list_head *list_all __used, + struct list_head *list_event __used, + int *idx __used, char const *msg __used) { } diff --git a/tools/perf/util/parse-events-bison.h b/tools/perf/util/parse-events-bison.h index c58b76584f92..0be3e5ae2fed 100644 --- a/tools/perf/util/parse-events-bison.h +++ b/tools/perf/util/parse-events-bison.h @@ -1,9 +1,8 @@ -/* A Bison parser, made by GNU Bison 2.4.3. */ +/* A Bison parser, made by GNU Bison 2.5. */ -/* Skeleton interface for Bison's Yacc-like parsers in C +/* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,8 +58,8 @@ typedef union YYSTYPE { -/* Line 1685 of yacc.c */ -#line 45 "util/parse-events.y" +/* Line 2068 of yacc.c */ +#line 46 "util/parse-events.y" char *str; unsigned long num; @@ -69,8 +68,8 @@ typedef union YYSTYPE -/* Line 1685 of yacc.c */ -#line 74 "util/parse-events-bison.h" +/* Line 2068 of yacc.c */ +#line 73 "util/parse-events-bison.h" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index f542a631388b..5b3a0ef4e232 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -23,7 +23,8 @@ struct event_symbol { const char *alias; }; -int parse_events_parse(struct list_head *list, int *idx); +int parse_events_parse(struct list_head *list, struct list_head *list_tmp, + int *idx); #define CHW(x) .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_##x #define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x @@ -671,6 +672,18 @@ int parse_events_add_pmu(struct list_head *list, int *idx, return add_event(list, idx, &attr, (char *) "pmu"); } +void parse_events_update_lists(struct list_head *list_event, + struct list_head *list_all) +{ + /* + * Called for single event definition. Update the + * 'all event' list, and reinit the 'signle event' + * list, for next event definition. + */ + list_splice_tail(list_event, list_all); + INIT_LIST_HEAD(list_event); +} + int parse_events_modifier(struct list_head *list, char *str) { struct perf_evsel *evsel; @@ -736,14 +749,14 @@ int parse_events_modifier(struct list_head *list, char *str) int parse_events(struct perf_evlist *evlist, const char *str, int unset __used) { - struct perf_evsel *evsel, *h; LIST_HEAD(list); + LIST_HEAD(list_tmp); YY_BUFFER_STATE buffer; int ret, idx = evlist->nr_entries; buffer = parse_events__scan_string(str); - ret = parse_events_parse(&list, &idx); + ret = parse_events_parse(&list, &list_tmp, &idx); parse_events__flush_buffer(buffer); parse_events__delete_buffer(buffer); @@ -754,9 +767,11 @@ int parse_events(struct perf_evlist *evlist, const char *str, int unset __used) return 0; } - list_for_each_entry_safe(evsel, h, &list, node) - perf_evsel__delete(evsel); - + /* + * There are 2 users - builtin-record and builtin-test objects. + * Both call perf_evlist__delete in case of error, so we dont + * need to bother. + */ fprintf(stderr, "invalid or unsupported event: '%s'\n", str); fprintf(stderr, "Run 'perf list' for a list of valid events\n"); return ret; diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 6d7c74b77c24..ca069f893381 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -76,8 +76,11 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx, void *ptr, char *type); int parse_events_add_pmu(struct list_head *list, int *idx, char *pmu , struct list_head *head_config); -void parse_events_error(struct list_head *list, int *idx, - char const *msg); +void parse_events_update_lists(struct list_head *list_event, + struct list_head *list_all); +void parse_events_error(struct list_head *list_all, + struct list_head *list_event, + int *idx, char const *msg); void print_events(const char *event_glob); void print_events_type(u8 type); diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 3a530193f5a8..d9637da7333c 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -1,6 +1,7 @@ %name-prefix "parse_events_" -%parse-param {struct list_head *list} +%parse-param {struct list_head *list_all} +%parse-param {struct list_head *list_event} %parse-param {int *idx} %{ @@ -56,10 +57,19 @@ events ',' event | event event: event_def PE_MODIFIER_EVENT { - ABORT_ON(parse_events_modifier(list, $2)); + /* + * Apply modifier on all events added by single event definition + * (there could be more events added for multiple tracepoint + * definitions via '*?'. + */ + ABORT_ON(parse_events_modifier(list_event, $2)); + parse_events_update_lists(list_event, list_all); } | event_def +{ + parse_events_update_lists(list_event, list_all); +} event_def: event_pmu | event_legacy_symbol | @@ -72,7 +82,7 @@ event_def: event_pmu | event_pmu: PE_NAME '/' event_config '/' { - ABORT_ON(parse_events_add_pmu(list, idx, $1, $3)); + ABORT_ON(parse_events_add_pmu(list_event, idx, $1, $3)); parse_events__free_terms($3); } @@ -82,7 +92,7 @@ PE_VALUE_SYM '/' event_config '/' int type = $1 >> 16; int config = $1 & 255; - ABORT_ON(parse_events_add_numeric(list, idx, type, config, $3)); + ABORT_ON(parse_events_add_numeric(list_event, idx, type, config, $3)); parse_events__free_terms($3); } | @@ -91,52 +101,52 @@ PE_VALUE_SYM sep_slash_dc int type = $1 >> 16; int config = $1 & 255; - ABORT_ON(parse_events_add_numeric(list, idx, type, config, NULL)); + ABORT_ON(parse_events_add_numeric(list_event, idx, type, config, NULL)); } event_legacy_cache: PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT { - ABORT_ON(parse_events_add_cache(list, idx, $1, $3, $5)); + ABORT_ON(parse_events_add_cache(list_event, idx, $1, $3, $5)); } | PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT { - ABORT_ON(parse_events_add_cache(list, idx, $1, $3, NULL)); + ABORT_ON(parse_events_add_cache(list_event, idx, $1, $3, NULL)); } | PE_NAME_CACHE_TYPE { - ABORT_ON(parse_events_add_cache(list, idx, $1, NULL, NULL)); + ABORT_ON(parse_events_add_cache(list_event, idx, $1, NULL, NULL)); } event_legacy_mem: PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc { - ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) $2, $4)); + ABORT_ON(parse_events_add_breakpoint(list_event, idx, (void *) $2, $4)); } | PE_PREFIX_MEM PE_VALUE sep_dc { - ABORT_ON(parse_events_add_breakpoint(list, idx, (void *) $2, NULL)); + ABORT_ON(parse_events_add_breakpoint(list_event, idx, (void *) $2, NULL)); } event_legacy_tracepoint: PE_NAME ':' PE_NAME { - ABORT_ON(parse_events_add_tracepoint(list, idx, $1, $3)); + ABORT_ON(parse_events_add_tracepoint(list_event, idx, $1, $3)); } event_legacy_numeric: PE_VALUE ':' PE_VALUE { - ABORT_ON(parse_events_add_numeric(list, idx, $1, $3, NULL)); + ABORT_ON(parse_events_add_numeric(list_event, idx, $1, $3, NULL)); } event_legacy_raw: PE_RAW { - ABORT_ON(parse_events_add_numeric(list, idx, PERF_TYPE_RAW, $1, NULL)); + ABORT_ON(parse_events_add_numeric(list_event, idx, PERF_TYPE_RAW, $1, NULL)); } event_config: @@ -211,7 +221,9 @@ sep_slash_dc: '/' | ':' | %% -void parse_events_error(struct list_head *list __used, int *idx __used, +void parse_events_error(struct list_head *list_all __used, + struct list_head *list_event __used, + int *idx __used, char const *msg __used) { } -- cgit v1.2.3