jit.cc revision 9b1c9b761dea9bc48a2994e3d4de46fc10343a25
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" 590a52223d9173315aeaca05217b8c792b3088ea7dNicolas Geoffray << "JIT number of compiled code=" << code_cache_->NumberOfCompiledCode() << "\n" 600a52223d9173315aeaca05217b8c792b3088ea7dNicolas Geoffray << "JIT total number of compilations=" << code_cache_->NumberOfCompilations() << "\n"; 61a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier cumulative_timings_.Dump(os); 62a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier} 63a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier 64a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartiervoid Jit::AddTimingLogger(const TimingLogger& logger) { 65a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier cumulative_timings_.AddLogger(logger); 66a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier} 67a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier 68a25dce9b452ba17ef7cef768926c884177a3025eNicolas GeoffrayJit::Jit() : jit_library_handle_(nullptr), 69a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_compiler_handle_(nullptr), 70a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_load_(nullptr), 71a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_compile_method_(nullptr), 72a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray dump_info_on_shutdown_(false), 73a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray cumulative_timings_("JIT timings"), 74a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray save_profiling_info_(false), 75a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray generate_debug_info_(false) { 76e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 77e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 78e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJit* Jit::Create(JitOptions* options, std::string* error_msg) { 79e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier std::unique_ptr<Jit> jit(new Jit); 80a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier jit->dump_info_on_shutdown_ = options->DumpJitInfoOnShutdown(); 81e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (!jit->LoadCompiler(error_msg)) { 82e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return nullptr; 83e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 840a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray jit->code_cache_.reset(JitCodeCache::Create( 85a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray options->GetCodeCacheInitialCapacity(), 86a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray options->GetCodeCacheMaxCapacity(), 87a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit->generate_debug_info_, 88a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray error_msg)); 89e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit->GetCodeCache() == nullptr) { 90e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return nullptr; 91e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 924d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle jit->save_profiling_info_ = options->GetSaveProfilingInfo(); 930a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray LOG(INFO) << "JIT created with initial_capacity=" 940a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray << PrettySize(options->GetCodeCacheInitialCapacity()) 950a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray << ", max_capacity=" << PrettySize(options->GetCodeCacheMaxCapacity()) 964d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle << ", compile_threshold=" << options->GetCompileThreshold() 974d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle << ", save_profiling_info=" << options->GetSaveProfilingInfo(); 98e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return jit.release(); 99e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 100e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 101e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartierbool Jit::LoadCompiler(std::string* error_msg) { 102e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_library_handle_ = dlopen( 103e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier kIsDebugBuild ? "libartd-compiler.so" : "libart-compiler.so", RTLD_NOW); 104e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_library_handle_ == nullptr) { 105e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier std::ostringstream oss; 106e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier oss << "JIT could not load libart-compiler.so: " << dlerror(); 107e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = oss.str(); 108e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 109e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 110a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_load_ = reinterpret_cast<void* (*)(CompilerCallbacks**, bool*)>( 111e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_load")); 112e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_load_ == nullptr) { 113e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 114e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_load entry point"; 115e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 116e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 117e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_unload_ = reinterpret_cast<void (*)(void*)>( 118e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_unload")); 119e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_unload_ == nullptr) { 120e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 121e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_unload entry point"; 122e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 123e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 124e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier jit_compile_method_ = reinterpret_cast<bool (*)(void*, ArtMethod*, Thread*)>( 125e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_compile_method")); 126e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compile_method_ == nullptr) { 127e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 128e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_compile_method entry point"; 129e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 130e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 131fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer jit_types_loaded_ = reinterpret_cast<void (*)(void*, mirror::Class**, size_t)>( 132fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer dlsym(jit_library_handle_, "jit_types_loaded")); 133fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer if (jit_types_loaded_ == nullptr) { 134160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer dlclose(jit_library_handle_); 135fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer *error_msg = "JIT couldn't find jit_types_loaded entry point"; 136160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer return false; 137160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer } 138e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CompilerCallbacks* callbacks = nullptr; 139a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray bool will_generate_debug_symbols = false; 140e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier VLOG(jit) << "Calling JitLoad interpreter_only=" 141e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier << Runtime::Current()->GetInstrumentation()->InterpretOnly(); 142a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray jit_compiler_handle_ = (jit_load_)(&callbacks, &will_generate_debug_symbols); 143e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compiler_handle_ == nullptr) { 144e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 145e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't load compiler"; 146e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 147e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 148e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (callbacks == nullptr) { 149e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 150e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT compiler callbacks were not set"; 151e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_compiler_handle_ = nullptr; 152e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 153e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 154e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier compiler_callbacks_ = callbacks; 155a25dce9b452ba17ef7cef768926c884177a3025eNicolas Geoffray generate_debug_info_ = will_generate_debug_symbols; 156e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return true; 157e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 158e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 159e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierbool Jit::CompileMethod(ArtMethod* method, Thread* self) { 160e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier DCHECK(!method->IsRuntimeMethod()); 16173be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray // Don't compile the method if it has breakpoints. 162d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier if (Dbg::IsDebuggerActive() && Dbg::MethodHasAnyBreakpoints(method)) { 163d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier VLOG(jit) << "JIT not compiling " << PrettyMethod(method) << " due to breakpoint"; 164d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier return false; 165d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier } 16673be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray 16773be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray // Don't compile the method if we are supposed to be deoptimized. 16873be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); 16973be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray if (instrumentation->AreAllMethodsDeoptimized() || instrumentation->IsDeoptimized(method)) { 170a42363f79832a6e14f348514664dc6dc3edf9da2Nicolas Geoffray VLOG(jit) << "JIT not compiling " << PrettyMethod(method) << " due to deoptimization"; 17173be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray return false; 17273be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray } 17373be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray 17473be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray if (!code_cache_->NotifyCompilationOf(method, self)) { 17573be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray return false; 17673be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray } 17773be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray bool success = jit_compile_method_(jit_compiler_handle_, method, self); 17873be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray code_cache_->DoneCompiling(method, self); 17973be1e8f8609708f6624bb297c9628de44fd8b6fNicolas Geoffray return success; 180e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 181e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 182e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiervoid Jit::CreateThreadPool() { 183e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CHECK(instrumentation_cache_.get() != nullptr); 184e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier instrumentation_cache_->CreateThreadPool(); 185e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 186e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 187e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiervoid Jit::DeleteThreadPool() { 188e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (instrumentation_cache_.get() != nullptr) { 189629e9350b0b72998416504f7a6fb95b6086daca8Nicolas Geoffray instrumentation_cache_->DeleteThreadPool(Thread::Current()); 190e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 191e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 192e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 1934d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravlevoid Jit::StartProfileSaver(const std::string& filename, 1944d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle const std::vector<std::string>& code_paths) { 1954d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle if (save_profiling_info_) { 1964d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle ProfileSaver::Start(filename, code_cache_.get(), code_paths); 1974d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle } 1984d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle} 1994d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle 2004d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravlevoid Jit::StopProfileSaver() { 2014d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle if (save_profiling_info_ && ProfileSaver::IsStarted()) { 2024d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle ProfileSaver::Stop(); 20331f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle } 20431f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle} 20531f2c155975c5794d481df03eb0947cb48d2c6b5Calin Juravle 20605d241565f36df825cf56a4f1b61bfb7e4dcb056Siva Chandrabool Jit::JitAtFirstUse() { 20705d241565f36df825cf56a4f1b61bfb7e4dcb056Siva Chandra if (instrumentation_cache_ != nullptr) { 20805d241565f36df825cf56a4f1b61bfb7e4dcb056Siva Chandra return instrumentation_cache_->HotMethodThreshold() == 0; 20905d241565f36df825cf56a4f1b61bfb7e4dcb056Siva Chandra } 21005d241565f36df825cf56a4f1b61bfb7e4dcb056Siva Chandra return false; 21105d241565f36df825cf56a4f1b61bfb7e4dcb056Siva Chandra} 21205d241565f36df825cf56a4f1b61bfb7e4dcb056Siva Chandra 213e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJit::~Jit() { 2144d77b6a511659f26fdc711e23825ffa6e7feed7aCalin Juravle DCHECK(!save_profiling_info_ || !ProfileSaver::IsStarted()); 215a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier if (dump_info_on_shutdown_) { 216a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier DumpInfo(LOG(INFO)); 217a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier } 218e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier DeleteThreadPool(); 219e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compiler_handle_ != nullptr) { 220e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_unload_(jit_compiler_handle_); 221e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 222e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_library_handle_ != nullptr) { 223e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 224e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 225e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 226e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 2275550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffrayvoid Jit::CreateInstrumentationCache(size_t compile_threshold, size_t warmup_threshold) { 2285550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray instrumentation_cache_.reset( 2295550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray new jit::JitInstrumentationCache(compile_threshold, warmup_threshold)); 230e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 231e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 232160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammervoid Jit::NewTypeLoadedIfUsingJit(mirror::Class* type) { 233160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer jit::Jit* jit = Runtime::Current()->GetJit(); 234160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer if (jit != nullptr && jit->generate_debug_info_) { 235fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer DCHECK(jit->jit_types_loaded_ != nullptr); 236fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer jit->jit_types_loaded_(jit->jit_compiler_handle_, &type, 1); 237fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer } 238fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer} 239fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer 240fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammervoid Jit::DumpTypeInfoForLoadedTypes(ClassLinker* linker) { 241fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer struct CollectClasses : public ClassVisitor { 2421aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier bool operator()(mirror::Class* klass) override { 243fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer classes_.push_back(klass); 244fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer return true; 245fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer } 2469b1c9b761dea9bc48a2994e3d4de46fc10343a25Mathieu Chartier std::vector<mirror::Class*> classes_; 247fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer }; 248fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer 249fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer if (generate_debug_info_) { 250fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer ScopedObjectAccess so(Thread::Current()); 251fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer 252fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer CollectClasses visitor; 253fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer linker->VisitClasses(&visitor); 254fffbee4d158259633ec7b7f712eaf75be86bd4e5Tamas Berghammer jit_types_loaded_(jit_compiler_handle_, visitor.classes_.data(), visitor.classes_.size()); 255160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer } 256160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer} 257160e6df5debaf77223eebddb8a4e3f7c5e729ad0Tamas Berghammer 258e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} // namespace jit 259e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} // namespace art 260