objtool: Ditch subcommands
Objtool has a fairly singular focus. It runs on object files and does validations and transformations which can be combined in various ways. The subcommand model has never been a good fit, making it awkward to combine and remove options. Remove the "check" and "orc" subcommands in favor of a more traditional cmdline option model. This makes it much more flexible to use, and easier to port individual features to other arches. Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Link: https://lkml.kernel.org/r/5c61ebf805e90aefc5fa62bc63468ffae53b9df6.1650300597.git.jpoimboe@redhat.com
This commit is contained in:
committed by
Peter Zijlstra
parent
2daf7faba7
commit
b51277eb97
+1
-96
@@ -3,16 +3,6 @@
|
||||
* Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* objtool:
|
||||
*
|
||||
* The 'check' subcmd analyzes every .o file and ensures the validity of its
|
||||
* stack trace metadata. It enforces a set of rules on asm code and C inline
|
||||
* assembly code so that stack traces can be reliable.
|
||||
*
|
||||
* For more information, see tools/objtool/Documentation/stack-validation.txt.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
@@ -26,20 +16,6 @@
|
||||
#include <objtool/objtool.h>
|
||||
#include <objtool/warn.h>
|
||||
|
||||
struct cmd_struct {
|
||||
const char *name;
|
||||
int (*fn)(int, const char **);
|
||||
const char *help;
|
||||
};
|
||||
|
||||
static const char objtool_usage_string[] =
|
||||
"objtool COMMAND [ARGS]";
|
||||
|
||||
static struct cmd_struct objtool_cmds[] = {
|
||||
{"check", cmd_check, "Perform stack metadata validation on an object file" },
|
||||
{"orc", cmd_orc, "Generate in-place ORC unwind tables for an object file" },
|
||||
};
|
||||
|
||||
bool help;
|
||||
|
||||
const char *objname;
|
||||
@@ -161,70 +137,6 @@ void objtool_pv_add(struct objtool_file *f, int idx, struct symbol *func)
|
||||
f->pv_ops[idx].clean = false;
|
||||
}
|
||||
|
||||
static void cmd_usage(void)
|
||||
{
|
||||
unsigned int i, longest = 0;
|
||||
|
||||
printf("\n usage: %s\n\n", objtool_usage_string);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(objtool_cmds); i++) {
|
||||
if (longest < strlen(objtool_cmds[i].name))
|
||||
longest = strlen(objtool_cmds[i].name);
|
||||
}
|
||||
|
||||
puts(" Commands:");
|
||||
for (i = 0; i < ARRAY_SIZE(objtool_cmds); i++) {
|
||||
printf(" %-*s ", longest, objtool_cmds[i].name);
|
||||
puts(objtool_cmds[i].help);
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
if (!help)
|
||||
exit(129);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void handle_options(int *argc, const char ***argv)
|
||||
{
|
||||
while (*argc > 0) {
|
||||
const char *cmd = (*argv)[0];
|
||||
|
||||
if (cmd[0] != '-')
|
||||
break;
|
||||
|
||||
if (!strcmp(cmd, "--help") || !strcmp(cmd, "-h")) {
|
||||
help = true;
|
||||
break;
|
||||
} else {
|
||||
fprintf(stderr, "Unknown option: %s\n", cmd);
|
||||
cmd_usage();
|
||||
}
|
||||
|
||||
(*argv)++;
|
||||
(*argc)--;
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_internal_command(int argc, const char **argv)
|
||||
{
|
||||
const char *cmd = argv[0];
|
||||
unsigned int i, ret;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(objtool_cmds); i++) {
|
||||
struct cmd_struct *p = objtool_cmds+i;
|
||||
|
||||
if (strcmp(p->name, cmd))
|
||||
continue;
|
||||
|
||||
ret = p->fn(argc, argv);
|
||||
|
||||
exit(ret);
|
||||
}
|
||||
|
||||
cmd_usage();
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
static const char *UNUSED = "OBJTOOL_NOT_IMPLEMENTED";
|
||||
@@ -233,14 +145,7 @@ int main(int argc, const char **argv)
|
||||
exec_cmd_init("objtool", UNUSED, UNUSED, UNUSED);
|
||||
pager_init(UNUSED);
|
||||
|
||||
argv++;
|
||||
argc--;
|
||||
handle_options(&argc, &argv);
|
||||
|
||||
if (!argc || help)
|
||||
cmd_usage();
|
||||
|
||||
handle_internal_command(argc, argv);
|
||||
objtool_run(argc, argv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user