void JitCompiler::ParseCompilerOptions() { // Special case max code units for inlining, whose default is "unset" (implictly // meaning no limit). Do this before parsing the actual passed options.
compiler_options_->SetInlineMaxCodeUnits(CompilerOptions::kDefaultInlineMaxCodeUnits);
Runtime* runtime = Runtime::Current();
{
std::string error_msg; if (!compiler_options_->ParseCompilerOptions(runtime->GetCompilerOptions(), /*ignore_unrecognized=*/ true,
&error_msg)) {
LOG(FATAL) << error_msg;
UNREACHABLE();
}
} // Set to appropriate JIT compiler type.
compiler_options_->compiler_type_ = runtime->IsZygote()
? CompilerOptions::CompilerType::kSharedCodeJitCompiler
: CompilerOptions::CompilerType::kJitCompiler; // JIT is never PIC, no matter what the runtime compiler options specify.
compiler_options_->SetNonPic();
// Set the appropriate read barrier option.
compiler_options_->emit_read_barrier_ = gUseReadBarrier;
// If the options don't provide whether we generate debuggable code, set // debuggability based on the runtime value. if (!compiler_options_->GetDebuggable()) {
compiler_options_->SetDebuggable(runtime->IsJavaDebuggable());
}
const InstructionSet instruction_set = compiler_options_->GetInstructionSet(); if (kRuntimeISA == InstructionSet::kArm) {
DCHECK_EQ(instruction_set, InstructionSet::kThumb2);
} else {
DCHECK_EQ(instruction_set, kRuntimeISA);
}
std::unique_ptr<const InstructionSetFeatures> instruction_set_features; for (const std::string& option : runtime->GetCompilerOptions()) {
VLOG(compiler) << "JIT compiler option " << option;
std::string error_msg; if (option.starts_with("--instruction-set-variant=")) { constchar* str = option.c_str() + strlen("--instruction-set-variant=");
VLOG(compiler) << "JIT instruction set variant " << str;
instruction_set_features = InstructionSetFeatures::FromVariantAndHwcap(
instruction_set, str, &error_msg); if (instruction_set_features == nullptr) {
LOG(WARNING) << "Error parsing " << option << " message=" << error_msg;
}
} elseif (option.starts_with("--instruction-set-features=")) { constchar* str = option.c_str() + strlen("--instruction-set-features=");
VLOG(compiler) << "JIT instruction set features " << str; if (instruction_set_features == nullptr) {
instruction_set_features = InstructionSetFeatures::FromVariant(
instruction_set, "default", &error_msg); if (instruction_set_features == nullptr) {
LOG(WARNING) << "Error parsing " << option << " message=" << error_msg;
}
}
instruction_set_features =
instruction_set_features->AddFeaturesFromString(str, &error_msg); if (instruction_set_features == nullptr) {
LOG(WARNING) << "Error parsing " << option << " message=" << error_msg;
}
} elseif (option.starts_with("--huge-method-max=")) { constchar* str = option.c_str() + strlen("--huge-method-max=");
VLOG(compiler) << "JIT huge method threshold " << str; int huge_method_threshold = static_cast<int>(strtol(str, NULL, 0)); if (huge_method_threshold <= 0) {
LOG(WARNING) << "Invalid huge method threshold: " << huge_method_threshold;
} else {
compiler_options_->SetHugeMethodThreshold(huge_method_threshold);
}
} elseif (option.starts_with("--inline-max-code-units=")) { constchar* str = option.c_str() + strlen("--inline-max-code-units=");
VLOG(compiler) << "JIT inline max number of code units " << str; int inline_max_code_units = static_cast<int>(strtol(str, NULL, 0)); if (inline_max_code_units <= 0) {
LOG(WARNING) << "Invalid inline max code units: " << inline_max_code_units;
} else {
compiler_options_->SetInlineMaxCodeUnits(inline_max_code_units);
}
} elseif (option.starts_with("--inline-max-total-instructions=")) { constchar* str = option.c_str() + strlen("--inline-max-total-instructions=");
VLOG(compiler) << "JIT inline max number of total instructions " << str; int inline_max_total_instructions = static_cast<int>(strtol(str, NULL, 0)); if (inline_max_total_instructions <= 0) {
LOG(WARNING) << "Invalid inline max total instructions: "
<< inline_max_total_instructions;
} else {
compiler_options_->SetInlineMaximumNumberOfTotalInstructions(inline_max_total_instructions);
}
} elseif (option.starts_with("--inline-max-instructions-for-small-method=")) { constchar* str = option.c_str() + strlen("--inline-max-instructions-for-small-method=");
VLOG(compiler) << "JIT inline max number of instructions for small method " << str; int inline_max_instructions_for_small_method = static_cast<int>(strtol(str, NULL, 0)); if (inline_max_instructions_for_small_method <= 0) {
LOG(WARNING) << "Invalid inline max instructions for small method: "
<< inline_max_instructions_for_small_method;
} else {
compiler_options_->SetInlineMaximumNumberOfInstructionsForSmallMethod(
inline_max_instructions_for_small_method);
}
} elseif (option.starts_with("--inline-max-cumulated-dex-registers=")) { constchar* str = option.c_str() + strlen("--inline-max-cumulated-dex-registers=");
VLOG(compiler) << "JIT inline max number of cumulated dex registers " << str; int inline_max_cumulated_dex_registers = static_cast<int>(strtol(str, NULL, 0)); if (inline_max_cumulated_dex_registers <= 0) {
LOG(WARNING) << "Invalid inline max cumulated dex registers: "
<< inline_max_cumulated_dex_registers;
} else {
compiler_options_->SetInlineMaximumNumberOfCumulatedDexRegisters(
inline_max_cumulated_dex_registers);
}
} elseif (option.starts_with("--inline-max-recursive-calls=")) { constchar* str = option.c_str() + strlen("--inline-max-recursive-calls=");
VLOG(compiler) << "JIT inline max number of recursive calls " << str; int inline_max_recursive_calls = static_cast<int>(strtol(str, NULL, 0)); if (inline_max_recursive_calls <= 0) {
LOG(WARNING) << "Invalid inline max recursive calls: " << inline_max_recursive_calls;
} else {
compiler_options_->SetInlineMaximumNumberOfRecursiveCalls(inline_max_recursive_calls);
}
}
}
if (instruction_set_features == nullptr) { // '--instruction-set-features/--instruction-set-variant' were not used. // Use build-time defined features.
instruction_set_features = InstructionSetFeatures::FromCppDefines();
}
compiler_options_->instruction_set_features_ = std::move(instruction_set_features);
if (compiler_options_->GetGenerateDebugInfo()) {
jit_logger_.reset(new JitLogger());
jit_logger_->OpenLog();
}
// If we don't have a new task following this compile, // trim maps to reduce memory usage. if (jit->GetThreadPool() == nullptr || jit->GetThreadPool()->GetTaskCount(self) == 0) {
TimingLogger::ScopedTiming t2("TrimMaps", &logger);
runtime->GetJitArenaPool()->TrimMaps();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.