// Describe and parse the command-line static std::vector<std::string> parseCommandLine(int argc, char *argv[], Partitioner2::Engine &engine) { using namespace Sawyer::CommandLine; std::string purpose = "simulate execution using concrete semantics"; std::string description = "Parses and loads the specimen and then executes its instructions in a concrete domain."; // The parser is the same as that created by Engine::commandLineParser except we don't need any partitioning switches since // this tool doesn't partition. Parser parser; parser .purpose(purpose) .version(std::string(ROSE_SCM_VERSION_ID).substr(0, 8), ROSE_CONFIGURE_DATE) .chapter(1, "ROSE Command-line Tools") .doc("Synopsis", "@prop{programName} [@v{switches}] @v{specimen_names}") .doc("Description", description) .doc("Specimens", engine.specimenNameDocumentation()) .with(engine.engineSwitches()) .with(engine.loaderSwitches()) .with(engine.disassemblerSwitches()); SwitchGroup tool("Tool switches"); tool.insert(Switch("start") .argument("address", nonNegativeIntegerParser(settings.startVa)) .doc("Address at which to start executing. If no address is specified then execution starts at the " "lowest address having execute permission.")); return parser.with(tool).parse(argc, argv).apply().unreachedArgs(); }