diff options
author | Andreas Gampe <agampe@google.com> | 2017-08-23 08:57:51 -0700 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2017-10-06 13:22:08 -0700 |
commit | 097f34cc09caf46945ec17e198f57ac9c156e904 (patch) | |
tree | 2f478bcc58ac21017431505ca87e83f4606355b4 /compiler/driver/compiler_options.cc | |
parent | 42e482f0615bd935d1426a749a413be2c3f79114 (diff) |
ART: Use CmdlineParser in dex2oat
Refactor dex2oat and the compiler to use the cmdline parser. In
an effort to standardize command-line parsing and make it easier
to add new properties in a principled manner.
Test: m test-art-host
Change-Id: Ia077a56234dbf579d7ca3430fef325b57aa06333
Diffstat (limited to 'compiler/driver/compiler_options.cc')
-rw-r--r-- | compiler/driver/compiler_options.cc | 131 |
1 files changed, 36 insertions, 95 deletions
diff --git a/compiler/driver/compiler_options.cc b/compiler/driver/compiler_options.cc index 538845de19..b6cedff28a 100644 --- a/compiler/driver/compiler_options.cc +++ b/compiler/driver/compiler_options.cc @@ -18,7 +18,13 @@ #include <fstream> +#include "android-base/stringprintf.h" + +#include "base/variant_map.h" +#include "cmdline_parser.h" +#include "compiler_options_map-inl.h" #include "runtime.h" +#include "simple_compiler_options_map.h" namespace art { @@ -71,115 +77,50 @@ bool CompilerOptions::EmitRunTimeChecksInDebugMode() const { (kIsTargetBuild || IsCoreImage() || Runtime::Current()->UseJitCompilation()); } -void CompilerOptions::ParseHugeMethodMax(const StringPiece& option, UsageFn Usage) { - ParseUintOption(option, "--huge-method-max", &huge_method_threshold_, Usage); -} - -void CompilerOptions::ParseLargeMethodMax(const StringPiece& option, UsageFn Usage) { - ParseUintOption(option, "--large-method-max", &large_method_threshold_, Usage); -} - -void CompilerOptions::ParseSmallMethodMax(const StringPiece& option, UsageFn Usage) { - ParseUintOption(option, "--small-method-max", &small_method_threshold_, Usage); -} - -void CompilerOptions::ParseTinyMethodMax(const StringPiece& option, UsageFn Usage) { - ParseUintOption(option, "--tiny-method-max", &tiny_method_threshold_, Usage); -} - -void CompilerOptions::ParseNumDexMethods(const StringPiece& option, UsageFn Usage) { - ParseUintOption(option, "--num-dex-methods", &num_dex_methods_threshold_, Usage); -} - -void CompilerOptions::ParseInlineMaxCodeUnits(const StringPiece& option, UsageFn Usage) { - ParseUintOption(option, "--inline-max-code-units", &inline_max_code_units_, Usage); -} - -void CompilerOptions::ParseDumpInitFailures(const StringPiece& option, - UsageFn Usage ATTRIBUTE_UNUSED) { - DCHECK(option.starts_with("--dump-init-failures=")); - std::string file_name = option.substr(strlen("--dump-init-failures=")).data(); - init_failure_output_.reset(new std::ofstream(file_name)); +bool CompilerOptions::ParseDumpInitFailures(const std::string& option, std::string* error_msg) { + init_failure_output_.reset(new std::ofstream(option)); if (init_failure_output_.get() == nullptr) { - LOG(ERROR) << "Failed to allocate ofstream"; + *error_msg = "Failed to construct std::ofstream"; + return false; } else if (init_failure_output_->fail()) { - LOG(ERROR) << "Failed to open " << file_name << " for writing the initialization " - << "failures."; + *error_msg = android::base::StringPrintf( + "Failed to open %s for writing the initialization failures.", option.c_str()); init_failure_output_.reset(); + return false; } + return true; } -void CompilerOptions::ParseRegisterAllocationStrategy(const StringPiece& option, - UsageFn Usage) { - DCHECK(option.starts_with("--register-allocation-strategy=")); - StringPiece choice = option.substr(strlen("--register-allocation-strategy=")).data(); - if (choice == "linear-scan") { +bool CompilerOptions::ParseRegisterAllocationStrategy(const std::string& option, + std::string* error_msg) { + if (option == "linear-scan") { register_allocation_strategy_ = RegisterAllocator::Strategy::kRegisterAllocatorLinearScan; - } else if (choice == "graph-color") { + } else if (option == "graph-color") { register_allocation_strategy_ = RegisterAllocator::Strategy::kRegisterAllocatorGraphColor; } else { - Usage("Unrecognized register allocation strategy. Try linear-scan, or graph-color."); + *error_msg = "Unrecognized register allocation strategy. Try linear-scan, or graph-color."; + return false; } + return true; } -bool CompilerOptions::ParseCompilerOption(const StringPiece& option, UsageFn Usage) { - if (option.starts_with("--compiler-filter=")) { - const char* compiler_filter_string = option.substr(strlen("--compiler-filter=")).data(); - if (!CompilerFilter::ParseCompilerFilter(compiler_filter_string, &compiler_filter_)) { - Usage("Unknown --compiler-filter value %s", compiler_filter_string); - } - } else if (option == "--compile-pic") { - compile_pic_ = true; - } else if (option.starts_with("--huge-method-max=")) { - ParseHugeMethodMax(option, Usage); - } else if (option.starts_with("--large-method-max=")) { - ParseLargeMethodMax(option, Usage); - } else if (option.starts_with("--small-method-max=")) { - ParseSmallMethodMax(option, Usage); - } else if (option.starts_with("--tiny-method-max=")) { - ParseTinyMethodMax(option, Usage); - } else if (option.starts_with("--num-dex-methods=")) { - ParseNumDexMethods(option, Usage); - } else if (option.starts_with("--inline-max-code-units=")) { - ParseInlineMaxCodeUnits(option, Usage); - } else if (option == "--generate-debug-info" || option == "-g") { - generate_debug_info_ = true; - } else if (option == "--no-generate-debug-info") { - generate_debug_info_ = false; - } else if (option == "--generate-mini-debug-info") { - generate_mini_debug_info_ = true; - } else if (option == "--no-generate-mini-debug-info") { - generate_mini_debug_info_ = false; - } else if (option == "--generate-build-id") { - generate_build_id_ = true; - } else if (option == "--no-generate-build-id") { - generate_build_id_ = false; - } else if (option == "--debuggable") { - debuggable_ = true; - } else if (option.starts_with("--top-k-profile-threshold=")) { - ParseDouble(option.data(), '=', 0.0, 100.0, &top_k_profile_threshold_, Usage); - } else if (option == "--abort-on-hard-verifier-error") { - abort_on_hard_verifier_failure_ = true; - } else if (option == "--no-abort-on-hard-verifier-error") { - abort_on_hard_verifier_failure_ = false; - } else if (option.starts_with("--dump-init-failures=")) { - ParseDumpInitFailures(option, Usage); - } else if (option.starts_with("--dump-cfg=")) { - dump_cfg_file_name_ = option.substr(strlen("--dump-cfg=")).data(); - } else if (option == "--dump-cfg-append") { - dump_cfg_append_ = true; - } else if (option.starts_with("--register-allocation-strategy=")) { - ParseRegisterAllocationStrategy(option, Usage); - } else if (option.starts_with("--verbose-methods=")) { - // TODO: rather than switch off compiler logging, make all VLOG(compiler) messages - // conditional on having verbose methods. - gLogVerbosity.compiler = false; - Split(option.substr(strlen("--verbose-methods=")).ToString(), ',', &verbose_methods_); - } else { - // Option not recognized. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wframe-larger-than=" + +bool CompilerOptions::ParseCompilerOptions(const std::vector<std::string>& options, + bool ignore_unrecognized, + std::string* error_msg) { + auto parser = CreateSimpleParser(ignore_unrecognized); + CmdlineResult parse_result = parser.Parse(options); + if (!parse_result.IsSuccess()) { + *error_msg = parse_result.GetMessage(); return false; } - return true; + + SimpleParseArgumentMap args = parser.ReleaseArgumentsMap(); + return ReadCompilerOptions(args, this, error_msg); } +#pragma GCC diagnostic pop + } // namespace art |