diff options
Diffstat (limited to 'runtime/jit/jit.cc')
| -rw-r--r-- | runtime/jit/jit.cc | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/runtime/jit/jit.cc b/runtime/jit/jit.cc index f69115159f..27a0e2d1af 100644 --- a/runtime/jit/jit.cc +++ b/runtime/jit/jit.cc @@ -24,6 +24,8 @@ #include "interpreter/interpreter.h" #include "jit_code_cache.h" #include "jit_instrumentation.h" +#include "oat_file_manager.h" +#include "offline_profiling_info.h" #include "runtime.h" #include "runtime_options.h" #include "utils.h" @@ -34,14 +36,18 @@ namespace jit { JitOptions* JitOptions::CreateFromRuntimeArguments(const RuntimeArgumentMap& options) { auto* jit_options = new JitOptions; jit_options->use_jit_ = options.GetOrDefault(RuntimeArgumentMap::UseJIT); - jit_options->code_cache_capacity_ = - options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheCapacity); + jit_options->code_cache_initial_capacity_ = + options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheInitialCapacity); + jit_options->code_cache_max_capacity_ = + options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheMaxCapacity); jit_options->compile_threshold_ = options.GetOrDefault(RuntimeArgumentMap::JITCompileThreshold); jit_options->warmup_threshold_ = options.GetOrDefault(RuntimeArgumentMap::JITWarmupThreshold); jit_options->dump_info_on_shutdown_ = options.Exists(RuntimeArgumentMap::DumpJITInfoOnShutdown); + jit_options->save_profiling_info_ = + options.GetOrDefault(RuntimeArgumentMap::JITSaveProfilingInfo);; return jit_options; } @@ -69,13 +75,19 @@ Jit* Jit::Create(JitOptions* options, std::string* error_msg) { if (!jit->LoadCompiler(error_msg)) { return nullptr; } - jit->code_cache_.reset(JitCodeCache::Create(options->GetCodeCacheCapacity(), error_msg)); + jit->code_cache_.reset(JitCodeCache::Create( + options->GetCodeCacheInitialCapacity(), options->GetCodeCacheMaxCapacity(), error_msg)); if (jit->GetCodeCache() == nullptr) { return nullptr; } - LOG(INFO) << "JIT created with code_cache_capacity=" - << PrettySize(options->GetCodeCacheCapacity()) - << " compile_threshold=" << options->GetCompileThreshold(); + jit->offline_profile_info_.reset(nullptr); + if (options->GetSaveProfilingInfo()) { + jit->offline_profile_info_.reset(new OfflineProfilingInfo()); + } + LOG(INFO) << "JIT created with initial_capacity=" + << PrettySize(options->GetCodeCacheInitialCapacity()) + << ", max_capacity=" << PrettySize(options->GetCodeCacheMaxCapacity()) + << ", compile_threshold=" << options->GetCompileThreshold(); return jit.release(); } @@ -148,6 +160,33 @@ void Jit::DeleteThreadPool() { } } +void Jit::SaveProfilingInfo(const std::string& filename) { + if (offline_profile_info_ == nullptr) { + return; + } + // Note that we can't check the PrimaryOatFile when constructing the offline_profilie_info_ + // because it becomes known to the Runtime after we create and initialize the JIT. + const OatFile* primary_oat_file = Runtime::Current()->GetOatFileManager().GetPrimaryOatFile(); + if (primary_oat_file == nullptr) { + LOG(WARNING) << "Couldn't find a primary oat file when trying to save profile info to " + << filename; + return; + } + + uint64_t last_update_ns = code_cache_->GetLastUpdateTimeNs(); + if (offline_profile_info_->NeedsSaving(last_update_ns)) { + VLOG(profiler) << "Iniate save profiling information to: " << filename; + std::set<ArtMethod*> methods; + { + ScopedObjectAccess soa(Thread::Current()); + code_cache_->GetCompiledArtMethods(primary_oat_file, methods); + } + offline_profile_info_->SaveProfilingInfo(filename, last_update_ns, methods); + } else { + VLOG(profiler) << "No need to save profiling information to: " << filename; + } +} + Jit::~Jit() { if (dump_info_on_shutdown_) { DumpInfo(LOG(INFO)); |