blob: 570f683598aad950ef86100540ab4d696cf7af46 [file] [log] [blame]
Mathieu Chartiere5f13e52015-02-24 09:37:21 -08001/*
2 * Copyright 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_RUNTIME_JIT_JIT_H_
18#define ART_RUNTIME_JIT_JIT_H_
19
20#include <unordered_map>
21
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080022#include "atomic.h"
23#include "base/macros.h"
24#include "base/mutex.h"
Mathieu Chartiera4885cb2015-03-09 15:38:54 -070025#include "base/timing_logger.h"
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080026#include "gc_root.h"
27#include "jni.h"
28#include "object_callbacks.h"
Calin Juravle31f2c152015-10-23 17:56:15 +010029#include "offline_profiling_info.h"
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080030#include "thread_pool.h"
31
32namespace art {
33
Mathieu Chartiere401d142015-04-22 13:56:20 -070034class ArtMethod;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080035struct RuntimeArgumentMap;
36
37namespace jit {
38
39class JitCodeCache;
40class JitInstrumentationCache;
41class JitOptions;
42
43class Jit {
44 public:
45 static constexpr bool kStressMode = kIsDebugBuild;
Nicolas Geoffray4e915fb2015-10-28 17:39:47 +000046 static constexpr size_t kDefaultCompileThreshold = kStressMode ? 2 : 500;
Nicolas Geoffray5550ca82015-08-21 18:38:30 +010047 static constexpr size_t kDefaultWarmupThreshold = kDefaultCompileThreshold / 2;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080048
49 virtual ~Jit();
50 static Jit* Create(JitOptions* options, std::string* error_msg);
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +000051 bool CompileMethod(ArtMethod* method, Thread* self, bool osr)
Mathieu Chartier90443472015-07-16 20:32:27 -070052 SHARED_REQUIRES(Locks::mutator_lock_);
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +000053 void CreateInstrumentationCache(size_t compile_threshold,
54 size_t warmup_threshold,
55 size_t osr_threshold);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080056 void CreateThreadPool();
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080057 const JitCodeCache* GetCodeCache() const {
58 return code_cache_.get();
59 }
60 JitCodeCache* GetCodeCache() {
61 return code_cache_.get();
62 }
63 void DeleteThreadPool();
Mathieu Chartiera4885cb2015-03-09 15:38:54 -070064 // Dump interesting info: #methods compiled, code vs data size, compile / verify cumulative
65 // loggers.
66 void DumpInfo(std::ostream& os);
67 // Add a timing logger to cumulative_timings_.
68 void AddTimingLogger(const TimingLogger& logger);
Mathieu Chartiera50f9cf2015-09-25 11:34:45 -070069 JitInstrumentationCache* GetInstrumentationCache() const {
70 return instrumentation_cache_.get();
71 }
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080072
Calin Juravlec90bc922016-02-24 10:13:09 +000073 // Starts the profile saver if the config options allow profile recording.
74 // The profile will be stored in the specified `filename` and will contain
75 // information collected from the given `code_paths` (a set of dex locations).
76 // The `foreign_dex_profile_path` is the path where the saver will put the
77 // profile markers for loaded dex files which are not owned by the application.
78 // The `app_dir` is the application directory and is used to decide which
79 // dex files belong to the application.
80 void StartProfileSaver(const std::string& filename,
81 const std::vector<std::string>& code_paths,
82 const std::string& foreign_dex_profile_path,
83 const std::string& app_dir);
Calin Juravle4d77b6a2015-12-01 18:38:09 +000084 void StopProfileSaver();
Calin Juravle31f2c152015-10-23 17:56:15 +010085
Nicolas Geoffrayaee21562015-12-15 16:39:44 +000086 void DumpForSigQuit(std::ostream& os) {
87 DumpInfo(os);
88 }
89
Tamas Berghammer160e6df2016-01-05 14:29:02 +000090 static void NewTypeLoadedIfUsingJit(mirror::Class* type)
91 SHARED_REQUIRES(Locks::mutator_lock_);
92
Tamas Berghammerfffbee42016-01-15 13:09:34 +000093 // If debug info generation is turned on then write the type information for types already loaded
94 // into the specified class linker to the jit debug interface,
95 void DumpTypeInfoForLoadedTypes(ClassLinker* linker);
96
Siva Chandra05d24152016-01-05 17:43:17 -080097 bool JitAtFirstUse();
98
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +000099 // If an OSR compiled version is available for `method`,
100 // and `dex_pc + dex_pc_offset` is an entry point of that compiled
101 // version, this method will jump to the compiled code, let it run,
102 // and return true afterwards. Return false otherwise.
103 static bool MaybeDoOnStackReplacement(Thread* thread,
104 ArtMethod* method,
105 uint32_t dex_pc,
106 int32_t dex_pc_offset,
107 JValue* result)
108 SHARED_REQUIRES(Locks::mutator_lock_);
109
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800110 private:
111 Jit();
112 bool LoadCompiler(std::string* error_msg);
113
114 // JIT compiler
115 void* jit_library_handle_;
116 void* jit_compiler_handle_;
Nicolas Geoffray5b82d332016-02-18 14:22:32 +0000117 void* (*jit_load_)(bool*);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800118 void (*jit_unload_)(void*);
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +0000119 bool (*jit_compile_method_)(void*, ArtMethod*, Thread*, bool);
Tamas Berghammerfffbee42016-01-15 13:09:34 +0000120 void (*jit_types_loaded_)(void*, mirror::Class**, size_t count);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800121
Mathieu Chartiera4885cb2015-03-09 15:38:54 -0700122 // Performance monitoring.
123 bool dump_info_on_shutdown_;
124 CumulativeLogger cumulative_timings_;
125
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800126 std::unique_ptr<jit::JitInstrumentationCache> instrumentation_cache_;
127 std::unique_ptr<jit::JitCodeCache> code_cache_;
Mathieu Chartier3130cdf2015-05-03 15:20:23 -0700128
Calin Juravle4d77b6a2015-12-01 18:38:09 +0000129 bool save_profiling_info_;
Nicolas Geoffraya25dce92016-01-12 16:41:10 +0000130 bool generate_debug_info_;
Calin Juravle4d77b6a2015-12-01 18:38:09 +0000131
Mathieu Chartier3130cdf2015-05-03 15:20:23 -0700132 DISALLOW_COPY_AND_ASSIGN(Jit);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800133};
134
135class JitOptions {
136 public:
137 static JitOptions* CreateFromRuntimeArguments(const RuntimeArgumentMap& options);
138 size_t GetCompileThreshold() const {
139 return compile_threshold_;
140 }
Nicolas Geoffray5550ca82015-08-21 18:38:30 +0100141 size_t GetWarmupThreshold() const {
142 return warmup_threshold_;
143 }
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +0000144 size_t GetOsrThreshold() const {
145 return osr_threshold_;
146 }
Nicolas Geoffray0a3be162015-11-18 11:15:22 +0000147 size_t GetCodeCacheInitialCapacity() const {
148 return code_cache_initial_capacity_;
149 }
150 size_t GetCodeCacheMaxCapacity() const {
151 return code_cache_max_capacity_;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800152 }
Mathieu Chartiera4885cb2015-03-09 15:38:54 -0700153 bool DumpJitInfoOnShutdown() const {
154 return dump_info_on_shutdown_;
155 }
Calin Juravle31f2c152015-10-23 17:56:15 +0100156 bool GetSaveProfilingInfo() const {
157 return save_profiling_info_;
158 }
Mathieu Chartier455f67c2015-03-17 13:48:29 -0700159 bool UseJIT() const {
160 return use_jit_;
161 }
162 void SetUseJIT(bool b) {
163 use_jit_ = b;
164 }
Calin Juravle31f2c152015-10-23 17:56:15 +0100165 void SetSaveProfilingInfo(bool b) {
166 save_profiling_info_ = b;
167 }
Siva Chandra05d24152016-01-05 17:43:17 -0800168 void SetJitAtFirstUse() {
169 use_jit_ = true;
170 compile_threshold_ = 0;
171 }
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800172
173 private:
Mathieu Chartier455f67c2015-03-17 13:48:29 -0700174 bool use_jit_;
Nicolas Geoffray0a3be162015-11-18 11:15:22 +0000175 size_t code_cache_initial_capacity_;
176 size_t code_cache_max_capacity_;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800177 size_t compile_threshold_;
Nicolas Geoffray5550ca82015-08-21 18:38:30 +0100178 size_t warmup_threshold_;
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +0000179 size_t osr_threshold_;
Mathieu Chartiera4885cb2015-03-09 15:38:54 -0700180 bool dump_info_on_shutdown_;
Calin Juravle31f2c152015-10-23 17:56:15 +0100181 bool save_profiling_info_;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800182
Nicolas Geoffray0a3be162015-11-18 11:15:22 +0000183 JitOptions()
184 : use_jit_(false),
185 code_cache_initial_capacity_(0),
186 code_cache_max_capacity_(0),
187 compile_threshold_(0),
Calin Juravle31f2c152015-10-23 17:56:15 +0100188 dump_info_on_shutdown_(false),
189 save_profiling_info_(false) { }
Mathieu Chartier3130cdf2015-05-03 15:20:23 -0700190
191 DISALLOW_COPY_AND_ASSIGN(JitOptions);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800192};
193
194} // namespace jit
195} // namespace art
196
197#endif // ART_RUNTIME_JIT_JIT_H_