2021-05-26 19:09:36 +00:00
// SPDX-License-Identifier: GPL-2.0
# include <linux/compiler.h>
# include <stdio.h>
# include <string.h>
# include "builtin.h"
# include "perf.h"
# include "debug.h"
# include <subcmd/parse-options.h>
# include "data-convert.h"
2021-09-23 16:59:15 +00:00
# include "data-convert-bt.h"
2021-05-26 19:09:36 +00:00
typedef int ( * data_cmd_fn_t ) ( int argc , const char * * argv ) ;
struct data_cmd {
const char * name ;
const char * summary ;
data_cmd_fn_t fn ;
} ;
static struct data_cmd data_cmds [ ] ;
# define for_each_cmd(cmd) \
for ( cmd = data_cmds ; cmd & & cmd - > name ; cmd + + )
static const struct option data_options [ ] = {
OPT_END ( )
} ;
static const char * const data_subcommands [ ] = { " convert " , NULL } ;
static const char * data_usage [ ] = {
" perf data [<common options>] <command> [<options>] " ,
NULL
} ;
static void print_usage ( void )
{
struct data_cmd * cmd ;
printf ( " Usage: \n " ) ;
printf ( " \t %s \n \n " , data_usage [ 0 ] ) ;
printf ( " \t Available commands: \n " ) ;
for_each_cmd ( cmd ) {
printf ( " \t %s \t - %s \n " , cmd - > name , cmd - > summary ) ;
}
printf ( " \n " ) ;
}
static const char * const data_convert_usage [ ] = {
" perf data convert [<options>] " ,
NULL
} ;
static int cmd_data_convert ( int argc , const char * * argv )
{
2021-09-23 16:59:15 +00:00
const char * to_ctf = NULL ;
2021-05-26 19:09:36 +00:00
struct perf_data_convert_opts opts = {
. force = false ,
. all = false ,
} ;
const struct option options [ ] = {
OPT_INCR ( ' v ' , " verbose " , & verbose , " be more verbose " ) ,
OPT_STRING ( ' i ' , " input " , & input_name , " file " , " input file name " ) ,
# ifdef HAVE_LIBBABELTRACE_SUPPORT
OPT_STRING ( 0 , " to-ctf " , & to_ctf , NULL , " Convert to CTF format " ) ,
OPT_BOOLEAN ( 0 , " tod " , & opts . tod , " Convert time to wall clock time " ) ,
# endif
OPT_BOOLEAN ( ' f ' , " force " , & opts . force , " don't complain, do it " ) ,
OPT_BOOLEAN ( 0 , " all " , & opts . all , " Convert all events " ) ,
OPT_END ( )
} ;
2021-09-23 16:59:15 +00:00
# ifndef HAVE_LIBBABELTRACE_SUPPORT
pr_err ( " No conversion support compiled in. perf should be compiled with environment variables LIBBABELTRACE=1 and LIBBABELTRACE_DIR=/path/to/libbabeltrace/ \n " ) ;
return - 1 ;
# endif
2021-05-26 19:09:36 +00:00
argc = parse_options ( argc , argv , options ,
data_convert_usage , 0 ) ;
if ( argc ) {
usage_with_options ( data_convert_usage , options ) ;
return - 1 ;
}
if ( to_ctf ) {
# ifdef HAVE_LIBBABELTRACE_SUPPORT
return bt_convert__perf2ctf ( input_name , to_ctf , & opts ) ;
# else
2021-09-23 16:59:15 +00:00
pr_err ( " The libbabeltrace support is not compiled in. \n " ) ;
2021-05-26 19:09:36 +00:00
return - 1 ;
# endif
}
return 0 ;
}
static struct data_cmd data_cmds [ ] = {
{ " convert " , " converts data file between formats " , cmd_data_convert } ,
{ . name = NULL , } ,
} ;
int cmd_data ( int argc , const char * * argv )
{
struct data_cmd * cmd ;
const char * cmdstr ;
/* No command specified. */
if ( argc < 2 )
goto usage ;
argc = parse_options_subcommand ( argc , argv , data_options , data_subcommands , data_usage ,
PARSE_OPT_STOP_AT_NON_OPTION ) ;
if ( argc < 1 )
goto usage ;
cmdstr = argv [ 0 ] ;
for_each_cmd ( cmd ) {
if ( strcmp ( cmd - > name , cmdstr ) )
continue ;
return cmd - > fn ( argc , argv ) ;
}
pr_err ( " Unknown command: %s \n " , cmdstr ) ;
usage :
print_usage ( ) ;
return - 1 ;
}