cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
 
-       thread = machine__findnew_thread(machine, event->ip.pid, event->ip.pid);
+       thread = machine__findnew_thread(machine, sample->pid, sample->pid);
        if (thread == NULL) {
                pr_err("problem processing %d event, skipping it.\n",
                       event->header.type);
        }
 
        thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
-                             event->ip.ip, &al);
+                             sample->ip, &al);
 
        if (al.map != NULL) {
                if (!al.map->dso->hit) {
 
                                struct perf_evsel *evsel,
                                struct machine *machine)
 {
-       struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
-                                                       event->ip.pid);
+       struct thread *thread = machine__findnew_thread(machine, sample->pid,
+                                                       sample->pid);
 
        if (thread == NULL) {
                pr_debug("problem processing %d event, skipping it.\n",
 
                symbol_conf.field_sep,
                sample->tid,
                symbol_conf.field_sep,
-               event->ip.ip,
+               sample->ip,
                symbol_conf.field_sep,
                sample->addr,
                symbol_conf.field_sep,
 
                                struct machine *machine)
 {
        struct addr_location al;
-       struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
-                                                       event->ip.tid);
+       struct thread *thread = machine__findnew_thread(machine, sample->pid,
+                                                       sample->tid);
 
        if (thread == NULL) {
                pr_debug("problem processing %d event, skipping it.\n",
 
 {
        struct perf_top *top = container_of(tool, struct perf_top, tool);
        struct symbol *parent = NULL;
-       u64 ip = event->ip.ip;
+       u64 ip = sample->ip;
        struct addr_location al;
        int err;
 
                if (!seen)
                        seen = intlist__new(NULL);
 
-               if (!intlist__has_entry(seen, event->ip.pid)) {
+               if (!intlist__has_entry(seen, sample->pid)) {
                        pr_err("Can't find guest [%d]'s kernel information\n",
-                               event->ip.pid);
-                       intlist__add(seen, event->ip.pid);
+                               sample->pid);
+                       intlist__add(seen, sample->pid);
                }
                return;
        }
                        break;
                case PERF_RECORD_MISC_GUEST_KERNEL:
                        ++top->guest_kernel_samples;
-                       machine = perf_session__find_machine(session, event->ip.pid);
+                       machine = perf_session__find_machine(session,
+                                                            sample.pid);
                        break;
                case PERF_RECORD_MISC_GUEST_USER:
                        ++top->guest_us_samples;
 
        list_for_each_entry(evsel, &evlist->entries, node) {
                for (k = 0; k < ARRAY_SIZE(fake_common_samples); k++) {
                        const union perf_event event = {
-                               .ip = {
-                                       .header = {
-                                               .misc = PERF_RECORD_MISC_USER,
-                                       },
-                                       .pid = fake_common_samples[k].pid,
-                                       .ip  = fake_common_samples[k].ip,
+                               .header = {
+                                       .misc = PERF_RECORD_MISC_USER,
                                },
                        };
 
+                       sample.pid = fake_common_samples[k].pid;
+                       sample.ip = fake_common_samples[k].ip;
                        if (perf_event__preprocess_sample(&event, machine, &al,
                                                          &sample) < 0)
                                goto out;
 
                for (k = 0; k < ARRAY_SIZE(fake_samples[i]); k++) {
                        const union perf_event event = {
-                               .ip = {
-                                       .header = {
-                                               .misc = PERF_RECORD_MISC_USER,
-                                       },
-                                       .pid = fake_samples[i][k].pid,
-                                       .ip  = fake_samples[i][k].ip,
+                               .header = {
+                                       .misc = PERF_RECORD_MISC_USER,
                                },
                        };
 
+                       sample.pid = fake_samples[i][k].pid;
+                       sample.ip = fake_samples[i][k].ip;
                        if (perf_event__preprocess_sample(&event, machine, &al,
                                                          &sample) < 0)
                                goto out;
 
 
 int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused,
                           union perf_event *event,
-                          struct perf_sample *sample __maybe_unused,
+                          struct perf_sample *sample,
                           struct perf_evsel *evsel __maybe_unused,
                           struct machine *machine)
 {
        struct addr_location al;
        u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-       struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
-                                                       event->ip.pid);
+       struct thread *thread = machine__findnew_thread(machine, sample->pid,
+                                                       sample->pid);
 
        if (thread == NULL) {
                pr_err("problem processing %d event, skipping it.\n",
        }
 
        thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
-                             event->ip.ip, &al);
+                             sample->ip, &al);
 
        if (al.map != NULL)
                al.map->dso->hit = 1;
 
                                  struct perf_sample *sample)
 {
        u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-       struct thread *thread = machine__findnew_thread(machine, event->ip.pid,
-                                                       event->ip.pid);
+       struct thread *thread = machine__findnew_thread(machine, sample->pid,
+                                                       sample->pid);
 
        if (thread == NULL)
                return -1;
                machine__create_kernel_maps(machine);
 
        thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
-                             event->ip.ip, al);
+                             sample->ip, al);
        dump_printf(" ...... dso: %s\n",
                    al->map ? al->map->dso->long_name :
                        al->level == 'H' ? "[hypervisor]" : "<not found>");
 
 #include "map.h"
 #include "build-id.h"
 
-/*
- * PERF_SAMPLE_IP | PERF_SAMPLE_TID | *
- */
-struct ip_event {
-       struct perf_event_header header;
-       u64 ip;
-       u32 pid, tid;
-       unsigned char __more_data[];
-};
-
 struct mmap_event {
        struct perf_event_header header;
        u32 pid, tid;
 
 union perf_event {
        struct perf_event_header        header;
-       struct ip_event                 ip;
        struct mmap_event               mmap;
        struct comm_event               comm;
        struct fork_event               fork;
 
                return -EFAULT;
 
        if (type & PERF_SAMPLE_IP) {
-               data->ip = event->ip.ip;
+               data->ip = *array;
                array++;
        }
 
        array = event->sample.array;
 
        if (type & PERF_SAMPLE_IP) {
-               event->ip.ip = sample->ip;
+               *array = sample->ip;
                array++;
        }
 
 
 
 static struct machine *
        perf_session__find_machine_for_cpumode(struct perf_session *session,
-                                              union perf_event *event)
+                                              union perf_event *event,
+                                              struct perf_sample *sample)
 {
        const u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
 
                if (event->header.type == PERF_RECORD_MMAP)
                        pid = event->mmap.pid;
                else
-                       pid = event->ip.pid;
+                       pid = sample->pid;
 
                return perf_session__findnew_machine(session, pid);
        }
                hists__inc_nr_events(&evsel->hists, event->header.type);
        }
 
-       machine = perf_session__find_machine_for_cpumode(session, event);
+       machine = perf_session__find_machine_for_cpumode(session, event,
+                                                        sample);
 
        switch (event->header.type) {
        case PERF_RECORD_SAMPLE: