parse-events.c (0111919da268e1ced315e009ad0d0435a2fb32ac) parse-events.c (f120f9d51be3a7db8991e7b78dc08bab5f8ab8f3)
1#include "../../../include/linux/hw_breakpoint.h"
2#include "util.h"
3#include "../perf.h"
4#include "evlist.h"
5#include "evsel.h"
6#include "parse-options.h"
7#include "parse-events.h"
8#include "exec_cmd.h"

--- 464 unchanged lines hidden (view full) ---

473
474
475 return EVT_HANDLED;
476}
477
478/* sys + ':' + event + ':' + flags*/
479#define MAX_EVOPT_LEN (MAX_EVENT_LENGTH * 2 + 2 + 128)
480static enum event_result
1#include "../../../include/linux/hw_breakpoint.h"
2#include "util.h"
3#include "../perf.h"
4#include "evlist.h"
5#include "evsel.h"
6#include "parse-options.h"
7#include "parse-events.h"
8#include "exec_cmd.h"

--- 464 unchanged lines hidden (view full) ---

473
474
475 return EVT_HANDLED;
476}
477
478/* sys + ':' + event + ':' + flags*/
479#define MAX_EVOPT_LEN (MAX_EVENT_LENGTH * 2 + 2 + 128)
480static enum event_result
481parse_multiple_tracepoint_event(const struct option *opt, char *sys_name,
481parse_multiple_tracepoint_event(struct perf_evlist *evlist, char *sys_name,
482 const char *evt_exp, char *flags)
483{
484 char evt_path[MAXPATHLEN];
485 struct dirent *evt_ent;
486 DIR *evt_dir;
487
488 snprintf(evt_path, MAXPATHLEN, "%s/%s", debugfs_path, sys_name);
489 evt_dir = opendir(evt_path);

--- 17 unchanged lines hidden (view full) ---

507 continue;
508
509 len = snprintf(event_opt, MAX_EVOPT_LEN, "%s:%s%s%s", sys_name,
510 evt_ent->d_name, flags ? ":" : "",
511 flags ?: "");
512 if (len < 0)
513 return EVT_FAILED;
514
482 const char *evt_exp, char *flags)
483{
484 char evt_path[MAXPATHLEN];
485 struct dirent *evt_ent;
486 DIR *evt_dir;
487
488 snprintf(evt_path, MAXPATHLEN, "%s/%s", debugfs_path, sys_name);
489 evt_dir = opendir(evt_path);

--- 17 unchanged lines hidden (view full) ---

507 continue;
508
509 len = snprintf(event_opt, MAX_EVOPT_LEN, "%s:%s%s%s", sys_name,
510 evt_ent->d_name, flags ? ":" : "",
511 flags ?: "");
512 if (len < 0)
513 return EVT_FAILED;
514
515 if (parse_events(opt, event_opt, 0))
515 if (parse_events(evlist, event_opt, 0))
516 return EVT_FAILED;
517 }
518
519 return EVT_HANDLED_ALL;
520}
521
522static enum event_result
516 return EVT_FAILED;
517 }
518
519 return EVT_HANDLED_ALL;
520}
521
522static enum event_result
523parse_tracepoint_event(const struct option *opt, const char **strp,
523parse_tracepoint_event(struct perf_evlist *evlist, const char **strp,
524 struct perf_event_attr *attr)
525{
526 const char *evt_name;
527 char *flags = NULL, *comma_loc;
528 char sys_name[MAX_EVENT_LENGTH];
529 unsigned int sys_length, evt_length;
530
531 if (debugfs_valid_mountpoint(debugfs_path))

--- 23 unchanged lines hidden (view full) ---

555 flags++;
556 }
557
558 evt_length = strlen(evt_name);
559 if (evt_length >= MAX_EVENT_LENGTH)
560 return EVT_FAILED;
561 if (strpbrk(evt_name, "*?")) {
562 *strp += strlen(sys_name) + evt_length + 1; /* 1 == the ':' */
524 struct perf_event_attr *attr)
525{
526 const char *evt_name;
527 char *flags = NULL, *comma_loc;
528 char sys_name[MAX_EVENT_LENGTH];
529 unsigned int sys_length, evt_length;
530
531 if (debugfs_valid_mountpoint(debugfs_path))

--- 23 unchanged lines hidden (view full) ---

555 flags++;
556 }
557
558 evt_length = strlen(evt_name);
559 if (evt_length >= MAX_EVENT_LENGTH)
560 return EVT_FAILED;
561 if (strpbrk(evt_name, "*?")) {
562 *strp += strlen(sys_name) + evt_length + 1; /* 1 == the ':' */
563 return parse_multiple_tracepoint_event(opt, sys_name, evt_name,
564 flags);
563 return parse_multiple_tracepoint_event(evlist, sys_name,
564 evt_name, flags);
565 } else {
566 return parse_single_tracepoint_event(sys_name, evt_name,
567 evt_length, attr, strp);
568 }
569}
570
571static enum event_result
572parse_breakpoint_type(const char *type, const char **strp,

--- 203 unchanged lines hidden (view full) ---

776 return 0;
777}
778
779/*
780 * Each event can have multiple symbolic names.
781 * Symbolic names are (almost) exactly matched.
782 */
783static enum event_result
565 } else {
566 return parse_single_tracepoint_event(sys_name, evt_name,
567 evt_length, attr, strp);
568 }
569}
570
571static enum event_result
572parse_breakpoint_type(const char *type, const char **strp,

--- 203 unchanged lines hidden (view full) ---

776 return 0;
777}
778
779/*
780 * Each event can have multiple symbolic names.
781 * Symbolic names are (almost) exactly matched.
782 */
783static enum event_result
784parse_event_symbols(const struct option *opt, const char **str,
784parse_event_symbols(struct perf_evlist *evlist, const char **str,
785 struct perf_event_attr *attr)
786{
787 enum event_result ret;
788
785 struct perf_event_attr *attr)
786{
787 enum event_result ret;
788
789 ret = parse_tracepoint_event(opt, str, attr);
789 ret = parse_tracepoint_event(evlist, str, attr);
790 if (ret != EVT_FAILED)
791 goto modifier;
792
793 ret = parse_raw_event(str, attr);
794 if (ret != EVT_FAILED)
795 goto modifier;
796
797 ret = parse_numeric_event(str, attr);

--- 22 unchanged lines hidden (view full) ---

820 fprintf(stderr, "Run 'perf list' for a list of valid events and modifiers\n");
821
822 return EVT_FAILED;
823 }
824
825 return ret;
826}
827
790 if (ret != EVT_FAILED)
791 goto modifier;
792
793 ret = parse_raw_event(str, attr);
794 if (ret != EVT_FAILED)
795 goto modifier;
796
797 ret = parse_numeric_event(str, attr);

