return parse_events__modifier_list(parse_state, loc, list, mod, /*group=*/false);
 }
 
-int parse_events_name(struct list_head *list, const char *name)
+int parse_events__set_default_name(struct list_head *list, char *name)
 {
        struct evsel *evsel;
+       bool used_name = false;
 
        __evlist__for_each_entry(list, evsel) {
                if (!evsel->name) {
-                       evsel->name = strdup(name);
+                       evsel->name = used_name ? strdup(name) : name;
+                       used_name = true;
                        if (!evsel->name)
                                return -ENOMEM;
                }
        }
-
+       if (!used_name)
+               free(name);
        return 0;
 }
 
 
                                 struct list_head *list, struct parse_events_modifier mod);
 int parse_events__modifier_group(struct parse_events_state *parse_state, void *loc,
                                 struct list_head *list, struct parse_events_modifier mod);
-int parse_events_name(struct list_head *list, const char *name);
+int parse_events__set_default_name(struct list_head *list, char *name);
 int parse_events_add_tracepoint(struct list_head *list, int *idx,
                                const char *sys, const char *event,
                                struct parse_events_error *error,
 
        return token;
 }
 
+/*
+ * Use yyless to return all the characaters to the input. Update the column for
+ * location debugging. If __alloc is non-zero set yylval to the text for the
+ * returned token's value.
+ */
 #define REWIND(__alloc)                                \
 do {                                                           \
        YYSTYPE *__yylval = parse_events_get_lval(yyscanner);   \
 
 event_name:
 PE_EVENT_NAME event_def
 {
-       int err;
+       /*
+        * When an event is parsed the text is rewound and the entire text of
+        * the event is set to the str of PE_EVENT_NAME token matched here. If
+        * no name was on an event via a term, set the name to the entire text
+        * taking ownership of the allocation.
+        */
+       int err = parse_events__set_default_name($2, $1);
 
-       err = parse_events_name($2, $1);
-       free($1);
        if (err) {
                free_list_evsel($2);
                YYNOMEM;