PE_NAME opt_pmu_config
 {
        struct parse_events_state *parse_state = _parse_state;
-       struct parse_events_error *error = parse_state->error;
        struct list_head *list = NULL, *orig_terms = NULL, *terms= NULL;
+       struct parse_events_error *error = parse_state->error;
        char *pattern = NULL;
 
-#define CLEANUP_YYABORT                                        \
+#define CLEANUP                                                \
        do {                                            \
                parse_events_terms__delete($2);         \
                parse_events_terms__delete(orig_terms); \
                free(list);                             \
                free($1);                               \
                free(pattern);                          \
-               YYABORT;                                \
        } while(0)
 
-       if (parse_events_copy_term_list($2, &orig_terms))
-               CLEANUP_YYABORT;
-
        if (error)
                error->idx = @1.first_column;
 
+       if (parse_events_copy_term_list($2, &orig_terms)) {
+               CLEANUP;
+               YYNOMEM;
+       }
+
        list = alloc_list();
-       if (!list)
-               CLEANUP_YYABORT;
+       if (!list) {
+               CLEANUP;
+               YYNOMEM;
+       }
        /* Attempt to add to list assuming $1 is a PMU name. */
        if (parse_events_add_pmu(parse_state, list, $1, $2, /*auto_merge_stats=*/false)) {
                struct perf_pmu *pmu = NULL;
                int ok = 0;
 
                /* Failure to add, try wildcard expansion of $1 as a PMU name. */
-               if (asprintf(&pattern, "%s*", $1) < 0)
-                       CLEANUP_YYABORT;
+               if (asprintf(&pattern, "%s*", $1) < 0) {
+                       CLEANUP;
+                       YYNOMEM;
+               }
 
                while ((pmu = perf_pmus__scan(pmu)) != NULL) {
                        char *name = pmu->name;
                            !perf_pmu__match(pattern, pmu->alias_name, $1)) {
                                bool auto_merge_stats = perf_pmu__auto_merge_stats(pmu);
 
-                               if (parse_events_copy_term_list(orig_terms, &terms))
-                                       CLEANUP_YYABORT;
+                               if (parse_events_copy_term_list(orig_terms, &terms)) {
+                                       CLEANUP;
+                                       YYNOMEM;
+                               }
                                if (!parse_events_add_pmu(parse_state, list, pmu->name, terms,
                                                          auto_merge_stats)) {
                                        ok++;
                        ok = !parse_events_multi_pmu_add(parse_state, $1, $2, &list);
                        $2 = NULL;
                }
-               if (!ok)
-                       CLEANUP_YYABORT;
+               if (!ok) {
+                       CLEANUP;
+                       YYABORT;
+               }
        }
-       parse_events_terms__delete($2);
-       parse_events_terms__delete(orig_terms);
-       free(pattern);
-       free($1);
        $$ = list;
-#undef CLEANUP_YYABORT
+       list = NULL;
+       CLEANUP;
+#undef CLEANUP
 }
 |
 PE_NAME sep_dc