--- 22 unchanged lines hidden (view full) ---

820 fprintf(stderr, "Run 'perf list' for a list of valid events and modifiers\n");
821
822 return EVT_FAILED;
823 }
824
825 return ret;
826}
827
828int parse_events(const struct option *opt, const char *str, int unset __used)
828int parse_events(struct perf_evlist *evlist , const char *str, int unset __used)
829{
829{
830 struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
831 struct perf_event_attr attr;
832 enum event_result ret;
833 const char *ostr;
834
835 for (;;) {
836 ostr = str;
837 memset(&attr, 0, sizeof(attr));
830 struct perf_event_attr attr;
831 enum event_result ret;
832 const char *ostr;
833
834 for (;;) {
835 ostr = str;
836 memset(&attr, 0, sizeof(attr));
838 ret = parse_event_symbols(opt, &str, &attr);
837 ret = parse_event_symbols(evlist, &str, &attr);
839 if (ret == EVT_FAILED)
840 return -1;
841
842 if (!(*str == 0 || *str == ',' || isspace(*str)))
843 return -1;
844
845 if (ret != EVT_HANDLED_ALL) {
846 struct perf_evsel *evsel;

--- 14 unchanged lines hidden (view full) ---

861 ++str;
862 while (isspace(*str))
863 ++str;
864 }
865
866 return 0;
867}
868
838 if (ret == EVT_FAILED)
839 return -1;
840
841 if (!(*str == 0 || *str == ',' || isspace(*str)))
842 return -1;
843
844 if (ret != EVT_HANDLED_ALL) {
845 struct perf_evsel *evsel;

--- 14 unchanged lines hidden (view full) ---

860 ++str;
861 while (isspace(*str))
862 ++str;
863 }
864
865 return 0;
866}
867
868int parse_events_option(const struct option *opt, const char *str,
869 int unset __used)
870{
871 struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
872 return parse_events(evlist, str, unset);
873}
874
869int parse_filter(const struct option *opt, const char *str,
870 int unset __used)
871{
872 struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
873 struct perf_evsel *last = NULL;
874
875 if (evlist->nr_entries > 0)
876 last = list_entry(evlist->entries.prev, struct perf_evsel, node);

--- 220 unchanged lines hidden ---
875int parse_filter(const struct option *opt, const char *str,
876 int unset __used)
877{
878 struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
879 struct perf_evsel *last = NULL;
880
881 if (evlist->nr_entries > 0)
882 last = list_entry(evlist->entries.prev, struct perf_evsel, node);

--- 220 unchanged lines hidden ---