|
@@ -1466,25 +1466,48 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static int process_trace_info(struct perf_file_section *section __unused,
|
|
|
+ struct perf_header *ph __unused,
|
|
|
+ int feat __unused, int fd)
|
|
|
+{
|
|
|
+ trace_report(fd, false);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int process_build_id(struct perf_file_section *section,
|
|
|
+ struct perf_header *ph,
|
|
|
+ int feat __unused, int fd)
|
|
|
+{
|
|
|
+ if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
|
|
|
+ pr_debug("Failed to read buildids, continuing...\n");
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
struct feature_ops {
|
|
|
int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist);
|
|
|
void (*print)(struct perf_header *h, int fd, FILE *fp);
|
|
|
+ int (*process)(struct perf_file_section *section,
|
|
|
+ struct perf_header *h, int feat, int fd);
|
|
|
const char *name;
|
|
|
bool full_only;
|
|
|
};
|
|
|
|
|
|
#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, .full_only = true }
|
|
|
+ [n] = { .name = #n, .write = write_##func, .print = print_##func, \
|
|
|
+ .full_only = true }
|
|
|
|
|
|
/* feature_ops not implemented: */
|
|
|
#define print_trace_info NULL
|
|
|
#define print_build_id NULL
|
|
|
|
|
|
static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
|
|
|
- FEAT_OPA(HEADER_TRACE_INFO, trace_info),
|
|
|
- FEAT_OPA(HEADER_BUILD_ID, build_id),
|
|
|
+ FEAT_OPP(HEADER_TRACE_INFO, trace_info),
|
|
|
+ FEAT_OPP(HEADER_BUILD_ID, build_id),
|
|
|
FEAT_OPA(HEADER_HOSTNAME, hostname),
|
|
|
FEAT_OPA(HEADER_OSRELEASE, osrelease),
|
|
|
FEAT_OPA(HEADER_VERSION, version),
|
|
@@ -1900,19 +1923,10 @@ static int perf_file_section__process(struct perf_file_section *section,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- switch (feat) {
|
|
|
- case HEADER_TRACE_INFO:
|
|
|
- trace_report(fd, false);
|
|
|
- break;
|
|
|
- case HEADER_BUILD_ID:
|
|
|
- if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
|
|
|
- pr_debug("Failed to read buildids, continuing...\n");
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
+ if (!feat_ops[feat].process)
|
|
|
+ return 0;
|
|
|
|
|
|
- return 0;
|
|
|
+ return feat_ops[feat].process(section, ph, feat, fd);
|
|
|
}
|
|
|
|
|
|
static int perf_file_header__read_pipe(struct perf_pipe_file_header *header,
|