return 0;
 }
 
+static void set_print_ip_opts(struct perf_event_attr *attr)
+{
+       unsigned int type = attr->type;
+
+       output[type].print_ip_opts = 0;
+       if (PRINT_FIELD(IP))
+               output[type].print_ip_opts |= PRINT_IP_OPT_IP;
+
+       if (PRINT_FIELD(SYM))
+               output[type].print_ip_opts |= PRINT_IP_OPT_SYM;
+
+       if (PRINT_FIELD(DSO))
+               output[type].print_ip_opts |= PRINT_IP_OPT_DSO;
+
+       if (PRINT_FIELD(SYMOFFSET))
+               output[type].print_ip_opts |= PRINT_IP_OPT_SYMOFFSET;
+}
+
 /*
  * verify all user requested events exist and the samples
  * have the expected data
 {
        int j;
        struct perf_evsel *evsel;
-       struct perf_event_attr *attr;
 
        for (j = 0; j < PERF_TYPE_MAX; ++j) {
                evsel = perf_session__find_first_evtype(session, j);
                if (evsel == NULL)
                        continue;
 
-               attr = &evsel->attr;
-
-               output[j].print_ip_opts = 0;
-               if (PRINT_FIELD(IP))
-                       output[j].print_ip_opts |= PRINT_IP_OPT_IP;
-
-               if (PRINT_FIELD(SYM))
-                       output[j].print_ip_opts |= PRINT_IP_OPT_SYM;
-
-               if (PRINT_FIELD(DSO))
-                       output[j].print_ip_opts |= PRINT_IP_OPT_DSO;
-
-               if (PRINT_FIELD(SYMOFFSET))
-                       output[j].print_ip_opts |= PRINT_IP_OPT_SYMOFFSET;
+               set_print_ip_opts(&evsel->attr);
        }
 
        return 0;
        struct perf_session     *session;
 };
 
+static int process_attr(struct perf_tool *tool, union perf_event *event,
+                       struct perf_evlist **pevlist)
+{
+       struct perf_script *scr = container_of(tool, struct perf_script, tool);
+       struct perf_evlist *evlist;
+       struct perf_evsel *evsel, *pos;
+       int err;
+
+       err = perf_event__process_attr(tool, event, pevlist);
+       if (err)
+               return err;
+
+       evlist = *pevlist;
+       evsel = perf_evlist__last(*pevlist);
+
+       if (evsel->attr.type >= PERF_TYPE_MAX)
+               return 0;
+
+       list_for_each_entry(pos, &evlist->entries, node) {
+               if (pos->attr.type == evsel->attr.type && pos != evsel)
+                       return 0;
+       }
+
+       set_print_ip_opts(&evsel->attr);
+
+       return perf_evsel__check_attr(evsel, scr->session);
+}
+
 static void sig_handler(int sig __maybe_unused)
 {
        session_done = 1;
                        .comm            = perf_event__process_comm,
                        .exit            = perf_event__process_exit,
                        .fork            = perf_event__process_fork,
-                       .attr            = perf_event__process_attr,
+                       .attr            = process_attr,
                        .tracing_data    = perf_event__process_tracing_data,
                        .build_id        = perf_event__process_build_id,
                        .ordered_samples = true,