There are three FEAT_OP* macros:
  - FEAT_OPA: for features without process record.
  - FEAT_OPP: for features with process record.
  - FEAT_OPF: like FEAT_OPP but to show only if show_full_info flags
    is set.

To add pipe-mode headers we need to specify whether a feature generates a
corresponding sample record. This is an extra variation to the existing
macros. To simplify, redefine macros instead so that:
  - show_full_info is specified as an argument (to remove the
  FEAT_OPF variation) and,
  - it always sets "process" handler (to remove the FEAT_OPA variation).
  Individual process handlers can be NULLed individually.

This allows to define two variations only:
  - FEAT_OPR: has sample record.
  - FEAT_OPN: doesn't has sample record.

Signed-off-by: David Carrillo-Cisneros <davi...@google.com>
---
 tools/perf/util/header.c | 72 +++++++++++++++++++++++++++++-------------------
 1 file changed, 44 insertions(+), 28 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index b7704b30ed52..7aa84a02b9bd 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -11,6 +11,7 @@
 #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>
@@ -2106,42 +2107,57 @@ struct feature_ops {
        int (*process)(struct feat_fd *fd, void *data);
        const char *name;
        bool full_only;
+       bool has_record;
 };
 
-#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(HEADER_##n),                \
+               .write = write_##func,                          \
+               .print = print_##func,                          \
+               .full_only = __full_only,                       \
+               .process = process_##func,                      \
+               .has_record = true                              \
+       }
+
+#define FEAT_OPN(n, func, __full_only) \
+       [HEADER_##n] = {                                        \
+               .name = __stringify(HEADER_##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 {
-- 
2.13.0.219.gdb65acc882-goog

Reply via email to