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