};
 
 struct dyn_ftrace {
-       unsigned long           ip; /* address of mcount call-site */
-       unsigned long           flags;
-       struct dyn_arch_ftrace  arch;
+       union {
+               unsigned long           ip; /* address of mcount call-site */
+               struct dyn_ftrace       *freelist;
+       };
+       union {
+               unsigned long           flags;
+               struct dyn_ftrace       *newlist;
+       };
+       struct dyn_arch_ftrace          arch;
 };
 
 int ftrace_force_update(void);
 
 
 static void ftrace_free_rec(struct dyn_ftrace *rec)
 {
-       rec->ip = (unsigned long)ftrace_free_records;
+       rec->freelist = ftrace_free_records;
        ftrace_free_records = rec;
        rec->flags |= FTRACE_FL_FREE;
 }
                        return NULL;
                }
 
-               ftrace_free_records = (void *)rec->ip;
+               ftrace_free_records = rec->freelist;
                memset(rec, 0, sizeof(*rec));
                return rec;
        }
                return NULL;
 
        rec->ip = ip;
-       rec->flags = (unsigned long)ftrace_new_addrs;
+       rec->newlist = ftrace_new_addrs;
        ftrace_new_addrs = rec;
 
        return rec;
                        return -1;
 
                p = ftrace_new_addrs;
-               ftrace_new_addrs = (struct dyn_ftrace *)p->flags;
+               ftrace_new_addrs = p->newlist;
                p->flags = 0L;
 
                /* convert record (i.e, patch mcount-call with NOP) */