blob: 3d4da5edcf550ad6a6c044178f0fc138f7a612fe [file] [log] [blame]
Brian Carlstrom7940e442013-07-12 13:46:57 -07001/*
2 * Copyright (C) 2011 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#include "compiler_driver.h"
18
Andreas Gampe8cf9cb32017-07-19 09:28:38 -070019#include <unistd.h>
Andreas Gampeb0f370e2014-09-25 22:51:40 -070020#include <unordered_set>
Anwar Ghuloum67f99412013-08-12 14:19:48 -070021#include <vector>
Brian Carlstrom7940e442013-07-12 13:46:57 -070022
Mathieu Chartierab972ef2014-12-03 17:38:22 -080023#ifndef __APPLE__
24#include <malloc.h> // For mallinfo
25#endif
26
Narayan Kamathe3eae5e2016-10-27 11:47:30 +010027#include "android-base/strings.h"
28
Mathieu Chartierc7853442015-03-27 14:35:38 -070029#include "art_field-inl.h"
Mathieu Chartiere401d142015-04-22 13:56:20 -070030#include "art_method-inl.h"
Andreas Gampef0446e92017-05-16 13:51:57 -070031#include "base/arena_allocator.h"
David Brazdild9c90372016-09-14 16:53:55 +010032#include "base/array_ref.h"
Vladimir Marko492a7fa2016-06-01 18:38:43 +010033#include "base/bit_vector.h"
Andreas Gampe542451c2016-07-26 09:02:02 -070034#include "base/enums.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070035#include "base/stl_util.h"
Mathieu Chartier32ce2ad2016-03-04 14:58:03 -080036#include "base/systrace.h"
Vladimir Marko80afd022015-05-19 18:08:00 +010037#include "base/time_utils.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070038#include "base/timing_logger.h"
Vladimir Marko3481ba22015-04-13 12:22:36 +010039#include "class_linker-inl.h"
Vladimir Markod8dbc8d2017-09-20 13:37:47 +010040#include "compiled_method-inl.h"
Nicolas Geoffrayb34f69a2014-03-07 15:28:39 +000041#include "compiler.h"
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +000042#include "compiler_callbacks.h"
Vladimir Markobe0e5462014-02-26 11:24:15 +000043#include "compiler_driver-inl.h"
Andreas Gampe5eb0d382015-07-23 01:19:26 -070044#include "dex/dex_to_dex_compiler.h"
Vladimir Markoc7f83202014-01-24 17:55:18 +000045#include "dex/verification_results.h"
Vladimir Marko2730db02014-01-27 11:15:17 +000046#include "dex/verified_method.h"
Steven Morelande431e272017-07-18 16:53:49 -070047#include "dex_compilation_unit.h"
48#include "dex_file-inl.h"
49#include "dex_instruction-inl.h"
Mark Mendellae9fd932014-02-10 16:14:35 -080050#include "driver/compiler_options.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070051#include "gc/accounting/card_table-inl.h"
52#include "gc/accounting/heap_bitmap.h"
Mathieu Chartiere401d142015-04-22 13:56:20 -070053#include "gc/space/image_space.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070054#include "gc/space/space.h"
Steven Morelande431e272017-07-18 16:53:49 -070055#include "handle_scope-inl.h"
56#include "intrinsics_enum.h"
57#include "jni_internal.h"
Vladimir Markod8dbc8d2017-09-20 13:37:47 +010058#include "linker/linker_patch.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070059#include "mirror/class-inl.h"
Steven Morelande431e272017-07-18 16:53:49 -070060#include "mirror/class_loader.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070061#include "mirror/dex_cache-inl.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070062#include "mirror/object-inl.h"
Andreas Gampec6ea7d02017-02-01 16:46:28 -080063#include "mirror/object-refvisitor-inl.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070064#include "mirror/object_array-inl.h"
65#include "mirror/throwable.h"
Steven Morelande431e272017-07-18 16:53:49 -070066#include "nativehelper/ScopedLocalRef.h"
67#include "object_lock.h"
68#include "runtime.h"
Orion Hodson26ef34c2017-11-01 13:32:41 +000069#include "runtime_intrinsics.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070070#include "scoped_thread_state_change-inl.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070071#include "thread.h"
Andreas Gampeb0f370e2014-09-25 22:51:40 -070072#include "thread_list.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070073#include "thread_pool.h"
Ian Rogers848871b2013-08-05 10:56:33 -070074#include "trampolines/trampoline_compiler.h"
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010075#include "transaction.h"
Mathieu Chartier93764b82017-07-17 14:51:53 -070076#include "utils/atomic_dex_ref_map-inl.h"
Vladimir Marko20f85592015-03-19 10:07:02 +000077#include "utils/dex_cache_arrays_layout-inl.h"
Andreas Gampee21dc3d2014-12-08 16:59:43 -080078#include "utils/swap_space.h"
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +000079#include "vdex_file.h"
Vladimir Marko2bc47802014-02-10 09:43:07 +000080#include "verifier/method_verifier-inl.h"
Steven Morelande431e272017-07-18 16:53:49 -070081#include "verifier/method_verifier.h"
Nicolas Geoffray08025182016-10-25 17:20:18 +010082#include "verifier/verifier_deps.h"
Andreas Gampe6d7abbd2017-04-24 13:19:09 -070083#include "verifier/verifier_enums.h"
Brian Carlstrom7940e442013-07-12 13:46:57 -070084
Brian Carlstrom7940e442013-07-12 13:46:57 -070085namespace art {
86
Mathieu Chartier8e219ae2014-08-19 14:29:46 -070087static constexpr bool kTimeCompileMethod = !kIsDebugBuild;
88
Calin Juravle226501b2015-12-11 14:41:31 +000089// Print additional info during profile guided compilation.
90static constexpr bool kDebugProfileGuidedCompilation = false;
91
Chang Xing70f689d2017-06-08 17:16:12 -070092// Max encoded fields allowed for initializing app image. Hardcode the number for now
93// because 5000 should be large enough.
94static constexpr uint32_t kMaxEncodedFields = 5000;
95
Brian Carlstrom7940e442013-07-12 13:46:57 -070096static double Percentage(size_t x, size_t y) {
97 return 100.0 * (static_cast<double>(x)) / (static_cast<double>(x + y));
98}
99
100static void DumpStat(size_t x, size_t y, const char* str) {
101 if (x == 0 && y == 0) {
102 return;
103 }
Ian Rogerse732ef12013-10-09 15:22:24 -0700104 LOG(INFO) << Percentage(x, y) << "% of " << str << " for " << (x + y) << " cases";
Brian Carlstrom7940e442013-07-12 13:46:57 -0700105}
106
Vladimir Markof096aad2014-01-23 15:51:58 +0000107class CompilerDriver::AOTCompilationStats {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700108 public:
109 AOTCompilationStats()
110 : stats_lock_("AOT compilation statistics lock"),
Brian Carlstrom7940e442013-07-12 13:46:57 -0700111 resolved_types_(0), unresolved_types_(0),
112 resolved_instance_fields_(0), unresolved_instance_fields_(0),
113 resolved_local_static_fields_(0), resolved_static_fields_(0), unresolved_static_fields_(0),
114 type_based_devirtualization_(0),
115 safe_casts_(0), not_safe_casts_(0) {
116 for (size_t i = 0; i <= kMaxInvokeType; i++) {
117 resolved_methods_[i] = 0;
118 unresolved_methods_[i] = 0;
119 virtual_made_direct_[i] = 0;
120 direct_calls_to_boot_[i] = 0;
121 direct_methods_to_boot_[i] = 0;
122 }
123 }
124
125 void Dump() {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700126 DumpStat(resolved_types_, unresolved_types_, "types resolved");
127 DumpStat(resolved_instance_fields_, unresolved_instance_fields_, "instance fields resolved");
128 DumpStat(resolved_local_static_fields_ + resolved_static_fields_, unresolved_static_fields_,
129 "static fields resolved");
130 DumpStat(resolved_local_static_fields_, resolved_static_fields_ + unresolved_static_fields_,
131 "static fields local to a class");
132 DumpStat(safe_casts_, not_safe_casts_, "check-casts removed based on type information");
133 // Note, the code below subtracts the stat value so that when added to the stat value we have
134 // 100% of samples. TODO: clean this up.
135 DumpStat(type_based_devirtualization_,
136 resolved_methods_[kVirtual] + unresolved_methods_[kVirtual] +
137 resolved_methods_[kInterface] + unresolved_methods_[kInterface] -
138 type_based_devirtualization_,
139 "virtual/interface calls made direct based on type information");
140
141 for (size_t i = 0; i <= kMaxInvokeType; i++) {
142 std::ostringstream oss;
143 oss << static_cast<InvokeType>(i) << " methods were AOT resolved";
144 DumpStat(resolved_methods_[i], unresolved_methods_[i], oss.str().c_str());
145 if (virtual_made_direct_[i] > 0) {
146 std::ostringstream oss2;
147 oss2 << static_cast<InvokeType>(i) << " methods made direct";
148 DumpStat(virtual_made_direct_[i],
149 resolved_methods_[i] + unresolved_methods_[i] - virtual_made_direct_[i],
150 oss2.str().c_str());
151 }
152 if (direct_calls_to_boot_[i] > 0) {
153 std::ostringstream oss2;
154 oss2 << static_cast<InvokeType>(i) << " method calls are direct into boot";
155 DumpStat(direct_calls_to_boot_[i],
156 resolved_methods_[i] + unresolved_methods_[i] - direct_calls_to_boot_[i],
157 oss2.str().c_str());
158 }
159 if (direct_methods_to_boot_[i] > 0) {
160 std::ostringstream oss2;
161 oss2 << static_cast<InvokeType>(i) << " method calls have methods in boot";
162 DumpStat(direct_methods_to_boot_[i],
163 resolved_methods_[i] + unresolved_methods_[i] - direct_methods_to_boot_[i],
164 oss2.str().c_str());
165 }
166 }
167 }
168
169// Allow lossy statistics in non-debug builds.
170#ifndef NDEBUG
171#define STATS_LOCK() MutexLock mu(Thread::Current(), stats_lock_)
172#else
173#define STATS_LOCK()
174#endif
175
Mathieu Chartier90443472015-07-16 20:32:27 -0700176 void TypeDoesntNeedAccessCheck() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700177 STATS_LOCK();
178 resolved_types_++;
179 }
180
Mathieu Chartier90443472015-07-16 20:32:27 -0700181 void TypeNeedsAccessCheck() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700182 STATS_LOCK();
183 unresolved_types_++;
184 }
185
Mathieu Chartier90443472015-07-16 20:32:27 -0700186 void ResolvedInstanceField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700187 STATS_LOCK();
188 resolved_instance_fields_++;
189 }
190
Mathieu Chartier90443472015-07-16 20:32:27 -0700191 void UnresolvedInstanceField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700192 STATS_LOCK();
193 unresolved_instance_fields_++;
194 }
195
Mathieu Chartier90443472015-07-16 20:32:27 -0700196 void ResolvedLocalStaticField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700197 STATS_LOCK();
198 resolved_local_static_fields_++;
199 }
200
Mathieu Chartier90443472015-07-16 20:32:27 -0700201 void ResolvedStaticField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700202 STATS_LOCK();
203 resolved_static_fields_++;
204 }
205
Mathieu Chartier90443472015-07-16 20:32:27 -0700206 void UnresolvedStaticField() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700207 STATS_LOCK();
208 unresolved_static_fields_++;
209 }
210
211 // Indicate that type information from the verifier led to devirtualization.
Mathieu Chartier90443472015-07-16 20:32:27 -0700212 void PreciseTypeDevirtualization() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700213 STATS_LOCK();
214 type_based_devirtualization_++;
215 }
216
Brian Carlstrom7940e442013-07-12 13:46:57 -0700217 // A check-cast could be eliminated due to verifier type analysis.
Mathieu Chartier90443472015-07-16 20:32:27 -0700218 void SafeCast() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700219 STATS_LOCK();
220 safe_casts_++;
221 }
222
223 // A check-cast couldn't be eliminated due to verifier type analysis.
Mathieu Chartier90443472015-07-16 20:32:27 -0700224 void NotASafeCast() REQUIRES(!stats_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700225 STATS_LOCK();
226 not_safe_casts_++;
227 }
228
229 private:
230 Mutex stats_lock_;
231
Brian Carlstrom7940e442013-07-12 13:46:57 -0700232 size_t resolved_types_;
233 size_t unresolved_types_;
234
235 size_t resolved_instance_fields_;
236 size_t unresolved_instance_fields_;
237
238 size_t resolved_local_static_fields_;
239 size_t resolved_static_fields_;
240 size_t unresolved_static_fields_;
241 // Type based devirtualization for invoke interface and virtual.
242 size_t type_based_devirtualization_;
243
244 size_t resolved_methods_[kMaxInvokeType + 1];
245 size_t unresolved_methods_[kMaxInvokeType + 1];
246 size_t virtual_made_direct_[kMaxInvokeType + 1];
247 size_t direct_calls_to_boot_[kMaxInvokeType + 1];
248 size_t direct_methods_to_boot_[kMaxInvokeType + 1];
249
250 size_t safe_casts_;
251 size_t not_safe_casts_;
252
253 DISALLOW_COPY_AND_ASSIGN(AOTCompilationStats);
254};
255
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100256class CompilerDriver::DexFileMethodSet {
257 public:
258 explicit DexFileMethodSet(const DexFile& dex_file)
259 : dex_file_(dex_file),
260 method_indexes_(dex_file.NumMethodIds(), false, Allocator::GetMallocAllocator()) {
261 }
262 DexFileMethodSet(DexFileMethodSet&& other) = default;
263
264 const DexFile& GetDexFile() const { return dex_file_; }
265
266 BitVector& GetMethodIndexes() { return method_indexes_; }
267 const BitVector& GetMethodIndexes() const { return method_indexes_; }
268
269 private:
270 const DexFile& dex_file_;
271 BitVector method_indexes_;
272};
273
Jeff Haodcdc85b2015-12-04 14:06:18 -0800274CompilerDriver::CompilerDriver(
275 const CompilerOptions* compiler_options,
276 VerificationResults* verification_results,
Jeff Haodcdc85b2015-12-04 14:06:18 -0800277 Compiler::Kind compiler_kind,
278 InstructionSet instruction_set,
279 const InstructionSetFeatures* instruction_set_features,
Vladimir Marko944da602016-02-19 12:27:55 +0000280 std::unordered_set<std::string>* image_classes,
Jeff Haodcdc85b2015-12-04 14:06:18 -0800281 std::unordered_set<std::string>* compiled_classes,
282 std::unordered_set<std::string>* compiled_methods,
Vladimir Marko944da602016-02-19 12:27:55 +0000283 size_t thread_count,
284 bool dump_stats,
285 bool dump_passes,
286 CumulativeLogger* timer,
287 int swap_fd,
Calin Juravle998c2162015-12-21 15:39:33 +0200288 const ProfileCompilationInfo* profile_compilation_info)
Calin Juravle226501b2015-12-11 14:41:31 +0000289 : compiler_options_(compiler_options),
Brian Carlstrom6449c622014-02-10 23:48:36 -0800290 verification_results_(verification_results),
Ian Rogers72d32622014-05-06 16:20:11 -0700291 compiler_(Compiler::Create(this, compiler_kind)),
Jeff Hao48699fb2015-04-06 14:21:37 -0700292 compiler_kind_(compiler_kind),
Vladimir Marko33bff252017-11-01 14:35:42 +0000293 instruction_set_(
294 instruction_set == InstructionSet::kArm ? InstructionSet::kThumb2 : instruction_set),
Dave Allison70202782013-10-22 17:52:19 -0700295 instruction_set_features_(instruction_set_features),
Mathieu Chartierc4ae9162016-04-07 13:19:19 -0700296 requires_constructor_barrier_lock_("constructor barrier lock"),
Vladimir Markof4da6752014-08-01 19:04:18 +0100297 non_relative_linker_patch_count_(0u),
Brian Carlstrom7940e442013-07-12 13:46:57 -0700298 image_classes_(image_classes),
Andreas Gampe4bf3ae92014-11-11 13:28:29 -0800299 classes_to_compile_(compiled_classes),
Andreas Gampe70bef0d2015-04-15 02:37:28 -0700300 methods_to_compile_(compiled_methods),
Andreas Gampef39208f2017-10-19 15:06:59 -0700301 number_of_soft_verifier_failures_(0),
Andreas Gampe6cf49e52015-03-05 13:08:45 -0800302 had_hard_verifier_failure_(false),
Andreas Gampeace0dc12016-01-20 13:33:13 -0800303 parallel_thread_count_(thread_count),
Brian Carlstrom7940e442013-07-12 13:46:57 -0700304 stats_(new AOTCompilationStats),
305 dump_stats_(dump_stats),
Nicolas Geoffrayea3fa0b2014-02-10 11:59:41 +0000306 dump_passes_(dump_passes),
307 timings_logger_(timer),
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700308 compiler_context_(nullptr),
Alexey Frunze19f6c692016-11-30 19:19:55 -0800309 support_boot_image_fixup_(true),
Calin Juravle998c2162015-12-21 15:39:33 +0200310 compiled_method_storage_(swap_fd),
Calin Juravle69158982016-03-16 11:53:41 +0000311 profile_compilation_info_(profile_compilation_info),
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100312 max_arena_alloc_(0),
313 dex_to_dex_references_lock_("dex-to-dex references lock"),
314 dex_to_dex_references_(),
315 current_dex_to_dex_methods_(nullptr) {
Brian Carlstrom6449c622014-02-10 23:48:36 -0800316 DCHECK(compiler_options_ != nullptr);
Brian Carlstrom2ce745c2013-07-17 17:44:30 -0700317
Ian Rogers72d32622014-05-06 16:20:11 -0700318 compiler_->Init();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700319
Vladimir Markoaad75c62016-10-03 08:46:48 +0000320 if (GetCompilerOptions().IsBootImage()) {
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800321 CHECK(image_classes_.get() != nullptr) << "Expected image classes for boot image";
322 }
Brian Carlstrom7940e442013-07-12 13:46:57 -0700323}
324
325CompilerDriver::~CompilerDriver() {
Mathieu Chartier93764b82017-07-17 14:51:53 -0700326 compiled_methods_.Visit([this](const DexFileReference& ref ATTRIBUTE_UNUSED,
Mathieu Chartieracab8d42016-11-23 13:45:58 -0800327 CompiledMethod* method) {
328 if (method != nullptr) {
329 CompiledMethod::ReleaseSwapAllocatedCompiledMethod(this, method);
Andreas Gampee21dc3d2014-12-08 16:59:43 -0800330 }
Mathieu Chartieracab8d42016-11-23 13:45:58 -0800331 });
Ian Rogers72d32622014-05-06 16:20:11 -0700332 compiler_->UnInit();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700333}
334
Vladimir Marko35831e82015-09-11 11:59:18 +0100335
Ian Rogersdd7624d2014-03-14 17:43:00 -0700336#define CREATE_TRAMPOLINE(type, abi, offset) \
Andreas Gampeaf13ad92014-04-11 12:07:48 -0700337 if (Is64BitInstructionSet(instruction_set_)) { \
Ian Rogersdd7624d2014-03-14 17:43:00 -0700338 return CreateTrampoline64(instruction_set_, abi, \
Andreas Gampe542451c2016-07-26 09:02:02 -0700339 type ## _ENTRYPOINT_OFFSET(PointerSize::k64, offset)); \
Ian Rogersdd7624d2014-03-14 17:43:00 -0700340 } else { \
341 return CreateTrampoline32(instruction_set_, abi, \
Andreas Gampe542451c2016-07-26 09:02:02 -0700342 type ## _ENTRYPOINT_OFFSET(PointerSize::k32, offset)); \
Ian Rogersdd7624d2014-03-14 17:43:00 -0700343 }
344
Vladimir Marko93205e32016-04-13 11:59:46 +0100345std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateJniDlsymLookup() const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700346 CREATE_TRAMPOLINE(JNI, kJniAbi, pDlsymLookup)
Ian Rogers848871b2013-08-05 10:56:33 -0700347}
348
Vladimir Marko93205e32016-04-13 11:59:46 +0100349std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickGenericJniTrampoline()
350 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700351 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickGenericJniTrampoline)
Andreas Gampe2da88232014-02-27 12:26:20 -0800352}
353
Vladimir Marko93205e32016-04-13 11:59:46 +0100354std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickImtConflictTrampoline()
355 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700356 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickImtConflictTrampoline)
Jeff Hao88474b42013-10-23 16:24:40 -0700357}
358
Vladimir Marko93205e32016-04-13 11:59:46 +0100359std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickResolutionTrampoline()
360 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700361 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickResolutionTrampoline)
Brian Carlstrom7940e442013-07-12 13:46:57 -0700362}
363
Vladimir Marko93205e32016-04-13 11:59:46 +0100364std::unique_ptr<const std::vector<uint8_t>> CompilerDriver::CreateQuickToInterpreterBridge()
365 const {
Ian Rogersdd7624d2014-03-14 17:43:00 -0700366 CREATE_TRAMPOLINE(QUICK, kQuickAbi, pQuickToInterpreterBridge)
Brian Carlstrom7940e442013-07-12 13:46:57 -0700367}
Ian Rogersdd7624d2014-03-14 17:43:00 -0700368#undef CREATE_TRAMPOLINE
Brian Carlstrom7940e442013-07-12 13:46:57 -0700369
370void CompilerDriver::CompileAll(jobject class_loader,
Brian Carlstrom45602482013-07-21 22:07:55 -0700371 const std::vector<const DexFile*>& dex_files,
Ian Rogers3d504072014-03-01 09:16:49 -0800372 TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700373 DCHECK(!Runtime::Current()->IsStarted());
Andreas Gampeace0dc12016-01-20 13:33:13 -0800374
375 InitializeThreadPools();
376
Andreas Gampe8d295f82015-01-20 14:50:21 -0800377 VLOG(compiler) << "Before precompile " << GetMemoryUsageString(false);
Andreas Gampe740667a2015-09-15 17:55:06 -0700378 // Precompile:
379 // 1) Load image classes
380 // 2) Resolve all classes
381 // 3) Attempt to verify all classes
382 // 4) Attempt to initialize image classes, and trivially initialized classes
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +0000383 PreCompile(class_loader, dex_files, timings);
Vladimir Markoaad75c62016-10-03 08:46:48 +0000384 if (GetCompilerOptions().IsBootImage()) {
Nicolas Geoffray762869d2016-07-15 15:28:35 +0100385 // We don't need to setup the intrinsics for non boot image compilation, as
386 // those compilations will pick up a boot image that have the ArtMethod already
387 // set with the intrinsics flag.
Orion Hodson26ef34c2017-11-01 13:32:41 +0000388 InitializeIntrinsics();
Nicolas Geoffray762869d2016-07-15 15:28:35 +0100389 }
Andreas Gampe740667a2015-09-15 17:55:06 -0700390 // Compile:
391 // 1) Compile all classes and methods enabled for compilation. May fall back to dex-to-dex
392 // compilation.
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100393 if (GetCompilerOptions().IsAnyCompilationEnabled()) {
Andreas Gampeace0dc12016-01-20 13:33:13 -0800394 Compile(class_loader, dex_files, timings);
Andreas Gampe740667a2015-09-15 17:55:06 -0700395 }
Brian Carlstrom7940e442013-07-12 13:46:57 -0700396 if (dump_stats_) {
397 stats_->Dump();
398 }
Andreas Gampeace0dc12016-01-20 13:33:13 -0800399
400 FreeThreadPools();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700401}
402
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700403static optimizer::DexToDexCompilationLevel GetDexToDexCompilationLevel(
404 Thread* self, const CompilerDriver& driver, Handle<mirror::ClassLoader> class_loader,
405 const DexFile& dex_file, const DexFile::ClassDef& class_def)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700406 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800407 auto* const runtime = Runtime::Current();
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100408 DCHECK(driver.GetCompilerOptions().IsQuickeningCompilationEnabled());
Brian Carlstrom7940e442013-07-12 13:46:57 -0700409 const char* descriptor = dex_file.GetClassDescriptor(class_def);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800410 ClassLinker* class_linker = runtime->GetClassLinker();
Ian Rogers98379392014-02-24 16:53:16 -0800411 mirror::Class* klass = class_linker->FindClass(self, descriptor, class_loader);
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700412 if (klass == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700413 CHECK(self->IsExceptionPending());
414 self->ClearException();
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700415 return optimizer::DexToDexCompilationLevel::kDontDexToDexCompile;
Brian Carlstrom7940e442013-07-12 13:46:57 -0700416 }
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700417 // DexToDex at the kOptimize level may introduce quickened opcodes, which replace symbolic
418 // references with actual offsets. We cannot re-verify such instructions.
419 //
420 // We store the verification information in the class status in the oat file, which the linker
421 // can validate (checksums) and use to skip load-time verification. It is thus safe to
422 // optimize when a class has been fully verified before.
Alex Lighte40dd382017-01-25 17:44:53 -0800423 optimizer::DexToDexCompilationLevel max_level = optimizer::DexToDexCompilationLevel::kOptimize;
424 if (driver.GetCompilerOptions().GetDebuggable()) {
425 // We are debuggable so definitions of classes might be changed. We don't want to do any
426 // optimizations that could break that.
Andreas Gampe1a4bc7f2017-03-27 14:57:30 -0700427 max_level = optimizer::DexToDexCompilationLevel::kDontDexToDexCompile;
Alex Lighte40dd382017-01-25 17:44:53 -0800428 }
Andreas Gampe2ed8def2014-08-28 14:41:02 -0700429 if (klass->IsVerified()) {
Sebastien Hertz75021222013-07-16 18:34:50 +0200430 // Class is verified so we can enable DEX-to-DEX compilation for performance.
Alex Lighte40dd382017-01-25 17:44:53 -0800431 return max_level;
Sebastien Hertz75021222013-07-16 18:34:50 +0200432 } else {
Andreas Gampe1a4bc7f2017-03-27 14:57:30 -0700433 // Class verification has failed: do not run DEX-to-DEX optimizations.
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700434 return optimizer::DexToDexCompilationLevel::kDontDexToDexCompile;
435 }
436}
437
438static optimizer::DexToDexCompilationLevel GetDexToDexCompilationLevel(
439 Thread* self,
440 const CompilerDriver& driver,
441 jobject jclass_loader,
442 const DexFile& dex_file,
443 const DexFile::ClassDef& class_def) {
444 ScopedObjectAccess soa(self);
445 StackHandleScope<1> hs(soa.Self());
446 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -0700447 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700448 return GetDexToDexCompilationLevel(self, driver, class_loader, dex_file, class_def);
449}
450
451// Does the runtime for the InstructionSet provide an implementation returned by
452// GetQuickGenericJniStub allowing down calls that aren't compiled using a JNI compiler?
453static bool InstructionSetHasGenericJniStub(InstructionSet isa) {
454 switch (isa) {
Vladimir Marko33bff252017-11-01 14:35:42 +0000455 case InstructionSet::kArm:
456 case InstructionSet::kArm64:
457 case InstructionSet::kThumb2:
458 case InstructionSet::kMips:
459 case InstructionSet::kMips64:
460 case InstructionSet::kX86:
461 case InstructionSet::kX86_64: return true;
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700462 default: return false;
463 }
464}
465
466static void CompileMethod(Thread* self,
467 CompilerDriver* driver,
468 const DexFile::CodeItem* code_item,
469 uint32_t access_flags,
470 InvokeType invoke_type,
471 uint16_t class_def_idx,
472 uint32_t method_idx,
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000473 Handle<mirror::ClassLoader> class_loader,
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700474 const DexFile& dex_file,
475 optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level,
Mathieu Chartier736b5602015-09-02 14:54:11 -0700476 bool compilation_enabled,
Mathieu Chartieracab8d42016-11-23 13:45:58 -0800477 Handle<mirror::DexCache> dex_cache) {
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700478 DCHECK(driver != nullptr);
479 CompiledMethod* compiled_method = nullptr;
480 uint64_t start_ns = kTimeCompileMethod ? NanoTime() : 0;
481 MethodReference method_ref(&dex_file, method_idx);
482
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100483 if (driver->GetCurrentDexToDexMethods() != nullptr) {
484 // This is the second pass when we dex-to-dex compile previously marked methods.
485 // TODO: Refactor the compilation to avoid having to distinguish the two passes
486 // here. That should be done on a higher level. http://b/29089975
487 if (driver->GetCurrentDexToDexMethods()->IsBitSet(method_idx)) {
Mathieu Chartier0733dc82017-07-17 14:05:28 -0700488 VerificationResults* results = driver->GetVerificationResults();
489 DCHECK(results != nullptr);
490 const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref);
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100491 // Do not optimize if a VerifiedMethod is missing. SafeCast elision,
492 // for example, relies on it.
493 compiled_method = optimizer::ArtCompileDEX(
494 driver,
495 code_item,
496 access_flags,
497 invoke_type,
498 class_def_idx,
499 method_idx,
500 class_loader,
501 dex_file,
502 (verified_method != nullptr)
503 ? dex_to_dex_compilation_level
Andreas Gampe1a4bc7f2017-03-27 14:57:30 -0700504 : optimizer::DexToDexCompilationLevel::kDontDexToDexCompile);
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100505 }
506 } else if ((access_flags & kAccNative) != 0) {
Goran Jakovljevic8d41c082016-09-28 08:49:46 +0000507 // Are we extracting only and have support for generic JNI down calls?
508 if (!driver->GetCompilerOptions().IsJniCompilationEnabled() &&
509 InstructionSetHasGenericJniStub(driver->GetInstructionSet())) {
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700510 // Leaving this empty will trigger the generic JNI version
511 } else {
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700512 // Look-up the ArtMethod associated with this code_item (if any)
513 // -- It is later used to lookup any [optimization] annotations for this method.
514 ScopedObjectAccess soa(self);
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700515
516 // TODO: Lookup annotation from DexFile directly without resolving method.
517 ArtMethod* method =
Vladimir Markoba118822017-06-12 15:41:56 +0100518 Runtime::Current()->GetClassLinker()->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>(
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700519 dex_file,
520 method_idx,
521 dex_cache,
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000522 class_loader,
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700523 /* referrer */ nullptr,
524 invoke_type);
525
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700526 // Query any JNI optimization annotations such as @FastNative or @CriticalNative.
527 Compiler::JniOptimizationFlags optimization_flags = Compiler::kNone;
528 if (UNLIKELY(method == nullptr)) {
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700529 // Failed method resolutions happen very rarely, e.g. ancestor class cannot be resolved.
530 DCHECK(self->IsExceptionPending());
531 self->ClearException();
Igor Murashkin367f3dd2016-09-01 17:00:24 -0700532 } else if (method->IsAnnotatedWithFastNative()) {
533 // TODO: Will no longer need this CHECK once we have verifier checking this.
534 CHECK(!method->IsAnnotatedWithCriticalNative());
535 optimization_flags = Compiler::kFastNative;
536 } else if (method->IsAnnotatedWithCriticalNative()) {
537 // TODO: Will no longer need this CHECK once we have verifier checking this.
538 CHECK(!method->IsAnnotatedWithFastNative());
539 optimization_flags = Compiler::kCriticalNative;
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700540 }
541
Igor Murashkin9d4b6da2016-07-29 09:51:58 -0700542 compiled_method = driver->GetCompiler()->JniCompile(access_flags,
543 method_idx,
544 dex_file,
545 optimization_flags);
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700546 CHECK(compiled_method != nullptr);
547 }
548 } else if ((access_flags & kAccAbstract) != 0) {
549 // Abstract methods don't have code.
Nicolas Geoffrayd28b9692015-11-04 14:36:55 +0000550 } else {
Mathieu Chartier0733dc82017-07-17 14:05:28 -0700551 VerificationResults* results = driver->GetVerificationResults();
552 DCHECK(results != nullptr);
553 const VerifiedMethod* verified_method = results->GetVerifiedMethod(method_ref);
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700554 bool compile = compilation_enabled &&
555 // Basic checks, e.g., not <clinit>.
Mathieu Chartier0733dc82017-07-17 14:05:28 -0700556 results->IsCandidateForCompilation(method_ref, access_flags) &&
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700557 // Did not fail to create VerifiedMethod metadata.
Andreas Gampe0760a812015-08-26 17:12:51 -0700558 verified_method != nullptr &&
559 // Do not have failures that should punt to the interpreter.
560 !verified_method->HasRuntimeThrow() &&
561 (verified_method->GetEncounteredVerificationFailures() &
Andreas Gampea727e372015-08-25 09:22:37 -0700562 (verifier::VERIFY_ERROR_FORCE_INTERPRETER | verifier::VERIFY_ERROR_LOCKING)) == 0 &&
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700563 // Is eligable for compilation by methods-to-compile filter.
Calin Juravle226501b2015-12-11 14:41:31 +0000564 driver->IsMethodToCompile(method_ref) &&
565 driver->ShouldCompileBasedOnProfile(method_ref);
566
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700567 if (compile) {
568 // NOTE: if compiler declines to compile this method, it will return null.
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000569 compiled_method = driver->GetCompiler()->Compile(code_item,
570 access_flags,
571 invoke_type,
572 class_def_idx,
573 method_idx,
574 class_loader,
575 dex_file,
576 dex_cache);
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700577 }
578 if (compiled_method == nullptr &&
579 dex_to_dex_compilation_level != optimizer::DexToDexCompilationLevel::kDontDexToDexCompile) {
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100580 DCHECK(!Runtime::Current()->UseJitCompilation());
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700581 // TODO: add a command-line option to disable DEX-to-DEX compilation ?
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100582 driver->MarkForDexToDexCompilation(self, method_ref);
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700583 }
584 }
585 if (kTimeCompileMethod) {
586 uint64_t duration_ns = NanoTime() - start_ns;
587 if (duration_ns > MsToNs(driver->GetCompiler()->GetMaximumCompilationTimeBeforeWarning())) {
David Sehr709b0702016-10-13 09:12:37 -0700588 LOG(WARNING) << "Compilation of " << dex_file.PrettyMethod(method_idx)
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700589 << " took " << PrettyDuration(duration_ns);
590 }
591 }
592
593 if (compiled_method != nullptr) {
594 // Count non-relative linker patches.
595 size_t non_relative_linker_patch_count = 0u;
Vladimir Markod8dbc8d2017-09-20 13:37:47 +0100596 for (const linker::LinkerPatch& patch : compiled_method->GetPatches()) {
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700597 if (!patch.IsPcRelative()) {
598 ++non_relative_linker_patch_count;
599 }
600 }
601 bool compile_pic = driver->GetCompilerOptions().GetCompilePic(); // Off by default
602 // When compiling with PIC, there should be zero non-relative linker patches
603 CHECK(!compile_pic || non_relative_linker_patch_count == 0u);
604
605 driver->AddCompiledMethod(method_ref, compiled_method, non_relative_linker_patch_count);
606 }
607
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700608 if (self->IsExceptionPending()) {
609 ScopedObjectAccess soa(self);
David Sehr709b0702016-10-13 09:12:37 -0700610 LOG(FATAL) << "Unexpected exception compiling: " << dex_file.PrettyMethod(method_idx) << "\n"
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700611 << self->GetException()->Dump();
Sebastien Hertz75021222013-07-16 18:34:50 +0200612 }
Brian Carlstrom7940e442013-07-12 13:46:57 -0700613}
614
Mathieu Chartiere401d142015-04-22 13:56:20 -0700615void CompilerDriver::CompileOne(Thread* self, ArtMethod* method, TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -0700616 DCHECK(!Runtime::Current()->IsStarted());
Brian Carlstrom7940e442013-07-12 13:46:57 -0700617 jobject jclass_loader;
618 const DexFile* dex_file;
Ian Rogers8b2c0b92013-09-19 02:56:49 -0700619 uint16_t class_def_idx;
Ian Rogersef7d42f2014-01-06 12:55:46 -0800620 uint32_t method_idx = method->GetDexMethodIndex();
621 uint32_t access_flags = method->GetAccessFlags();
622 InvokeType invoke_type = method->GetInvokeType();
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000623 StackHandleScope<2> hs(self);
Mathieu Chartier736b5602015-09-02 14:54:11 -0700624 Handle<mirror::DexCache> dex_cache(hs.NewHandle(method->GetDexCache()));
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000625 Handle<mirror::ClassLoader> class_loader(
626 hs.NewHandle(method->GetDeclaringClass()->GetClassLoader()));
Brian Carlstrom7940e442013-07-12 13:46:57 -0700627 {
628 ScopedObjectAccessUnchecked soa(self);
Mathieu Chartiere5f13e52015-02-24 09:37:21 -0800629 ScopedLocalRef<jobject> local_class_loader(
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000630 soa.Env(), soa.AddLocalReference<jobject>(class_loader.Get()));
Brian Carlstrom7940e442013-07-12 13:46:57 -0700631 jclass_loader = soa.Env()->NewGlobalRef(local_class_loader.get());
632 // Find the dex_file
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700633 dex_file = method->GetDexFile();
634 class_def_idx = method->GetClassDefIndex();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700635 }
Ian Rogersef7d42f2014-01-06 12:55:46 -0800636 const DexFile::CodeItem* code_item = dex_file->GetCodeItem(method->GetCodeItemOffset());
Mathieu Chartier736b5602015-09-02 14:54:11 -0700637
638 // Go to native so that we don't block GC during compilation.
Mathieu Chartierf1d666e2015-09-03 16:13:34 -0700639 ScopedThreadSuspension sts(self, kNative);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700640
641 std::vector<const DexFile*> dex_files;
642 dex_files.push_back(dex_file);
643
Andreas Gampeace0dc12016-01-20 13:33:13 -0800644 InitializeThreadPools();
645
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +0000646 PreCompile(jclass_loader, dex_files, timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700647
Brian Carlstrom7940e442013-07-12 13:46:57 -0700648 // Can we run DEX-to-DEX compiler on this class ?
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700649 optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level =
650 GetDexToDexCompilationLevel(self,
651 *this,
652 jclass_loader,
653 *dex_file,
654 dex_file->GetClassDef(class_def_idx));
655
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100656 DCHECK(current_dex_to_dex_methods_ == nullptr);
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700657 CompileMethod(self,
658 this,
659 code_item,
660 access_flags,
661 invoke_type,
662 class_def_idx,
663 method_idx,
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000664 class_loader,
Andreas Gampe5eb0d382015-07-23 01:19:26 -0700665 *dex_file,
666 dex_to_dex_compilation_level,
Mathieu Chartier736b5602015-09-02 14:54:11 -0700667 true,
668 dex_cache);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700669
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100670 ArrayRef<DexFileMethodSet> dex_to_dex_references;
671 {
672 // From this point on, we shall not modify dex_to_dex_references_, so
673 // just grab a reference to it that we use without holding the mutex.
674 MutexLock lock(Thread::Current(), dex_to_dex_references_lock_);
675 dex_to_dex_references = ArrayRef<DexFileMethodSet>(dex_to_dex_references_);
676 }
677 if (!dex_to_dex_references.empty()) {
678 DCHECK_EQ(dex_to_dex_references.size(), 1u);
679 DCHECK(&dex_to_dex_references[0].GetDexFile() == dex_file);
680 current_dex_to_dex_methods_ = &dex_to_dex_references.front().GetMethodIndexes();
681 DCHECK(current_dex_to_dex_methods_->IsBitSet(method_idx));
682 DCHECK_EQ(current_dex_to_dex_methods_->NumSetBits(), 1u);
683 CompileMethod(self,
684 this,
685 code_item,
686 access_flags,
687 invoke_type,
688 class_def_idx,
689 method_idx,
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000690 class_loader,
Vladimir Marko492a7fa2016-06-01 18:38:43 +0100691 *dex_file,
692 dex_to_dex_compilation_level,
693 true,
694 dex_cache);
695 current_dex_to_dex_methods_ = nullptr;
696 }
697
Andreas Gampeace0dc12016-01-20 13:33:13 -0800698 FreeThreadPools();
699
Brian Carlstrom7940e442013-07-12 13:46:57 -0700700 self->GetJniEnv()->DeleteGlobalRef(jclass_loader);
Mathieu Chartier2535abe2015-02-17 10:38:49 -0800701}
702
Andreas Gampeace0dc12016-01-20 13:33:13 -0800703void CompilerDriver::Resolve(jobject class_loader,
704 const std::vector<const DexFile*>& dex_files,
705 TimingLogger* timings) {
706 // Resolution allocates classes and needs to run single-threaded to be deterministic.
707 bool force_determinism = GetCompilerOptions().IsForceDeterminism();
708 ThreadPool* resolve_thread_pool = force_determinism
709 ? single_thread_pool_.get()
710 : parallel_thread_pool_.get();
711 size_t resolve_thread_count = force_determinism ? 1U : parallel_thread_count_;
712
Brian Carlstrom7940e442013-07-12 13:46:57 -0700713 for (size_t i = 0; i != dex_files.size(); ++i) {
714 const DexFile* dex_file = dex_files[i];
Kenny Rootd5185342014-05-13 14:47:05 -0700715 CHECK(dex_file != nullptr);
Andreas Gampeace0dc12016-01-20 13:33:13 -0800716 ResolveDexFile(class_loader,
717 *dex_file,
718 dex_files,
719 resolve_thread_pool,
720 resolve_thread_count,
721 timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700722 }
723}
724
Andreas Gampeace0dc12016-01-20 13:33:13 -0800725// Resolve const-strings in the code. Done to have deterministic allocation behavior. Right now
726// this is single-threaded for simplicity.
727// TODO: Collect the relevant string indices in parallel, then allocate them sequentially in a
728// stable order.
729
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000730static void ResolveConstStrings(Handle<mirror::DexCache> dex_cache,
Andreas Gampeace0dc12016-01-20 13:33:13 -0800731 const DexFile& dex_file,
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000732 const DexFile::CodeItem* code_item)
733 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeace0dc12016-01-20 13:33:13 -0800734 if (code_item == nullptr) {
735 // Abstract or native method.
736 return;
737 }
738
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000739 ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
Mathieu Chartier1d2d4ff2017-09-23 16:11:06 -0700740 for (const Instruction& inst : code_item->Instructions()) {
741 switch (inst.Opcode()) {
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000742 case Instruction::CONST_STRING:
Andreas Gampeace0dc12016-01-20 13:33:13 -0800743 case Instruction::CONST_STRING_JUMBO: {
Mathieu Chartier1d2d4ff2017-09-23 16:11:06 -0700744 dex::StringIndex string_index((inst.Opcode() == Instruction::CONST_STRING)
745 ? inst.VRegB_21c()
746 : inst.VRegB_31c());
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000747 mirror::String* string = class_linker->ResolveString(dex_file, string_index, dex_cache);
748 CHECK(string != nullptr) << "Could not allocate a string when forcing determinism";
Andreas Gampeace0dc12016-01-20 13:33:13 -0800749 break;
750 }
751
752 default:
753 break;
754 }
Andreas Gampeace0dc12016-01-20 13:33:13 -0800755 }
756}
757
758static void ResolveConstStrings(CompilerDriver* driver,
759 const std::vector<const DexFile*>& dex_files,
760 TimingLogger* timings) {
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000761 ScopedObjectAccess soa(Thread::Current());
762 StackHandleScope<1> hs(soa.Self());
763 ClassLinker* const class_linker = Runtime::Current()->GetClassLinker();
764 MutableHandle<mirror::DexCache> dex_cache(hs.NewHandle<mirror::DexCache>(nullptr));
765
Andreas Gampeace0dc12016-01-20 13:33:13 -0800766 for (const DexFile* dex_file : dex_files) {
Vladimir Markocd556b02017-02-03 11:47:34 +0000767 dex_cache.Assign(class_linker->FindDexCache(soa.Self(), *dex_file));
Andreas Gampeace0dc12016-01-20 13:33:13 -0800768 TimingLogger::ScopedTiming t("Resolve const-string Strings", timings);
769
770 size_t class_def_count = dex_file->NumClassDefs();
771 for (size_t class_def_index = 0; class_def_index < class_def_count; ++class_def_index) {
772 const DexFile::ClassDef& class_def = dex_file->GetClassDef(class_def_index);
773
774 const uint8_t* class_data = dex_file->GetClassData(class_def);
775 if (class_data == nullptr) {
776 // empty class, probably a marker interface
777 continue;
778 }
779
780 ClassDataItemIterator it(*dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -0700781 it.SkipAllFields();
Andreas Gampeace0dc12016-01-20 13:33:13 -0800782
783 bool compilation_enabled = driver->IsClassToCompile(
784 dex_file->StringByTypeIdx(class_def.class_idx_));
785 if (!compilation_enabled) {
786 // Compilation is skipped, do not resolve const-string in code of this class.
787 // TODO: Make sure that inlining honors this.
788 continue;
789 }
790
791 // Direct methods.
792 int64_t previous_direct_method_idx = -1;
793 while (it.HasNextDirectMethod()) {
794 uint32_t method_idx = it.GetMemberIndex();
795 if (method_idx == previous_direct_method_idx) {
796 // smali can create dex files with two encoded_methods sharing the same method_idx
797 // http://code.google.com/p/smali/issues/detail?id=119
798 it.Next();
799 continue;
800 }
801 previous_direct_method_idx = method_idx;
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000802 ResolveConstStrings(dex_cache, *dex_file, it.GetMethodCodeItem());
Andreas Gampeace0dc12016-01-20 13:33:13 -0800803 it.Next();
804 }
805 // Virtual methods.
806 int64_t previous_virtual_method_idx = -1;
807 while (it.HasNextVirtualMethod()) {
808 uint32_t method_idx = it.GetMemberIndex();
809 if (method_idx == previous_virtual_method_idx) {
810 // smali can create dex files with two encoded_methods sharing the same method_idx
811 // http://code.google.com/p/smali/issues/detail?id=119
812 it.Next();
813 continue;
814 }
815 previous_virtual_method_idx = method_idx;
Nicolas Geoffray571d2342016-10-12 13:03:15 +0000816 ResolveConstStrings(dex_cache, *dex_file, it.GetMethodCodeItem());
Andreas Gampeace0dc12016-01-20 13:33:13 -0800817 it.Next();
818 }
819 DCHECK(!it.HasNext());
820 }
821 }
822}
823
824inline void CompilerDriver::CheckThreadPools() {
825 DCHECK(parallel_thread_pool_ != nullptr);
826 DCHECK(single_thread_pool_ != nullptr);
827}
828
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +0000829static void EnsureVerifiedOrVerifyAtRuntime(jobject jclass_loader,
830 const std::vector<const DexFile*>& dex_files) {
831 ScopedObjectAccess soa(Thread::Current());
832 StackHandleScope<2> hs(soa.Self());
833 Handle<mirror::ClassLoader> class_loader(
834 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
835 MutableHandle<mirror::Class> cls(hs.NewHandle<mirror::Class>(nullptr));
836 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
837
838 for (const DexFile* dex_file : dex_files) {
839 for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
840 const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
841 const char* descriptor = dex_file->GetClassDescriptor(class_def);
842 cls.Assign(class_linker->FindClass(soa.Self(), descriptor, class_loader));
Andreas Gampefa4333d2017-02-14 11:10:34 -0800843 if (cls == nullptr) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +0000844 soa.Self()->ClearException();
845 } else if (&cls->GetDexFile() == dex_file) {
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +0000846 DCHECK(cls->IsErroneous() || cls->IsVerified() || cls->ShouldVerifyAtRuntime())
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +0000847 << cls->PrettyClass()
848 << " " << cls->GetStatus();
849 }
850 }
851 }
852}
853
Andreas Gampeace0dc12016-01-20 13:33:13 -0800854void CompilerDriver::PreCompile(jobject class_loader,
855 const std::vector<const DexFile*>& dex_files,
856 TimingLogger* timings) {
857 CheckThreadPools();
858
Brian Carlstrom7940e442013-07-12 13:46:57 -0700859 LoadImageClasses(timings);
Andreas Gampe8d295f82015-01-20 14:50:21 -0800860 VLOG(compiler) << "LoadImageClasses: " << GetMemoryUsageString(false);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700861
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100862 if (compiler_options_->IsAnyCompilationEnabled()) {
Mathieu Chartier88b74b62017-07-16 17:08:19 -0700863 // Avoid adding the dex files in the case where we aren't going to add compiled methods.
864 // This reduces RAM usage for this case.
865 for (const DexFile* dex_file : dex_files) {
866 // Can be already inserted if the caller is CompileOne. This happens for gtests.
867 if (!compiled_methods_.HaveDexFile(dex_file)) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -0700868 compiled_methods_.AddDexFile(dex_file);
Mathieu Chartier88b74b62017-07-16 17:08:19 -0700869 }
870 }
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100871 // Resolve eagerly to prepare for compilation.
Andreas Gampeace0dc12016-01-20 13:33:13 -0800872 Resolve(class_loader, dex_files, timings);
Mathieu Chartiere86deef2015-03-19 13:43:37 -0700873 VLOG(compiler) << "Resolve: " << GetMemoryUsageString(false);
874 }
875
Nicolas Geoffray60ca9492016-12-20 21:15:00 +0000876 if (compiler_options_->AssumeClassesAreVerified()) {
Mathieu Chartierab972ef2014-12-03 17:38:22 -0800877 VLOG(compiler) << "Verify none mode specified, skipping verification.";
Andreas Gampeace0dc12016-01-20 13:33:13 -0800878 SetVerified(class_loader, dex_files, timings);
Mathieu Chartiere86deef2015-03-19 13:43:37 -0700879 }
880
Nicolas Geoffray60ca9492016-12-20 21:15:00 +0000881 if (!compiler_options_->IsVerificationEnabled()) {
Jeff Hao4a200f52014-04-01 14:58:49 -0700882 return;
883 }
884
Vladimir Markoaad75c62016-10-03 08:46:48 +0000885 if (GetCompilerOptions().IsForceDeterminism() && GetCompilerOptions().IsBootImage()) {
Andreas Gampeace0dc12016-01-20 13:33:13 -0800886 // Resolve strings from const-string. Do this now to have a deterministic image.
887 ResolveConstStrings(this, dex_files, timings);
888 VLOG(compiler) << "Resolve const-strings: " << GetMemoryUsageString(false);
889 }
890
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +0000891 Verify(class_loader, dex_files, timings);
Andreas Gampe8d295f82015-01-20 14:50:21 -0800892 VLOG(compiler) << "Verify: " << GetMemoryUsageString(false);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700893
Andreas Gampe6cf49e52015-03-05 13:08:45 -0800894 if (had_hard_verifier_failure_ && GetCompilerOptions().AbortOnHardVerifierFailure()) {
Andreas Gampefdfb4d42017-07-27 12:12:22 -0700895 // Avoid dumping threads. Even if we shut down the thread pools, there will still be three
896 // instances of this thread's stack.
897 LOG(FATAL_WITHOUT_ABORT) << "Had a hard failure verifying all classes, and was asked to abort "
898 << "in such situations. Please check the log.";
899 abort();
Andreas Gampef39208f2017-10-19 15:06:59 -0700900 } else if (number_of_soft_verifier_failures_ > 0 &&
901 GetCompilerOptions().AbortOnSoftVerifierFailure()) {
902 LOG(FATAL_WITHOUT_ABORT) << "Had " << number_of_soft_verifier_failures_ << " soft failure(s) "
903 << "verifying all classes, and was asked to abort in such situations. "
904 << "Please check the log.";
905 abort();
Andreas Gampe6cf49e52015-03-05 13:08:45 -0800906 }
907
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100908 if (compiler_options_->IsAnyCompilationEnabled()) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +0000909 if (kIsDebugBuild) {
910 EnsureVerifiedOrVerifyAtRuntime(class_loader, dex_files);
911 }
Nicolas Geoffrayade72d62016-12-15 13:20:02 +0000912 InitializeClasses(class_loader, dex_files, timings);
913 VLOG(compiler) << "InitializeClasses: " << GetMemoryUsageString(false);
914 }
Brian Carlstrom7940e442013-07-12 13:46:57 -0700915
916 UpdateImageClasses(timings);
Andreas Gampe8d295f82015-01-20 14:50:21 -0800917 VLOG(compiler) << "UpdateImageClasses: " << GetMemoryUsageString(false);
Brian Carlstrom7940e442013-07-12 13:46:57 -0700918}
919
Ian Rogersdfb325e2013-10-30 01:00:44 -0700920bool CompilerDriver::IsImageClass(const char* descriptor) const {
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800921 if (image_classes_ != nullptr) {
922 // If we have a set of image classes, use those.
Ian Rogersdfb325e2013-10-30 01:00:44 -0700923 return image_classes_->find(descriptor) != image_classes_->end();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700924 }
Mathieu Chartierc5dd3192015-12-09 16:38:30 -0800925 // No set of image classes, assume we include all the classes.
926 // NOTE: Currently only reachable from InitImageMethodVisitor for the app image case.
Vladimir Markoaad75c62016-10-03 08:46:48 +0000927 return !GetCompilerOptions().IsBootImage();
Brian Carlstrom7940e442013-07-12 13:46:57 -0700928}
929
Andreas Gampe4bf3ae92014-11-11 13:28:29 -0800930bool CompilerDriver::IsClassToCompile(const char* descriptor) const {
Andreas Gampeb1fcead2015-04-20 18:53:51 -0700931 if (classes_to_compile_ == nullptr) {
932 return true;
933 }
934 return classes_to_compile_->find(descriptor) != classes_to_compile_->end();
Andreas Gampe4bf3ae92014-11-11 13:28:29 -0800935}
936
Andreas Gampe70bef0d2015-04-15 02:37:28 -0700937bool CompilerDriver::IsMethodToCompile(const MethodReference& method_ref) const {
Andreas Gampe70bef0d2015-04-15 02:37:28 -0700938 if (methods_to_compile_ == nullptr) {
939 return true;
940 }
941
Mathieu Chartierfc8b4222017-09-17 13:44:24 -0700942 std::string tmp = method_ref.PrettyMethod();
Andreas Gampe70bef0d2015-04-15 02:37:28 -0700943 return methods_to_compile_->find(tmp.c_str()) != methods_to_compile_->end();
944}
945
Calin Juravle226501b2015-12-11 14:41:31 +0000946bool CompilerDriver::ShouldCompileBasedOnProfile(const MethodReference& method_ref) const {
Mathieu Chartier97ab5e32017-02-22 13:35:44 -0800947 // Profile compilation info may be null if no profile is passed.
Mathieu Chartierd0af56c2017-02-17 12:56:25 -0800948 if (!CompilerFilter::DependsOnProfile(compiler_options_->GetCompilerFilter())) {
949 // Use the compiler filter instead of the presence of profile_compilation_info_ since
950 // we may want to have full speed compilation along with profile based layout optimizations.
Calin Juravle226501b2015-12-11 14:41:31 +0000951 return true;
952 }
Mathieu Chartier97ab5e32017-02-22 13:35:44 -0800953 // If we are using a profile filter but do not have a profile compilation info, compile nothing.
954 if (profile_compilation_info_ == nullptr) {
955 return false;
956 }
Mathieu Chartier7b135c82017-06-05 12:54:01 -0700957 // Compile only hot methods, it is the profile saver's job to decide what startup methods to mark
958 // as hot.
Mathieu Chartierbbe3a5e2017-06-13 16:36:17 -0700959 bool result = profile_compilation_info_->GetMethodHotness(method_ref).IsHot();
Calin Juravle226501b2015-12-11 14:41:31 +0000960
961 if (kDebugProfileGuidedCompilation) {
962 LOG(INFO) << "[ProfileGuidedCompilation] "
Mathieu Chartierfc8b4222017-09-17 13:44:24 -0700963 << (result ? "Compiled" : "Skipped") << " method:" << method_ref.PrettyMethod(true);
Calin Juravle226501b2015-12-11 14:41:31 +0000964 }
965 return result;
966}
967
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700968class ResolveCatchBlockExceptionsClassVisitor : public ClassVisitor {
969 public:
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000970 ResolveCatchBlockExceptionsClassVisitor() : classes_() {}
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700971
Mathieu Chartier28357fa2016-10-18 16:27:40 -0700972 virtual bool operator()(ObjPtr<mirror::Class> c) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000973 classes_.push_back(c);
Mathieu Chartiere4275c02015-08-06 15:34:15 -0700974 return true;
975 }
976
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000977 void FindExceptionTypesToResolve(
978 std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve)
Vladimir Markobfb80d22017-02-14 14:08:12 +0000979 REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Marko8d6768d2017-03-14 10:13:21 +0000980 const auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
981 for (ObjPtr<mirror::Class> klass : classes_) {
982 for (ArtMethod& method : klass->GetMethods(pointer_size)) {
983 FindExceptionTypesToResolveForMethod(&method, exceptions_to_resolve);
984 }
985 }
986 }
987
988 private:
989 void FindExceptionTypesToResolveForMethod(
990 ArtMethod* method,
991 std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve)
992 REQUIRES_SHARED(Locks::mutator_lock_) {
993 const DexFile::CodeItem* code_item = method->GetCodeItem();
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700994 if (code_item == nullptr) {
995 return; // native or abstract method
Brian Carlstrom7940e442013-07-12 13:46:57 -0700996 }
Mathieu Chartiere0671ce2015-07-28 17:23:28 -0700997 if (code_item->tries_size_ == 0) {
998 return; // nothing to process
999 }
1000 const uint8_t* encoded_catch_handler_list = DexFile::GetCatchHandlerData(*code_item, 0);
1001 size_t num_encoded_catch_handlers = DecodeUnsignedLeb128(&encoded_catch_handler_list);
1002 for (size_t i = 0; i < num_encoded_catch_handlers; i++) {
1003 int32_t encoded_catch_handler_size = DecodeSignedLeb128(&encoded_catch_handler_list);
1004 bool has_catch_all = false;
1005 if (encoded_catch_handler_size <= 0) {
1006 encoded_catch_handler_size = -encoded_catch_handler_size;
1007 has_catch_all = true;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001008 }
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001009 for (int32_t j = 0; j < encoded_catch_handler_size; j++) {
Andreas Gampea5b09a62016-11-17 15:21:22 -08001010 dex::TypeIndex encoded_catch_handler_handlers_type_idx =
1011 dex::TypeIndex(DecodeUnsignedLeb128(&encoded_catch_handler_list));
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001012 // Add to set of types to resolve if not already in the dex cache resolved types
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001013 if (!method->IsResolvedTypeIdx(encoded_catch_handler_handlers_type_idx)) {
1014 exceptions_to_resolve->emplace(encoded_catch_handler_handlers_type_idx,
1015 method->GetDexFile());
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001016 }
1017 // ignore address associated with catch handler
1018 DecodeUnsignedLeb128(&encoded_catch_handler_list);
1019 }
1020 if (has_catch_all) {
1021 // ignore catch all address
1022 DecodeUnsignedLeb128(&encoded_catch_handler_list);
1023 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001024 }
1025 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001026
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001027 std::vector<ObjPtr<mirror::Class>> classes_;
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001028};
1029
1030class RecordImageClassesVisitor : public ClassVisitor {
1031 public:
1032 explicit RecordImageClassesVisitor(std::unordered_set<std::string>* image_classes)
1033 : image_classes_(image_classes) {}
1034
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001035 bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001036 std::string temp;
1037 image_classes_->insert(klass->GetDescriptor(&temp));
1038 return true;
1039 }
1040
1041 private:
1042 std::unordered_set<std::string>* const image_classes_;
1043};
Brian Carlstrom7940e442013-07-12 13:46:57 -07001044
1045// Make a list of descriptors for classes to include in the image
Mathieu Chartier90443472015-07-16 20:32:27 -07001046void CompilerDriver::LoadImageClasses(TimingLogger* timings) {
Kenny Rootd5185342014-05-13 14:47:05 -07001047 CHECK(timings != nullptr);
Vladimir Markoaad75c62016-10-03 08:46:48 +00001048 if (!GetCompilerOptions().IsBootImage()) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001049 return;
1050 }
1051
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001052 TimingLogger::ScopedTiming t("LoadImageClasses", timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001053 // Make a first class to load all classes explicitly listed in the file
1054 Thread* self = Thread::Current();
1055 ScopedObjectAccess soa(self);
1056 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
Kenny Rootd5185342014-05-13 14:47:05 -07001057 CHECK(image_classes_.get() != nullptr);
Mathieu Chartier02e25112013-08-14 16:14:24 -07001058 for (auto it = image_classes_->begin(), end = image_classes_->end(); it != end;) {
Vladimir Markoe9c36b32013-11-21 15:49:16 +00001059 const std::string& descriptor(*it);
Mathieu Chartiereb8167a2014-05-07 15:43:14 -07001060 StackHandleScope<1> hs(self);
1061 Handle<mirror::Class> klass(
1062 hs.NewHandle(class_linker->FindSystemClass(self, descriptor.c_str())));
Andreas Gampefa4333d2017-02-14 11:10:34 -08001063 if (klass == nullptr) {
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001064 VLOG(compiler) << "Failed to find class " << descriptor;
Vladimir Markoe9c36b32013-11-21 15:49:16 +00001065 image_classes_->erase(it++);
Ian Rogersa436fde2013-08-27 23:34:06 -07001066 self->ClearException();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001067 } else {
1068 ++it;
1069 }
1070 }
1071
1072 // Resolve exception classes referenced by the loaded classes. The catch logic assumes
1073 // exceptions are resolved by the verifier when there is a catch block in an interested method.
1074 // Do this here so that exception classes appear to have been specified image classes.
Andreas Gampea5b09a62016-11-17 15:21:22 -08001075 std::set<std::pair<dex::TypeIndex, const DexFile*>> unresolved_exception_types;
Mathieu Chartiereb8167a2014-05-07 15:43:14 -07001076 StackHandleScope<1> hs(self);
1077 Handle<mirror::Class> java_lang_Throwable(
1078 hs.NewHandle(class_linker->FindSystemClass(self, "Ljava/lang/Throwable;")));
Brian Carlstrom7940e442013-07-12 13:46:57 -07001079 do {
1080 unresolved_exception_types.clear();
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001081 {
1082 // Thread suspension is not allowed while ResolveCatchBlockExceptionsClassVisitor
1083 // is using a std::vector<ObjPtr<mirror::Class>>.
1084 ScopedAssertNoThreadSuspension ants(__FUNCTION__);
1085 ResolveCatchBlockExceptionsClassVisitor visitor;
1086 class_linker->VisitClasses(&visitor);
1087 visitor.FindExceptionTypesToResolve(&unresolved_exception_types);
1088 }
Andreas Gampea5b09a62016-11-17 15:21:22 -08001089 for (const auto& exception_type : unresolved_exception_types) {
1090 dex::TypeIndex exception_type_idx = exception_type.first;
Mathieu Chartier02e25112013-08-14 16:14:24 -07001091 const DexFile* dex_file = exception_type.second;
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001092 StackHandleScope<2> hs2(self);
Mathieu Chartierf284d442016-06-02 11:48:30 -07001093 Handle<mirror::DexCache> dex_cache(hs2.NewHandle(class_linker->RegisterDexFile(*dex_file,
1094 nullptr)));
Andreas Gampe277ccbd2014-11-03 21:36:10 -08001095 Handle<mirror::Class> klass(hs2.NewHandle(
Andreas Gampefa4333d2017-02-14 11:10:34 -08001096 (dex_cache != nullptr)
Vladimir Markocd556b02017-02-03 11:47:34 +00001097 ? class_linker->ResolveType(*dex_file,
1098 exception_type_idx,
1099 dex_cache,
1100 ScopedNullHandle<mirror::ClassLoader>())
1101 : nullptr));
Andreas Gampefa4333d2017-02-14 11:10:34 -08001102 if (klass == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001103 const DexFile::TypeId& type_id = dex_file->GetTypeId(exception_type_idx);
1104 const char* descriptor = dex_file->GetTypeDescriptor(type_id);
1105 LOG(FATAL) << "Failed to resolve class " << descriptor;
1106 }
Mathieu Chartiereb8167a2014-05-07 15:43:14 -07001107 DCHECK(java_lang_Throwable->IsAssignableFrom(klass.Get()));
Brian Carlstrom7940e442013-07-12 13:46:57 -07001108 }
1109 // Resolving exceptions may load classes that reference more exceptions, iterate until no
1110 // more are found
1111 } while (!unresolved_exception_types.empty());
1112
1113 // We walk the roots looking for classes so that we'll pick up the
1114 // above classes plus any classes them depend on such super
1115 // classes, interfaces, and the required ClassLinker roots.
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001116 RecordImageClassesVisitor visitor(image_classes_.get());
1117 class_linker->VisitClasses(&visitor);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001118
1119 CHECK_NE(image_classes_->size(), 0U);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001120}
1121
Vladimir Marko19a4d372016-12-08 14:41:46 +00001122static void MaybeAddToImageClasses(Thread* self,
1123 ObjPtr<mirror::Class> klass,
Andreas Gampeb1fcead2015-04-20 18:53:51 -07001124 std::unordered_set<std::string>* image_classes)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001125 REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Marko19a4d372016-12-08 14:41:46 +00001126 DCHECK_EQ(self, Thread::Current());
Mathieu Chartierf8322842014-05-16 10:59:25 -07001127 StackHandleScope<1> hs(self);
Ian Rogers1ff3c982014-08-12 02:30:58 -07001128 std::string temp;
Andreas Gampe542451c2016-07-26 09:02:02 -07001129 const PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001130 while (!klass->IsObjectClass()) {
Ian Rogers1ff3c982014-08-12 02:30:58 -07001131 const char* descriptor = klass->GetDescriptor(&temp);
Andreas Gampeb1fcead2015-04-20 18:53:51 -07001132 std::pair<std::unordered_set<std::string>::iterator, bool> result =
1133 image_classes->insert(descriptor);
Ian Rogers1ff3c982014-08-12 02:30:58 -07001134 if (!result.second) { // Previously inserted.
1135 break;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001136 }
Ian Rogers1ff3c982014-08-12 02:30:58 -07001137 VLOG(compiler) << "Adding " << descriptor << " to image classes";
Vladimir Marko19a4d372016-12-08 14:41:46 +00001138 for (size_t i = 0, num_interfaces = klass->NumDirectInterfaces(); i != num_interfaces; ++i) {
1139 ObjPtr<mirror::Class> interface = mirror::Class::GetDirectInterface(self, klass, i);
1140 DCHECK(interface != nullptr);
1141 MaybeAddToImageClasses(self, interface, image_classes);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001142 }
Vladimir Marko19a4d372016-12-08 14:41:46 +00001143 for (auto& m : klass->GetVirtualMethods(pointer_size)) {
1144 MaybeAddToImageClasses(self, m.GetDeclaringClass(), image_classes);
Mathieu Chartiere401d142015-04-22 13:56:20 -07001145 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001146 if (klass->IsArrayClass()) {
Vladimir Marko19a4d372016-12-08 14:41:46 +00001147 MaybeAddToImageClasses(self, klass->GetComponentType(), image_classes);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001148 }
Mathieu Chartierf8322842014-05-16 10:59:25 -07001149 klass.Assign(klass->GetSuperClass());
Brian Carlstrom7940e442013-07-12 13:46:57 -07001150 }
1151}
1152
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001153// Keeps all the data for the update together. Also doubles as the reference visitor.
1154// Note: we can use object pointers because we suspend all threads.
1155class ClinitImageUpdate {
1156 public:
Mathieu Chartier31e88222016-10-14 18:43:19 -07001157 static ClinitImageUpdate* Create(VariableSizedHandleScope& hs,
1158 std::unordered_set<std::string>* image_class_descriptors,
1159 Thread* self,
1160 ClassLinker* linker) {
1161 std::unique_ptr<ClinitImageUpdate> res(new ClinitImageUpdate(hs,
1162 image_class_descriptors,
1163 self,
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001164 linker));
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001165 return res.release();
1166 }
1167
1168 ~ClinitImageUpdate() {
1169 // Allow others to suspend again.
1170 self_->EndAssertNoThreadSuspension(old_cause_);
1171 }
1172
1173 // Visitor for VisitReferences.
Mathieu Chartier31e88222016-10-14 18:43:19 -07001174 void operator()(ObjPtr<mirror::Object> object,
1175 MemberOffset field_offset,
1176 bool /* is_static */) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001177 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001178 mirror::Object* ref = object->GetFieldObject<mirror::Object>(field_offset);
1179 if (ref != nullptr) {
1180 VisitClinitClassesObject(ref);
1181 }
1182 }
1183
Roland Levillain5e8d5f02016-10-18 18:03:43 +01001184 // java.lang.ref.Reference visitor for VisitReferences.
Mathieu Chartier31e88222016-10-14 18:43:19 -07001185 void operator()(ObjPtr<mirror::Class> klass ATTRIBUTE_UNUSED,
1186 ObjPtr<mirror::Reference> ref ATTRIBUTE_UNUSED) const {}
Mathieu Chartierda7c6502015-07-23 16:01:26 -07001187
1188 // Ignore class native roots.
1189 void VisitRootIfNonNull(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED)
1190 const {}
1191 void VisitRoot(mirror::CompressedReference<mirror::Object>* root ATTRIBUTE_UNUSED) const {}
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001192
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001193 void Walk() REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001194 // Use the initial classes as roots for a search.
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001195 for (Handle<mirror::Class> klass_root : image_classes_) {
1196 VisitClinitClassesObject(klass_root.Get());
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001197 }
Vladimir Marko19a4d372016-12-08 14:41:46 +00001198 Thread* self = Thread::Current();
1199 ScopedAssertNoThreadSuspension ants(__FUNCTION__);
Mathieu Chartier31e88222016-10-14 18:43:19 -07001200 for (Handle<mirror::Class> h_klass : to_insert_) {
Vladimir Marko19a4d372016-12-08 14:41:46 +00001201 MaybeAddToImageClasses(self, h_klass.Get(), image_class_descriptors_);
Mathieu Chartier31e88222016-10-14 18:43:19 -07001202 }
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001203 }
1204
1205 private:
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001206 class FindImageClassesVisitor : public ClassVisitor {
1207 public:
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001208 explicit FindImageClassesVisitor(VariableSizedHandleScope& hs,
1209 ClinitImageUpdate* data)
1210 : data_(data),
1211 hs_(hs) {}
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001212
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001213 bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001214 std::string temp;
1215 const char* name = klass->GetDescriptor(&temp);
1216 if (data_->image_class_descriptors_->find(name) != data_->image_class_descriptors_->end()) {
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001217 data_->image_classes_.push_back(hs_.NewHandle(klass));
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001218 } else {
1219 // Check whether it is initialized and has a clinit. They must be kept, too.
1220 if (klass->IsInitialized() && klass->FindClassInitializer(
1221 Runtime::Current()->GetClassLinker()->GetImagePointerSize()) != nullptr) {
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001222 data_->image_classes_.push_back(hs_.NewHandle(klass));
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001223 }
1224 }
1225 return true;
1226 }
1227
1228 private:
1229 ClinitImageUpdate* const data_;
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001230 VariableSizedHandleScope& hs_;
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001231 };
1232
Mathieu Chartier31e88222016-10-14 18:43:19 -07001233 ClinitImageUpdate(VariableSizedHandleScope& hs,
1234 std::unordered_set<std::string>* image_class_descriptors,
1235 Thread* self,
1236 ClassLinker* linker) REQUIRES_SHARED(Locks::mutator_lock_)
1237 : hs_(hs),
1238 image_class_descriptors_(image_class_descriptors),
1239 self_(self) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001240 CHECK(linker != nullptr);
1241 CHECK(image_class_descriptors != nullptr);
1242
1243 // Make sure nobody interferes with us.
1244 old_cause_ = self->StartAssertNoThreadSuspension("Boot image closure");
1245
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001246 // Find all the already-marked classes.
1247 WriterMutexLock mu(self, *Locks::heap_bitmap_lock_);
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001248 FindImageClassesVisitor visitor(hs_, this);
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001249 linker->VisitClasses(&visitor);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001250 }
1251
1252 void VisitClinitClassesObject(mirror::Object* object) const
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001253 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001254 DCHECK(object != nullptr);
1255 if (marked_objects_.find(object) != marked_objects_.end()) {
1256 // Already processed.
1257 return;
1258 }
1259
1260 // Mark it.
1261 marked_objects_.insert(object);
1262
1263 if (object->IsClass()) {
Mathieu Chartier31e88222016-10-14 18:43:19 -07001264 // Add to the TODO list since MaybeAddToImageClasses may cause thread suspension. Thread
1265 // suspensionb is not safe to do in VisitObjects or VisitReferences.
1266 to_insert_.push_back(hs_.NewHandle(object->AsClass()));
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001267 } else {
1268 // Else visit the object's class.
1269 VisitClinitClassesObject(object->GetClass());
1270 }
1271
Mathieu Chartiere401d142015-04-22 13:56:20 -07001272 // If it is not a DexCache, visit all references.
Mathieu Chartier31e88222016-10-14 18:43:19 -07001273 if (!object->IsDexCache()) {
Mathieu Chartier059ef3d2015-08-18 13:54:21 -07001274 object->VisitReferences(*this, *this);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001275 }
1276 }
1277
Mathieu Chartier31e88222016-10-14 18:43:19 -07001278 VariableSizedHandleScope& hs_;
1279 mutable std::vector<Handle<mirror::Class>> to_insert_;
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001280 mutable std::unordered_set<mirror::Object*> marked_objects_;
Andreas Gampeb1fcead2015-04-20 18:53:51 -07001281 std::unordered_set<std::string>* const image_class_descriptors_;
Mathieu Chartier28357fa2016-10-18 16:27:40 -07001282 std::vector<Handle<mirror::Class>> image_classes_;
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001283 Thread* const self_;
1284 const char* old_cause_;
1285
1286 DISALLOW_COPY_AND_ASSIGN(ClinitImageUpdate);
1287};
Brian Carlstrom7940e442013-07-12 13:46:57 -07001288
Ian Rogers3d504072014-03-01 09:16:49 -08001289void CompilerDriver::UpdateImageClasses(TimingLogger* timings) {
Vladimir Markoaad75c62016-10-03 08:46:48 +00001290 if (GetCompilerOptions().IsBootImage()) {
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001291 TimingLogger::ScopedTiming t("UpdateImageClasses", timings);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001292
Mathieu Chartier4f55e222015-09-04 13:26:21 -07001293 Runtime* runtime = Runtime::Current();
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001294
1295 // Suspend all threads.
Mathieu Chartier4f55e222015-09-04 13:26:21 -07001296 ScopedSuspendAll ssa(__FUNCTION__);
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001297
Mathieu Chartier31e88222016-10-14 18:43:19 -07001298 VariableSizedHandleScope hs(Thread::Current());
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001299 std::string error_msg;
Mathieu Chartier31e88222016-10-14 18:43:19 -07001300 std::unique_ptr<ClinitImageUpdate> update(ClinitImageUpdate::Create(hs,
1301 image_classes_.get(),
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001302 Thread::Current(),
Mathieu Chartier31e88222016-10-14 18:43:19 -07001303 runtime->GetClassLinker()));
Andreas Gampeb0f370e2014-09-25 22:51:40 -07001304
1305 // Do the marking.
1306 update->Walk();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001307 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001308}
1309
Vladimir Marko07785bb2015-06-15 18:52:54 +01001310bool CompilerDriver::CanAssumeClassIsLoaded(mirror::Class* klass) {
1311 Runtime* runtime = Runtime::Current();
1312 if (!runtime->IsAotCompiler()) {
Calin Juravleffc87072016-04-20 14:22:09 +01001313 DCHECK(runtime->UseJitCompilation());
Vladimir Marko07785bb2015-06-15 18:52:54 +01001314 // Having the klass reference here implies that the klass is already loaded.
1315 return true;
1316 }
Vladimir Markoaad75c62016-10-03 08:46:48 +00001317 if (!GetCompilerOptions().IsBootImage()) {
Vladimir Marko07785bb2015-06-15 18:52:54 +01001318 // Assume loaded only if klass is in the boot image. App classes cannot be assumed
1319 // loaded because we don't even know what class loader will be used to load them.
1320 bool class_in_image = runtime->GetHeap()->FindSpaceFromObject(klass, false)->IsImageSpace();
1321 return class_in_image;
1322 }
1323 std::string temp;
1324 const char* descriptor = klass->GetDescriptor(&temp);
1325 return IsImageClass(descriptor);
1326}
1327
Vladimir Marko492a7fa2016-06-01 18:38:43 +01001328void CompilerDriver::MarkForDexToDexCompilation(Thread* self, const MethodReference& method_ref) {
1329 MutexLock lock(self, dex_to_dex_references_lock_);
1330 // Since we're compiling one dex file at a time, we need to look for the
1331 // current dex file entry only at the end of dex_to_dex_references_.
1332 if (dex_to_dex_references_.empty() ||
1333 &dex_to_dex_references_.back().GetDexFile() != method_ref.dex_file) {
1334 dex_to_dex_references_.emplace_back(*method_ref.dex_file);
1335 }
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07001336 dex_to_dex_references_.back().GetMethodIndexes().SetBit(method_ref.index);
Vladimir Marko492a7fa2016-06-01 18:38:43 +01001337}
1338
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001339bool CompilerDriver::CanAccessTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class,
1340 ObjPtr<mirror::Class> resolved_class) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001341 if (resolved_class == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001342 stats_->TypeNeedsAccessCheck();
1343 return false; // Unknown class needs access checks.
1344 }
David Brazdil38f64d32016-01-18 17:13:41 +00001345 bool is_accessible = resolved_class->IsPublic(); // Public classes are always accessible.
1346 if (!is_accessible) {
David Brazdil38f64d32016-01-18 17:13:41 +00001347 if (referrer_class == nullptr) {
1348 stats_->TypeNeedsAccessCheck();
1349 return false; // Incomplete referrer knowledge needs access check.
1350 }
1351 // Perform access check, will return true if access is ok or false if we're going to have to
1352 // check this at runtime (for example for class loaders).
1353 is_accessible = referrer_class->CanAccess(resolved_class);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001354 }
David Brazdil38f64d32016-01-18 17:13:41 +00001355 if (is_accessible) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001356 stats_->TypeDoesntNeedAccessCheck();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001357 } else {
1358 stats_->TypeNeedsAccessCheck();
1359 }
David Brazdil38f64d32016-01-18 17:13:41 +00001360 return is_accessible;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001361}
1362
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001363bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class,
1364 ObjPtr<mirror::Class> resolved_class,
Mingyao Yangfb8464a2015-11-02 10:56:59 -08001365 bool* finalizable) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001366 if (resolved_class == nullptr) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001367 stats_->TypeNeedsAccessCheck();
Mingyao Yangfb8464a2015-11-02 10:56:59 -08001368 // Be conservative.
1369 *finalizable = true;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001370 return false; // Unknown class needs access checks.
1371 }
Mingyao Yangfb8464a2015-11-02 10:56:59 -08001372 *finalizable = resolved_class->IsFinalizable();
David Brazdil38f64d32016-01-18 17:13:41 +00001373 bool is_accessible = resolved_class->IsPublic(); // Public classes are always accessible.
1374 if (!is_accessible) {
David Brazdil38f64d32016-01-18 17:13:41 +00001375 if (referrer_class == nullptr) {
1376 stats_->TypeNeedsAccessCheck();
1377 return false; // Incomplete referrer knowledge needs access check.
1378 }
1379 // Perform access and instantiable checks, will return true if access is ok or false if we're
1380 // going to have to check this at runtime (for example for class loaders).
1381 is_accessible = referrer_class->CanAccess(resolved_class);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001382 }
David Brazdil38f64d32016-01-18 17:13:41 +00001383 bool result = is_accessible && resolved_class->IsInstantiable();
Brian Carlstrom7940e442013-07-12 13:46:57 -07001384 if (result) {
1385 stats_->TypeDoesntNeedAccessCheck();
1386 } else {
1387 stats_->TypeNeedsAccessCheck();
1388 }
1389 return result;
1390}
1391
Vladimir Markobe0e5462014-02-26 11:24:15 +00001392void CompilerDriver::ProcessedInstanceField(bool resolved) {
1393 if (!resolved) {
1394 stats_->UnresolvedInstanceField();
1395 } else {
1396 stats_->ResolvedInstanceField();
1397 }
1398}
1399
1400void CompilerDriver::ProcessedStaticField(bool resolved, bool local) {
1401 if (!resolved) {
1402 stats_->UnresolvedStaticField();
1403 } else if (local) {
1404 stats_->ResolvedLocalStaticField();
1405 } else {
1406 stats_->ResolvedStaticField();
1407 }
1408}
1409
Mathieu Chartierc7853442015-03-27 14:35:38 -07001410ArtField* CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx,
1411 const DexCompilationUnit* mUnit, bool is_put,
1412 const ScopedObjectAccess& soa) {
Vladimir Markobe0e5462014-02-26 11:24:15 +00001413 // Try to resolve the field and compiling method's class.
Mathieu Chartierc7853442015-03-27 14:35:38 -07001414 ArtField* resolved_field;
Vladimir Markobe0e5462014-02-26 11:24:15 +00001415 mirror::Class* referrer_class;
Mathieu Chartier736b5602015-09-02 14:54:11 -07001416 Handle<mirror::DexCache> dex_cache(mUnit->GetDexCache());
Vladimir Markobe0e5462014-02-26 11:24:15 +00001417 {
Vladimir Marko8d6768d2017-03-14 10:13:21 +00001418 Handle<mirror::ClassLoader> class_loader_handle = mUnit->GetClassLoader();
Mathieu Chartier736b5602015-09-02 14:54:11 -07001419 resolved_field = ResolveField(soa, dex_cache, class_loader_handle, mUnit, field_idx, false);
Mathieu Chartierc7853442015-03-27 14:35:38 -07001420 referrer_class = resolved_field != nullptr
Mathieu Chartier736b5602015-09-02 14:54:11 -07001421 ? ResolveCompilingMethodsClass(soa, dex_cache, class_loader_handle, mUnit) : nullptr;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001422 }
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001423 bool can_link = false;
Vladimir Markobe0e5462014-02-26 11:24:15 +00001424 if (resolved_field != nullptr && referrer_class != nullptr) {
Vladimir Markobe0e5462014-02-26 11:24:15 +00001425 std::pair<bool, bool> fast_path = IsFastInstanceField(
Mathieu Chartier736b5602015-09-02 14:54:11 -07001426 dex_cache.Get(), referrer_class, resolved_field, field_idx);
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001427 can_link = is_put ? fast_path.second : fast_path.first;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001428 }
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001429 ProcessedInstanceField(can_link);
1430 return can_link ? resolved_field : nullptr;
1431}
1432
1433bool CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit,
1434 bool is_put, MemberOffset* field_offset,
1435 bool* is_volatile) {
1436 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartierc7853442015-03-27 14:35:38 -07001437 ArtField* resolved_field = ComputeInstanceFieldInfo(field_idx, mUnit, is_put, soa);
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001438
Mathieu Chartierc7853442015-03-27 14:35:38 -07001439 if (resolved_field == nullptr) {
Vladimir Markobe0e5462014-02-26 11:24:15 +00001440 // Conservative defaults.
1441 *is_volatile = true;
1442 *field_offset = MemberOffset(static_cast<size_t>(-1));
Nicolas Geoffraye5038322014-07-04 09:41:32 +01001443 return false;
1444 } else {
1445 *is_volatile = resolved_field->IsVolatile();
1446 *field_offset = resolved_field->GetOffset();
1447 return true;
Vladimir Markobe0e5462014-02-26 11:24:15 +00001448 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001449}
1450
Vladimir Marko2730db02014-01-27 11:15:17 +00001451const VerifiedMethod* CompilerDriver::GetVerifiedMethod(const DexFile* dex_file,
1452 uint32_t method_idx) const {
1453 MethodReference ref(dex_file, method_idx);
1454 return verification_results_->GetVerifiedMethod(ref);
1455}
1456
1457bool CompilerDriver::IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001458 if (!compiler_options_->IsVerificationEnabled()) {
1459 // If we didn't verify, every cast has to be treated as non-safe.
1460 return false;
1461 }
Vladimir Marko2730db02014-01-27 11:15:17 +00001462 DCHECK(mUnit->GetVerifiedMethod() != nullptr);
1463 bool result = mUnit->GetVerifiedMethod()->IsSafeCast(dex_pc);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001464 if (result) {
1465 stats_->SafeCast();
1466 } else {
1467 stats_->NotASafeCast();
1468 }
1469 return result;
1470}
1471
Mathieu Chartier90443472015-07-16 20:32:27 -07001472class CompilationVisitor {
1473 public:
1474 virtual ~CompilationVisitor() {}
1475 virtual void Visit(size_t index) = 0;
1476};
1477
Brian Carlstrom7940e442013-07-12 13:46:57 -07001478class ParallelCompilationManager {
1479 public:
Brian Carlstrom7940e442013-07-12 13:46:57 -07001480 ParallelCompilationManager(ClassLinker* class_linker,
1481 jobject class_loader,
1482 CompilerDriver* compiler,
1483 const DexFile* dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07001484 const std::vector<const DexFile*>& dex_files,
Ian Rogers3d504072014-03-01 09:16:49 -08001485 ThreadPool* thread_pool)
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001486 : index_(0),
1487 class_linker_(class_linker),
Brian Carlstrom7940e442013-07-12 13:46:57 -07001488 class_loader_(class_loader),
1489 compiler_(compiler),
1490 dex_file_(dex_file),
Andreas Gampede7b4362014-07-28 18:38:57 -07001491 dex_files_(dex_files),
Ian Rogers3d504072014-03-01 09:16:49 -08001492 thread_pool_(thread_pool) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07001493
1494 ClassLinker* GetClassLinker() const {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001495 CHECK(class_linker_ != nullptr);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001496 return class_linker_;
1497 }
1498
1499 jobject GetClassLoader() const {
1500 return class_loader_;
1501 }
1502
1503 CompilerDriver* GetCompiler() const {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001504 CHECK(compiler_ != nullptr);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001505 return compiler_;
1506 }
1507
1508 const DexFile* GetDexFile() const {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001509 CHECK(dex_file_ != nullptr);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001510 return dex_file_;
1511 }
1512
Andreas Gampede7b4362014-07-28 18:38:57 -07001513 const std::vector<const DexFile*>& GetDexFiles() const {
1514 return dex_files_;
1515 }
1516
Mathieu Chartier90443472015-07-16 20:32:27 -07001517 void ForAll(size_t begin, size_t end, CompilationVisitor* visitor, size_t work_units)
1518 REQUIRES(!*Locks::mutator_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001519 Thread* self = Thread::Current();
1520 self->AssertNoPendingException();
1521 CHECK_GT(work_units, 0U);
1522
Ian Rogers3e5cf302014-05-20 16:40:37 -07001523 index_.StoreRelaxed(begin);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001524 for (size_t i = 0; i < work_units; ++i) {
Mathieu Chartier90443472015-07-16 20:32:27 -07001525 thread_pool_->AddTask(self, new ForAllClosure(this, end, visitor));
Brian Carlstrom7940e442013-07-12 13:46:57 -07001526 }
1527 thread_pool_->StartWorkers(self);
1528
1529 // Ensure we're suspended while we're blocked waiting for the other threads to finish (worker
1530 // thread destructor's called below perform join).
1531 CHECK_NE(self->GetState(), kRunnable);
1532
1533 // Wait for all the worker threads to finish.
1534 thread_pool_->Wait(self, true, false);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001535
1536 // And stop the workers accepting jobs.
1537 thread_pool_->StopWorkers(self);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001538 }
1539
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001540 size_t NextIndex() {
Ian Rogers3e5cf302014-05-20 16:40:37 -07001541 return index_.FetchAndAddSequentiallyConsistent(1);
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001542 }
1543
Brian Carlstrom7940e442013-07-12 13:46:57 -07001544 private:
Brian Carlstrom7940e442013-07-12 13:46:57 -07001545 class ForAllClosure : public Task {
1546 public:
Mathieu Chartier90443472015-07-16 20:32:27 -07001547 ForAllClosure(ParallelCompilationManager* manager, size_t end, CompilationVisitor* visitor)
Brian Carlstrom7940e442013-07-12 13:46:57 -07001548 : manager_(manager),
Brian Carlstrom7940e442013-07-12 13:46:57 -07001549 end_(end),
Mathieu Chartier90443472015-07-16 20:32:27 -07001550 visitor_(visitor) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07001551
1552 virtual void Run(Thread* self) {
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001553 while (true) {
1554 const size_t index = manager_->NextIndex();
1555 if (UNLIKELY(index >= end_)) {
1556 break;
1557 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001558 visitor_->Visit(index);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001559 self->AssertNoPendingException();
1560 }
1561 }
1562
1563 virtual void Finalize() {
1564 delete this;
1565 }
Brian Carlstrom0cd7ec22013-07-17 23:40:20 -07001566
Brian Carlstrom7940e442013-07-12 13:46:57 -07001567 private:
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001568 ParallelCompilationManager* const manager_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001569 const size_t end_;
Mathieu Chartier90443472015-07-16 20:32:27 -07001570 CompilationVisitor* const visitor_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001571 };
1572
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001573 AtomicInteger index_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001574 ClassLinker* const class_linker_;
1575 const jobject class_loader_;
1576 CompilerDriver* const compiler_;
1577 const DexFile* const dex_file_;
Andreas Gampede7b4362014-07-28 18:38:57 -07001578 const std::vector<const DexFile*>& dex_files_;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001579 ThreadPool* const thread_pool_;
Mathieu Chartier0b3eb392013-08-23 14:56:59 -07001580
1581 DISALLOW_COPY_AND_ASSIGN(ParallelCompilationManager);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001582};
1583
Jeff Hao0e49b422013-11-08 12:16:56 -08001584// A fast version of SkipClass above if the class pointer is available
1585// that avoids the expensive FindInClassPath search.
1586static bool SkipClass(jobject class_loader, const DexFile& dex_file, mirror::Class* klass)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001587 REQUIRES_SHARED(Locks::mutator_lock_) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001588 DCHECK(klass != nullptr);
Jeff Hao0e49b422013-11-08 12:16:56 -08001589 const DexFile& original_dex_file = *klass->GetDexCache()->GetDexFile();
1590 if (&dex_file != &original_dex_file) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001591 if (class_loader == nullptr) {
David Sehr709b0702016-10-13 09:12:37 -07001592 LOG(WARNING) << "Skipping class " << klass->PrettyDescriptor() << " from "
Jeff Hao0e49b422013-11-08 12:16:56 -08001593 << dex_file.GetLocation() << " previously found in "
1594 << original_dex_file.GetLocation();
1595 }
1596 return true;
1597 }
1598 return false;
1599}
1600
Mathieu Chartier70b63482014-06-27 17:19:04 -07001601static void CheckAndClearResolveException(Thread* self)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -07001602 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier70b63482014-06-27 17:19:04 -07001603 CHECK(self->IsExceptionPending());
Nicolas Geoffray14691c52015-03-05 10:40:17 +00001604 mirror::Throwable* exception = self->GetException();
Ian Rogers1ff3c982014-08-12 02:30:58 -07001605 std::string temp;
1606 const char* descriptor = exception->GetClass()->GetDescriptor(&temp);
1607 const char* expected_exceptions[] = {
1608 "Ljava/lang/IllegalAccessError;",
1609 "Ljava/lang/IncompatibleClassChangeError;",
1610 "Ljava/lang/InstantiationError;",
Brian Carlstrom898fcb52014-08-25 23:07:30 -07001611 "Ljava/lang/LinkageError;",
Ian Rogers1ff3c982014-08-12 02:30:58 -07001612 "Ljava/lang/NoClassDefFoundError;",
1613 "Ljava/lang/NoSuchFieldError;",
1614 "Ljava/lang/NoSuchMethodError;"
1615 };
1616 bool found = false;
1617 for (size_t i = 0; (found == false) && (i < arraysize(expected_exceptions)); ++i) {
1618 if (strcmp(descriptor, expected_exceptions[i]) == 0) {
1619 found = true;
1620 }
1621 }
1622 if (!found) {
Brian Carlstrom898fcb52014-08-25 23:07:30 -07001623 LOG(FATAL) << "Unexpected exception " << exception->Dump();
Mathieu Chartier70b63482014-06-27 17:19:04 -07001624 }
1625 self->ClearException();
1626}
1627
Mathieu Chartierb5d38612016-04-07 10:52:52 -07001628bool CompilerDriver::RequiresConstructorBarrier(const DexFile& dex_file,
1629 uint16_t class_def_idx) const {
1630 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_idx);
1631 const uint8_t* class_data = dex_file.GetClassData(class_def);
1632 if (class_data == nullptr) {
1633 // Empty class such as a marker interface.
1634 return false;
1635 }
1636 ClassDataItemIterator it(dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -07001637 it.SkipStaticFields();
Mathieu Chartierb5d38612016-04-07 10:52:52 -07001638 // We require a constructor barrier if there are final instance fields.
1639 while (it.HasNextInstanceField()) {
1640 if (it.MemberIsFinal()) {
1641 return true;
1642 }
1643 it.Next();
1644 }
1645 return false;
1646}
1647
Mathieu Chartier90443472015-07-16 20:32:27 -07001648class ResolveClassFieldsAndMethodsVisitor : public CompilationVisitor {
1649 public:
1650 explicit ResolveClassFieldsAndMethodsVisitor(const ParallelCompilationManager* manager)
1651 : manager_(manager) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07001652
Mathieu Chartiere0671ce2015-07-28 17:23:28 -07001653 void Visit(size_t class_def_index) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
Mathieu Chartier90443472015-07-16 20:32:27 -07001654 ATRACE_CALL();
1655 Thread* const self = Thread::Current();
1656 jobject jclass_loader = manager_->GetClassLoader();
1657 const DexFile& dex_file = *manager_->GetDexFile();
1658 ClassLinker* class_linker = manager_->GetClassLinker();
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001659
Mathieu Chartier90443472015-07-16 20:32:27 -07001660 // If an instance field is final then we need to have a barrier on the return, static final
1661 // fields are assigned within the lock held for class initialization. Conservatively assume
1662 // constructor barriers are always required.
1663 bool requires_constructor_barrier = true;
1664
1665 // Method and Field are the worst. We can't resolve without either
1666 // context from the code use (to disambiguate virtual vs direct
1667 // method and instance vs static field) or from class
1668 // definitions. While the compiler will resolve what it can as it
1669 // needs it, here we try to resolve fields and methods used in class
1670 // definitions, since many of them many never be referenced by
1671 // generated code.
1672 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
1673 ScopedObjectAccess soa(self);
1674 StackHandleScope<2> hs(soa.Self());
1675 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07001676 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07001677 Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
Vladimir Markocd556b02017-02-03 11:47:34 +00001678 soa.Self(), dex_file)));
Mathieu Chartier90443472015-07-16 20:32:27 -07001679 // Resolve the class.
1680 mirror::Class* klass = class_linker->ResolveType(dex_file, class_def.class_idx_, dex_cache,
1681 class_loader);
1682 bool resolve_fields_and_methods;
1683 if (klass == nullptr) {
1684 // Class couldn't be resolved, for example, super-class is in a different dex file. Don't
1685 // attempt to resolve methods and fields when there is no declaring class.
1686 CheckAndClearResolveException(soa.Self());
1687 resolve_fields_and_methods = false;
1688 } else {
1689 // We successfully resolved a class, should we skip it?
1690 if (SkipClass(jclass_loader, dex_file, klass)) {
1691 return;
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001692 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001693 // We want to resolve the methods and fields eagerly.
1694 resolve_fields_and_methods = true;
Ian Rogers68b56852014-08-29 20:19:11 -07001695 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001696 // Note the class_data pointer advances through the headers,
1697 // static fields, instance fields, direct methods, and virtual
1698 // methods.
1699 const uint8_t* class_data = dex_file.GetClassData(class_def);
1700 if (class_data == nullptr) {
1701 // Empty class such as a marker interface.
1702 requires_constructor_barrier = false;
1703 } else {
1704 ClassDataItemIterator it(dex_file, class_data);
1705 while (it.HasNextStaticField()) {
1706 if (resolve_fields_and_methods) {
1707 ArtField* field = class_linker->ResolveField(dex_file, it.GetMemberIndex(),
1708 dex_cache, class_loader, true);
1709 if (field == nullptr) {
1710 CheckAndClearResolveException(soa.Self());
1711 }
Ian Rogers68b56852014-08-29 20:19:11 -07001712 }
1713 it.Next();
1714 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001715 // We require a constructor barrier if there are final instance fields.
1716 requires_constructor_barrier = false;
1717 while (it.HasNextInstanceField()) {
1718 if (it.MemberIsFinal()) {
1719 requires_constructor_barrier = true;
1720 }
1721 if (resolve_fields_and_methods) {
1722 ArtField* field = class_linker->ResolveField(dex_file, it.GetMemberIndex(),
1723 dex_cache, class_loader, false);
1724 if (field == nullptr) {
1725 CheckAndClearResolveException(soa.Self());
1726 }
Ian Rogers68b56852014-08-29 20:19:11 -07001727 }
1728 it.Next();
1729 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001730 if (resolve_fields_and_methods) {
1731 while (it.HasNextDirectMethod()) {
Vladimir Markoba118822017-06-12 15:41:56 +01001732 ArtMethod* method = class_linker->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>(
Mathieu Chartier90443472015-07-16 20:32:27 -07001733 dex_file, it.GetMemberIndex(), dex_cache, class_loader, nullptr,
1734 it.GetMethodInvokeType(class_def));
1735 if (method == nullptr) {
1736 CheckAndClearResolveException(soa.Self());
1737 }
1738 it.Next();
1739 }
1740 while (it.HasNextVirtualMethod()) {
Vladimir Markoba118822017-06-12 15:41:56 +01001741 ArtMethod* method = class_linker->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>(
Mathieu Chartier90443472015-07-16 20:32:27 -07001742 dex_file, it.GetMemberIndex(), dex_cache, class_loader, nullptr,
1743 it.GetMethodInvokeType(class_def));
1744 if (method == nullptr) {
1745 CheckAndClearResolveException(soa.Self());
1746 }
1747 it.Next();
1748 }
1749 DCHECK(!it.HasNext());
1750 }
1751 }
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07001752 manager_->GetCompiler()->SetRequiresConstructorBarrier(self,
1753 &dex_file,
1754 class_def_index,
1755 requires_constructor_barrier);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001756 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001757
Mathieu Chartier90443472015-07-16 20:32:27 -07001758 private:
1759 const ParallelCompilationManager* const manager_;
1760};
1761
1762class ResolveTypeVisitor : public CompilationVisitor {
1763 public:
1764 explicit ResolveTypeVisitor(const ParallelCompilationManager* manager) : manager_(manager) {
1765 }
Andreas Gampea5b09a62016-11-17 15:21:22 -08001766 void Visit(size_t type_idx) OVERRIDE REQUIRES(!Locks::mutator_lock_) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001767 // Class derived values are more complicated, they require the linker and loader.
Mathieu Chartier90443472015-07-16 20:32:27 -07001768 ScopedObjectAccess soa(Thread::Current());
1769 ClassLinker* class_linker = manager_->GetClassLinker();
1770 const DexFile& dex_file = *manager_->GetDexFile();
1771 StackHandleScope<2> hs(soa.Self());
Mathieu Chartier90443472015-07-16 20:32:27 -07001772 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07001773 hs.NewHandle(soa.Decode<mirror::ClassLoader>(manager_->GetClassLoader())));
Mathieu Chartierd57d4542015-10-14 10:55:30 -07001774 Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->RegisterDexFile(
1775 dex_file,
Mathieu Chartierf284d442016-06-02 11:48:30 -07001776 class_loader.Get())));
Andreas Gampefa4333d2017-02-14 11:10:34 -08001777 ObjPtr<mirror::Class> klass = (dex_cache != nullptr)
Vladimir Markocd556b02017-02-03 11:47:34 +00001778 ? class_linker->ResolveType(dex_file, dex::TypeIndex(type_idx), dex_cache, class_loader)
1779 : nullptr;
Brian Carlstrom7940e442013-07-12 13:46:57 -07001780
Mathieu Chartier90443472015-07-16 20:32:27 -07001781 if (klass == nullptr) {
1782 soa.Self()->AssertPendingException();
1783 mirror::Throwable* exception = soa.Self()->GetException();
1784 VLOG(compiler) << "Exception during type resolution: " << exception->Dump();
1785 if (exception->GetClass()->DescriptorEquals("Ljava/lang/OutOfMemoryError;")) {
1786 // There's little point continuing compilation if the heap is exhausted.
1787 LOG(FATAL) << "Out of memory during type resolution for compilation";
1788 }
1789 soa.Self()->ClearException();
Ian Rogersa436fde2013-08-27 23:34:06 -07001790 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001791 }
Mathieu Chartier90443472015-07-16 20:32:27 -07001792
1793 private:
1794 const ParallelCompilationManager* const manager_;
1795};
Brian Carlstrom7940e442013-07-12 13:46:57 -07001796
Andreas Gampeace0dc12016-01-20 13:33:13 -08001797void CompilerDriver::ResolveDexFile(jobject class_loader,
1798 const DexFile& dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07001799 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08001800 ThreadPool* thread_pool,
1801 size_t thread_count,
1802 TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07001803 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1804
1805 // TODO: we could resolve strings here, although the string table is largely filled with class
1806 // and method names.
1807
Andreas Gampede7b4362014-07-28 18:38:57 -07001808 ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
1809 thread_pool);
Vladimir Markoaad75c62016-10-03 08:46:48 +00001810 if (GetCompilerOptions().IsBootImage()) {
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001811 // For images we resolve all types, such as array, whereas for applications just those with
1812 // classdefs are resolved by ResolveClassFieldsAndMethods.
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001813 TimingLogger::ScopedTiming t("Resolve Types", timings);
Mathieu Chartier90443472015-07-16 20:32:27 -07001814 ResolveTypeVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001815 context.ForAll(0, dex_file.NumTypeIds(), &visitor, thread_count);
Ian Rogerse6bb3b22013-08-19 21:51:45 -07001816 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07001817
Mathieu Chartierf5997b42014-06-20 10:37:54 -07001818 TimingLogger::ScopedTiming t("Resolve MethodsAndFields", timings);
Mathieu Chartier90443472015-07-16 20:32:27 -07001819 ResolveClassFieldsAndMethodsVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001820 context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001821}
1822
Andreas Gampeace0dc12016-01-20 13:33:13 -08001823void CompilerDriver::SetVerified(jobject class_loader,
1824 const std::vector<const DexFile*>& dex_files,
1825 TimingLogger* timings) {
1826 // This can be run in parallel.
Mathieu Chartier90443472015-07-16 20:32:27 -07001827 for (const DexFile* dex_file : dex_files) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001828 CHECK(dex_file != nullptr);
Andreas Gampeace0dc12016-01-20 13:33:13 -08001829 SetVerifiedDexFile(class_loader,
1830 *dex_file,
1831 dex_files,
1832 parallel_thread_pool_.get(),
1833 parallel_thread_count_,
1834 timings);
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001835 }
1836}
1837
Nicolas Geoffray51c17fa2016-11-25 15:56:12 +00001838static void PopulateVerifiedMethods(const DexFile& dex_file,
1839 uint32_t class_def_index,
1840 VerificationResults* verification_results) {
1841 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
1842 const uint8_t* class_data = dex_file.GetClassData(class_def);
1843 if (class_data == nullptr) {
1844 return;
1845 }
1846 ClassDataItemIterator it(dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -07001847 it.SkipAllFields();
Nicolas Geoffray51c17fa2016-11-25 15:56:12 +00001848
1849 while (it.HasNextDirectMethod()) {
1850 verification_results->CreateVerifiedMethodFor(MethodReference(&dex_file, it.GetMemberIndex()));
1851 it.Next();
1852 }
1853
1854 while (it.HasNextVirtualMethod()) {
1855 verification_results->CreateVerifiedMethodFor(MethodReference(&dex_file, it.GetMemberIndex()));
1856 it.Next();
1857 }
1858 DCHECK(!it.HasNext());
1859}
1860
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001861static void LoadAndUpdateStatus(const DexFile& dex_file,
1862 const DexFile::ClassDef& class_def,
1863 mirror::Class::Status status,
1864 Handle<mirror::ClassLoader> class_loader,
1865 Thread* self)
1866 REQUIRES_SHARED(Locks::mutator_lock_) {
1867 StackHandleScope<1> hs(self);
1868 const char* descriptor = dex_file.GetClassDescriptor(class_def);
1869 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
1870 Handle<mirror::Class> cls(hs.NewHandle<mirror::Class>(
1871 class_linker->FindClass(self, descriptor, class_loader)));
Andreas Gampefa4333d2017-02-14 11:10:34 -08001872 if (cls != nullptr) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001873 // Check that the class is resolved with the current dex file. We might get
1874 // a boot image class, or a class in a different dex file for multidex, and
1875 // we should not update the status in that case.
1876 if (&cls->GetDexFile() == &dex_file) {
1877 ObjectLock<mirror::Class> lock(self, cls);
1878 mirror::Class::SetStatus(cls, status, self);
1879 }
1880 } else {
1881 DCHECK(self->IsExceptionPending());
1882 self->ClearException();
1883 }
1884}
1885
Nicolas Geoffray74981052017-01-16 17:54:09 +00001886bool CompilerDriver::FastVerify(jobject jclass_loader,
1887 const std::vector<const DexFile*>& dex_files,
1888 TimingLogger* timings) {
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +00001889 verifier::VerifierDeps* verifier_deps =
1890 Runtime::Current()->GetCompilerCallbacks()->GetVerifierDeps();
Mathieu Chartier72041a02017-07-14 18:23:25 -07001891 // If there exist VerifierDeps that aren't the ones we just created to output, use them to verify.
1892 if (verifier_deps == nullptr || verifier_deps->OutputOnly()) {
Nicolas Geoffray74981052017-01-16 17:54:09 +00001893 return false;
1894 }
1895 TimingLogger::ScopedTiming t("Fast Verify", timings);
1896 ScopedObjectAccess soa(Thread::Current());
1897 StackHandleScope<2> hs(soa.Self());
1898 Handle<mirror::ClassLoader> class_loader(
1899 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Nicolas Geoffray74981052017-01-16 17:54:09 +00001900 if (!verifier_deps->ValidateDependencies(class_loader, soa.Self())) {
1901 return false;
1902 }
1903
Nicolas Geoffray49cda062017-04-21 13:08:25 +01001904 bool compiler_only_verifies = !GetCompilerOptions().IsAnyCompilationEnabled();
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001905
Nicolas Geoffray74981052017-01-16 17:54:09 +00001906 // We successfully validated the dependencies, now update class status
1907 // of verified classes. Note that the dependencies also record which classes
1908 // could not be fully verified; we could try again, but that would hurt verification
1909 // time. So instead we assume these classes still need to be verified at
1910 // runtime.
1911 for (const DexFile* dex_file : dex_files) {
Mathieu Chartierbf755fe2017-08-01 13:42:56 -07001912 // Fetch the list of unverified classes.
1913 const std::set<dex::TypeIndex>& unverified_classes =
Nicolas Geoffray74981052017-01-16 17:54:09 +00001914 verifier_deps->GetUnverifiedClasses(*dex_file);
Nicolas Geoffray74981052017-01-16 17:54:09 +00001915 for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) {
1916 const DexFile::ClassDef& class_def = dex_file->GetClassDef(i);
Mathieu Chartierbf755fe2017-08-01 13:42:56 -07001917 if (unverified_classes.find(class_def.class_idx_) == unverified_classes.end()) {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001918 if (compiler_only_verifies) {
Nicolas Geoffray74981052017-01-16 17:54:09 +00001919 // Just update the compiled_classes_ map. The compiler doesn't need to resolve
1920 // the type.
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07001921 ClassReference ref(dex_file, i);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07001922 mirror::Class::Status existing = mirror::Class::kStatusNotReady;
1923 DCHECK(compiled_classes_.Get(ref, &existing)) << ref.dex_file->GetLocation();
1924 ClassStateTable::InsertResult result =
1925 compiled_classes_.Insert(ref, existing, mirror::Class::kStatusVerified);
1926 CHECK_EQ(result, ClassStateTable::kInsertResultSuccess);
Nicolas Geoffray74981052017-01-16 17:54:09 +00001927 } else {
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001928 // Update the class status, so later compilation stages know they don't need to verify
Nicolas Geoffray74981052017-01-16 17:54:09 +00001929 // the class.
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001930 LoadAndUpdateStatus(
1931 *dex_file, class_def, mirror::Class::kStatusVerified, class_loader, soa.Self());
Nicolas Geoffray74981052017-01-16 17:54:09 +00001932 // Create `VerifiedMethod`s for each methods, the compiler expects one for
1933 // quickening or compiling.
1934 // Note that this means:
1935 // - We're only going to compile methods that did verify.
1936 // - Quickening will not do checkcast ellision.
1937 // TODO(ngeoffray): Reconsider this once we refactor compiler filters.
1938 PopulateVerifiedMethods(*dex_file, i, verification_results_);
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00001939 }
Nicolas Geoffray0a27fd02017-01-25 16:18:54 +00001940 } else if (!compiler_only_verifies) {
1941 // Make sure later compilation stages know they should not try to verify
1942 // this class again.
1943 LoadAndUpdateStatus(*dex_file,
1944 class_def,
1945 mirror::Class::kStatusRetryVerificationAtRuntime,
1946 class_loader,
1947 soa.Self());
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00001948 }
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00001949 }
1950 }
Nicolas Geoffray74981052017-01-16 17:54:09 +00001951 return true;
1952}
1953
1954void CompilerDriver::Verify(jobject jclass_loader,
1955 const std::vector<const DexFile*>& dex_files,
1956 TimingLogger* timings) {
1957 if (FastVerify(jclass_loader, dex_files, timings)) {
1958 return;
1959 }
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00001960
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +00001961 // If there is no existing `verifier_deps` (because of non-existing vdex), or
1962 // the existing `verifier_deps` is not valid anymore, create a new one for
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00001963 // non boot image compilation. The verifier will need it to record the new dependencies.
1964 // Then dex2oat can update the vdex file with these new dependencies.
1965 if (!GetCompilerOptions().IsBootImage()) {
Mathieu Chartier72041a02017-07-14 18:23:25 -07001966 // Dex2oat creates the verifier deps.
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00001967 // Create the main VerifierDeps, and set it to this thread.
Mathieu Chartier72041a02017-07-14 18:23:25 -07001968 verifier::VerifierDeps* verifier_deps =
1969 Runtime::Current()->GetCompilerCallbacks()->GetVerifierDeps();
1970 CHECK(verifier_deps != nullptr);
Nicolas Geoffrayb0bbe8e2016-11-19 10:42:37 +00001971 Thread::Current()->SetVerifierDeps(verifier_deps);
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00001972 // Create per-thread VerifierDeps to avoid contention on the main one.
1973 // We will merge them after verification.
1974 for (ThreadPoolWorker* worker : parallel_thread_pool_->GetWorkers()) {
Mathieu Chartier72041a02017-07-14 18:23:25 -07001975 worker->GetThread()->SetVerifierDeps(new verifier::VerifierDeps(dex_files_for_oat_file_));
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00001976 }
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00001977 }
Nicolas Geoffray74981052017-01-16 17:54:09 +00001978
Nicolas Geoffray46847392017-04-28 14:56:39 +01001979 // Verification updates VerifierDeps and needs to run single-threaded to be deterministic.
1980 bool force_determinism = GetCompilerOptions().IsForceDeterminism();
1981 ThreadPool* verify_thread_pool =
1982 force_determinism ? single_thread_pool_.get() : parallel_thread_pool_.get();
1983 size_t verify_thread_count = force_determinism ? 1U : parallel_thread_count_;
Mathieu Chartier90443472015-07-16 20:32:27 -07001984 for (const DexFile* dex_file : dex_files) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07001985 CHECK(dex_file != nullptr);
Nicolas Geoffray6bb7f1b2016-11-03 10:52:49 +00001986 VerifyDexFile(jclass_loader,
Andreas Gampeace0dc12016-01-20 13:33:13 -08001987 *dex_file,
1988 dex_files,
Nicolas Geoffray46847392017-04-28 14:56:39 +01001989 verify_thread_pool,
1990 verify_thread_count,
Andreas Gampeace0dc12016-01-20 13:33:13 -08001991 timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07001992 }
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00001993
1994 if (!GetCompilerOptions().IsBootImage()) {
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00001995 // Merge all VerifierDeps into the main one.
Nicolas Geoffray74981052017-01-16 17:54:09 +00001996 verifier::VerifierDeps* verifier_deps = Thread::Current()->GetVerifierDeps();
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00001997 for (ThreadPoolWorker* worker : parallel_thread_pool_->GetWorkers()) {
1998 verifier::VerifierDeps* thread_deps = worker->GetThread()->GetVerifierDeps();
1999 worker->GetThread()->SetVerifierDeps(nullptr);
Mathieu Chartier72041a02017-07-14 18:23:25 -07002000 verifier_deps->MergeWith(*thread_deps, dex_files_for_oat_file_);
Nicolas Geoffray340dafa2016-11-18 16:03:10 +00002001 delete thread_deps;
2002 }
2003 Thread::Current()->SetVerifierDeps(nullptr);
2004 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002005}
2006
Mathieu Chartier90443472015-07-16 20:32:27 -07002007class VerifyClassVisitor : public CompilationVisitor {
2008 public:
Andreas Gampe5fd66d02016-09-12 20:22:19 -07002009 VerifyClassVisitor(const ParallelCompilationManager* manager, verifier::HardFailLogMode log_level)
Andreas Gampe7fe30232016-03-25 16:58:00 -07002010 : manager_(manager), log_level_(log_level) {}
Brian Carlstrom7940e442013-07-12 13:46:57 -07002011
Mathieu Chartier90443472015-07-16 20:32:27 -07002012 virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2013 ATRACE_CALL();
2014 ScopedObjectAccess soa(Thread::Current());
2015 const DexFile& dex_file = *manager_->GetDexFile();
2016 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2017 const char* descriptor = dex_file.GetClassDescriptor(class_def);
2018 ClassLinker* class_linker = manager_->GetClassLinker();
2019 jobject jclass_loader = manager_->GetClassLoader();
2020 StackHandleScope<3> hs(soa.Self());
2021 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002022 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002023 Handle<mirror::Class> klass(
2024 hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002025 verifier::FailureKind failure_kind;
Andreas Gampefa4333d2017-02-14 11:10:34 -08002026 if (klass == nullptr) {
Ian Rogerse6bb3b22013-08-19 21:51:45 -07002027 CHECK(soa.Self()->IsExceptionPending());
2028 soa.Self()->ClearException();
Mathieu Chartier90443472015-07-16 20:32:27 -07002029
2030 /*
2031 * At compile time, we can still structurally verify the class even if FindClass fails.
2032 * This is to ensure the class is structurally sound for compilation. An unsound class
2033 * will be rejected by the verifier and later skipped during compilation in the compiler.
2034 */
Mathieu Chartier673ed3d2015-08-28 14:56:43 -07002035 Handle<mirror::DexCache> dex_cache(hs.NewHandle(class_linker->FindDexCache(
Vladimir Markocd556b02017-02-03 11:47:34 +00002036 soa.Self(), dex_file)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002037 std::string error_msg;
Nicolas Geoffray08025182016-10-25 17:20:18 +01002038 failure_kind =
2039 verifier::MethodVerifier::VerifyClass(soa.Self(),
Andreas Gampeec6e6c12015-11-05 20:39:56 -08002040 &dex_file,
2041 dex_cache,
2042 class_loader,
David Brazdil15fc7292016-09-02 14:13:18 +01002043 class_def,
Andreas Gampe53e32d12015-12-09 21:03:23 -08002044 Runtime::Current()->GetCompilerCallbacks(),
Andreas Gampeec6e6c12015-11-05 20:39:56 -08002045 true /* allow soft failures */,
Andreas Gampe7fe30232016-03-25 16:58:00 -07002046 log_level_,
Nicolas Geoffray08025182016-10-25 17:20:18 +01002047 &error_msg);
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002048 if (failure_kind == verifier::FailureKind::kHardFailure) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002049 LOG(ERROR) << "Verification failed on class " << PrettyDescriptor(descriptor)
2050 << " because: " << error_msg;
2051 manager_->GetCompiler()->SetHadHardVerifierFailure();
Andreas Gampef39208f2017-10-19 15:06:59 -07002052 } else if (failure_kind == verifier::FailureKind::kSoftFailure) {
2053 manager_->GetCompiler()->AddSoftVerifierFailure();
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002054 } else {
2055 // Force a soft failure for the VerifierDeps. This is a sanity measure, as
2056 // the vdex file already records that the class hasn't been resolved. It avoids
2057 // trying to do future verification optimizations when processing the vdex file.
Andreas Gampef39208f2017-10-19 15:06:59 -07002058 DCHECK(failure_kind == verifier::FailureKind::kNoFailure) << failure_kind;
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002059 failure_kind = verifier::FailureKind::kSoftFailure;
Mathieu Chartier90443472015-07-16 20:32:27 -07002060 }
2061 } else if (!SkipClass(jclass_loader, dex_file, klass.Get())) {
David Sehr709b0702016-10-13 09:12:37 -07002062 CHECK(klass->IsResolved()) << klass->PrettyClass();
Nicolas Geoffray08025182016-10-25 17:20:18 +01002063 failure_kind = class_linker->VerifyClass(soa.Self(), klass, log_level_);
Mathieu Chartier90443472015-07-16 20:32:27 -07002064
2065 if (klass->IsErroneous()) {
2066 // ClassLinker::VerifyClass throws, which isn't useful in the compiler.
2067 CHECK(soa.Self()->IsExceptionPending());
2068 soa.Self()->ClearException();
2069 manager_->GetCompiler()->SetHadHardVerifierFailure();
Andreas Gampef39208f2017-10-19 15:06:59 -07002070 } else if (failure_kind == verifier::FailureKind::kSoftFailure) {
2071 manager_->GetCompiler()->AddSoftVerifierFailure();
Mathieu Chartier90443472015-07-16 20:32:27 -07002072 }
2073
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002074 CHECK(klass->ShouldVerifyAtRuntime() || klass->IsVerified() || klass->IsErroneous())
David Sehr709b0702016-10-13 09:12:37 -07002075 << klass->PrettyDescriptor() << ": state=" << klass->GetStatus();
Mathieu Chartier90443472015-07-16 20:32:27 -07002076
Nicolas Geoffrayc7da1d62017-04-19 09:36:24 +01002077 // Class has a meaningful status for the compiler now, record it.
2078 ClassReference ref(manager_->GetDexFile(), class_def_index);
2079 manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
2080
Orion Hodsonc5e0d3f2017-08-22 19:00:04 +01002081 // It is *very* problematic if there are verification errors in the boot classpath.
2082 // For example, we rely on things working OK without verification when the decryption dialog
2083 // is brought up. So abort in a debug build if we find this violated.
Narayan Kamathe3eae5e2016-10-27 11:47:30 +01002084 if (kIsDebugBuild) {
Orion Hodsonc5e0d3f2017-08-22 19:00:04 +01002085 if (manager_->GetCompiler()->GetCompilerOptions().IsBootImage()) {
Andreas Gampe12fadcd2017-08-03 05:06:28 -07002086 if (!klass->IsVerified()) {
2087 // Re-run verification to get all failure messages if it soft-failed.
2088 if (!klass->IsErroneous()) {
2089 gLogVerbosity.verifier = true;
2090 // Note: We can't call ClassLinker::VerifyClass, as it will elide the second
2091 // verification.
2092 Runtime* runtime = Runtime::Current();
2093 std::string v_error;
2094 verifier::MethodVerifier::VerifyClass(soa.Self(),
2095 klass.Get(),
2096 runtime->GetCompilerCallbacks(),
2097 runtime->IsAotCompiler(),
2098 verifier::HardFailLogMode::kLogInternalFatal,
2099 &v_error);
2100 }
2101 LOG(FATAL) << "Boot classpath class " << klass->PrettyClass()
2102 << " failed to fully verify: state= " << klass->GetStatus();
2103 }
Narayan Kamathe3eae5e2016-10-27 11:47:30 +01002104 }
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002105 if (klass->IsVerified()) {
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002106 DCHECK_EQ(failure_kind, verifier::FailureKind::kNoFailure);
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002107 } else if (klass->ShouldVerifyAtRuntime()) {
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002108 DCHECK_EQ(failure_kind, verifier::FailureKind::kSoftFailure);
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002109 } else {
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002110 DCHECK_EQ(failure_kind, verifier::FailureKind::kHardFailure);
Nicolas Geoffray7cc3ae52017-03-07 14:33:37 +00002111 }
Narayan Kamathe3eae5e2016-10-27 11:47:30 +01002112 }
Nicolas Geoffray08025182016-10-25 17:20:18 +01002113 } else {
2114 // Make the skip a soft failure, essentially being considered as verify at runtime.
Andreas Gampe6d7abbd2017-04-24 13:19:09 -07002115 failure_kind = verifier::FailureKind::kSoftFailure;
Ian Rogerse6bb3b22013-08-19 21:51:45 -07002116 }
Nicolas Geoffray08025182016-10-25 17:20:18 +01002117 verifier::VerifierDeps::MaybeRecordVerificationStatus(
2118 dex_file, class_def.class_idx_, failure_kind);
Mathieu Chartier90443472015-07-16 20:32:27 -07002119 soa.Self()->AssertNoPendingException();
Brian Carlstrom7940e442013-07-12 13:46:57 -07002120 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002121
2122 private:
2123 const ParallelCompilationManager* const manager_;
Andreas Gampe5fd66d02016-09-12 20:22:19 -07002124 const verifier::HardFailLogMode log_level_;
Mathieu Chartier90443472015-07-16 20:32:27 -07002125};
Brian Carlstrom7940e442013-07-12 13:46:57 -07002126
Andreas Gampeace0dc12016-01-20 13:33:13 -08002127void CompilerDriver::VerifyDexFile(jobject class_loader,
2128 const DexFile& dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07002129 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002130 ThreadPool* thread_pool,
2131 size_t thread_count,
2132 TimingLogger* timings) {
Mathieu Chartierf5997b42014-06-20 10:37:54 -07002133 TimingLogger::ScopedTiming t("Verify Dex File", timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002134 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
Andreas Gampede7b4362014-07-28 18:38:57 -07002135 ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2136 thread_pool);
Andreas Gampef39208f2017-10-19 15:06:59 -07002137 bool abort_on_verifier_failures = GetCompilerOptions().AbortOnHardVerifierFailure()
2138 || GetCompilerOptions().AbortOnSoftVerifierFailure();
2139 verifier::HardFailLogMode log_level = abort_on_verifier_failures
Andreas Gampe5fd66d02016-09-12 20:22:19 -07002140 ? verifier::HardFailLogMode::kLogInternalFatal
2141 : verifier::HardFailLogMode::kLogWarning;
Andreas Gampe7fe30232016-03-25 16:58:00 -07002142 VerifyClassVisitor visitor(&context, log_level);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002143 context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002144}
2145
Mathieu Chartier90443472015-07-16 20:32:27 -07002146class SetVerifiedClassVisitor : public CompilationVisitor {
2147 public:
2148 explicit SetVerifiedClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2149
2150 virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2151 ATRACE_CALL();
2152 ScopedObjectAccess soa(Thread::Current());
2153 const DexFile& dex_file = *manager_->GetDexFile();
2154 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2155 const char* descriptor = dex_file.GetClassDescriptor(class_def);
2156 ClassLinker* class_linker = manager_->GetClassLinker();
2157 jobject jclass_loader = manager_->GetClassLoader();
2158 StackHandleScope<3> hs(soa.Self());
2159 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002160 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002161 Handle<mirror::Class> klass(
2162 hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2163 // Class might have failed resolution. Then don't set it to verified.
Andreas Gampefa4333d2017-02-14 11:10:34 -08002164 if (klass != nullptr) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002165 // Only do this if the class is resolved. If even resolution fails, quickening will go very,
2166 // very wrong.
Vladimir Marko72ab6842017-01-20 19:32:50 +00002167 if (klass->IsResolved() && !klass->IsErroneousResolved()) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002168 if (klass->GetStatus() < mirror::Class::kStatusVerified) {
2169 ObjectLock<mirror::Class> lock(soa.Self(), klass);
2170 // Set class status to verified.
2171 mirror::Class::SetStatus(klass, mirror::Class::kStatusVerified, soa.Self());
2172 // Mark methods as pre-verified. If we don't do this, the interpreter will run with
2173 // access checks.
Igor Murashkindf707e42016-02-02 16:56:50 -08002174 klass->SetSkipAccessChecksFlagOnAllMethods(
Mathieu Chartier90443472015-07-16 20:32:27 -07002175 GetInstructionSetPointerSize(manager_->GetCompiler()->GetInstructionSet()));
Igor Murashkindf707e42016-02-02 16:56:50 -08002176 klass->SetVerificationAttempted();
Mathieu Chartier90443472015-07-16 20:32:27 -07002177 }
2178 // Record the final class status if necessary.
2179 ClassReference ref(manager_->GetDexFile(), class_def_index);
2180 manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002181 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002182 } else {
2183 Thread* self = soa.Self();
2184 DCHECK(self->IsExceptionPending());
2185 self->ClearException();
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002186 }
2187 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002188
2189 private:
2190 const ParallelCompilationManager* const manager_;
2191};
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002192
Andreas Gampeace0dc12016-01-20 13:33:13 -08002193void CompilerDriver::SetVerifiedDexFile(jobject class_loader,
2194 const DexFile& dex_file,
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002195 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002196 ThreadPool* thread_pool,
2197 size_t thread_count,
2198 TimingLogger* timings) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002199 TimingLogger::ScopedTiming t("Verify Dex File", timings);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002200 if (!compiled_classes_.HaveDexFile(&dex_file)) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002201 compiled_classes_.AddDexFile(&dex_file);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002202 }
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002203 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2204 ParallelCompilationManager context(class_linker, class_loader, this, &dex_file, dex_files,
2205 thread_pool);
Mathieu Chartier90443472015-07-16 20:32:27 -07002206 SetVerifiedClassVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002207 context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002208}
2209
Mathieu Chartier90443472015-07-16 20:32:27 -07002210class InitializeClassVisitor : public CompilationVisitor {
2211 public:
2212 explicit InitializeClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
Ian Rogersfc0e94b2013-09-23 23:51:32 -07002213
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002214 void Visit(size_t class_def_index) OVERRIDE {
Mathieu Chartier90443472015-07-16 20:32:27 -07002215 ATRACE_CALL();
2216 jobject jclass_loader = manager_->GetClassLoader();
2217 const DexFile& dex_file = *manager_->GetDexFile();
2218 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2219 const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def.class_idx_);
2220 const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
Jeff Hao0e49b422013-11-08 12:16:56 -08002221
Mathieu Chartier90443472015-07-16 20:32:27 -07002222 ScopedObjectAccess soa(Thread::Current());
2223 StackHandleScope<3> hs(soa.Self());
2224 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002225 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier90443472015-07-16 20:32:27 -07002226 Handle<mirror::Class> klass(
2227 hs.NewHandle(manager_->GetClassLinker()->FindClass(soa.Self(), descriptor, class_loader)));
2228
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002229 if (klass != nullptr && !SkipClass(manager_->GetClassLoader(), dex_file, klass.Get())) {
2230 TryInitializeClass(klass, class_loader);
2231 }
2232 // Clear any class not found or verification exceptions.
2233 soa.Self()->ClearException();
2234 }
2235
2236 // A helper function for initializing klass.
2237 void TryInitializeClass(Handle<mirror::Class> klass, Handle<mirror::ClassLoader>& class_loader)
2238 REQUIRES_SHARED(Locks::mutator_lock_) {
2239 const DexFile& dex_file = klass->GetDexFile();
2240 const DexFile::ClassDef* class_def = klass->GetClassDef();
2241 const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def->class_idx_);
2242 const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
2243 ScopedObjectAccessUnchecked soa(Thread::Current());
2244 StackHandleScope<3> hs(soa.Self());
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002245 const bool is_boot_image = manager_->GetCompiler()->GetCompilerOptions().IsBootImage();
Mathieu Chartier17498e52017-06-13 11:35:04 -07002246 const bool is_app_image = manager_->GetCompiler()->GetCompilerOptions().IsAppImage();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002247
Jeff Hao0cb17282017-07-12 14:51:49 -07002248 mirror::Class::Status old_status = klass->GetStatus();
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002249 // Don't initialize classes in boot space when compiling app image
2250 if (is_app_image && klass->IsBootStrapClassLoaded()) {
2251 // Also return early and don't store the class status in the recorded class status.
2252 return;
2253 }
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002254 // Only try to initialize classes that were successfully verified.
2255 if (klass->IsVerified()) {
2256 // Attempt to initialize the class but bail if we either need to initialize the super-class
2257 // or static fields.
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002258 manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, false);
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002259 old_status = klass->GetStatus();
2260 if (!klass->IsInitialized()) {
2261 // We don't want non-trivial class initialization occurring on multiple threads due to
2262 // deadlock problems. For example, a parent class is initialized (holding its lock) that
2263 // refers to a sub-class in its static/class initializer causing it to try to acquire the
2264 // sub-class' lock. While on a second thread the sub-class is initialized (holding its lock)
2265 // after first initializing its parents, whose locks are acquired. This leads to a
2266 // parent-to-child and a child-to-parent lock ordering and consequent potential deadlock.
2267 // We need to use an ObjectLock due to potential suspension in the interpreting code. Rather
2268 // than use a special Object for the purpose we use the Class of java.lang.Class.
2269 Handle<mirror::Class> h_klass(hs.NewHandle(klass->GetClass()));
2270 ObjectLock<mirror::Class> lock(soa.Self(), h_klass);
2271 // Attempt to initialize allowing initialization of parent classes but still not static
2272 // fields.
Chang Xinge602b1c2017-06-30 11:55:01 -07002273 // Initialize dependencies first only for app image, to make TryInitialize recursive.
2274 bool is_superclass_initialized = !is_app_image ? true :
2275 InitializeDependencies(klass, class_loader, soa.Self());
2276 if (!is_app_image || (is_app_image && is_superclass_initialized)) {
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002277 manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, true);
Chang Xinge602b1c2017-06-30 11:55:01 -07002278 }
2279 // Otherwise it's in app image but superclasses can't be initialized, no need to proceed.
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002280 old_status = klass->GetStatus();
Chang Xing70f689d2017-06-08 17:16:12 -07002281
2282 bool too_many_encoded_fields = false;
2283 if (!is_boot_image && klass->NumStaticFields() > kMaxEncodedFields) {
2284 too_many_encoded_fields = true;
2285 }
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002286 // If the class was not initialized, we can proceed to see if we can initialize static
Chang Xing70f689d2017-06-08 17:16:12 -07002287 // fields. Limit the max number of encoded fields.
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002288 if (!klass->IsInitialized() &&
Mathieu Chartier17498e52017-06-13 11:35:04 -07002289 (is_app_image || is_boot_image) &&
Chang Xinge602b1c2017-06-30 11:55:01 -07002290 is_superclass_initialized &&
Chang Xing70f689d2017-06-08 17:16:12 -07002291 !too_many_encoded_fields &&
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002292 manager_->GetCompiler()->IsImageClass(descriptor)) {
2293 bool can_init_static_fields = false;
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002294 if (is_boot_image) {
Mathieu Chartier90443472015-07-16 20:32:27 -07002295 // We need to initialize static fields, we only do this for image classes that aren't
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002296 // marked with the $NoPreloadHolder (which implies this should not be initialized
2297 // early).
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002298 can_init_static_fields = !StringPiece(descriptor).ends_with("$NoPreloadHolder;");
2299 } else {
Mathieu Chartier17498e52017-06-13 11:35:04 -07002300 CHECK(is_app_image);
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002301 // The boot image case doesn't need to recursively initialize the dependencies with
2302 // special logic since the class linker already does this.
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002303 can_init_static_fields =
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002304 !soa.Self()->IsExceptionPending() &&
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002305 is_superclass_initialized &&
2306 NoClinitInDependency(klass, soa.Self(), &class_loader);
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002307 // TODO The checking for clinit can be removed since it's already
2308 // checked when init superclass. Currently keep it because it contains
2309 // processing of intern strings. Will be removed later when intern strings
2310 // and clinit are both initialized.
2311 }
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002312
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002313 if (can_init_static_fields) {
2314 VLOG(compiler) << "Initializing: " << descriptor;
2315 // TODO multithreading support. We should ensure the current compilation thread has
2316 // exclusive access to the runtime and the transaction. To achieve this, we could use
2317 // a ReaderWriterMutex but we're holding the mutator lock so we fail mutex sanity
2318 // checks in Thread::AssertThreadSuspensionIsAllowable.
2319 Runtime* const runtime = Runtime::Current();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002320 // Run the class initializer in transaction mode.
Chang Xing5a906fc2017-07-26 15:01:16 -07002321 runtime->EnterTransactionMode(is_app_image, klass.Get());
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002322 bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true,
2323 true);
2324 // TODO we detach transaction from runtime to indicate we quit the transactional
2325 // mode which prevents the GC from visiting objects modified during the transaction.
2326 // Ensure GC is not run so don't access freed objects when aborting transaction.
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002327
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002328 {
2329 ScopedAssertNoThreadSuspension ants("Transaction end");
Chang Xing16d1dd82017-07-20 17:56:26 -07002330
2331 if (success) {
2332 runtime->ExitTransactionMode();
2333 DCHECK(!runtime->IsActiveTransaction());
2334 }
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002335
Mathieu Chartier90443472015-07-16 20:32:27 -07002336 if (!success) {
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002337 CHECK(soa.Self()->IsExceptionPending());
2338 mirror::Throwable* exception = soa.Self()->GetException();
2339 VLOG(compiler) << "Initialization of " << descriptor << " aborted because of "
2340 << exception->Dump();
2341 std::ostream* file_log = manager_->GetCompiler()->
2342 GetCompilerOptions().GetInitFailureOutput();
2343 if (file_log != nullptr) {
2344 *file_log << descriptor << "\n";
2345 *file_log << exception->Dump() << "\n";
2346 }
2347 soa.Self()->ClearException();
Chang Xing605fe242017-07-20 15:57:21 -07002348 runtime->RollbackAllTransactions();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002349 CHECK_EQ(old_status, klass->GetStatus()) << "Previous class status not restored";
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002350 } else if (is_boot_image) {
2351 // For boot image, we want to put the updated status in the oat class since we can't
2352 // reject the image anyways.
2353 old_status = klass->GetStatus();
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002354 }
2355 }
2356
Nicolas Geoffrayabadf022017-08-03 08:25:41 +00002357 if (!success) {
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002358 // On failure, still intern strings of static fields and seen in <clinit>, as these
2359 // will be created in the zygote. This is separated from the transaction code just
2360 // above as we will allocate strings, so must be allowed to suspend.
2361 if (&klass->GetDexFile() == manager_->GetDexFile()) {
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002362 InternStrings(klass, class_loader);
Mathieu Chartierdabeb3a2017-06-12 17:10:07 -07002363 } else {
2364 DCHECK(!is_boot_image) << "Boot image must have equal dex files";
Andreas Gampedbfe2542014-11-25 22:21:42 -08002365 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002366 }
2367 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002368 }
Jeff Hao0cb17282017-07-12 14:51:49 -07002369 // If the class still isn't initialized, at least try some checks that initialization
2370 // would do so they can be skipped at runtime.
2371 if (!klass->IsInitialized() &&
2372 manager_->GetClassLinker()->ValidateSuperClassDescriptors(klass)) {
2373 old_status = mirror::Class::kStatusSuperclassValidated;
2374 } else {
2375 soa.Self()->ClearException();
2376 }
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002377 soa.Self()->AssertNoPendingException();
Brian Carlstrom7940e442013-07-12 13:46:57 -07002378 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002379 }
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002380 // Record the final class status if necessary.
2381 ClassReference ref(&dex_file, klass->GetDexClassDefIndex());
2382 // Back up the status before doing initialization for static encoded fields,
2383 // because the static encoded branch wants to keep the status to uninitialized.
2384 manager_->GetCompiler()->RecordClassStatus(ref, old_status);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002385 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002386
2387 private:
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002388 void InternStrings(Handle<mirror::Class> klass, Handle<mirror::ClassLoader> class_loader)
2389 REQUIRES_SHARED(Locks::mutator_lock_) {
2390 DCHECK(manager_->GetCompiler()->GetCompilerOptions().IsBootImage());
2391 DCHECK(klass->IsVerified());
2392 DCHECK(!klass->IsInitialized());
2393
2394 StackHandleScope<1> hs(Thread::Current());
2395 Handle<mirror::DexCache> h_dex_cache = hs.NewHandle(klass->GetDexCache());
2396 const DexFile* dex_file = manager_->GetDexFile();
2397 const DexFile::ClassDef* class_def = klass->GetClassDef();
2398 ClassLinker* class_linker = manager_->GetClassLinker();
2399
Andreas Gampe7bf90482017-03-02 16:41:35 -08002400 // Check encoded final field values for strings and intern.
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002401 annotations::RuntimeEncodedStaticFieldValueIterator value_it(*dex_file,
2402 &h_dex_cache,
2403 &class_loader,
2404 manager_->GetClassLinker(),
2405 *class_def);
2406 for ( ; value_it.HasNext(); value_it.Next()) {
2407 if (value_it.GetValueType() == annotations::RuntimeEncodedStaticFieldValueIterator::kString) {
2408 // Resolve the string. This will intern the string.
2409 art::ObjPtr<mirror::String> resolved = class_linker->ResolveString(
2410 *dex_file, dex::StringIndex(value_it.GetJavaValue().i), h_dex_cache);
2411 CHECK(resolved != nullptr);
2412 }
2413 }
Andreas Gampe7bf90482017-03-02 16:41:35 -08002414
2415 // Intern strings seen in <clinit>.
2416 ArtMethod* clinit = klass->FindClassInitializer(class_linker->GetImagePointerSize());
2417 if (clinit != nullptr) {
2418 const DexFile::CodeItem* code_item = clinit->GetCodeItem();
2419 DCHECK(code_item != nullptr);
Mathieu Chartier1d2d4ff2017-09-23 16:11:06 -07002420 for (const Instruction& inst : code_item->Instructions()) {
2421 if (inst.Opcode() == Instruction::CONST_STRING) {
Andreas Gampe7bf90482017-03-02 16:41:35 -08002422 ObjPtr<mirror::String> s = class_linker->ResolveString(
Mathieu Chartier1d2d4ff2017-09-23 16:11:06 -07002423 *dex_file, dex::StringIndex(inst.VRegB_21c()), h_dex_cache);
Andreas Gampe7bf90482017-03-02 16:41:35 -08002424 CHECK(s != nullptr);
Mathieu Chartier1d2d4ff2017-09-23 16:11:06 -07002425 } else if (inst.Opcode() == Instruction::CONST_STRING_JUMBO) {
Andreas Gampe7bf90482017-03-02 16:41:35 -08002426 ObjPtr<mirror::String> s = class_linker->ResolveString(
Mathieu Chartier1d2d4ff2017-09-23 16:11:06 -07002427 *dex_file, dex::StringIndex(inst.VRegB_31c()), h_dex_cache);
Andreas Gampe7bf90482017-03-02 16:41:35 -08002428 CHECK(s != nullptr);
2429 }
Andreas Gampe7bf90482017-03-02 16:41:35 -08002430 }
2431 }
Andreas Gampe9e7078b2017-03-02 13:50:36 -08002432 }
2433
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002434 bool ResolveTypesOfMethods(Thread* self, ArtMethod* m)
2435 REQUIRES_SHARED(Locks::mutator_lock_) {
Vladimir Markob45528c2017-07-27 14:14:28 +01002436 // Return value of ResolveReturnType() is discarded because resolve will be done internally.
2437 ObjPtr<mirror::Class> rtn_type = m->ResolveReturnType();
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002438 if (rtn_type == nullptr) {
2439 self->ClearException();
2440 return false;
2441 }
2442 const DexFile::TypeList* types = m->GetParameterTypeList();
2443 if (types != nullptr) {
2444 for (uint32_t i = 0; i < types->Size(); ++i) {
2445 dex::TypeIndex param_type_idx = types->GetTypeItem(i).type_idx_;
Vladimir Markob45528c2017-07-27 14:14:28 +01002446 ObjPtr<mirror::Class> param_type = m->ResolveClassFromTypeIndex(param_type_idx);
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002447 if (param_type == nullptr) {
2448 self->ClearException();
2449 return false;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002450 }
2451 }
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002452 }
2453 return true;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002454 }
2455
2456 // Pre resolve types mentioned in all method signatures before start a transaction
2457 // since ResolveType doesn't work in transaction mode.
2458 bool PreResolveTypes(Thread* self, const Handle<mirror::Class>& klass)
2459 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002460 PointerSize pointer_size = manager_->GetClassLinker()->GetImagePointerSize();
2461 for (ArtMethod& m : klass->GetMethods(pointer_size)) {
2462 if (!ResolveTypesOfMethods(self, &m)) {
2463 return false;
2464 }
2465 }
2466 if (klass->IsInterface()) {
2467 return true;
2468 } else if (klass->HasSuperClass()) {
2469 StackHandleScope<1> hs(self);
2470 MutableHandle<mirror::Class> super_klass(hs.NewHandle<mirror::Class>(klass->GetSuperClass()));
2471 for (int i = super_klass->GetVTableLength() - 1; i >= 0; --i) {
2472 ArtMethod* m = klass->GetVTableEntry(i, pointer_size);
2473 ArtMethod* super_m = super_klass->GetVTableEntry(i, pointer_size);
2474 if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002475 return false;
2476 }
2477 }
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002478 for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) {
2479 super_klass.Assign(klass->GetIfTable()->GetInterface(i));
2480 if (klass->GetClassLoader() != super_klass->GetClassLoader()) {
2481 uint32_t num_methods = super_klass->NumVirtualMethods();
2482 for (uint32_t j = 0; j < num_methods; ++j) {
2483 ArtMethod* m = klass->GetIfTable()->GetMethodArray(i)->GetElementPtrSize<ArtMethod*>(
2484 j, pointer_size);
2485 ArtMethod* super_m = super_klass->GetVirtualMethod(j, pointer_size);
2486 if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
2487 return false;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002488 }
2489 }
2490 }
2491 }
Mathieu Chartier7a8bcfd2017-06-13 13:40:43 -07002492 }
2493 return true;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002494 }
2495
2496 // Initialize the klass's dependencies recursively before initializing itself.
2497 // Checking for interfaces is also necessary since interfaces can contain
2498 // both default methods and static encoded fields.
2499 bool InitializeDependencies(const Handle<mirror::Class>& klass,
2500 Handle<mirror::ClassLoader> class_loader,
2501 Thread* self)
2502 REQUIRES_SHARED(Locks::mutator_lock_) {
2503 if (klass->HasSuperClass()) {
2504 ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
2505 StackHandleScope<1> hs(self);
2506 Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
2507 if (!handle_scope_super->IsInitialized()) {
2508 this->TryInitializeClass(handle_scope_super, class_loader);
2509 if (!handle_scope_super->IsInitialized()) {
2510 return false;
2511 }
2512 }
2513 }
2514
2515 uint32_t num_if = klass->NumDirectInterfaces();
2516 for (size_t i = 0; i < num_if; i++) {
2517 ObjPtr<mirror::Class>
2518 interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
2519 StackHandleScope<1> hs(self);
2520 Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
2521
2522 TryInitializeClass(handle_interface, class_loader);
2523
2524 if (!handle_interface->IsInitialized()) {
2525 return false;
2526 }
2527 }
2528
2529 return PreResolveTypes(self, klass);
2530 }
2531
2532 // In this phase the classes containing class initializers are ignored. Make sure no
2533 // clinit appears in kalss's super class chain and interfaces.
2534 bool NoClinitInDependency(const Handle<mirror::Class>& klass,
2535 Thread* self,
2536 Handle<mirror::ClassLoader>* class_loader)
2537 REQUIRES_SHARED(Locks::mutator_lock_) {
2538 ArtMethod* clinit =
2539 klass->FindClassInitializer(manager_->GetClassLinker()->GetImagePointerSize());
2540 if (clinit != nullptr) {
2541 VLOG(compiler) << klass->PrettyClass() << ' ' << clinit->PrettyMethod(true);
2542 return false;
2543 }
2544 if (klass->HasSuperClass()) {
2545 ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
2546 StackHandleScope<1> hs(self);
2547 Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
2548 if (!NoClinitInDependency(handle_scope_super, self, class_loader)) {
2549 return false;
2550 }
2551 }
2552
2553 uint32_t num_if = klass->NumDirectInterfaces();
2554 for (size_t i = 0; i < num_if; i++) {
2555 ObjPtr<mirror::Class>
2556 interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
2557 StackHandleScope<1> hs(self);
2558 Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
2559 if (!NoClinitInDependency(handle_interface, self, class_loader)) {
2560 return false;
2561 }
2562 }
2563
Chang Xingba17dbd2017-06-28 21:27:56 +00002564 return true;
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002565 }
2566
Mathieu Chartier90443472015-07-16 20:32:27 -07002567 const ParallelCompilationManager* const manager_;
2568};
Brian Carlstrom7940e442013-07-12 13:46:57 -07002569
Andreas Gampeace0dc12016-01-20 13:33:13 -08002570void CompilerDriver::InitializeClasses(jobject jni_class_loader,
2571 const DexFile& dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07002572 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002573 TimingLogger* timings) {
Mathieu Chartierf5997b42014-06-20 10:37:54 -07002574 TimingLogger::ScopedTiming t("InitializeNoClinit", timings);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002575
2576 // Initialization allocates objects and needs to run single-threaded to be deterministic.
2577 bool force_determinism = GetCompilerOptions().IsForceDeterminism();
2578 ThreadPool* init_thread_pool = force_determinism
2579 ? single_thread_pool_.get()
2580 : parallel_thread_pool_.get();
2581 size_t init_thread_count = force_determinism ? 1U : parallel_thread_count_;
2582
Brian Carlstrom7940e442013-07-12 13:46:57 -07002583 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
Andreas Gampede7b4362014-07-28 18:38:57 -07002584 ParallelCompilationManager context(class_linker, jni_class_loader, this, &dex_file, dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002585 init_thread_pool);
Mathieu Chartierf1dd69a2017-06-08 23:30:15 +00002586
2587 if (GetCompilerOptions().IsBootImage() || GetCompilerOptions().IsAppImage()) {
2588 // Set the concurrency thread to 1 to support initialization for App Images since transaction
2589 // doesn't support multithreading now.
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002590 // TODO: remove this when transactional mode supports multithreading.
Andreas Gampeace0dc12016-01-20 13:33:13 -08002591 init_thread_count = 1U;
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002592 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002593 InitializeClassVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002594 context.ForAll(0, dex_file.NumClassDefs(), &visitor, init_thread_count);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002595}
2596
Mathieu Chartier91288d82016-04-28 09:44:54 -07002597class InitializeArrayClassesAndCreateConflictTablesVisitor : public ClassVisitor {
Mathieu Chartier085a0722016-04-01 17:33:31 -07002598 public:
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002599 explicit InitializeArrayClassesAndCreateConflictTablesVisitor(VariableSizedHandleScope& hs)
2600 : hs_(hs) {}
2601
2602 virtual bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE
2603 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier91288d82016-04-28 09:44:54 -07002604 if (Runtime::Current()->GetHeap()->ObjectIsInBootImageSpace(klass)) {
2605 return true;
2606 }
Mathieu Chartier085a0722016-04-01 17:33:31 -07002607 if (klass->IsArrayClass()) {
2608 StackHandleScope<1> hs(Thread::Current());
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002609 auto h_klass = hs.NewHandleWrapper(&klass);
2610 Runtime::Current()->GetClassLinker()->EnsureInitialized(hs.Self(), h_klass, true, true);
Mathieu Chartier085a0722016-04-01 17:33:31 -07002611 }
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002612 // Collect handles since there may be thread suspension in future EnsureInitialized.
2613 to_visit_.push_back(hs_.NewHandle(klass));
Nicolas Geoffray88f288e2016-06-29 08:17:52 +00002614 return true;
Nelli Kimbadee982016-05-13 13:08:53 +03002615 }
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00002616
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002617 void FillAllIMTAndConflictTables() REQUIRES_SHARED(Locks::mutator_lock_) {
2618 for (Handle<mirror::Class> c : to_visit_) {
2619 // Create the conflict tables.
2620 FillIMTAndConflictTables(c.Get());
2621 }
2622 }
2623
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00002624 private:
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002625 void FillIMTAndConflictTables(ObjPtr<mirror::Class> klass)
2626 REQUIRES_SHARED(Locks::mutator_lock_) {
Artem Udovichenkoa62cb9b2016-06-30 09:18:25 +00002627 if (!klass->ShouldHaveImt()) {
2628 return;
2629 }
2630 if (visited_classes_.find(klass) != visited_classes_.end()) {
2631 return;
2632 }
2633 if (klass->HasSuperClass()) {
2634 FillIMTAndConflictTables(klass->GetSuperClass());
2635 }
2636 if (!klass->IsTemp()) {
2637 Runtime::Current()->GetClassLinker()->FillIMTAndConflictTables(klass);
2638 }
2639 visited_classes_.insert(klass);
2640 }
2641
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002642 VariableSizedHandleScope& hs_;
2643 std::vector<Handle<mirror::Class>> to_visit_;
2644 std::unordered_set<ObjPtr<mirror::Class>, HashObjPtr> visited_classes_;
Mathieu Chartier085a0722016-04-01 17:33:31 -07002645};
2646
Brian Carlstrom7940e442013-07-12 13:46:57 -07002647void CompilerDriver::InitializeClasses(jobject class_loader,
2648 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002649 TimingLogger* timings) {
Brian Carlstrom7940e442013-07-12 13:46:57 -07002650 for (size_t i = 0; i != dex_files.size(); ++i) {
2651 const DexFile* dex_file = dex_files[i];
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002652 CHECK(dex_file != nullptr);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002653 InitializeClasses(class_loader, *dex_file, dex_files, timings);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002654 }
Vladimir Markoaad75c62016-10-03 08:46:48 +00002655 if (GetCompilerOptions().IsBootImage() || GetCompilerOptions().IsAppImage()) {
Mathieu Chartier085a0722016-04-01 17:33:31 -07002656 // Make sure that we call EnsureIntiailized on all the array classes to call
2657 // SetVerificationAttempted so that the access flags are set. If we do not do this they get
2658 // changed at runtime resulting in more dirty image pages.
Mathieu Chartier91288d82016-04-28 09:44:54 -07002659 // Also create conflict tables.
2660 // Only useful if we are compiling an image (image_classes_ is not null).
Mathieu Chartier085a0722016-04-01 17:33:31 -07002661 ScopedObjectAccess soa(Thread::Current());
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002662 VariableSizedHandleScope hs(soa.Self());
2663 InitializeArrayClassesAndCreateConflictTablesVisitor visitor(hs);
Mathieu Chartier91288d82016-04-28 09:44:54 -07002664 Runtime::Current()->GetClassLinker()->VisitClassesWithoutClassesLock(&visitor);
Mathieu Chartier28357fa2016-10-18 16:27:40 -07002665 visitor.FillAllIMTAndConflictTables();
Mathieu Chartier085a0722016-04-01 17:33:31 -07002666 }
Vladimir Markoaad75c62016-10-03 08:46:48 +00002667 if (GetCompilerOptions().IsBootImage()) {
Mathieu Chartier093ef212014-08-11 13:52:12 -07002668 // Prune garbage objects created during aborted transactions.
2669 Runtime::Current()->GetHeap()->CollectGarbage(true);
2670 }
Brian Carlstrom7940e442013-07-12 13:46:57 -07002671}
2672
Andreas Gampeace0dc12016-01-20 13:33:13 -08002673void CompilerDriver::Compile(jobject class_loader,
2674 const std::vector<const DexFile*>& dex_files,
2675 TimingLogger* timings) {
Calin Juravle998c2162015-12-21 15:39:33 +02002676 if (kDebugProfileGuidedCompilation) {
2677 LOG(INFO) << "[ProfileGuidedCompilation] " <<
2678 ((profile_compilation_info_ == nullptr)
2679 ? "null"
2680 : profile_compilation_info_->DumpInfo(&dex_files));
Calin Juravle226501b2015-12-11 14:41:31 +00002681 }
Vladimir Marko492a7fa2016-06-01 18:38:43 +01002682
Mathieu Chartier72041a02017-07-14 18:23:25 -07002683 current_dex_to_dex_methods_ = nullptr;
2684 Thread* const self = Thread::Current();
2685 {
2686 // Clear in case we aren't the first call to Compile.
2687 MutexLock mu(self, dex_to_dex_references_lock_);
2688 dex_to_dex_references_.clear();
2689 }
2690
Vladimir Marko492a7fa2016-06-01 18:38:43 +01002691 for (const DexFile* dex_file : dex_files) {
Andreas Gampe2ed8def2014-08-28 14:41:02 -07002692 CHECK(dex_file != nullptr);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002693 CompileDexFile(class_loader,
2694 *dex_file,
2695 dex_files,
2696 parallel_thread_pool_.get(),
2697 parallel_thread_count_,
2698 timings);
Calin Juravle69158982016-03-16 11:53:41 +00002699 const ArenaPool* const arena_pool = Runtime::Current()->GetArenaPool();
2700 const size_t arena_alloc = arena_pool->GetBytesAllocated();
2701 max_arena_alloc_ = std::max(arena_alloc, max_arena_alloc_);
Jean-Philippe Halimica76a1a2016-02-02 19:48:52 +01002702 Runtime::Current()->ReclaimArenaPoolMemory();
Brian Carlstrom7940e442013-07-12 13:46:57 -07002703 }
Vladimir Marko492a7fa2016-06-01 18:38:43 +01002704
2705 ArrayRef<DexFileMethodSet> dex_to_dex_references;
2706 {
2707 // From this point on, we shall not modify dex_to_dex_references_, so
2708 // just grab a reference to it that we use without holding the mutex.
Mathieu Chartier72041a02017-07-14 18:23:25 -07002709 MutexLock lock(self, dex_to_dex_references_lock_);
Vladimir Marko492a7fa2016-06-01 18:38:43 +01002710 dex_to_dex_references = ArrayRef<DexFileMethodSet>(dex_to_dex_references_);
2711 }
2712 for (const auto& method_set : dex_to_dex_references) {
2713 current_dex_to_dex_methods_ = &method_set.GetMethodIndexes();
2714 CompileDexFile(class_loader,
2715 method_set.GetDexFile(),
2716 dex_files,
2717 parallel_thread_pool_.get(),
2718 parallel_thread_count_,
2719 timings);
2720 }
2721 current_dex_to_dex_methods_ = nullptr;
2722
Andreas Gampe8d295f82015-01-20 14:50:21 -08002723 VLOG(compiler) << "Compile: " << GetMemoryUsageString(false);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002724}
2725
Mathieu Chartier90443472015-07-16 20:32:27 -07002726class CompileClassVisitor : public CompilationVisitor {
2727 public:
2728 explicit CompileClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
2729
2730 virtual void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
2731 ATRACE_CALL();
2732 const DexFile& dex_file = *manager_->GetDexFile();
2733 const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index);
2734 ClassLinker* class_linker = manager_->GetClassLinker();
2735 jobject jclass_loader = manager_->GetClassLoader();
Mathieu Chartier90443472015-07-16 20:32:27 -07002736 ClassReference ref(&dex_file, class_def_index);
2737 // Skip compiling classes with generic verifier failures since they will still fail at runtime
2738 if (manager_->GetCompiler()->verification_results_->IsClassRejected(ref)) {
Ian Rogers1ff3c982014-08-12 02:30:58 -07002739 return;
2740 }
Mathieu Chartier736b5602015-09-02 14:54:11 -07002741 // Use a scoped object access to perform to the quick SkipClass check.
2742 const char* descriptor = dex_file.GetClassDescriptor(class_def);
2743 ScopedObjectAccess soa(Thread::Current());
2744 StackHandleScope<3> hs(soa.Self());
2745 Handle<mirror::ClassLoader> class_loader(
Mathieu Chartier0795f232016-09-27 18:43:30 -07002746 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader)));
Mathieu Chartier736b5602015-09-02 14:54:11 -07002747 Handle<mirror::Class> klass(
2748 hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor, class_loader)));
2749 Handle<mirror::DexCache> dex_cache;
Andreas Gampefa4333d2017-02-14 11:10:34 -08002750 if (klass == nullptr) {
Mathieu Chartier736b5602015-09-02 14:54:11 -07002751 soa.Self()->AssertPendingException();
2752 soa.Self()->ClearException();
2753 dex_cache = hs.NewHandle(class_linker->FindDexCache(soa.Self(), dex_file));
2754 } else if (SkipClass(jclass_loader, dex_file, klass.Get())) {
2755 return;
2756 } else {
2757 dex_cache = hs.NewHandle(klass->GetDexCache());
2758 }
2759
Mathieu Chartier90443472015-07-16 20:32:27 -07002760 const uint8_t* class_data = dex_file.GetClassData(class_def);
2761 if (class_data == nullptr) {
2762 // empty class, probably a marker interface
2763 return;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002764 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002765
Mathieu Chartier736b5602015-09-02 14:54:11 -07002766 // Go to native so that we don't block GC during compilation.
Mathieu Chartierf1d666e2015-09-03 16:13:34 -07002767 ScopedThreadSuspension sts(soa.Self(), kNative);
Mathieu Chartier736b5602015-09-02 14:54:11 -07002768
Mathieu Chartier90443472015-07-16 20:32:27 -07002769 CompilerDriver* const driver = manager_->GetCompiler();
2770
2771 // Can we run DEX-to-DEX compiler on this class ?
Andreas Gampe5eb0d382015-07-23 01:19:26 -07002772 optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level =
Mathieu Chartier736b5602015-09-02 14:54:11 -07002773 GetDexToDexCompilationLevel(soa.Self(), *driver, jclass_loader, dex_file, class_def);
Andreas Gampe5eb0d382015-07-23 01:19:26 -07002774
Mathieu Chartier90443472015-07-16 20:32:27 -07002775 ClassDataItemIterator it(dex_file, class_data);
Mathieu Chartiere17cf242017-06-19 11:05:51 -07002776 it.SkipAllFields();
Mathieu Chartier90443472015-07-16 20:32:27 -07002777
2778 bool compilation_enabled = driver->IsClassToCompile(
2779 dex_file.StringByTypeIdx(class_def.class_idx_));
2780
2781 // Compile direct methods
2782 int64_t previous_direct_method_idx = -1;
2783 while (it.HasNextDirectMethod()) {
2784 uint32_t method_idx = it.GetMemberIndex();
2785 if (method_idx == previous_direct_method_idx) {
2786 // smali can create dex files with two encoded_methods sharing the same method_idx
2787 // http://code.google.com/p/smali/issues/detail?id=119
2788 it.Next();
2789 continue;
2790 }
2791 previous_direct_method_idx = method_idx;
Vladimir Marko8d6768d2017-03-14 10:13:21 +00002792 CompileMethod(soa.Self(),
2793 driver,
2794 it.GetMethodCodeItem(),
2795 it.GetMethodAccessFlags(),
2796 it.GetMethodInvokeType(class_def),
2797 class_def_index,
2798 method_idx,
2799 class_loader,
2800 dex_file,
2801 dex_to_dex_compilation_level,
2802 compilation_enabled,
2803 dex_cache);
Mathieu Chartier90443472015-07-16 20:32:27 -07002804 it.Next();
2805 }
2806 // Compile virtual methods
2807 int64_t previous_virtual_method_idx = -1;
2808 while (it.HasNextVirtualMethod()) {
2809 uint32_t method_idx = it.GetMemberIndex();
2810 if (method_idx == previous_virtual_method_idx) {
2811 // smali can create dex files with two encoded_methods sharing the same method_idx
2812 // http://code.google.com/p/smali/issues/detail?id=119
2813 it.Next();
2814 continue;
2815 }
2816 previous_virtual_method_idx = method_idx;
Vladimir Marko8d6768d2017-03-14 10:13:21 +00002817 CompileMethod(soa.Self(),
2818 driver, it.GetMethodCodeItem(),
2819 it.GetMethodAccessFlags(),
2820 it.GetMethodInvokeType(class_def),
2821 class_def_index,
2822 method_idx,
2823 class_loader,
2824 dex_file,
2825 dex_to_dex_compilation_level,
2826 compilation_enabled,
2827 dex_cache);
Mathieu Chartier90443472015-07-16 20:32:27 -07002828 it.Next();
2829 }
2830 DCHECK(!it.HasNext());
Brian Carlstrom7940e442013-07-12 13:46:57 -07002831 }
Mathieu Chartier90443472015-07-16 20:32:27 -07002832
2833 private:
2834 const ParallelCompilationManager* const manager_;
2835};
Brian Carlstrom7940e442013-07-12 13:46:57 -07002836
Andreas Gampeace0dc12016-01-20 13:33:13 -08002837void CompilerDriver::CompileDexFile(jobject class_loader,
2838 const DexFile& dex_file,
Andreas Gampede7b4362014-07-28 18:38:57 -07002839 const std::vector<const DexFile*>& dex_files,
Andreas Gampeace0dc12016-01-20 13:33:13 -08002840 ThreadPool* thread_pool,
2841 size_t thread_count,
2842 TimingLogger* timings) {
Mathieu Chartierf5997b42014-06-20 10:37:54 -07002843 TimingLogger::ScopedTiming t("Compile Dex File", timings);
Ian Rogersbe7149f2013-08-20 09:29:39 -07002844 ParallelCompilationManager context(Runtime::Current()->GetClassLinker(), class_loader, this,
Andreas Gampede7b4362014-07-28 18:38:57 -07002845 &dex_file, dex_files, thread_pool);
Mathieu Chartier90443472015-07-16 20:32:27 -07002846 CompileClassVisitor visitor(&context);
Andreas Gampeace0dc12016-01-20 13:33:13 -08002847 context.ForAll(0, dex_file.NumClassDefs(), &visitor, thread_count);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002848}
2849
Andreas Gampe5eb0d382015-07-23 01:19:26 -07002850void CompilerDriver::AddCompiledMethod(const MethodReference& method_ref,
2851 CompiledMethod* const compiled_method,
2852 size_t non_relative_linker_patch_count) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002853 DCHECK(GetCompiledMethod(method_ref) == nullptr) << method_ref.PrettyMethod();
2854 MethodTable::InsertResult result = compiled_methods_.Insert(method_ref,
2855 /*expected*/ nullptr,
2856 compiled_method);
Mathieu Chartieracab8d42016-11-23 13:45:58 -08002857 CHECK(result == MethodTable::kInsertResultSuccess);
2858 non_relative_linker_patch_count_.FetchAndAddRelaxed(non_relative_linker_patch_count);
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002859 DCHECK(GetCompiledMethod(method_ref) != nullptr) << method_ref.PrettyMethod();
Brian Carlstrom7940e442013-07-12 13:46:57 -07002860}
2861
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002862bool CompilerDriver::GetCompiledClass(const ClassReference& ref,
2863 mirror::Class::Status* status) const {
Andreas Gampebb846102017-05-11 21:03:35 -07002864 DCHECK(status != nullptr);
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002865 // The table doesn't know if something wasn't inserted. For this case it will return
Jeff Haof1aa2652017-08-03 17:09:33 -07002866 // kStatusNotReady. To handle this, just assume anything we didn't try to verify is not compiled.
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002867 if (!compiled_classes_.Get(ref, status) ||
Jeff Haof1aa2652017-08-03 17:09:33 -07002868 *status < mirror::Class::kStatusRetryVerificationAtRuntime) {
Andreas Gampebb846102017-05-11 21:03:35 -07002869 return false;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002870 }
Andreas Gampebb846102017-05-11 21:03:35 -07002871 return true;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002872}
2873
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002874mirror::Class::Status CompilerDriver::GetClassStatus(const ClassReference& ref) const {
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002875 mirror::Class::Status status = ClassStatus::kStatusNotReady;
2876 if (!GetCompiledClass(ref, &status)) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002877 classpath_classes_.Get(ref, &status);
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002878 }
2879 return status;
2880}
2881
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002882void CompilerDriver::RecordClassStatus(const ClassReference& ref, mirror::Class::Status status) {
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002883 switch (status) {
Vladimir Marko72ab6842017-01-20 19:32:50 +00002884 case mirror::Class::kStatusErrorResolved:
2885 case mirror::Class::kStatusErrorUnresolved:
Jeff Hao0cb17282017-07-12 14:51:49 -07002886 case mirror::Class::kStatusNotReady:
2887 case mirror::Class::kStatusResolved:
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002888 case mirror::Class::kStatusRetryVerificationAtRuntime:
2889 case mirror::Class::kStatusVerified:
Jeff Hao0cb17282017-07-12 14:51:49 -07002890 case mirror::Class::kStatusSuperclassValidated:
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002891 case mirror::Class::kStatusInitialized:
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002892 break; // Expected states.
2893 default:
2894 LOG(FATAL) << "Unexpected class status for class "
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002895 << PrettyDescriptor(
2896 ref.dex_file->GetClassDescriptor(ref.dex_file->GetClassDef(ref.index)))
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002897 << " of " << status;
2898 }
2899
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002900 ClassStateTable::InsertResult result;
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002901 ClassStateTable* table = &compiled_classes_;
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002902 do {
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002903 mirror::Class::Status existing = mirror::Class::kStatusNotReady;
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002904 if (!table->Get(ref, &existing)) {
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002905 // A classpath class.
Mathieu Chartier010f5cc2017-07-24 15:53:46 -07002906 if (kIsDebugBuild) {
2907 // Check to make sure it's not a dex file for an oat file we are compiling since these
2908 // should always succeed. These do not include classes in for used libraries.
Mathieu Chartier72041a02017-07-14 18:23:25 -07002909 for (const DexFile* dex_file : GetDexFilesForOatFile()) {
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002910 CHECK_NE(ref.dex_file, dex_file) << ref.dex_file->GetLocation();
Mathieu Chartier010f5cc2017-07-24 15:53:46 -07002911 }
2912 }
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002913 if (!classpath_classes_.HaveDexFile(ref.dex_file)) {
Nicolas Geoffray486dda02017-09-11 14:15:52 +01002914 // Boot classpath dex file.
2915 return;
2916 }
2917 table = &classpath_classes_;
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002918 table->Get(ref, &existing);
Mathieu Chartier010f5cc2017-07-24 15:53:46 -07002919 }
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002920 if (existing >= status) {
2921 // Existing status is already better than we expect, break.
2922 break;
2923 }
Nicolas Geoffrayade72d62016-12-15 13:20:02 +00002924 // Update the status if we now have a greater one. This happens with vdex,
2925 // which records a class is verified, but does not resolve it.
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002926 result = table->Insert(ref, existing, status);
2927 CHECK(result != ClassStateTable::kInsertResultInvalidDexFile) << ref.dex_file->GetLocation();
Mathieu Chartier1a088d42017-07-18 11:43:57 -07002928 } while (result != ClassStateTable::kInsertResultSuccess);
Ian Rogers8f3c9ae2013-08-20 17:26:41 -07002929}
2930
Brian Carlstrom7940e442013-07-12 13:46:57 -07002931CompiledMethod* CompilerDriver::GetCompiledMethod(MethodReference ref) const {
Mathieu Chartieracab8d42016-11-23 13:45:58 -08002932 CompiledMethod* compiled_method = nullptr;
Mathieu Chartierfc8b4222017-09-17 13:44:24 -07002933 compiled_methods_.Get(ref, &compiled_method);
Mathieu Chartieracab8d42016-11-23 13:45:58 -08002934 return compiled_method;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002935}
2936
Calin Juravlef1c6d9e2015-04-13 18:42:21 +01002937bool CompilerDriver::IsMethodVerifiedWithoutFailures(uint32_t method_idx,
2938 uint16_t class_def_idx,
2939 const DexFile& dex_file) const {
2940 const VerifiedMethod* verified_method = GetVerifiedMethod(&dex_file, method_idx);
2941 if (verified_method != nullptr) {
2942 return !verified_method->HasVerificationFailures();
2943 }
2944
2945 // If we can't find verification metadata, check if this is a system class (we trust that system
2946 // classes have their methods verified). If it's not, be conservative and assume the method
2947 // has not been verified successfully.
2948
2949 // TODO: When compiling the boot image it should be safe to assume that everything is verified,
2950 // even if methods are not found in the verification cache.
2951 const char* descriptor = dex_file.GetClassDescriptor(dex_file.GetClassDef(class_def_idx));
2952 ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
2953 Thread* self = Thread::Current();
2954 ScopedObjectAccess soa(self);
2955 bool is_system_class = class_linker->FindSystemClass(self, descriptor) != nullptr;
2956 if (!is_system_class) {
2957 self->ClearException();
2958 }
2959 return is_system_class;
2960}
2961
Vladimir Markof4da6752014-08-01 19:04:18 +01002962size_t CompilerDriver::GetNonRelativeLinkerPatchCount() const {
Mathieu Chartieracab8d42016-11-23 13:45:58 -08002963 return non_relative_linker_patch_count_.LoadRelaxed();
Vladimir Markof4da6752014-08-01 19:04:18 +01002964}
2965
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07002966void CompilerDriver::SetRequiresConstructorBarrier(Thread* self,
2967 const DexFile* dex_file,
2968 uint16_t class_def_index,
2969 bool requires) {
2970 WriterMutexLock mu(self, requires_constructor_barrier_lock_);
2971 requires_constructor_barrier_.emplace(ClassReference(dex_file, class_def_index), requires);
Brian Carlstrom7940e442013-07-12 13:46:57 -07002972}
2973
Mathieu Chartier371bd832016-04-07 10:19:48 -07002974bool CompilerDriver::RequiresConstructorBarrier(Thread* self,
2975 const DexFile* dex_file,
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07002976 uint16_t class_def_index) {
2977 ClassReference class_ref(dex_file, class_def_index);
2978 {
2979 ReaderMutexLock mu(self, requires_constructor_barrier_lock_);
2980 auto it = requires_constructor_barrier_.find(class_ref);
2981 if (it != requires_constructor_barrier_.end()) {
2982 return it->second;
2983 }
Mathieu Chartierb5d38612016-04-07 10:52:52 -07002984 }
Mathieu Chartierc4ae9162016-04-07 13:19:19 -07002985 WriterMutexLock mu(self, requires_constructor_barrier_lock_);
2986 const bool requires = RequiresConstructorBarrier(*dex_file, class_def_index);
2987 requires_constructor_barrier_.emplace(class_ref, requires);
2988 return requires;
Brian Carlstrom7940e442013-07-12 13:46:57 -07002989}
2990
Andreas Gampe8d295f82015-01-20 14:50:21 -08002991std::string CompilerDriver::GetMemoryUsageString(bool extended) const {
Mathieu Chartierab972ef2014-12-03 17:38:22 -08002992 std::ostringstream oss;
Calin Juravle69158982016-03-16 11:53:41 +00002993 const gc::Heap* const heap = Runtime::Current()->GetHeap();
Anton Kirilovdd9473b2016-01-28 15:08:01 +00002994 const size_t java_alloc = heap->GetBytesAllocated();
Calin Juravle69158982016-03-16 11:53:41 +00002995 oss << "arena alloc=" << PrettySize(max_arena_alloc_) << " (" << max_arena_alloc_ << "B)";
Anton Kirilovdd9473b2016-01-28 15:08:01 +00002996 oss << " java alloc=" << PrettySize(java_alloc) << " (" << java_alloc << "B)";
Elliott Hughes7bf5a262015-04-02 20:55:07 -07002997#if defined(__BIONIC__) || defined(__GLIBC__)
Anton Kirilovdd9473b2016-01-28 15:08:01 +00002998 const struct mallinfo info = mallinfo();
Mathieu Chartierab972ef2014-12-03 17:38:22 -08002999 const size_t allocated_space = static_cast<size_t>(info.uordblks);
3000 const size_t free_space = static_cast<size_t>(info.fordblks);
Anton Kirilovdd9473b2016-01-28 15:08:01 +00003001 oss << " native alloc=" << PrettySize(allocated_space) << " (" << allocated_space << "B)"
3002 << " free=" << PrettySize(free_space) << " (" << free_space << "B)";
Mathieu Chartierab972ef2014-12-03 17:38:22 -08003003#endif
Vladimir Marko35831e82015-09-11 11:59:18 +01003004 compiled_method_storage_.DumpMemoryUsage(oss, extended);
Mathieu Chartierab972ef2014-12-03 17:38:22 -08003005 return oss.str();
3006}
3007
Jeff Haodcdc85b2015-12-04 14:06:18 -08003008bool CompilerDriver::MayInlineInternal(const DexFile* inlined_from,
3009 const DexFile* inlined_into) const {
3010 // We're not allowed to inline across dex files if we're the no-inline-from dex file.
3011 if (inlined_from != inlined_into &&
Vladimir Marko47496c22016-01-27 16:15:08 +00003012 compiler_options_->GetNoInlineFromDexFile() != nullptr &&
3013 ContainsElement(*compiler_options_->GetNoInlineFromDexFile(), inlined_from)) {
Jeff Haodcdc85b2015-12-04 14:06:18 -08003014 return false;
3015 }
3016
3017 return true;
3018}
3019
Andreas Gampeace0dc12016-01-20 13:33:13 -08003020void CompilerDriver::InitializeThreadPools() {
3021 size_t parallel_count = parallel_thread_count_ > 0 ? parallel_thread_count_ - 1 : 0;
3022 parallel_thread_pool_.reset(
3023 new ThreadPool("Compiler driver thread pool", parallel_count));
3024 single_thread_pool_.reset(new ThreadPool("Single-threaded Compiler driver thread pool", 0));
3025}
3026
3027void CompilerDriver::FreeThreadPools() {
3028 parallel_thread_pool_.reset();
3029 single_thread_pool_.reset();
3030}
3031
Mathieu Chartier72041a02017-07-14 18:23:25 -07003032void CompilerDriver::SetDexFilesForOatFile(const std::vector<const DexFile*>& dex_files) {
3033 dex_files_for_oat_file_ = dex_files;
Nicolas Geoffray486dda02017-09-11 14:15:52 +01003034 compiled_classes_.AddDexFiles(dex_files);
3035}
3036
3037void CompilerDriver::SetClasspathDexFiles(const std::vector<const DexFile*>& dex_files) {
3038 classpath_classes_.AddDexFiles(dex_files);
Mathieu Chartier72041a02017-07-14 18:23:25 -07003039}
3040
Brian Carlstrom7940e442013-07-12 13:46:57 -07003041} // namespace art