if (opts->full_auxtrace) {
                struct evsel *tracking_evsel;
 
-               err = parse_events(evlist, "dummy:u", NULL);
+               err = parse_event(evlist, "dummy:u");
                if (err)
                        goto out;
 
 
                evsel__set_sample_bit(arm_spe_evsel, PHYS_ADDR);
 
        /* Add dummy event to keep tracking */
-       err = parse_events(evlist, "dummy:u", NULL);
+       err = parse_event(evlist, "dummy:u");
        if (err)
                return err;
 
 
                return TEST_FAIL;
        }
 
-       ret = parse_events(evlist, "intel_cqm/llc_occupancy/", NULL);
+       ret = parse_event(evlist, "intel_cqm/llc_occupancy/");
        if (ret) {
                pr_debug("parse_events failed, is \"intel_cqm/llc_occupancy/\" available?\n");
                err = TEST_SKIP;
 
                struct evsel *tracking_evsel;
                int err;
 
-               err = parse_events(evlist, "dummy:u", NULL);
+               err = parse_event(evlist, "dummy:u");
                if (err)
                        return err;
 
 
        if (!evlist__can_select_event(evlist, sched_switch))
                return -EPERM;
 
-       err = parse_events(evlist, sched_switch, NULL);
+       err = parse_event(evlist, sched_switch);
        if (err) {
                pr_debug2("%s: failed to parse %s, error %d\n",
                          __func__, sched_switch, err);
 
                sprintf(iostat_cmd, iostat_cmd_template,
                        list->rps[idx]->pmu_idx, list->rps[idx]->pmu_idx,
                        list->rps[idx]->pmu_idx, list->rps[idx]->pmu_idx);
-               ret = parse_events(evl, iostat_cmd, NULL);
+               ret = parse_event(evl, iostat_cmd);
                if (ret)
                        goto err;
        }
 
                        topdown_events = TOPDOWN_L1_EVENTS;
        }
 
-       return parse_events(evlist, topdown_events, NULL);
+       return parse_event(evlist, topdown_events);
 }
 
 
                str = do_determine_event(excl_kernel);
                pr_debug("Parsing event '%s'\n", str);
-               ret = parse_events(evlist, str, NULL);
+               ret = parse_event(evlist, str);
                if (ret < 0) {
                        pr_debug("parse_events failed\n");
                        goto out_put;
 
                goto out_err;
        }
 
