jit.cc revision 160e6df5debaf77223eebddb8a4e3f7c5e729ad0
1e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier/* 2e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * Copyright 2014 The Android Open Source Project 3e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * 4e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 5e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * you may not use this file except in compliance with the License. 6e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * You may obtain a copy of the License at 7e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * 8e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 9e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * 10e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * Unless required by applicable law or agreed to in writing, software 11e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 12e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * See the License for the specific language governing permissions and 14e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier * limitations under the License. 15e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier */ 16e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 17e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "jit.h" 18e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 19e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include <dlfcn.h> 20e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 21e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "art_method-inl.h" 222a5c4681ba19411c1cb22e9a7ab446dab910af1cAndreas Gampe#include "debugger.h" 23e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "entrypoints/runtime_asm_entrypoints.h" 24e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "interpreter/interpreter.h" 25e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "jit_code_cache.h" 26e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "jit_instrumentation.h" 2731f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle#include "oat_file_manager.h" 2831f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle#include "offline_profiling_info.h" 294d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle#include "profile_saver.h" 30e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "runtime.h" 31e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "runtime_options.h" 32e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "utils.h" 33e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 34e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiernamespace art { 35e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiernamespace jit { 36e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 37e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJitOptions* JitOptions::CreateFromRuntimeArguments(const RuntimeArgumentMap& options) { 38e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier auto* jit_options = new JitOptions; 39455f67c4cf0b4f04e117db3024fd189fa1c7dab9Mathieu Chartier jit_options->use_jit_ = options.GetOrDefault(RuntimeArgumentMap::UseJIT); 400a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray jit_options->code_cache_initial_capacity_ = 410a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheInitialCapacity); 420a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray jit_options->code_cache_max_capacity_ = 430a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheMaxCapacity); 44e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_options->compile_threshold_ = 45e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier options.GetOrDefault(RuntimeArgumentMap::JITCompileThreshold); 465550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray jit_options->warmup_threshold_ = 475550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray options.GetOrDefault(RuntimeArgumentMap::JITWarmupThreshold); 48a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier jit_options->dump_info_on_shutdown_ = 49a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier options.Exists(RuntimeArgumentMap::DumpJITInfoOnShutdown); 5031f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle jit_options->save_profiling_info_ = 5131f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle options.GetOrDefault(RuntimeArgumentMap::JITSaveProfilingInfo);; 52e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return jit_options; 53e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 54e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 55a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartiervoid Jit::DumpInfo(std::ostream& os) { 56aee2156e308f3f346ac4df76ba1d33ee9b11be84Nicolas Geoffray os << "JIT code cache size=" << PrettySize(code_cache_->CodeCacheSize()) << "\n" 57aee2156e308f3f346ac4df76ba1d33ee9b11be84Nicolas Geoffray << "JIT data cache size=" << PrettySize(code_cache_->DataCacheSize()) << "\n" 58aee2156e308f3f346ac4df76ba1d33ee9b11be84Nicolas Geoffray << "JIT current capacity=" << PrettySize(code_cache_->GetCurrentCapacity()) << "\n" 59aee2156e308f3f346ac4df76ba1d33ee9b11be84Nicolas Geoffray << "JIT number of compiled code=" << code_cache_->NumberOfCompiledCode() << "\n"; 60a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier cumulative_timings_.Dump(os); 61a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier} 62a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier 63a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartiervoid Jit::AddTimingLogger(const TimingLogger& logger) { 64a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier cumulative_timings_.AddLogger(logger); 65a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier} 66a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier 67a25dce9b452ba17ef7cef768926c884177a3025eNicolas GeoffrayJit::Jit() : jit_library_handle_(nullptr), 68a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_compiler_handle_(nullptr), 69a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_load_(nullptr), 70a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_compile_method_(nullptr), 71a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray dump_info_on_shutdown_(false), 72a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray cumulative_timings_("JIT timings"), 73a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray save_profiling_info_(false), 74a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray generate_debug_info_(false) { 75e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 76e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 77e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJit* Jit::Create(JitOptions* options, std::string* error_msg) { 78e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier std::unique_ptr<Jit> jit(new Jit); 79a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier jit->dump_info_on_shutdown_ = options->DumpJitInfoOnShutdown(); 80e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (!jit->LoadCompiler(error_msg)) { 81e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return nullptr; 82e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 830a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray jit->code_cache_.reset(JitCodeCache::Create( 84a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray options->GetCodeCacheInitialCapacity(), 85a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray options->GetCodeCacheMaxCapacity(), 86a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit->generate_debug_info_, 87a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray error_msg)); 88e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit->GetCodeCache() == nullptr) { 89e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return nullptr; 90e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 914d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle jit->save_profiling_info_ = options->GetSaveProfilingInfo(); 920a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray LOG(INFO) << "JIT created with initial_capacity=" 930a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray << PrettySize(options->GetCodeCacheInitialCapacity()) 940a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray << ", max_capacity=" << PrettySize(options->GetCodeCacheMaxCapacity()) 954d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle << ", compile_threshold=" << options->GetCompileThreshold() 964d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle << ", save_profiling_info=" << options->GetSaveProfilingInfo(); 97e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return jit.release(); 98e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 99e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 100e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartierbool Jit::LoadCompiler(std::string* error_msg) { 101e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_library_handle_ = dlopen( 102e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier kIsDebugBuild ? "libartd-compiler.so" : "libart-compiler.so", RTLD_NOW); 103e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_library_handle_ == nullptr) { 104e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier std::ostringstream oss; 105e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier oss << "JIT could not load libart-compiler.so: " << dlerror(); 106e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = oss.str(); 107e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 108e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 109a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_load_ = reinterpret_cast<void* (*)(CompilerCallbacks**, bool*)>( 110e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_load")); 111e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_load_ == nullptr) { 112e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 113e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_load entry point"; 114e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 115e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 116e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_unload_ = reinterpret_cast<void (*)(void*)>( 117e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_unload")); 118e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_unload_ == nullptr) { 119e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 120e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_unload entry point"; 121e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 122e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 123e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier jit_compile_method_ = reinterpret_cast<bool (*)(void*, ArtMethod*, Thread*)>( 124e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_compile_method")); 125e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compile_method_ == nullptr) { 126e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 127e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_compile_method entry point"; 128e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 129e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 130160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer jit_type_loaded_ = reinterpret_cast<void (*)(void*, mirror::Class*)>( 131160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer dlsym(jit_library_handle_, "jit_type_loaded")); 132160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer if (jit_type_loaded_ == nullptr) { 133160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer dlclose(jit_library_handle_); 134160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer *error_msg = "JIT couldn't find jit_type_loaded entry point"; 135160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer return false; 136160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer } 137e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CompilerCallbacks* callbacks = nullptr; 138a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray bool will_generate_debug_symbols = false; 139e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier VLOG(jit) << "Calling JitLoad interpreter_only=" 140e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier << Runtime::Current()->GetInstrumentation()->InterpretOnly(); 141a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_compiler_handle_ = (jit_load_)(&callbacks, &will_generate_debug_symbols); 142e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compiler_handle_ == nullptr) { 143e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 144e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't load compiler"; 145e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 146e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 147e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (callbacks == nullptr) { 148e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 149e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT compiler callbacks were not set"; 150e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_compiler_handle_ = nullptr; 151e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 152e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 153e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier compiler_callbacks_ = callbacks; 154a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray generate_debug_info_ = will_generate_debug_symbols; 155e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return true; 156e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 157e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 158e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierbool Jit::CompileMethod(ArtMethod* method, Thread* self) { 159e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier DCHECK(!method->IsRuntimeMethod()); 16073be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray // Don't compile the method if it has breakpoints. 161d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier if (Dbg::IsDebuggerActive() && Dbg::MethodHasAnyBreakpoints(method)) { 162d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier VLOG(jit) << "JIT not compiling " << PrettyMethod(method) << " due to breakpoint"; 163d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier return false; 164d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier } 16573be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray 16673be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray // Don't compile the method if we are supposed to be deoptimized. 16773be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); 16873be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray if (instrumentation->AreAllMethodsDeoptimized() || instrumentation->IsDeoptimized(method)) { 16973be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray return false; 17073be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray } 17173be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray 17273be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray if (!code_cache_->NotifyCompilationOf(method, self)) { 17373be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray return false; 17473be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray } 17573be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray bool success = jit_compile_method_(jit_compiler_handle_, method, self); 17673be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray code_cache_->DoneCompiling(method, self); 17773be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray return success; 178e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 179e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 180e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiervoid Jit::CreateThreadPool() { 181e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CHECK(instrumentation_cache_.get() != nullptr); 182e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier instrumentation_cache_->CreateThreadPool(); 183e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 184e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 185e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiervoid Jit::DeleteThreadPool() { 186e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (instrumentation_cache_.get() != nullptr) { 187629e9350b0b72998416504f7a6fb95b6086daca8Nicolas Geoffray instrumentation_cache_->DeleteThreadPool(Thread::Current()); 188e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 189e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 190e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 1914d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravlevoid Jit::StartProfileSaver(const std::string& filename, 1924d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle const std::vector<std::string>& code_paths) { 1934d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle if (save_profiling_info_) { 1944d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle ProfileSaver::Start(filename, code_cache_.get(), code_paths); 1954d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle } 1964d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle} 1974d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle 1984d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravlevoid Jit::StopProfileSaver() { 1994d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle if (save_profiling_info_ && ProfileSaver::IsStarted()) { 2004d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle ProfileSaver::Stop(); 20131f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle } 20231f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle} 20331f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle 204e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJit::~Jit() { 2054d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle DCHECK(!save_profiling_info_ || !ProfileSaver::IsStarted()); 206a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier if (dump_info_on_shutdown_) { 207a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier DumpInfo(LOG(INFO)); 208a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier } 209e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier DeleteThreadPool(); 210e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compiler_handle_ != nullptr) { 211e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_unload_(jit_compiler_handle_); 212e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 213e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_library_handle_ != nullptr) { 214e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 215e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 216e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 217e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 2185550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffrayvoid Jit::CreateInstrumentationCache(size_t compile_threshold, size_t warmup_threshold) { 219e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CHECK_GT(compile_threshold, 0U); 2205550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray instrumentation_cache_.reset( 2215550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray new jit::JitInstrumentationCache(compile_threshold, warmup_threshold)); 222e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 223e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 224160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammervoid Jit::NewTypeLoadedIfUsingJit(mirror::Class* type) { 225160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer jit::Jit* jit = Runtime::Current()->GetJit(); 226160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer if (jit != nullptr && jit->generate_debug_info_) { 227160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer DCHECK(jit->jit_type_loaded_ != nullptr); 228160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer jit->jit_type_loaded_(jit->jit_compiler_handle_, type); 229160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer } 230160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer} 231160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer 232e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} // namespace jit 233e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} // namespace art 234