linux/tools/perf/builtin-data.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/compiler.h>
   3#include "builtin.h"
   4#include "perf.h"
   5#include "debug.h"
   6#include <subcmd/parse-options.h>
   7#include "data-convert.h"
   8#include "data-convert-bt.h"
   9
  10typedef int (*data_cmd_fn_t)(int argc, const char **argv);
  11
  12struct data_cmd {
  13        const char      *name;
  14        const char      *summary;
  15        data_cmd_fn_t   fn;
  16};
  17
  18static struct data_cmd data_cmds[];
  19
  20#define for_each_cmd(cmd) \
  21        for (cmd = data_cmds; cmd && cmd->name; cmd++)
  22
  23static const struct option data_options[] = {
  24        OPT_END()
  25};
  26
  27static const char * const data_subcommands[] = { "convert", NULL };
  28
  29static const char *data_usage[] = {
  30        "perf data [<common options>] <command> [<options>]",
  31        NULL
  32};
  33
  34static void print_usage(void)
  35{
  36        struct data_cmd *cmd;
  37
  38        printf("Usage:\n");
  39        printf("\t%s\n\n", data_usage[0]);
  40        printf("\tAvailable commands:\n");
  41
  42        for_each_cmd(cmd) {
  43                printf("\t %s\t- %s\n", cmd->name, cmd->summary);
  44        }
  45
  46        printf("\n");
  47}
  48
  49static const char * const data_convert_usage[] = {
  50        "perf data convert [<options>]",
  51        NULL
  52};
  53
  54static int cmd_data_convert(int argc, const char **argv)
  55{
  56        const char *to_ctf     = NULL;
  57        struct perf_data_convert_opts opts = {
  58                .force = false,
  59                .all = false,
  60        };
  61        const struct option options[] = {
  62                OPT_INCR('v', "verbose", &verbose, "be more verbose"),
  63                OPT_STRING('i', "input", &input_name, "file", "input file name"),
  64#ifdef HAVE_LIBBABELTRACE_SUPPORT
  65                OPT_STRING(0, "to-ctf", &to_ctf, NULL, "Convert to CTF format"),
  66#endif
  67                OPT_BOOLEAN('f', "force", &opts.force, "don't complain, do it"),
  68                OPT_BOOLEAN(0, "all", &opts.all, "Convert all events"),
  69                OPT_END()
  70        };
  71
  72#ifndef HAVE_LIBBABELTRACE_SUPPORT
  73        pr_err("No conversion support compiled in. perf should be compiled with environment variables LIBBABELTRACE=1 and LIBBABELTRACE_DIR=/path/to/libbabeltrace/\n");
  74        return -1;
  75#endif
  76
  77        argc = parse_options(argc, argv, options,
  78                             data_convert_usage, 0);
  79        if (argc) {
  80                usage_with_options(data_convert_usage, options);
  81                return -1;
  82        }
  83
  84        if (to_ctf) {
  85#ifdef HAVE_LIBBABELTRACE_SUPPORT
  86                return bt_convert__perf2ctf(input_name, to_ctf, &opts);
  87#else
  88                pr_err("The libbabeltrace support is not compiled in.\n");
  89                return -1;
  90#endif
  91        }
  92
  93        return 0;
  94}
  95
  96static struct data_cmd data_cmds[] = {
  97        { "convert", "converts data file between formats", cmd_data_convert },
  98        { .name = NULL, },
  99};
 100
 101int cmd_data(int argc, const char **argv)
 102{
 103        struct data_cmd *cmd;
 104        const char *cmdstr;
 105
 106        /* No command specified. */
 107        if (argc < 2)
 108                goto usage;
 109
 110        argc = parse_options_subcommand(argc, argv, data_options, data_subcommands, data_usage,
 111                             PARSE_OPT_STOP_AT_NON_OPTION);
 112        if (argc < 1)
 113                goto usage;
 114
 115        cmdstr = argv[0];
 116
 117        for_each_cmd(cmd) {
 118                if (strcmp(cmd->name, cmdstr))
 119                        continue;
 120
 121                return cmd->fn(argc, argv);
 122        }
 123
 124        pr_err("Unknown command: %s\n", cmdstr);
 125usage:
 126        print_usage();
 127        return -1;
 128}
 129