in dex2oat/dex2oat.cc [1041:1182]
void ParseArgs(int argc, char** argv) {
original_argc = argc;
original_argv = argv;
InitLogging(argv);
// Skip over argv[0].
argv++;
argc--;
if (argc == 0) {
Usage("No arguments specified");
}
std::unique_ptr<ParserOptions> parser_options(new ParserOptions());
compiler_options_.reset(new CompilerOptions());
for (int i = 0; i < argc; i++) {
const StringPiece option(argv[i]);
const bool log_options = false;
if (log_options) {
LOG(INFO) << "dex2oat: option[" << i << "]=" << argv[i];
}
if (option.starts_with("--dex-file=")) {
dex_filenames_.push_back(option.substr(strlen("--dex-file=")).data());
} else if (option.starts_with("--dex-location=")) {
dex_locations_.push_back(option.substr(strlen("--dex-location=")).data());
} else if (option.starts_with("--zip-fd=")) {
ParseZipFd(option);
} else if (option.starts_with("--zip-location=")) {
zip_location_ = option.substr(strlen("--zip-location=")).data();
} else if (option.starts_with("--oat-file=")) {
oat_filenames_.push_back(option.substr(strlen("--oat-file=")).data());
} else if (option.starts_with("--oat-symbols=")) {
parser_options->oat_symbols.push_back(option.substr(strlen("--oat-symbols=")).data());
} else if (option.starts_with("--oat-fd=")) {
ParseOatFd(option);
} else if (option == "--watch-dog") {
parser_options->watch_dog_enabled = true;
} else if (option == "--no-watch-dog") {
parser_options->watch_dog_enabled = false;
} else if (option.starts_with("-j")) {
ParseJ(option);
} else if (option.starts_with("--oat-location=")) {
oat_location_ = option.substr(strlen("--oat-location=")).data();
} else if (option.starts_with("--image=")) {
image_filenames_.push_back(option.substr(strlen("--image=")).data());
} else if (option.starts_with("--image-classes=")) {
image_classes_filename_ = option.substr(strlen("--image-classes=")).data();
} else if (option.starts_with("--image-classes-zip=")) {
image_classes_zip_filename_ = option.substr(strlen("--image-classes-zip=")).data();
} else if (option.starts_with("--image-format=")) {
ParseImageFormat(option);
} else if (option.starts_with("--compiled-classes=")) {
compiled_classes_filename_ = option.substr(strlen("--compiled-classes=")).data();
} else if (option.starts_with("--compiled-classes-zip=")) {
compiled_classes_zip_filename_ = option.substr(strlen("--compiled-classes-zip=")).data();
} else if (option.starts_with("--compiled-methods=")) {
compiled_methods_filename_ = option.substr(strlen("--compiled-methods=")).data();
} else if (option.starts_with("--compiled-methods-zip=")) {
compiled_methods_zip_filename_ = option.substr(strlen("--compiled-methods-zip=")).data();
} else if (option.starts_with("--base=")) {
ParseBase(option);
} else if (option.starts_with("--boot-image=")) {
parser_options->boot_image_filename = option.substr(strlen("--boot-image=")).data();
} else if (option.starts_with("--android-root=")) {
android_root_ = option.substr(strlen("--android-root=")).data();
} else if (option.starts_with("--instruction-set=")) {
ParseInstructionSet(option);
} else if (option.starts_with("--instruction-set-variant=")) {
ParseInstructionSetVariant(option, parser_options.get());
} else if (option.starts_with("--instruction-set-features=")) {
ParseInstructionSetFeatures(option, parser_options.get());
} else if (option.starts_with("--compiler-backend=")) {
ParseCompilerBackend(option, parser_options.get());
} else if (option.starts_with("--profile-file=")) {
profile_file_ = option.substr(strlen("--profile-file=")).ToString();
} else if (option.starts_with("--profile-file-fd=")) {
ParseUintOption(option, "--profile-file-fd", &profile_file_fd_, Usage);
} else if (option == "--host") {
is_host_ = true;
} else if (option == "--runtime-arg") {
if (++i >= argc) {
Usage("Missing required argument for --runtime-arg");
}
if (log_options) {
LOG(INFO) << "dex2oat: option[" << i << "]=" << argv[i];
}
runtime_args_.push_back(argv[i]);
} else if (option == "--dump-timing") {
dump_timing_ = true;
} else if (option == "--dump-passes") {
dump_passes_ = true;
} else if (option == "--dump-stats") {
dump_stats_ = true;
} else if (option.starts_with("--swap-file=")) {
swap_file_name_ = option.substr(strlen("--swap-file=")).data();
} else if (option.starts_with("--swap-fd=")) {
ParseUintOption(option, "--swap-fd", &swap_fd_, Usage);
} else if (option.starts_with("--swap-dex-size-threshold=")) {
ParseUintOption(option,
"--swap-dex-size-threshold",
&min_dex_file_cumulative_size_for_swap_,
Usage);
} else if (option.starts_with("--swap-dex-count-threshold=")) {
ParseUintOption(option,
"--swap-dex-count-threshold",
&min_dex_files_for_swap_,
Usage);
} else if (option.starts_with("--very-large-app-threshold=")) {
ParseUintOption(option,
"--very-large-app-threshold",
&very_large_threshold_,
Usage);
} else if (option.starts_with("--app-image-file=")) {
app_image_file_name_ = option.substr(strlen("--app-image-file=")).data();
} else if (option.starts_with("--app-image-fd=")) {
ParseUintOption(option, "--app-image-fd", &app_image_fd_, Usage);
} else if (option.starts_with("--verbose-methods=")) {
// TODO: rather than switch off compiler logging, make all VLOG(compiler) messages
// conditional on having verbost methods.
gLogVerbosity.compiler = false;
Split(option.substr(strlen("--verbose-methods=")).ToString(), ',', &verbose_methods_);
} else if (option == "--multi-image") {
multi_image_ = true;
} else if (option.starts_with("--no-inline-from=")) {
no_inline_from_string_ = option.substr(strlen("--no-inline-from=")).data();
} else if (option == "--force-determinism") {
if (!SupportsDeterministicCompilation()) {
Usage("Cannot use --force-determinism with read barriers or non-CMS garbage collector");
}
force_determinism_ = true;
} else if (!compiler_options_->ParseCompilerOption(option, Usage)) {
Usage("Unknown argument %s", option.data());
}
}
ProcessOptions(parser_options.get());
// Insert some compiler things.
InsertCompileOptions(argc, argv);
}