#include <linux/list.h>
 #include <linux/kernel.h>
 #include <linux/bitops.h>
+#include <linux/stringify.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/utsname.h>
        int (*process)(struct feat_fd *ff, void *data);
        const char *name;
        bool full_only;
+       bool synthesize;
 };
 
-#define FEAT_OPA(n, func) \
-       [n] = { .name = #n, .write = write_##func, .print = print_##func }
-#define FEAT_OPP(n, func) \
-       [n] = { .name = #n, .write = write_##func, .print = print_##func, \
-               .process = process_##func }
-#define FEAT_OPF(n, func) \
-       [n] = { .name = #n, .write = write_##func, .print = print_##func, \
-               .process = process_##func, .full_only = true }
+#define FEAT_OPR(n, func, __full_only) \
+       [HEADER_##n] = {                                        \
+               .name       = __stringify(n),                   \
+               .write      = write_##func,                     \
+               .print      = print_##func,                     \
+               .full_only  = __full_only,                      \
+               .process    = process_##func,                   \
+               .synthesize = true                              \
+       }
+
+#define FEAT_OPN(n, func, __full_only) \
+       [HEADER_##n] = {                                        \
+               .name       = __stringify(n),                   \
+               .write      = write_##func,                     \
+               .print      = print_##func,                     \
+               .full_only  = __full_only,                      \
+               .process    = process_##func                    \
+       }
 
 /* feature_ops not implemented: */
 #define print_tracing_data     NULL
 #define print_build_id         NULL
 
+#define process_branch_stack   NULL
+#define process_stat           NULL
+
+
 static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
-       FEAT_OPP(HEADER_TRACING_DATA,   tracing_data),
-       FEAT_OPP(HEADER_BUILD_ID,       build_id),
-       FEAT_OPP(HEADER_HOSTNAME,       hostname),
-       FEAT_OPP(HEADER_OSRELEASE,      osrelease),
-       FEAT_OPP(HEADER_VERSION,        version),
-       FEAT_OPP(HEADER_ARCH,           arch),
-       FEAT_OPP(HEADER_NRCPUS,         nrcpus),
-       FEAT_OPP(HEADER_CPUDESC,        cpudesc),
-       FEAT_OPP(HEADER_CPUID,          cpuid),
-       FEAT_OPP(HEADER_TOTAL_MEM,      total_mem),
-       FEAT_OPP(HEADER_EVENT_DESC,     event_desc),
-       FEAT_OPP(HEADER_CMDLINE,        cmdline),
-       FEAT_OPF(HEADER_CPU_TOPOLOGY,   cpu_topology),
-       FEAT_OPF(HEADER_NUMA_TOPOLOGY,  numa_topology),
-       FEAT_OPA(HEADER_BRANCH_STACK,   branch_stack),
-       FEAT_OPP(HEADER_PMU_MAPPINGS,   pmu_mappings),
-       FEAT_OPP(HEADER_GROUP_DESC,     group_desc),
-       FEAT_OPP(HEADER_AUXTRACE,       auxtrace),
-       FEAT_OPA(HEADER_STAT,           stat),
-       FEAT_OPF(HEADER_CACHE,          cache),
+       FEAT_OPN(TRACING_DATA,  tracing_data,   false),
+       FEAT_OPN(BUILD_ID,      build_id,       false),
+       FEAT_OPR(HOSTNAME,      hostname,       false),
+       FEAT_OPR(OSRELEASE,     osrelease,      false),
+       FEAT_OPR(VERSION,       version,        false),
+       FEAT_OPR(ARCH,          arch,           false),
+       FEAT_OPR(NRCPUS,        nrcpus,         false),
+       FEAT_OPR(CPUDESC,       cpudesc,        false),
+       FEAT_OPR(CPUID,         cpuid,          false),
+       FEAT_OPR(TOTAL_MEM,     total_mem,      false),
+       FEAT_OPR(EVENT_DESC,    event_desc,     false),
+       FEAT_OPR(CMDLINE,       cmdline,        false),
+       FEAT_OPR(CPU_TOPOLOGY,  cpu_topology,   true),
+       FEAT_OPR(NUMA_TOPOLOGY, numa_topology,  true),
+       FEAT_OPN(BRANCH_STACK,  branch_stack,   false),
+       FEAT_OPR(PMU_MAPPINGS,  pmu_mappings,   false),
+       FEAT_OPN(GROUP_DESC,    group_desc,     false),
+       FEAT_OPN(AUXTRACE,      auxtrace,       false),
+       FEAT_OPN(STAT,          stat,           false),
+       FEAT_OPN(CACHE,         cache,          true),
 };
 
 struct header_print_data {