/* * Copyright 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "jit_options.h" #include "runtime_options.h" namespace art HIDDEN { namespace jit { // Maximum permitted threshold value. static constexpr uint32_t kJitMaxThreshold = std::numeric_limits::max(); static constexpr uint32_t kJitDefaultOptimizeThreshold = 0xffff; // Different optimization threshold constants. These default to the equivalent optimization // thresholds divided by 2, but can be overridden at the command-line. static constexpr uint32_t kJitStressDefaultOptimizeThreshold = kJitDefaultOptimizeThreshold / 2; static constexpr uint32_t kJitSlowStressDefaultOptimizeThreshold = kJitStressDefaultOptimizeThreshold / 2; static constexpr uint32_t kJitDefaultWarmupThreshold = 0xffff; // Different warm-up threshold constants. These default to the equivalent warmup thresholds divided // by 2, but can be overridden at the command-line. static constexpr uint32_t kJitStressDefaultWarmupThreshold = kJitDefaultWarmupThreshold / 2; static constexpr uint32_t kJitSlowStressDefaultWarmupThreshold = kJitStressDefaultWarmupThreshold / 2; static constexpr size_t kDefaultPriorityThreadWeightRatio = 1000; static constexpr size_t kDefaultInvokeTransitionWeightRatio = 500; DEFINE_RUNTIME_DEBUG_FLAG(JitOptions, kSlowMode); JitOptions* JitOptions::CreateFromRuntimeArguments(const RuntimeArgumentMap& options) { auto* jit_options = new JitOptions; jit_options->use_jit_compilation_ = options.GetOrDefault(RuntimeArgumentMap::UseJitCompilation); jit_options->use_profiled_jit_compilation_ = options.GetOrDefault(RuntimeArgumentMap::UseProfiledJitCompilation); jit_options->code_cache_initial_capacity_ = options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheInitialCapacity); jit_options->code_cache_max_capacity_ = options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheMaxCapacity); jit_options->dump_info_on_shutdown_ = options.Exists(RuntimeArgumentMap::DumpJITInfoOnShutdown); jit_options->profile_saver_options_ = options.GetOrDefault(RuntimeArgumentMap::ProfileSaverOpts); jit_options->thread_pool_pthread_priority_ = options.GetOrDefault(RuntimeArgumentMap::JITPoolThreadPthreadPriority); jit_options->zygote_thread_pool_pthread_priority_ = options.GetOrDefault(RuntimeArgumentMap::JITZygotePoolThreadPthreadPriority); // Set default optimize threshold to aid with checking defaults. jit_options->optimize_threshold_ = kIsDebugBuild ? (kSlowMode ? kJitSlowStressDefaultOptimizeThreshold : kJitStressDefaultOptimizeThreshold) : kJitDefaultOptimizeThreshold; // Set default warm-up threshold to aid with checking defaults. jit_options->warmup_threshold_ = kIsDebugBuild ? (kSlowMode ? kJitSlowStressDefaultWarmupThreshold : kJitStressDefaultWarmupThreshold) : kJitDefaultWarmupThreshold; if (options.Exists(RuntimeArgumentMap::JITOptimizeThreshold)) { jit_options->optimize_threshold_ = *options.Get(RuntimeArgumentMap::JITOptimizeThreshold); } DCHECK_LE(jit_options->optimize_threshold_, kJitMaxThreshold); if (options.Exists(RuntimeArgumentMap::JITWarmupThreshold)) { jit_options->warmup_threshold_ = *options.Get(RuntimeArgumentMap::JITWarmupThreshold); } DCHECK_LE(jit_options->warmup_threshold_, kJitMaxThreshold); if (options.Exists(RuntimeArgumentMap::JITPriorityThreadWeight)) { jit_options->priority_thread_weight_ = *options.Get(RuntimeArgumentMap::JITPriorityThreadWeight); if (jit_options->priority_thread_weight_ > jit_options->warmup_threshold_) { LOG(FATAL) << "Priority thread weight is above the warmup threshold."; } else if (jit_options->priority_thread_weight_ == 0) { LOG(FATAL) << "Priority thread weight cannot be 0."; } } else { jit_options->priority_thread_weight_ = std::max( jit_options->warmup_threshold_ / kDefaultPriorityThreadWeightRatio, static_cast(1)); } if (options.Exists(RuntimeArgumentMap::JITInvokeTransitionWeight)) { jit_options->invoke_transition_weight_ = *options.Get(RuntimeArgumentMap::JITInvokeTransitionWeight); if (jit_options->invoke_transition_weight_ > jit_options->warmup_threshold_) { LOG(FATAL) << "Invoke transition weight is above the warmup threshold."; } else if (jit_options->invoke_transition_weight_ == 0) { LOG(FATAL) << "Invoke transition weight cannot be 0."; } } else { jit_options->invoke_transition_weight_ = std::max( jit_options->warmup_threshold_ / kDefaultInvokeTransitionWeightRatio, static_cast(1)); } return jit_options; } } // namespace jit } // namespace art