goto out_munmap;
                }
 
-               err = perf_evlist__parse_sample(evlist, event, &sample, false);
+               err = perf_evlist__parse_sample(evlist, event, &sample);
                if (err) {
                        pr_err("Can't parse sample, err = %d\n", err);
                        goto out_munmap;
                                if (type < PERF_RECORD_MAX)
                                        nr_events[type]++;
 
-                               err = perf_evlist__parse_sample(evlist, event, &sample, false);
+                               err = perf_evlist__parse_sample(evlist, event, &sample);
                                if (err < 0) {
                                        if (verbose)
                                                perf_event__fprintf(event, stderr);
 
        int ret;
 
        while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) {
-               ret = perf_evlist__parse_sample(top->evlist, event, &sample, false);
+               ret = perf_evlist__parse_sample(top->evlist, event, &sample);
                if (ret) {
                        pr_err("Can't parse sample, err = %d\n", ret);
                        continue;
 
 }
 
 int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
-                             struct perf_sample *sample, bool swapped)
+                             struct perf_sample *sample)
 {
        struct perf_evsel *evsel = perf_evlist__first(evlist);
-       return perf_evsel__parse_sample(evsel, event, sample, swapped);
+       return perf_evsel__parse_sample(evsel, event, sample);
 }
 
 size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
 
 u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
 
 int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
-                             struct perf_sample *sample, bool swapped);
+                             struct perf_sample *sample);
 
 bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
 bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
 
        return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
 }
 
-static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
-                                      struct perf_sample *sample,
-                                      bool swapped)
+static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
+                                      const union perf_event *event,
+                                      struct perf_sample *sample)
 {
+       u64 type = evsel->attr.sample_type;
        const u64 *array = event->sample.array;
+       bool swapped = evsel->needs_swap;
        union u64_swap u;
 
        array += ((event->header.size -
 }
 
 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
-                            struct perf_sample *data, bool swapped)
+                            struct perf_sample *data)
 {
        u64 type = evsel->attr.sample_type;
        u64 regs_user = evsel->attr.sample_regs_user;
+       bool swapped = evsel->needs_swap;
        const u64 *array;
 
        /*
        if (event->header.type != PERF_RECORD_SAMPLE) {
                if (!evsel->attr.sample_id_all)
                        return 0;
-               return perf_event__parse_id_sample(event, type, data, swapped);
+               return perf_evsel__parse_id_sample(evsel, event, data);
        }
 
        array = event->sample.array;
 
        struct cpu_map          *cpus;
        unsigned int            sample_size;
        bool                    supported;
+       bool                    needs_swap;
        /* parse modifier helper */
        int                     exclude_GH;
        struct perf_evsel       *leader;
 void hists__init(struct hists *hists);
 
 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
-                            struct perf_sample *sample, bool swapped);
+                            struct perf_sample *sample);
 
 static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel)
 {
 
                if (ret != (ssize_t)sizeof(nr))
                        goto error;
 
-               if (ph->needs_swap)
+               if (ph->needs_swap) {
                        nr = bswap_32(nr);
+                       evsel->needs_swap = true;
+               }
 
                evsel->name = do_read_string(fd, ph);
 
 
                if (evsel == NULL)
                        goto out_delete_evlist;
+
+               evsel->needs_swap = header->needs_swap;
                /*
                 * Do it before so that if perf_evsel__alloc_id fails, this
                 * entry gets purged too at perf_evlist__delete().
 
                if (pyevent == NULL)
                        return PyErr_NoMemory();
 
-               err = perf_evlist__parse_sample(evlist, event, &pevent->sample, false);
+               err = perf_evlist__parse_sample(evlist, event, &pevent->sample);
                if (err)
                        return PyErr_Format(PyExc_OSError,
                                            "perf: can't parse sample, err=%d", err);
 
                if (iter->timestamp > limit)
                        break;
 
-               ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample,
-                                               s->header.needs_swap);
+               ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample);
                if (ret)
                        pr_err("Can't parse sample, err = %d\n", ret);
                else {
        /*
         * For all kernel events we get the sample data
         */
-       ret = perf_evlist__parse_sample(session->evlist, event, &sample,
-                                       session->header.needs_swap);
+       ret = perf_evlist__parse_sample(session->evlist, event, &sample);
        if (ret)
                return ret;