diff options
Diffstat (limited to 'src/tools/wasm-objdump.cc')
-rw-r--r-- | src/tools/wasm-objdump.cc | 131 |
1 files changed, 31 insertions, 100 deletions
diff --git a/src/tools/wasm-objdump.cc b/src/tools/wasm-objdump.cc index eaa9ece7..ec967c4e 100644 --- a/src/tools/wasm-objdump.cc +++ b/src/tools/wasm-objdump.cc @@ -25,46 +25,14 @@ #include "binary-reader.h" #include "binary-reader-objdump.h" -#define PROGRAM_NAME "wasm-objdump" - -#define NOPE HasArgument::No -#define YEP HasArgument::Yes - using namespace wabt; -enum { - FLAG_HEADERS, - FLAG_SECTION, - FLAG_RAW, - FLAG_DISASSEMBLE, - FLAG_DEBUG, - FLAG_DETAILS, - FLAG_RELOCS, - FLAG_HELP, - NUM_FLAGS -}; - static const char s_description[] = - " Print information about the contents of wasm binaries.\n" - "\n" - "examples:\n" - " $ wasm-objdump test.wasm\n"; - -static Option s_options[] = { - {FLAG_HEADERS, 'h', "headers", nullptr, NOPE, "print headers"}, - {FLAG_SECTION, 'j', "section", nullptr, YEP, "select just one section"}, - {FLAG_RAW, 's', "full-contents", nullptr, NOPE, - "print raw section contents"}, - {FLAG_DISASSEMBLE, 'd', "disassemble", nullptr, NOPE, - "disassemble function bodies"}, - {FLAG_DEBUG, '\0', "debug", nullptr, NOPE, "print extra debug information"}, - {FLAG_DETAILS, 'x', "details", nullptr, NOPE, "Show section details"}, - {FLAG_RELOCS, 'r', "reloc", nullptr, NOPE, - "show relocations inline with disassembly"}, - {FLAG_HELP, 'h', "help", nullptr, NOPE, "print this help message"}, -}; - -WABT_STATIC_ASSERT(NUM_FLAGS == WABT_ARRAY_SIZE(s_options)); +R"( Print information about the contents of wasm binaries. + +examples: + $ wasm-objdump test.wasm +)"; static ObjdumpOptions s_objdump_options; @@ -72,70 +40,33 @@ static std::vector<const char*> s_infiles; static std::unique_ptr<FileStream> s_log_stream; -static void on_argument(struct OptionParser* parser, const char* argument) { - s_infiles.push_back(argument); -} - -static void on_option(struct OptionParser* parser, - struct Option* option, - const char* argument) { - switch (option->id) { - case FLAG_HEADERS: - s_objdump_options.headers = true; - break; - - case FLAG_RAW: - s_objdump_options.raw = true; - break; - - case FLAG_DEBUG: - s_objdump_options.debug = true; - s_log_stream = FileStream::CreateStdout(); - s_objdump_options.log_stream = s_log_stream.get(); - break; - - case FLAG_DISASSEMBLE: - s_objdump_options.disassemble = true; - break; - - case FLAG_DETAILS: - s_objdump_options.details = true; - break; - - case FLAG_RELOCS: - s_objdump_options.relocs = true; - break; - - case FLAG_SECTION: - s_objdump_options.section_name = argument; - break; - - case FLAG_HELP: - print_help(parser, PROGRAM_NAME); - exit(0); - break; - } -} - -static void on_option_error(struct OptionParser* parser, const char* message) { - WABT_FATAL("%s\n", message); -} - static void parse_options(int argc, char** argv) { - OptionParser parser; - WABT_ZERO_MEMORY(parser); - parser.description = s_description; - parser.options = s_options; - parser.num_options = WABT_ARRAY_SIZE(s_options); - parser.on_option = on_option; - parser.on_argument = on_argument; - parser.on_error = on_option_error; - parse_options(&parser, argc, argv); - - if (s_infiles.size() == 0) { - print_help(&parser, PROGRAM_NAME); - WABT_FATAL("No filename given.\n"); - } + OptionParser parser("wasm-objdump", s_description); + + parser.AddOption('h', "headers", "Print headers", + []() { s_objdump_options.headers = true; }); + parser.AddOption( + 'j', "section", "SECTION", "Select just one section", + [](const char* argument) { s_objdump_options.section_name = argument; }); + parser.AddOption('s', "full-contents", "Print raw section contents", + []() { s_objdump_options.raw = true; }); + parser.AddOption('d', "disassemble", "Disassemble function bodies", + []() { s_objdump_options.disassemble = true; }); + parser.AddOption("debug", "Print extra debug information", []() { + s_objdump_options.debug = true; + s_log_stream = FileStream::CreateStdout(); + s_objdump_options.log_stream = s_log_stream.get(); + }); + parser.AddOption('x', "details", "Show section details", + []() { s_objdump_options.details = true; }); + parser.AddOption('r', "reloc", "Show relocations inline with disassembly", + []() { s_objdump_options.relocs = true; }); + parser.AddHelpOption(); + parser.AddArgument( + "filename", OptionParser::ArgumentCount::OneOrMore, + [](const char* argument) { s_infiles.push_back(argument); }); + + parser.Parse(argc, argv); } Result dump_file(const char* filename) { |