INIT_LIST_HEAD(&evsel->node);
        evsel->attr = *attr;
        evsel->idx  = idx;
+       evsel->leader = evsel;
 }
 
 struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr)
 
        struct xyarray          *sample_id;
        u64                     *id;
        u32                      ids;
+       struct perf_evsel       *leader;
 
        /* parse modifier helper */
        int                      nr_members;
 
                                goto try_again;
                        }
                        if ((errno == EINVAL || errno == EBADF) &&
-                           pos->leader != pos &&
+                           pos->core.leader != &pos->core &&
                            pos->weak_group) {
                                pos = evlist__reset_weak_group(evlist, pos, true);
                                goto try_again;
 
 
                /* Non-group events are considered as leader */
                if (symbol_conf.event_group && !evsel__is_group_leader(pos)) {
-                       struct hists *leader_hists = evsel__hists(pos->leader);
+                       struct hists *leader_hists = evsel__hists(evsel__leader(pos));
 
                        hists__match(leader_hists, hists);
                        hists__link(leader_hists, hists);
 
                                       struct perf_sample *sample,
                                       FILE *fp)
 {
+       struct evsel *leader = evsel__leader(evsel);
        struct perf_stat_output_ctx ctx = {
                .print_metric = script_print_metric,
                .new_line = script_new_line,
 
        if (!evsel->stats)
                evlist__alloc_stats(script->session->evlist, false);
-       if (evsel_script(evsel->leader)->gnum++ == 0)
+       if (evsel_script(leader)->gnum++ == 0)
                perf_stat__reset_shadow_stats();
        val = sample->period * evsel->scale;
        perf_stat__update_shadow_stats(evsel,
                                       sample->cpu,
                                       &rt_stat);
        evsel_script(evsel)->val = val;
-       if (evsel_script(evsel->leader)->gnum == evsel->leader->core.nr_members) {
-               for_each_group_member (ev2, evsel->leader) {
+       if (evsel_script(leader)->gnum == leader->core.nr_members) {
+               for_each_group_member (ev2, leader) {
                        perf_stat__print_shadow_stats(&stat_config, ev2,
                                                      evsel_script(ev2)->val,
                                                      sample->cpu,
                                                      NULL,
                                                      &rt_stat);
                }
-               evsel_script(evsel->leader)->gnum = 0;
+               evsel_script(leader)->gnum = 0;
        }
 }
 
 
                evlist__warn_hybrid_group(evlist);
 
        evlist__for_each_entry(evlist, evsel) {
-               leader = evsel->leader;
+               leader = evsel__leader(evsel);
 
                /* Check that leader matches cpus with each member. */
                if (leader == evsel)
                }
 
                for_each_group_evsel(pos, leader) {
-                       pos->leader = pos;
+                       evsel__set_leader(pos, pos);
                        pos->core.nr_members = 0;
                }
-               evsel->leader->core.nr_members = 0;
+               evsel->core.leader->nr_members = 0;
        }
 }
 
                 */
                counter->errored = true;
 
-               if ((counter->leader != counter) ||
-                   !(counter->leader->core.nr_members > 1))
+               if ((evsel__leader(counter) != counter) ||
+                   !(counter->core.leader->nr_members > 1))
                        return COUNTER_SKIP;
        } else if (evsel__fallback(counter, errno, msg, sizeof(msg))) {
                if (verbose > 0)
                                 * Don't close here because we're in the wrong affinity.
                                 */
                                if ((errno == EINVAL || errno == EBADF) &&
-                                   counter->leader != counter &&
+                                   evsel__leader(counter) != counter &&
                                    counter->weak_group) {
                                        evlist__reset_weak_group(evsel_list, counter, false);
                                        assert(counter->reset_group);
 
 
                /* Non-group events are considered as leader */
                if (symbol_conf.event_group && !evsel__is_group_leader(pos)) {
-                       struct hists *leader_hists = evsel__hists(pos->leader);
+                       struct hists *leader_hists = evsel__hists(evsel__leader(pos));
 
                        hists__match(leader_hists, hists);
                        hists__link(leader_hists, hists);
 
        TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 
        TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 
        TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
        TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 
        TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 
        TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
        TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
 
        TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
 
        /* cycles */
        TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
 
        return 0;
        TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
 
        return 0;
        TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
 
        return 0;
        TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
 
        return 0;
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
 
        /* cache-misses - not sampling */
        TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
 
        /* branch-misses - not sampling */
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
 
        return 0;
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
 
        /* branch-misses - not sampling */
        TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
        TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
 
        return 0;
        TEST_ASSERT_VAL("wrong config",
                        PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
 
        /* cache-misses - can not be pinned, but will go on with the leader */
        TEST_ASSERT_VAL("wrong config",
                        PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
        TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
 
        /* cache-misses - can not be pinned, but will go on with the leader */
        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
        TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 
        evsel = evsel__next(evsel);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
        TEST_ASSERT_VAL("wrong config", 0xc0 == evsel->core.attr.config);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        return 0;
 }
 
        evsel = leader = evlist__first(evlist);
        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 
        evsel = evsel__next(evsel);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
        TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        return 0;
 }
 
        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
        TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 
        evsel = evsel__next(evsel);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        return 0;
 }
 
        TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
        TEST_ASSERT_VAL("wrong config", 0x3c == evsel->core.attr.config);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
        TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
 
        evsel = evsel__next(evsel);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
        TEST_ASSERT_VAL("wrong config", 0xc0 == evsel->core.attr.config);
-       TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
+       TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
        TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
        TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
        return 0;
 
        grp = false;
        evlist__for_each_entry(evlist, evsel) {
                if (grp) {
-                       if (!(evsel->leader == leader ||
-                            (evsel->leader == evsel &&
+                       if (!(evsel__leader(evsel) == leader ||
+                            (evsel__leader(evsel) == evsel &&
                              evsel->core.nr_members <= 1)))
                                return -EINVAL;
                } else if (evsel == leader) {
        grp = false;
        evlist__for_each_entry(evlist, evsel) {
                if (grp) {
-                       if (evsel->leader != leader) {
-                               evsel->leader = leader;
+                       if (!evsel__has_leader(evsel, leader)) {
+                               evsel__set_leader(evsel, leader);
                                if (leader->core.nr_members < 1)
                                        leader->core.nr_members = 1;
                                leader->core.nr_members += 1;
 
        /* Find new leader for the group */
        evlist__for_each_entry(evlist, evsel) {
-               if (evsel->leader != leader || evsel == leader)
+               if (!evsel__has_leader(evsel, leader) || evsel == leader)
                        continue;
                if (!new_leader)
                        new_leader = evsel;
-               evsel->leader = new_leader;
+               evsel__set_leader(evsel, new_leader);
        }
 
        /* Update group information */
 
                              enum bperf_filter_type *filter_type,
                              __u32 *filter_entry_cnt)
 {
-       if (evsel->leader->core.nr_members > 1) {
+       if (evsel->core.leader->nr_members > 1) {
                pr_err("bpf managed perf events do not yet support groups.\n");
                return -1;
        }
 
 
                        if (evsel__is_group_leader(pos))
                                leader = evsel;
-                       evsel->leader = leader;
+                       evsel__set_leader(evsel, leader);
 
                        evlist__add(tmp_list, evsel);
                }
 
                }
 
                __evlist__for_each_entry_safe(list, temp, evsel) {
-                       if (evsel->leader == leader) {
+                       if (evsel__has_leader(evsel, leader)) {
                                list_del_init(&evsel->core.node);
                                evlist__add(evlist, evsel);
                        }
        leader->core.nr_members = evsel->core.idx - leader->core.idx + 1;
 
        __evlist__for_each_entry(list, evsel) {
-               evsel->leader = leader;
+               evsel->core.leader = &leader->core;
        }
 }
 
                return;
 
        evlist__for_each_entry_safe(evlist, n, evsel) {
-               if (evsel->leader == move_evsel->leader)
+               if (evsel__leader(evsel) == evsel__leader(move_evsel))
                        list_move_tail(&evsel->core.node, &move);
        }
 
        struct evsel *c2, *leader;
        bool is_open = true;
 
-       leader = evsel->leader;
+       leader = evsel__leader(evsel);
+
        pr_debug("Weak group for %s/%d failed\n",
                        leader->name, leader->core.nr_members);
 
        evlist__for_each_entry(evsel_list, c2) {
                if (c2 == evsel)
                        is_open = false;
-               if (c2->leader == leader) {
+               if (evsel__has_leader(c2, leader)) {
                        if (is_open && close)
                                perf_evsel__close(&c2->core);
-                       c2->leader = c2;
+                       evsel__set_leader(c2, c2);
                        c2->core.nr_members = 0;
                        /*
                         * Set this for all former members of the group
         * any valid memory load information.
         */
        evlist__for_each_entry(evlist, evsel) {
-               leader = evsel->leader;
+               leader = evsel__leader(evsel);
                if (leader == evsel)
                        continue;
 
                if (leader->name && strstr(leader->name, "mem-loads-aux")) {
                        for_each_group_evsel(pos, leader) {
-                               pos->leader = pos;
+                               evsel__set_leader(pos, pos);
                                pos->core.nr_members = 0;
                        }
                }
 
 {
        perf_evsel__init(&evsel->core, attr, idx);
        evsel->tracking    = !idx;
-       evsel->leader      = evsel;
        evsel->unit        = "";
        evsel->scale       = 1.0;
        evsel->max_events  = ULONG_MAX;
        evsel->cgrp = cgroup__get(orig->cgrp);
        evsel->tp_format = orig->tp_format;
        evsel->handler = orig->handler;
-       evsel->leader = orig->leader;
+       evsel->core.leader = orig->core.leader;
 
        evsel->max_events = orig->max_events;
        evsel->tool_event = orig->tool_event;
 void evsel__config(struct evsel *evsel, struct record_opts *opts,
                   struct callchain_param *callchain)
 {
-       struct evsel *leader = evsel->leader;
+       struct evsel *leader = evsel__leader(evsel);
        struct perf_event_attr *attr = &evsel->core.attr;
        int track = evsel->tracking;
        bool per_cpu = opts->target.default_per_cpu && !opts->target.per_thread;
 
 static int evsel__hybrid_group_cpu(struct evsel *evsel, int cpu)
 {
-       struct evsel *leader = evsel->leader;
+       struct evsel *leader = evsel__leader(evsel);
 
        if ((evsel__is_hybrid(evsel) && !evsel__is_hybrid(leader)) ||
            (!evsel__is_hybrid(evsel) && evsel__is_hybrid(leader))) {
 
 static int get_group_fd(struct evsel *evsel, int cpu, int thread)
 {
-       struct evsel *leader = evsel->leader;
+       struct evsel *leader = evsel__leader(evsel);
        int fd;
 
        if (evsel__is_group_leader(evsel))
 {
        return evsel->pmu_name && perf_pmu__is_hybrid(evsel->pmu_name);
 }
+
+struct evsel *evsel__leader(struct evsel *evsel)
+{
+       return container_of(evsel->core.leader, struct evsel, core);
+}
+
+bool evsel__has_leader(struct evsel *evsel, struct evsel *leader)
+{
+       return evsel->core.leader == &leader->core;
+}
+
+bool evsel__is_leader(struct evsel *evsel)
+{
+       return evsel__has_leader(evsel, evsel);
+}
+
+void evsel__set_leader(struct evsel *evsel, struct evsel *leader)
+{
+       evsel->core.leader = &leader->core;
+}
 
        bool                    reset_group;
        bool                    errored;
        struct hashmap          *per_pkg_mask;
-       struct evsel            *leader;
        int                     err;
        int                     cpu_iter;
        struct {
  */
 static inline bool evsel__is_group_leader(const struct evsel *evsel)
 {
-       return evsel->leader == evsel;
+       return evsel->core.leader == &evsel->core;
 }
 
 /**
 
 static inline int evsel__group_idx(struct evsel *evsel)
 {
-       return evsel->core.idx - evsel->leader->core.idx;
+       return evsel->core.idx - evsel->core.leader->idx;
 }
 
 /* Iterates group WITHOUT the leader. */
 #define for_each_group_member(_evsel, _leader)                                         \
 for ((_evsel) = list_entry((_leader)->core.node.next, struct evsel, core.node); \
-     (_evsel) && (_evsel)->leader == (_leader);                                        \
+     (_evsel) && (_evsel)->core.leader == (&_leader->core);                                    \
      (_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node))
 
 /* Iterates group WITH the leader. */
 #define for_each_group_evsel(_evsel, _leader)                                  \
 for ((_evsel) = _leader;                                                       \
-     (_evsel) && (_evsel)->leader == (_leader);                                        \
+     (_evsel) && (_evsel)->core.leader == (&_leader->core);                                    \
      (_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node))
 
 static inline bool evsel__has_branch_callstack(const struct evsel *evsel)
 
 void evsel__zero_per_pkg(struct evsel *evsel);
 bool evsel__is_hybrid(struct evsel *evsel);
+struct evsel *evsel__leader(struct evsel *evsel);
+bool evsel__has_leader(struct evsel *evsel, struct evsel *leader);
+bool evsel__is_leader(struct evsel *evsel);
+void evsel__set_leader(struct evsel *evsel, struct evsel *leader);
 #endif /* __PERF_EVSEL_H */
 
        i = nr = 0;
        evlist__for_each_entry(session->evlist, evsel) {
                if (evsel->core.idx == (int) desc[i].leader_idx) {
-                       evsel->leader = evsel;
+                       evsel__set_leader(evsel, evsel);
                        /* {anon_group} is a dummy name */
                        if (strcmp(desc[i].name, "{anon_group}")) {
                                evsel->group_name = desc[i].name;
                        i++;
                } else if (nr) {
                        /* This is a group member */
-                       evsel->leader = leader;
+                       evsel__set_leader(evsel, leader);
 
                        nr--;
                }
 
                /* Ignore event if already used and merging is disabled. */
                if (metric_no_merge && test_bit(ev->core.idx, evlist_used))
                        continue;
-               if (!has_constraint && ev->leader != current_leader) {
+               if (!has_constraint && !evsel__has_leader(ev, current_leader)) {
                        /*
                         * Start of a new group, discard the whole match and
                         * start again.
                        matched_events = 0;
                        memset(metric_events, 0,
                                sizeof(struct evsel *) * idnum);
-                       current_leader = ev->leader;
+                       current_leader = evsel__leader(ev);
                }
                /*
                 * Check for duplicate events with the same name. For example,
                         * when then group is left.
                         */
                        if (!has_constraint &&
-                           ev->leader != metric_events[i]->leader &&
-                           evsel_same_pmu_or_none(ev->leader, metric_events[i]->leader))
+                           ev->core.leader != metric_events[i]->core.leader &&
+                           evsel_same_pmu_or_none(evsel__leader(ev), evsel__leader(metric_events[i])))
                                break;
                        if (!strcmp(metric_events[i]->name, ev->name)) {
                                set_bit(ev->core.idx, evlist_used);
 
        __evlist__for_each_entry(list, evsel) {
                if (i >= nr_pmu)
                        i = 0;
-               evsel->leader = (struct evsel *) leaders[i++];
+               evsel__set_leader(evsel, (struct evsel *) leaders[i++]);
        }
 
        /* The number of members and group name are same for each group */
 
  */
 static struct evsel *evsel__read_sampler(struct evsel *evsel, struct evlist *evlist)
 {
-       struct evsel *leader = evsel->leader;
+       struct evsel *leader = evsel__leader(evsel);
 
        if (evsel__is_aux_event(leader) || arch_topdown_sample_read(leader) ||
            is_mem_loads_aux_event(leader)) {
                evlist__for_each_entry(evlist, evsel) {
-                       if (evsel->leader == leader && evsel != evsel->leader)
+                       if (evsel__leader(evsel) == leader && evsel != evsel__leader(evsel))
                                return evsel;
                }
        }
 static void evsel__config_leader_sampling(struct evsel *evsel, struct evlist *evlist)
 {
        struct perf_event_attr *attr = &evsel->core.attr;
-       struct evsel *leader = evsel->leader;
+       struct evsel *leader = evsel__leader(evsel);
        struct evsel *read_sampler;
        u64 term_types, freq_mask;
 
 
        evlist__for_each_entry(evsel_list, counter) {
                bool invalid = false;
 
-               leader = counter->leader;
+               leader = evsel__leader(counter);
                if (!counter->metric_expr)
                        continue;
 
 
                             int cpu)
 {
        struct perf_event_attr *attr = &evsel->core.attr;
-       struct evsel *leader = evsel->leader;
+       struct evsel *leader = evsel__leader(evsel);
 
        attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED |
                            PERF_FORMAT_TOTAL_TIME_RUNNING;