jit.cc revision 0a3be1620a3560253cfa789cb9819013293c5654
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" 27e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "runtime.h" 28e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "runtime_options.h" 29e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier#include "utils.h" 30e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 31e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiernamespace art { 32e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiernamespace jit { 33e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 34e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJitOptions* JitOptions::CreateFromRuntimeArguments(const RuntimeArgumentMap& options) { 35e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier auto* jit_options = new JitOptions; 36455f67c4cf0b4f04e117db3024fd189fa1c7dab9Mathieu Chartier jit_options->use_jit_ = options.GetOrDefault(RuntimeArgumentMap::UseJIT); 370a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray jit_options->code_cache_initial_capacity_ = 380a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheInitialCapacity); 390a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray jit_options->code_cache_max_capacity_ = 400a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray options.GetOrDefault(RuntimeArgumentMap::JITCodeCacheMaxCapacity); 41e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_options->compile_threshold_ = 42e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier options.GetOrDefault(RuntimeArgumentMap::JITCompileThreshold); 435550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray jit_options->warmup_threshold_ = 445550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray options.GetOrDefault(RuntimeArgumentMap::JITWarmupThreshold); 45a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier jit_options->dump_info_on_shutdown_ = 46a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier options.Exists(RuntimeArgumentMap::DumpJITInfoOnShutdown); 47e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return jit_options; 48e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 49e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 50a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartiervoid Jit::DumpInfo(std::ostream& os) { 51a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier os << "Code cache size=" << PrettySize(code_cache_->CodeCacheSize()) 52a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier << " data cache size=" << PrettySize(code_cache_->DataCacheSize()) 531dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray << " number of compiled code=" << code_cache_->NumberOfCompiledCode() 54a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier << "\n"; 55a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier cumulative_timings_.Dump(os); 56a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier} 57a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier 58a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartiervoid Jit::AddTimingLogger(const TimingLogger& logger) { 59a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier cumulative_timings_.AddLogger(logger); 60a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier} 61a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier 62e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJit::Jit() 63e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier : jit_library_handle_(nullptr), jit_compiler_handle_(nullptr), jit_load_(nullptr), 64a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier jit_compile_method_(nullptr), dump_info_on_shutdown_(false), 65a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier cumulative_timings_("JIT timings") { 66e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 67e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 68e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJit* Jit::Create(JitOptions* options, std::string* error_msg) { 69e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier std::unique_ptr<Jit> jit(new Jit); 70a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier jit->dump_info_on_shutdown_ = options->DumpJitInfoOnShutdown(); 71e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (!jit->LoadCompiler(error_msg)) { 72e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return nullptr; 73e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 740a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray jit->code_cache_.reset(JitCodeCache::Create( 750a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray options->GetCodeCacheInitialCapacity(), options->GetCodeCacheMaxCapacity(), error_msg)); 76e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit->GetCodeCache() == nullptr) { 77e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return nullptr; 78e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 790a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray LOG(INFO) << "JIT created with initial_capacity=" 800a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray << PrettySize(options->GetCodeCacheInitialCapacity()) 810a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray << ", max_capacity=" << PrettySize(options->GetCodeCacheMaxCapacity()) 820a3be1620a3560253cfa789cb9819013293c5654Nicolas Geoffray << ", compile_threshold=" << options->GetCompileThreshold(); 83e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return jit.release(); 84e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 85e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 86e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartierbool Jit::LoadCompiler(std::string* error_msg) { 87e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_library_handle_ = dlopen( 88e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier kIsDebugBuild ? "libartd-compiler.so" : "libart-compiler.so", RTLD_NOW); 89e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_library_handle_ == nullptr) { 90e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier std::ostringstream oss; 91e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier oss << "JIT could not load libart-compiler.so: " << dlerror(); 92e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = oss.str(); 93e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 94e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 95e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_load_ = reinterpret_cast<void* (*)(CompilerCallbacks**)>( 96e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_load")); 97e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_load_ == nullptr) { 98e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 99e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_load entry point"; 100e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 101e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 102e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_unload_ = reinterpret_cast<void (*)(void*)>( 103e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_unload")); 104e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_unload_ == nullptr) { 105e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 106e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_unload entry point"; 107e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 108e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 109e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier jit_compile_method_ = reinterpret_cast<bool (*)(void*, ArtMethod*, Thread*)>( 110e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlsym(jit_library_handle_, "jit_compile_method")); 111e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compile_method_ == nullptr) { 112e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 113e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't find jit_compile_method entry point"; 114e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 115e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 116e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CompilerCallbacks* callbacks = nullptr; 117e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier VLOG(jit) << "Calling JitLoad interpreter_only=" 118e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier << Runtime::Current()->GetInstrumentation()->InterpretOnly(); 119e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_compiler_handle_ = (jit_load_)(&callbacks); 120e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compiler_handle_ == nullptr) { 121e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 122e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT couldn't load compiler"; 123e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 124e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 125e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (callbacks == nullptr) { 126e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 127e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *error_msg = "JIT compiler callbacks were not set"; 128e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_compiler_handle_ = nullptr; 129e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return false; 130e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 131e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier compiler_callbacks_ = callbacks; 132e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return true; 133e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 134e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 135e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierbool Jit::CompileMethod(ArtMethod* method, Thread* self) { 136e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier DCHECK(!method->IsRuntimeMethod()); 137d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier if (Dbg::IsDebuggerActive() && Dbg::MethodHasAnyBreakpoints(method)) { 138d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier VLOG(jit) << "JIT not compiling " << PrettyMethod(method) << " due to breakpoint"; 139d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier return false; 140d8565456d29f4ad05f11cf84d2d2dac488508e06Mathieu Chartier } 1417bf2b4f1d08050f80782217febac55c8cfc5e4efNicolas Geoffray return jit_compile_method_(jit_compiler_handle_, method, self); 142e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 143e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 144e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiervoid Jit::CreateThreadPool() { 145e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CHECK(instrumentation_cache_.get() != nullptr); 146e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier instrumentation_cache_->CreateThreadPool(); 147e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 148e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 149e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartiervoid Jit::DeleteThreadPool() { 150e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (instrumentation_cache_.get() != nullptr) { 151629e9350b0b72998416504f7a6fb95b6086daca8Nicolas Geoffray instrumentation_cache_->DeleteThreadPool(Thread::Current()); 152e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 153e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 154e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 155e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu ChartierJit::~Jit() { 156a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier if (dump_info_on_shutdown_) { 157a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier DumpInfo(LOG(INFO)); 158a4885cbaafd35fe9c60eb6cd95e41e2c86f54f66Mathieu Chartier } 159e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier DeleteThreadPool(); 160e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_compiler_handle_ != nullptr) { 161e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier jit_unload_(jit_compiler_handle_); 162e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 163e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier if (jit_library_handle_ != nullptr) { 164e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier dlclose(jit_library_handle_); 165e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier } 166e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 167e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 1685550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffrayvoid Jit::CreateInstrumentationCache(size_t compile_threshold, size_t warmup_threshold) { 169e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier CHECK_GT(compile_threshold, 0U); 1705550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray instrumentation_cache_.reset( 1715550ca8bcc742b109d77e62f3a0877c667d894d3Nicolas Geoffray new jit::JitInstrumentationCache(compile_threshold, warmup_threshold)); 172e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 173e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 174e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} // namespace jit 175e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} // namespace art 176