-       err = parse_events(evlist, "cpu-clock:u", NULL);
+       err = parse_event(evlist, "cpu-clock:u");
        if (err) {
                pr_debug("failed to parse event cpu-clock:u\n");
                goto out_err;
 
 
                        for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
                                __evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
-                               err = parse_events(evlist, name, NULL);
+                               err = parse_event(evlist, name);
                                if (err)
                                        ret = err;
                        }
                 return -ENOMEM;
 
        for (i = 0; i < nr_names; ++i) {
-               err = parse_events(evlist, names[i], NULL);
+               err = parse_event(evlist, names[i]);
                if (err) {
                        pr_debug("failed to parse event '%s', err %d\n",
                                 names[i], err);
 
 
        TEST_ASSERT_VAL("No memory", evlist);
 
-       err = parse_events(evlist, "cpu-clock", NULL);
+       err = parse_event(evlist, "cpu-clock");
        if (err)
                goto out;
        err = TEST_FAIL;
 
 
        TEST_ASSERT_VAL("No memory", evlist);
 
-       err = parse_events(evlist, "cpu-clock", NULL);
+       err = parse_event(evlist, "cpu-clock");
        if (err)
                goto out;
-       err = parse_events(evlist, "task-clock", NULL);
+       err = parse_event(evlist, "task-clock");
        if (err)
                goto out;
        err = TEST_FAIL;
 
        if (evlist == NULL)
                 return -ENOMEM;
 
-       err = parse_events(evlist, "cpu-clock", NULL);
+       err = parse_event(evlist, "cpu-clock");
        if (err)
                goto out;
-       err = parse_events(evlist, "task-clock", NULL);
+       err = parse_event(evlist, "task-clock");
        if (err)
                goto out;
 
 
 
        TEST_ASSERT_VAL("No memory", evlist);
 
-       err = parse_events(evlist, "cpu-clock", NULL);
+       err = parse_event(evlist, "cpu-clock");
        if (err)
                goto out;
        err = TEST_FAIL;
 
 
        perf_evlist__set_maps(&evlist->core, cpus, threads);
 
-       CHECK__(parse_events(evlist, "dummy:u", NULL));
-       CHECK__(parse_events(evlist, "cycles:u", NULL));
+       CHECK__(parse_event(evlist, "dummy:u"));
+       CHECK__(parse_event(evlist, "cycles:u"));
 
        evlist__config(evlist, &opts, NULL);
 
 
 
        perf_evlist__set_maps(&evlist->core, cpus, threads);
 
-       CHECK__(parse_events(evlist, "cycles:u", NULL));
+       CHECK__(parse_event(evlist, "cycles:u"));
 
        evlist__config(evlist, &opts, NULL);
 
 
        perf_evlist__set_maps(&evlist->core, cpus, threads);
 
        /* First event */
-       err = parse_events(evlist, "cpu-clock:u", NULL);
+       err = parse_event(evlist, "cpu-clock:u");
        if (err) {
                pr_debug("Failed to parse event dummy:u\n");
                goto out_err;
        /* Second event */
        if (perf_pmu__has_hybrid()) {
                cycles = "cpu_core/cycles/u";
-               err = parse_events(evlist, cycles, NULL);
+               err = parse_event(evlist, cycles);
                if (err) {
                        cycles = "cpu_atom/cycles/u";
                        pr_debug("Trying %s\n", cycles);
-                       err = parse_events(evlist, cycles, NULL);
+                       err = parse_event(evlist, cycles);
                }
        } else {
-               err = parse_events(evlist, cycles, NULL);
+               err = parse_event(evlist, cycles);
        }
        if (err) {
                pr_debug("Failed to parse event %s\n", cycles);
                goto out;
        }
 
-       err = parse_events(evlist, sched_switch, NULL);
+       err = parse_event(evlist, sched_switch);
        if (err) {
                pr_debug("Failed to parse event %s\n", sched_switch);
                goto out_err;
        evsel__set_sample_bit(cycles_evsel, TIME);
 
        /* Fourth event */
-       err = parse_events(evlist, "dummy:u", NULL);
+       err = parse_event(evlist, "dummy:u");
        if (err) {
                pr_debug("Failed to parse event dummy:u\n");
                goto out_err;
 
                if (asprintf(&event_definition, "bpf-output/no-inherit=1,name=%s/", name) < 0)
                        return ERR_PTR(-ENOMEM);
 
-               err = parse_events(evlist, event_definition, NULL);
+               err = parse_event(evlist, event_definition);
                free(event_definition);
 
                if (err) {
 
        return ret;
 }
 
+int parse_event(struct evlist *evlist, const char *str)
+{
+       struct parse_events_error err;
+       int ret;
+
+       parse_events_error__init(&err);
+       ret = parse_events(evlist, str, &err);
+       parse_events_error__exit(&err);
+       return ret;
+}
+
 void parse_events_error__init(struct parse_events_error *err)
 {
        bzero(err, sizeof(*err));
 void parse_events_error__handle(struct parse_events_error *err, int idx,
                                char *str, char *help)
 {
-       if (WARN(!str, "WARNING: failed to provide error string\n"))
-               goto out_free;
-       if (!err) {
-               /* Assume caller does not want message printed */
-               pr_debug("event syntax error: %s\n", str);
+       if (WARN(!str || !err, "WARNING: failed to provide error string or struct\n"))
                goto out_free;
-       }
        switch (err->num_errors) {
        case 0:
                err->idx = idx;
 
 
 int parse_events_option(const struct option *opt, const char *str, int unset);
 int parse_events_option_new_evlist(const struct option *opt, const char *str, int unset);
+__attribute__((nonnull(1, 2, 3)))
 int __parse_events(struct evlist *evlist, const char *str, struct parse_events_error *error,
                   struct perf_pmu *fake_pmu);
 
+__attribute__((nonnull))
 static inline int parse_events(struct evlist *evlist, const char *str,
                               struct parse_events_error *err)
 {
        return __parse_events(evlist, str, err, NULL);
 }
 
+int parse_event(struct evlist *evlist, const char *str);
+
 int parse_events_terms(struct list_head *terms, const char *str);
 int parse_filter(const struct option *opt, const char *str, int unset);
 int exclude_perf(const struct option *opt, const char *arg, int unset);
 
        if (!evlist)
                return -ENOMEM;
 
-       if (parse_events(evlist, str, NULL))
+       if (parse_event(evlist, str))
                goto out_delete;
 
        evsel = evlist__first(evlist);
 
        if (!temp_evlist)
                return false;
 
-       err = parse_events(temp_evlist, str, NULL);
+       err = parse_event(temp_evlist, str);
        if (err)
                goto out_delete;