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 --- |