blob: 630eba34af345aaaf4975d2804a283153a16d520 [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 -080035class CompilerCallbacks;
36struct RuntimeArgumentMap;
37
38namespace jit {
39
40class JitCodeCache;
41class JitInstrumentationCache;
42class JitOptions;
43
44class Jit {
45 public:
46 static constexpr bool kStressMode = kIsDebugBuild;
Nicolas Geoffray4e915fb2015-10-28 17:39:47 +000047 static constexpr size_t kDefaultCompileThreshold = kStressMode ? 2 : 500;
Nicolas Geoffray5550ca82015-08-21 18:38:30 +010048 static constexpr size_t kDefaultWarmupThreshold = kDefaultCompileThreshold / 2;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080049
50 virtual ~Jit();
51 static Jit* Create(JitOptions* options, std::string* error_msg);
Mathieu Chartiere401d142015-04-22 13:56:20 -070052 bool CompileMethod(ArtMethod* method, Thread* self)
Mathieu Chartier90443472015-07-16 20:32:27 -070053 SHARED_REQUIRES(Locks::mutator_lock_);
Nicolas Geoffray5550ca82015-08-21 18:38:30 +010054 void CreateInstrumentationCache(size_t compile_threshold, size_t warmup_threshold);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080055 void CreateThreadPool();
56 CompilerCallbacks* GetCompilerCallbacks() {
57 return compiler_callbacks_;
58 }
59 const JitCodeCache* GetCodeCache() const {
60 return code_cache_.get();
61 }
62 JitCodeCache* GetCodeCache() {
63 return code_cache_.get();
64 }
65 void DeleteThreadPool();
Mathieu Chartiera4885cb2015-03-09 15:38:54 -070066 // Dump interesting info: #methods compiled, code vs data size, compile / verify cumulative
67 // loggers.
68 void DumpInfo(std::ostream& os);
69 // Add a timing logger to cumulative_timings_.
70 void AddTimingLogger(const TimingLogger& logger);
Mathieu Chartiera50f9cf2015-09-25 11:34:45 -070071 JitInstrumentationCache* GetInstrumentationCache() const {
72 return instrumentation_cache_.get();
73 }
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080074
Calin Juravle31f2c152015-10-23 17:56:15 +010075 void SaveProfilingInfo(const std::string& filename);
76
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080077 private:
78 Jit();
79 bool LoadCompiler(std::string* error_msg);
80
81 // JIT compiler
82 void* jit_library_handle_;
83 void* jit_compiler_handle_;
84 void* (*jit_load_)(CompilerCallbacks**);
85 void (*jit_unload_)(void*);
Mathieu Chartiere401d142015-04-22 13:56:20 -070086 bool (*jit_compile_method_)(void*, ArtMethod*, Thread*);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080087
Mathieu Chartiera4885cb2015-03-09 15:38:54 -070088 // Performance monitoring.
89 bool dump_info_on_shutdown_;
90 CumulativeLogger cumulative_timings_;
91
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080092 std::unique_ptr<jit::JitInstrumentationCache> instrumentation_cache_;
93 std::unique_ptr<jit::JitCodeCache> code_cache_;
94 CompilerCallbacks* compiler_callbacks_; // Owned by the jit compiler.
Mathieu Chartier3130cdf2015-05-03 15:20:23 -070095
Calin Juravle31f2c152015-10-23 17:56:15 +010096 std::unique_ptr<OfflineProfilingInfo> offline_profile_info_;
Mathieu Chartier3130cdf2015-05-03 15:20:23 -070097 DISALLOW_COPY_AND_ASSIGN(Jit);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -080098};
99
100class JitOptions {
101 public:
102 static JitOptions* CreateFromRuntimeArguments(const RuntimeArgumentMap& options);
103 size_t GetCompileThreshold() const {
104 return compile_threshold_;
105 }
Nicolas Geoffray5550ca82015-08-21 18:38:30 +0100106 size_t GetWarmupThreshold() const {
107 return warmup_threshold_;
108 }
Nicolas Geoffray0a3be162015-11-18 11:15:22 +0000109 size_t GetCodeCacheInitialCapacity() const {
110 return code_cache_initial_capacity_;
111 }
112 size_t GetCodeCacheMaxCapacity() const {
113 return code_cache_max_capacity_;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800114 }
Mathieu Chartiera4885cb2015-03-09 15:38:54 -0700115 bool DumpJitInfoOnShutdown() const {
116 return dump_info_on_shutdown_;
117 }
Calin Juravle31f2c152015-10-23 17:56:15 +0100118 bool GetSaveProfilingInfo() const {
119 return save_profiling_info_;
120 }
Mathieu Chartier455f67c2015-03-17 13:48:29 -0700121 bool UseJIT() const {
122 return use_jit_;
123 }
124 void SetUseJIT(bool b) {
125 use_jit_ = b;
126 }
Calin Juravle31f2c152015-10-23 17:56:15 +0100127 void SetSaveProfilingInfo(bool b) {
128 save_profiling_info_ = b;
129 }
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800130
131 private:
Mathieu Chartier455f67c2015-03-17 13:48:29 -0700132 bool use_jit_;
Nicolas Geoffray0a3be162015-11-18 11:15:22 +0000133 size_t code_cache_initial_capacity_;
134 size_t code_cache_max_capacity_;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800135 size_t compile_threshold_;
Nicolas Geoffray5550ca82015-08-21 18:38:30 +0100136 size_t warmup_threshold_;
Mathieu Chartiera4885cb2015-03-09 15:38:54 -0700137 bool dump_info_on_shutdown_;
Calin Juravle31f2c152015-10-23 17:56:15 +0100138 bool save_profiling_info_;
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800139
Nicolas Geoffray0a3be162015-11-18 11:15:22 +0000140 JitOptions()
141 : use_jit_(false),
142 code_cache_initial_capacity_(0),
143 code_cache_max_capacity_(0),
144 compile_threshold_(0),
Calin Juravle31f2c152015-10-23 17:56:15 +0100145 dump_info_on_shutdown_(false),
146 save_profiling_info_(false) { }
Mathieu Chartier3130cdf2015-05-03 15:20:23 -0700147
148 DISALLOW_COPY_AND_ASSIGN(JitOptions);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800149};
150
151} // namespace jit
152} // namespace art
153
154#endif // ART_RUNTIME_JIT_JIT_H_