diff options
author | Andreas Gampe <agampe@google.com> | 2014-12-17 20:40:11 -0800 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2014-12-17 20:40:11 -0800 |
commit | c24f3990db5845691016b935df3d9382b6762f0f (patch) | |
tree | d5e295f60196d305583fa5b58120c9cc189f2127 /cmdline | |
parent | 55b752a817a08be46b167e07d7fee3d20a8e6a9c (diff) | |
download | art-c24f3990db5845691016b935df3d9382b6762f0f.zip art-c24f3990db5845691016b935df3d9382b6762f0f.tar.gz art-c24f3990db5845691016b935df3d9382b6762f0f.tar.bz2 |
ART: Fix oatdump
Refactor and modify cmdline.h to allow oatdump to run without a
Runtime.
Bug: 18789891
Change-Id: I1d7a1585e3672d04e58dbac9a4d4bd835c1c9143
Diffstat (limited to 'cmdline')
-rw-r--r-- | cmdline/cmdline.h | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/cmdline/cmdline.h b/cmdline/cmdline.h index c15594a..30012d0 100644 --- a/cmdline/cmdline.h +++ b/cmdline/cmdline.h @@ -221,18 +221,10 @@ struct CmdlineArgs { virtual ~CmdlineArgs() {} - protected: - virtual ParseStatus ParseCustom(const StringPiece& option, std::string* error_msg) { - UNUSED(option); - UNUSED(error_msg); - - return kParseUnknownArgument; - } - - virtual ParseStatus ParseChecks(std::string* error_msg) { + bool ParseCheckBootImage(std::string* error_msg) { if (boot_image_location_ == nullptr) { *error_msg = "--boot-image must be specified"; - return kParseError; + return false; } DBG_LOG << "boot image location: " << boot_image_location_; @@ -243,7 +235,7 @@ struct CmdlineArgs { size_t file_name_idx = boot_image_location.rfind("/"); if (file_name_idx == std::string::npos) { // Prevent a InsertIsaDirectory check failure. *error_msg = "Boot image location must have a / in it"; - return kParseError; + return false; } // Don't let image locations with the 'arch' in it through, since it's not a location. @@ -263,7 +255,7 @@ struct CmdlineArgs { if (GetInstructionSetFromString(parent_dir_name.c_str()) != kNone) { *error_msg = "Do not specify the architecture as part of the boot image location"; - return kParseError; + return false; } } @@ -272,19 +264,28 @@ struct CmdlineArgs { if (!LocationToFilename(boot_image_location, instruction_set_, &file_name)) { *error_msg = StringPrintf("No corresponding file for location '%s' exists", file_name.c_str()); - return kParseError; + return false; } DBG_LOG << "boot_image_filename does exist: " << file_name; } - return kParseOk; + return true; } - private: void PrintUsage() { fprintf(stderr, "%s", GetUsage().c_str()); } + + protected: + virtual ParseStatus ParseCustom(const StringPiece& option ATTRIBUTE_UNUSED, + std::string* error_msg ATTRIBUTE_UNUSED) { + return kParseUnknownArgument; + } + + virtual ParseStatus ParseChecks(std::string* error_msg ATTRIBUTE_UNUSED) { + return kParseOk; + } }; template <typename Args = CmdlineArgs> @@ -300,14 +301,21 @@ struct CmdlineMain { return EXIT_FAILURE; } - std::unique_ptr<Runtime> runtime = CreateRuntime(args.get()); - if (runtime == nullptr) { - return EXIT_FAILURE; - } - bool needs_runtime = NeedsRuntime(); + std::unique_ptr<Runtime> runtime; + if (needs_runtime) { + std::string error_msg; + if (!args_->ParseCheckBootImage(&error_msg)) { + fprintf(stderr, "%s\n", error_msg.c_str()); + args_->PrintUsage(); + return EXIT_FAILURE; + } + runtime.reset(CreateRuntime(args.get())); + if (runtime == nullptr) { + return EXIT_FAILURE; + } if (!ExecuteWithRuntime(runtime.get())) { return EXIT_FAILURE; } @@ -358,11 +366,10 @@ struct CmdlineMain { Args* args_ = nullptr; private: - std::unique_ptr<Runtime> CreateRuntime(CmdlineArgs* args) { + Runtime* CreateRuntime(CmdlineArgs* args) { CHECK(args != nullptr); - return std::unique_ptr<Runtime>(StartRuntime(args->boot_image_location_, - args->instruction_set_)); + return StartRuntime(args->boot_image_location_, args->instruction_set_); } }; } // namespace art |